diff --git a/README.md b/README.md index cfcb1aab0f..0592643325 100644 --- a/README.md +++ b/README.md @@ -8,64 +8,6 @@ ----------------------------------------------------------------------------- -Welcome to Bittensor Developer Docs. These docs are built using [Docusaurus](https://docusaurus.io/). See the below instructions to build these docs locally. - -## Basic - -In most cases you only need to follow this basic approach. If you know what you are doing, also see the below [Advanced](#advanced) section. - -### Installation - -``` -git clone https://github.com/opentensor/developer-docs.git -``` - -``` -cd developer-docs -``` - -``` -yarn -``` - -The above steps will install Docusaurus and all its dependencies on your local machine. - -### Start a preview server - -From the `developer-docs` directory run this command: - -``` -yarn start -``` - -The above command starts a local Docusaurus development server and opens up a browser window. Any changes you make within the `developer-docs` directory will be shown live in the browser window. You do not need to restart the server. Simply refresh the browser. - -Follow the [WRITING STYLE GUIDE](./WRITING-STYLE-GUIDE.md) and stick to those writing style guidelines to make your contribution to these docs better. - -## Advanced - -### Build static html - -``` -yarn build -``` - -This command generates static content, including all the static html files and assets, into the `build` directory. You can then serve this `build` directory using any static hosting service. - -### Deployment - -Using SSH: - -``` -$ USE_SSH=true yarn deploy -``` - -Not using SSH: - -``` -$ GIT_USER= yarn deploy -``` - -If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. - ---- \ No newline at end of file +This repo is now a relic/archive. It was the original home of the open source docs for Bittensor, hosted at docs.bittensor.com +These docs are now hosted at docs.learnbittensor.org, and the open source repository is now at https://github.com/latent-to/developer-docs +This migration was executed June 18, 2025 by https://github.com/MichaelTrestman, head of Bittensor docs. Contact at m@latent.to or _trexman on discord. diff --git a/WRITING-STYLE-GUIDE.md b/WRITING-STYLE-GUIDE.md deleted file mode 100644 index 7023ada811..0000000000 --- a/WRITING-STYLE-GUIDE.md +++ /dev/null @@ -1,151 +0,0 @@ -

- - Tao Logo - -

-

Writing Style Guide

- ------------------------------------------------------------------------------ - -When you write a developer document for Opentensor Foundation, your audience should find your documentation readable, informative, and concise. To accomplish these goals, here below are a few helpful writing style recommendations. We encourage you to stick to the writing style described on this page. - -# General principles - -This section describes the general principles for writing docs. - -## Style and tone - -- Avoid colloquialisms and jargon. - -- Address the user directly. Use "you" instead of "user" or "they". - -- Use the active voice. Use present tense. - -- Avoid writing the way you speak. That is, avoid using contractions (aren’t, don’t, isn’t), jokes or using colloquial content. - -## Readability - -- Break up walls of text (long passages of text) into smaller chunks to aid readability. Use lists. - -- Provide context. Your readers can be beginner developers or experts in specialized fields. They may not know what you are talking about without a context. - -- Use shorter sentences (**26 words or less**). They are easier to understand (and easier to translate). - -- Define acronyms and abbreviations on the first usage in every topic. - -- Our documentation is written in US English, but the audience will include people for whom English is not their primary language.  - -- Avoid culturally specific references, humor, names. - -- Avoid compound verbs. Try to substitute a simpler verb. - -- Write dates and times in unambiguous and clear ways. Write "27 November 2020" instead of either "11/27/2020" or "27/11/2020" or "November 27, 2020". - -- Avoid negative sentence construction. Try not to say "it is not uncommon" but instead say "it is common". Yes there is a subtle difference between the two but for technical writing this simplification works better. - -- Avoid directional language (below, left) in procedural documentation (like a step by step instruction section), wherever possible. Instead refer to the actual step number. - -- Be consistent in capitalization and punctuation. - -- Avoid hypothetical future "would". Instead, write in the present tense. - - **For example**: Avoid saying "The compiler would then send" but instead say, "The compiler sends". - -- Avoid the`&` character in the descriptive text. Use the word "and". - -## Avoid foreshadowing - -- Do not refer to future features or products.  - -- Avoid making excessive or unsupported claims about future enhancements. - -## Titles and headings - -Document titles and section headings should either: - -- Explicitly state the purpose of the section. - -- Be a call to action, or intention. - -This approach makes it easier for the reader to get her specific development task done. - -### Examples - -- **Preferred**: Sharding your data (section heading) - **Avoid**: Data sharding fundamentals (title is not purpose-driven) - -- **Preferred**: Creating input pipelines - **Avoid**: Input pipelines - -## Rules - -- Document titles (**h1**): Use title case. - - **For example**: "Running a Model". - -- Section headings within a document (**h2, h3, h4, h5**): Use sentence case. - - **For example**: "Running a model". - -- A document title is the main title of a document page. A document has only one document title. - - **Example**: "Writing Style Guide" at the beginning of this page is a document title. The document title also appears at the top level in the navigation bar, so it must be short, preferably four to five words or less. - -- A section heading is the title for an individual section within a document page. - - **Example**: "Titles and headings" up above this section. A document page can have multiple sections, and hence multiple section headings. - -- Use a heading hierarchy. Do not skip levels of the heading hierarchy. - - **For example**, put h3 only under h2. - -- To change the visual formatting of a heading, use CSS instead of using a heading level that does not fit the hierarchy. - -- Do not write empty headings or headings with no associated content. - -- Avoid using question marks in document titles and section headings. - - **Example**: - - **Avoid**: How it works? - - **Preferred**: How it works - -- Avoid using emphasis or italics in document titles or section headings. - -- Avoid joining words using a slash. - - **Example:** - - **Avoid**: Execute on your CPU/GPU system - - **Preferred**: Execute on your CPU or GPU system - -## Python docstrings - -We use the [Napoleon extension](https://sphinxcontrib-napoleon.readthedocs.io/en/latest/) with Sphinx for generating API docs. - -### Recommendation - -- Use the [Google style](https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_google.html#example-google) docstrings for Python. - -### Example - -**Follow**: - -``` -Args: - -    path (str): The path of the file to wrap -    field_storage (FileStorage): The :class:\`FileStorage\` instance to wrap -    temporary (bool): Whether or not to delete the file when the File instance is destructed - -Returns: - -    BufferedFileStorage: A buffered writable file descriptor - -``` - -**Avoid**: - -``` -:param path: The path of the file to wrap -:type path: str -:param field_storage: The :class:\`FileStorage\` instance to wrap -:type field_storage: FileStorage -:param temporary: Whether or not to delete the file when the File instance is destructed -:type temporary: bool -:returns: A buffered writable file descriptor -:rtype: BufferedFileStorage - -``` - ---- diff --git a/docs/_components.md b/docs/_components.md deleted file mode 100644 index c5f2fbdae1..0000000000 --- a/docs/_components.md +++ /dev/null @@ -1,164 +0,0 @@ ---- -title: "Components" ---- - - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -### Admonition -:::note - -Please write down your wallet’s mnemonic seed and keep it in a safe place. The mnemonic can be used to restore your wallet. Keep it carefully to not lose your assets. Please write down your wallet’s mnemonic seed and keep it in a safe place. The mnemonic can be used to restore your wallet. Keep it carefully to not lose your assets. Please write down your wallet’s mnemonic seed and keep it in a safe place. The mnemonic can be used to restore your wallet. Keep it carefully to not lose your assets. Please write down your wallet’s mnemonic seed and keep it in a safe place. The mnemonic can be used to restore your wallet. Keep it carefully to not lose your assets.Please write down your wallet’s mnemonic seed and keep it in a safe place. The mnemonic can be used to restore your wallet. Keep it carefully to not lose your assets. Please write down your wallet’s mnemonic seed and keep it in a safe place. The mnemonic can be used to restore your wallet. Keep it carefully to not lose your assets.Please write down your wallet’s mnemonic seed and keep it in a safe place. The mnemonic can be used to restore your wallet. Keep it carefully to not lose your assets.Please write down your wallet’s mnemonic seed and keep it in a safe place. The mnemonic can be used to restore your wallet. Keep it carefully to not lose your assets. - -::: - -:::tip - - - -::: - -:::info - -Some **content** with _Markdown_ `syntax`. Check [this `api`](#). - -::: - -:::warning - -Some **content** with _Markdown_ `syntax`. Check [this `api`](#). - -::: - -:::danger[ ] - -Some **content** with _Markdown_ `syntax`. Check [this `api`](#). - -::: - -### Blockquote -> Sodales tempus turpis et eget mauris urna aliquet nisl. Tellus quam aliquam vitae pharetra. In porttitor luctus id neque cras vulputate donec blandit auctor. Amet lacus vitae ullamcorper blandit massa aliquet porttitor magna nisi. Mattis turpis orci neque dui morbi ut. Ullamcorper nullam elementum purus sed eu vel ligula sed. -> Lectus pharetra lobortis faucibus ullamcorper pretium. Sed est amet convallis in. Pharetra risus in viverra porta purus suspendisse. Ultrices sit dictumst et donec risus tellus nec faucibus. Venenatis in scelerisque augue eu aliquet mauris ut. Nunc consequat vitae nulla adipiscing molestie tellus nam. Egestas dapibus vitae faucibus augue ut in. Blandit in viverra feugiat pellentesque augue vestibulum elit nec a. Volutpat risus tristique leo mattis dolor nisl elit. Eget ultrices rutrum vestibulum ornare tristique id congue. -### Code Block -```bash -LPUSH bikes:repairs bike:1 -``` -### Show source -```tsx title="bitterson/App.tsx" link="https://figma.com" -const App = () => ( - - /* ... */ - -); -``` - - -### Show Tabs - - - - ```bash - npm i -g redis - ``` - - - - - ```bash - yarn add -g redis - ``` - - - -### Show Tabs with Source - - -```tsx title="Bittensor/help.ts" link="https://figma.com" -const App = () => ( - - /* ... */ - -); -``` - - -```tsx title="Bittensor/help.js" link="https://github.com/facebook/react" -const App = () => ( - - /* ... */ - -); -``` - - - -### Table -| Programming Language | Year | -|----------------------|------| -| C | 1972 | -| Python | 1991 | -| Java | 1995 | -| JavaScript | 1995 | -| Ruby | 1995 | -| C# | 2000 | -| Swift | 2014 | -| Rust | 2010 | -| Kotlin | 2011 | -| TypeScript | 2012 | - - -### Horizontal line ---- - -### Image -![image info](https://plainbackground.com/plain1024/565b5f.png) - -### Video -[![](https://markdown-videos-api.jorgenkh.no/youtube/f6zXyq4VPP8)](https://www.youtube.com/watch?v=f6zXyq4VPP8) - -## Order List - -### Ordered List -1. First item -2. Second item -3. Third item -4. Fourth item - - -### Unordered List -- First item -- Second item -- Third item -- Fourth item \ No newline at end of file diff --git a/docs/_sphinx-gen.md b/docs/_sphinx-gen.md deleted file mode 100644 index 2390647b9e..0000000000 --- a/docs/_sphinx-gen.md +++ /dev/null @@ -1,37 +0,0 @@ -Building and Publishing Bittensor Python Reference Docs with Sphinx -Install virtual env - -python3 -m venv sphinx_venv -source sphinx_venv/bin/activate - -Install Sphinx and the required extensions - -Download this "sphinx-starter.tar" file: https://drive.google.com/file/d/192MweEv_M4uonylOypQh8tCrO4yjLETP/view?usp=drive_link I made this file to simplify the Sphinx installation and set up so you can get to building the docs quickly. -Do a "tar xvf sphinx-starter.tar" in a new directory. This will extract three files and a directory, i.e., “Makefile”, “make.bat” and “requirements.txt” files, and a "source" directory. -Run "pip install -r requirements.txt". This will install Sphinx and the required extensions. -Build docs locally - -In the "source/conf.py" file, change line 67 (autoapi_dirs = ["/Users/rajkaramchedu/2scratch/bittensor/bittensor"]) and put in the path to your local Bittensor clone repo. -Also on line 28 of “source/conf.py”, put in your path for Python site-packages. -Run "make html". This will create a "build" directory and place reference html docs in it. -Open the docs with the command: open build/html/index.html and you will see all the reference docs, exactly like how the published version looks like, including CSS customizations. -When you edit a docstring in the Bittensor repo, run this command to delete old stuff and rebuild html: rm -r build && make html This will make sure the "build" directory is removed before rebuilding the docs, or else it will use the old stuff in the "build" directory, and we don't want that. -In the “source” directory, there are separate “index.rst” files for Wallet SDK, Bittensor SDK and for legacy docs. If you are generating Wallet API docs, then copy over the “index.rst.btwallet” into “index.rst” before you build the docs. -When you are ready to publish the docs, proceed to the below next step. - -Publish the docs - -To publish the docs on docs.bittensor.com, you will push the entire "build/html" directory into the docs repo. However, before you do that, remove the `html/_sources` directory. This directory contains reStructuredText source files and we don't want to version control them. So, do rm -r build/html/_sources first. -In the docs repo, https://github.com/opentensor/developer-docs/tree/main , this "html" directory is located in the "developer-docs/python-api" path. Always replace the entire "html" directory even if you updated a single word or letter in a docstring. -In the Markdown file that contains links to these Python reference docs and sections, you will use "pathname:///python-api/html/index.html" for linking to the homepage of the Python ref docs. See "docs/bt-api-ref.md" for examples. - -Conf.py - -The "source/conf.py" is where all the configuration for docs generation is defined. -See Sphinx website here: https://www.sphinx-doc.org/en/master/index.html -We use Sphinx AutoAPI extension for docstrings to html generation. See the docs for the extension here: https://sphinx-autoapi.readthedocs.io/en/latest/reference/config.html -We use Sphinx Book Theme with additional custom CSS tweaks. Our custom CSS file is located in the `source/_static` directory. The Sphinx Book Theme docs are in https://sphinx-book-theme.readthedocs.io/en/stable/tutorials/get-started.html -Finally, we use Google style for docstrings. See the description here: https://github.com/opentensor/developer-docs/blob/main/WRITING-STYLE-GUIDE.md#python-docstrings - -That's it. Happy documenting. - diff --git a/docs/_subnet-pages/index.md b/docs/_subnet-pages/index.md deleted file mode 100644 index 7947f213ad..0000000000 --- a/docs/_subnet-pages/index.md +++ /dev/null @@ -1,208 +0,0 @@ ---- -title: "Subnet Pages" -hide_table_of_contents: true ---- - -import { HiAcademicCap } from "react-icons/hi2"; -import { SiRootssage } from "react-icons/si"; - - -# Subnet Pages - -This section presents key information for each subnet. Click on a subnet card to go to its details page. - -:::tip Updating subnet details page -If your subnet details page need updates, then [submit a GitHub issue](https://github.com/opentensor/developer-docs/issues/new). -::: - - - - - - - α} - title='Subnet 1' - link='/subnet-pages/subnet-1' - body='text prompting' /> - β} - title='Subnet 2' - link='/subnet-pages/subnet-2' - body='Omron' /> - γ} - title='Subnet 3' - link='/subnet-pages/subnet-3' - body='data scraping' /> - Δ} - title='Subnet 4' - link='/subnet-pages/subnet-4' - body='Targon' /> - - - - ε} - title='Subnet 5' - link='/subnet-pages/subnet-5' - body='OpenKaito Search' /> - ζ} - title='Subnet 6' - link='/subnet-pages/subnet-6' - body='Nous Finetuning' /> - η} - title='Subnet 7' - link='/subnet-pages/subnet-7' - body='storage subnet' /> - θ} - title='Subnet 8' - link='/subnet-pages/subnet-8' - body='PTN' /> - - - - ι} - title='Subnet 9' - link='/subnet-pages/subnet-9' - body='pretraining' /> - κ} - title='Subnet 10' - link='/subnet-pages/subnet-10' - body='Map reduce' /> - λ} - title='Subnet 11' - link='/subnet-pages/subnet-11' - body='transcription' /> - μ} - title='Subnet 12' - link='/subnet-pages/subnet-12' - body='Compute Horde' /> - - - - ν} - title='Subnet 13' - link='/subnet-pages/subnet-13' - body='data universe' /> - ξ} - title='Subnet 14' - link='/subnet-pages/subnet-14' - body='llm defender' /> - ο} - title='Subnet 15' - link='/subnet-pages/subnet-15' - body='blockchain insights' /> - π} - title='Subnet 16' - link='/subnet-pages/subnet-16' - body='audio subnet' /> - - - - ρ} - title='Subnet 17' - link='/subnet-pages/subnet-17' - body='flavia inference' /> - σ} - title='Subnet 18' - link='/subnet-pages/subnet-18' - body='cortex.t' /> - τ} - title='Subnet 19' - link='/subnet-pages/subnet-19' - body='vision' /> - υ} - title='Subnet 20' - link='/subnet-pages/subnet-20' - body='bitagent' /> - - - - φ} - title='Subnet 21' - link='/subnet-pages/subnet-21' - body='filetao' /> - χ} - title='Subnet 22' - link='/subnet-pages/subnet-22' - body='smart-scrape' /> - ψ} - title='Subnet 23' - link='/subnet-pages/subnet-23' - body='NicheImage' /> - ω} - title='Subnet 24' - link='/subnet-pages/subnet-24' - body='cellular automata' /> - - - - א} - title='Subnet 25' - link='/subnet-pages/subnet-25' - body='distributed training' /> - ב} - title='Subnet 26' - link='/subnet-pages/subnet-26' - body='ImageAlchemy' /> - ג} - title='Subnet 27' - link='/subnet-pages/subnet-27' - body='compute subnet' /> - ד} - title='Subnet 28' - link='/subnet-pages/subnet-28' - body='S&P 500 Oracle' /> - - - - ה} - title='Subnet 29' - link='/subnet-pages/subnet-29' - body='Fractal' /> - ו} - title='Subnet 30' - link='/subnet-pages/subnet-30' - body='Unknown' /> - ז} - title='Subnet 31' - link='/subnet-pages/subnet-31' - body='healthcare' /> - ח} - title='Subnet 32' - link='/subnet-pages/subnet-32' - body='It's AI: LLM Detection' /> - diff --git a/docs/_subnet-pages/subnet-0.md b/docs/_subnet-pages/subnet-0.md deleted file mode 100644 index 7713934d50..0000000000 --- a/docs/_subnet-pages/subnet-0.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: "Subnet 0" ---- - -# Subnet 0 - -## Name - -Root network - -## Netuid -0 - -## Description - -The weights for the subnets are set by the root network validators. These root network weights determine the emissions for all the subnets. See more at [Root network](../emissions.md#root-network). - -## Subnet owner - -Opentensor Foundation - -## GitHub - -https://github.com/opentensor/bittensor - - \ No newline at end of file diff --git a/docs/_subnet-pages/subnet-1.md b/docs/_subnet-pages/subnet-1.md deleted file mode 100644 index 8c8adb7600..0000000000 --- a/docs/_subnet-pages/subnet-1.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: "Subnet 1" ---- - -# Subnet 1 - -## Name - -Text prompting - -## Netuid -1 - -## Description - -Incentivizes subnet miners who produce the best prompt completions in response to the prompts sent by the subnet validators in that subnet. - -## Subnet owner - -Macrocosmos - -## GitHub - -https://github.com/opentensor/prompting - - diff --git a/docs/_subnet-pages/subnet-10.md b/docs/_subnet-pages/subnet-10.md deleted file mode 100644 index a07db36ede..0000000000 --- a/docs/_subnet-pages/subnet-10.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: "Subnet 10" ---- - -# Subnet 10 - -## Name - -Map Reduce - -## Netuid -10 - -## Description - -This subnet (Map Reduce Subnet) incentivizes miners by offering rewards for contributing network bandwidth and memory resources. - -## Subnet owner - -https://github.com/dream-well/map-reduce-subnet/ - -## GitHub - -https://github.com/dream-well/map-reduce-subnet/ - - \ No newline at end of file diff --git a/docs/_subnet-pages/subnet-11.md b/docs/_subnet-pages/subnet-11.md deleted file mode 100644 index 4af96fe40b..0000000000 --- a/docs/_subnet-pages/subnet-11.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: "Subnet 11" ---- - -# Subnet 11 - -## Name - -Transcription Subnet - -## Netuid -11 - -## Description - -Miners are responsible for transcribing spoken language into accurate written text using advanced speech-to-text models, while validators ensure the quality and reliability of these transcriptions. This synergetic process not only makes audio content universally accessible and searchable but also significantly amplifies its value across diverse sectors. - -## Subnet owner - -https://github.com/Cazure8/transcription-subnet - -## GitHub - -https://github.com/Cazure8/transcription-subnet - - \ No newline at end of file diff --git a/docs/_subnet-pages/subnet-12.md b/docs/_subnet-pages/subnet-12.md deleted file mode 100644 index 03a7db0d7b..0000000000 --- a/docs/_subnet-pages/subnet-12.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: "Subnet 12" ---- - -# Subnet 12 - -## Name - -ComputeHorde - -## Netuid -12 - -## Description - -A subnet that provides compute resources. - -## Subnet owner - -https://github.com/backend-developers-ltd/ComputeHorde - -## GitHub - -https://github.com/backend-developers-ltd/ComputeHorde - - \ No newline at end of file diff --git a/docs/_subnet-pages/subnet-13.md b/docs/_subnet-pages/subnet-13.md deleted file mode 100644 index 35c7e399fd..0000000000 --- a/docs/_subnet-pages/subnet-13.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: "Subnet 13" ---- - -# Subnet 13 - -## Name - -Data Universe - -## Netuid -13 - -## Description - -Data Universe subnet collects and stores large amounts of data from across a wide-range of sources, for use by other Subnets. This subnet is built from the ground-up with a focus on decentralization and scalability. There is no centralized entity that controls the data; the data is stored across all Miner's on the network and is queryable via the Validators. - -At launch, Data Universe is able to support up to 50 Petabytes of data across 200 miners, while only requiring ~10GB of storage on the Validator. - -## Subnet owner - -https://github.com/RusticLuftig/data-universe/ - -## GitHub - -https://github.com/RusticLuftig/data-universe/ - - \ No newline at end of file diff --git a/docs/_subnet-pages/subnet-14.md b/docs/_subnet-pages/subnet-14.md deleted file mode 100644 index ef037ae626..0000000000 --- a/docs/_subnet-pages/subnet-14.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: "Subnet 14" ---- - -# Subnet 14 - -## Name - -Bittensor LLM Defender Subnet - -## Netuid -14 - -## Description - -The LLM Defender subnet provides Large Language Model (LLM) developers a way to decentralize the computing required to detect and prevent various attacks and exploits against LLM applications. - -## Subnet owner - -https://github.com/ceterum1/llm-defender-subnet/ - -## GitHub - -https://github.com/ceterum1/llm-defender-subnet/ - - \ No newline at end of file diff --git a/docs/_subnet-pages/subnet-15.md b/docs/_subnet-pages/subnet-15.md deleted file mode 100644 index eb9f566647..0000000000 --- a/docs/_subnet-pages/subnet-15.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: "Subnet 15" ---- - -# Subnet 15 - -## Name - -Bittensor Blockchain Insights Subnet - -## Netuid -15 - -## Description - -Blockchain Insights Subnet is an innovative project focusing on transforming raw blockchain data into structured graph models. This project aims to provide comprehensive insights into various blockchain activities, including simple transactions, DeFi protocol transactions, and NFT exchanges. - -## Subnet owner - -https://github.com/blockchain-insights/blockchain-data-subnet/ - -## GitHub - -https://github.com/blockchain-insights/blockchain-data-subnet/ - - \ No newline at end of file diff --git a/docs/_subnet-pages/subnet-16.md b/docs/_subnet-pages/subnet-16.md deleted file mode 100644 index 52101bf4fa..0000000000 --- a/docs/_subnet-pages/subnet-16.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: "Subnet 16" ---- - -# Subnet 16 - -## Name - -Audio Generation Subnetwork - -## Netuid -16 - -## Description - -This subnetwork is a decentralized system designed for text-to-audio applications within the Bittensor network. - -## Subnet owner - -https://github.com/UncleTensor/AudioSubnet/ - -## GitHub - -https://github.com/UncleTensor/AudioSubnet/ - - \ No newline at end of file diff --git a/docs/_subnet-pages/subnet-17.md b/docs/_subnet-pages/subnet-17.md deleted file mode 100644 index 5b05013bda..0000000000 --- a/docs/_subnet-pages/subnet-17.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: "Subnet 17" ---- - -# Subnet 17 - -## Name - -Flavia - Model Inference Subnet - -## Netuid -17 - -## Description - -The Flavia subnet focuses on decentralized model inference at different scales. - -## Subnet owner - -https://github.com/CortexLM/flavia/ - -## GitHub - -https://github.com/CortexLM/flavia/ - - \ No newline at end of file diff --git a/docs/_subnet-pages/subnet-18.md b/docs/_subnet-pages/subnet-18.md deleted file mode 100644 index 28d809165c..0000000000 --- a/docs/_subnet-pages/subnet-18.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: "Subnet 18" ---- - -# Subnet 18 - -## Name - -Cortex.t Subnet for AI Development and Synthetic Data Generation. - -## Netuid -18 - -## Description - -Cortex.t offers a dual-purpose solution that caters to the needs of app developers and innovators in the AI space. - -This subnet is meticulously designed to deliver reliable, high-quality text and image responses through API usage, utilising the decentralised Bittensor network. This subnet serves as a cornerstone for creating a fair, transparent, and manipulation-free environment for the incentivised production of intelligence (mining) and generation and fulfilment of diverse user prompts. - -## Subnet owner - -https://github.com/corcel-api/cortex.t/ - -## GitHub - -https://github.com/corcel-api/cortex.t/ - - \ No newline at end of file diff --git a/docs/_subnet-pages/subnet-19.md b/docs/_subnet-pages/subnet-19.md deleted file mode 100644 index 9a5048e994..0000000000 --- a/docs/_subnet-pages/subnet-19.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: "Subnet 19" ---- - -# Subnet 19 - -## Name - -Vision - -## Netuid -19 - -## Description - -This subnet is a world of images unlocked. Recognition, Embeddings, Object detection, Segmentation. Here, we will do it all. Starting with Meta's Segment Anything Model. - -## Subnet owner - -https://github.com/namoray/vision/ - -## GitHub - -https://github.com/namoray/vision/ - - \ No newline at end of file diff --git a/docs/_subnet-pages/subnet-2.md b/docs/_subnet-pages/subnet-2.md deleted file mode 100644 index 4a9deb59e2..0000000000 --- a/docs/_subnet-pages/subnet-2.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: "Subnet 2" ---- - -# Subnet 2 - -## Name - -Omron (𝜏, β) - -## Netuid -2 - -## Description - -The purpose of the Omron subnet is to provide verified AI inferences in order to optimize staking and re-staking yields. - -Omron allows a variety of yield optimization models to be hosted and run against the Bittensor network while being zk-verified. - -In specific, this subnet enhances the Bittensor network by providing utility to protocols and networks outside the Bittensor ecosystem. As a result, this subnet amplifies Bittensor’s mission throughout a variety of such external protocols and networks. - -Furthermore, this subnet provides internal benefits by guiding Bittensor users towards the most profitable validators to delegate to. This, in turn, benefits delegators and thereby benefits the Bittensor network as a whole. - -## Subnet owner - -https://twitter.com/omron_ai - -## GitHub - -https://github.com/inference-labs-inc/omron-subnet - - \ No newline at end of file diff --git a/docs/_subnet-pages/subnet-20.md b/docs/_subnet-pages/subnet-20.md deleted file mode 100644 index 43694dd109..0000000000 --- a/docs/_subnet-pages/subnet-20.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: "Subnet 20" ---- - -# Subnet 20 - -## Name - -BitAgent - -## Netuid - -20 - -## Description - -BitAgent has 2 core thrusts: - -1. **Q&A/Tasking**, available in a few flavors: -- a) with your data in real time (BYOD) -- b) summarization of large data (BYOD) -- c) logic-based reasoning -- d) agency (tool execution, operation performance) - -2. **Integrated Orchestration** - this is task completion initiated by natural language for application. - -## Subnet owner - -https://github.com/RogueTensor/bitagent_subnet - - -## GitHub - -https://github.com/RogueTensor/bitagent_subnet - - \ No newline at end of file diff --git a/docs/_subnet-pages/subnet-21.md b/docs/_subnet-pages/subnet-21.md deleted file mode 100644 index 7f171ec06d..0000000000 --- a/docs/_subnet-pages/subnet-21.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: "Subnet 21" ---- - -# Subnet 21 - -## Name - -FileTAO - -## Netuid -21 - -## Description - -FileTAO implements a novel, multi-layered zero-knowledge interactive proof-of-spacetime algorithm. It cleverly uses Pedersen commitments, random challenges leveraging elliptic curve cryptography, sequential seed-based chained hash verification, and merkle proofs to achieve an efficient, robust, secure, and highly available decentralized storage system on the Bittensor network. - -## Subnet owner - -https://github.com/ifrit98/storage-subnet/ - -## GitHub - -https://github.com/ifrit98/storage-subnet/ - - \ No newline at end of file diff --git a/docs/_subnet-pages/subnet-22.md b/docs/_subnet-pages/subnet-22.md deleted file mode 100644 index 5c92286bfd..0000000000 --- a/docs/_subnet-pages/subnet-22.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: "Subnet 22" ---- - -# Subnet 22 - -## Name - -Smart-Scrape - -## Netuid -22 - -## Description - -Smart-Scrape subnet is a cutting-edge tool hosted, designed for effective and simplified analysis of Twitter data. This subnet is ideal for researchers, marketers, and data analysts who seek to extract insightful information from Twitter with ease. - -## Subnet owner - -https://github.com/surcyf123/smart-scrape/ - -## GitHub - -https://github.com/surcyf123/smart-scrape/ - - \ No newline at end of file diff --git a/docs/_subnet-pages/subnet-23.md b/docs/_subnet-pages/subnet-23.md deleted file mode 100644 index e11fddd3de..0000000000 --- a/docs/_subnet-pages/subnet-23.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: "Subnet 23" ---- - -# Subnet 23 - -## Name - -NicheImage - -## Netuid - -23 - -## Description - -Image Generating Subnet - -## Subnet owner - -https://github.com/NicheTensor/NicheImage/ - -## GitHub - -https://github.com/NicheTensor/NicheImage/ - - \ No newline at end of file diff --git a/docs/_subnet-pages/subnet-24.md b/docs/_subnet-pages/subnet-24.md deleted file mode 100644 index 75f8494750..0000000000 --- a/docs/_subnet-pages/subnet-24.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: "Subnet 24" ---- - -# Subnet 24 - -## Name - -Cellular Automata - -## Netuid -24 - -## Description - -The primary focus of this subnet is to run, analyze, and store cellular automata to serve as a research and science accelerator. The subnet will serve as a conduit between cellular automata researchers in the scientific community and the computational resources available through the Bittensor community of miners and validators. - - -## Subnet owner - -https://github.com/vn-automata/bt-automata - -## GitHub - -https://github.com/vn-automata/bt-automata - - \ No newline at end of file diff --git a/docs/_subnet-pages/subnet-25.md b/docs/_subnet-pages/subnet-25.md deleted file mode 100644 index eb32b5c566..0000000000 --- a/docs/_subnet-pages/subnet-25.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: "Subnet 25" ---- - -# Subnet 25 - -## Name - -Distributed Training Subnet - -## Netuid -25 - -## Description - -Distributed Training. - -## Subnet owner -https://github.com/bit-current/DistributedTraining - -## GitHub -https://github.com/bit-current/DistributedTraining - - diff --git a/docs/_subnet-pages/subnet-26.md b/docs/_subnet-pages/subnet-26.md deleted file mode 100644 index 9544317121..0000000000 --- a/docs/_subnet-pages/subnet-26.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: "Subnet 26" ---- - -# Subnet 26 - -## Name - -Image Alchemy - -## Netuid -26 - -## Description - -Image Alchemy - -## Subnet owner - -https://github.com/Supreme-Emperor-Wang/ImageAlchemy/ - -## GitHub - -https://github.com/Supreme-Emperor-Wang/ImageAlchemy/ - - \ No newline at end of file diff --git a/docs/_subnet-pages/subnet-27.md b/docs/_subnet-pages/subnet-27.md deleted file mode 100644 index 3255f93e33..0000000000 --- a/docs/_subnet-pages/subnet-27.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: "Subnet 27" ---- - -# Subnet 27 - -## Name - -Compute Subnet - -## Netuid -27 - -## Description - -This is a compute-composable subnet, integrating various cloud platforms (e.g., Runpod, Lambda, AWS) into a cohesive unit. Its purpose is to enable higher-level cloud platforms to offer seamless compute composability across different underlying platforms. - -With the proliferation of cloud platforms, there's a growing need for a subnet that can seamlessly integrate these platforms, allowing efficient resource sharing and allocation. This compute-composable subnet empowers nodes to contribute computational power, with validators ensuring the integrity and efficiency of the shared resources. - -## Subnet owner - -https://github.com/neuralinternet/compute-subnet/ - -## GitHub - -https://github.com/neuralinternet/compute-subnet/ - - \ No newline at end of file diff --git a/docs/_subnet-pages/subnet-28.md b/docs/_subnet-pages/subnet-28.md deleted file mode 100644 index e097541916..0000000000 --- a/docs/_subnet-pages/subnet-28.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: "Subnet 28" ---- - -# Subnet 28 - -## Name - -Foundry S&P 500 Oracle - -## Netuid -28 - -## Description - -The Foundry S&P 500 Oracle incentivizes miners to frequently predict the S&P 500 price index during trading hours (9:30 AM - 4 PM Eastern Standard Time). This subnet serves as a suitable starting point for the traditional financial markets predictions given the S&P 500 index’s utility, accessibility, and world-wide acceptance. - -In this subnet, subnet validators send subnet miners a timestamp of a future time, for which the miners must make an S&P 500 price prediction. The miners must immediately respond with their price prediction for that given timestamp. Validators store these predictions and calculate the scores of the miners once the predictions mature. Miners then receive ranks to stack up against one another, naturally incentivizing competition. - -## Subnet owner -https://foundrydigital.com/accelerate/ - -## GitHub - -https://github.com/teast21/snpOracle - - diff --git a/docs/_subnet-pages/subnet-29.md b/docs/_subnet-pages/subnet-29.md deleted file mode 100644 index ea7dbe6d10..0000000000 --- a/docs/_subnet-pages/subnet-29.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: "Subnet 29" ---- - -# Subnet 29 - -## Name - -Fractal: Text-to-Video Generation Grid for Edge-Node Inference - -## Netuid -29 - -## Description - -Fractal, taking inspiration from Manifold Labs' Deterministic Verification Network, is utilizing deterministic verification to create a grid of decentralized nodes to perform inference for video generation. By incentivizing users to host text-to-video models, this subnet allows Fractal to develop a mechanism that optimizes how end-user inference requests are handled to minimize latency. Additionally, the subnet is incredibly gamification-resistant, as a random seed is generated for each inference request, and if the Verifier and Prover seeds do not match, the Prover will be penalized. - -## Subnet owner - -https://github.com/fractal-net/fractal - -## GitHub - -https://github.com/fractal-net/fractal - - \ No newline at end of file diff --git a/docs/_subnet-pages/subnet-3.md b/docs/_subnet-pages/subnet-3.md deleted file mode 100644 index 333247b738..0000000000 --- a/docs/_subnet-pages/subnet-3.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: "Subnet 3" ---- - -# Subnet 3 - -## Name - -Scraping Subnet - -## Netuid -3 - -## Description - -Data scraping is a critical component in numerous AI and machine learning models, often acting as the foundational layer for various subnets, including [Subnet 1](./subnet-1.md). - -The objective of this subnet is to harvest data from platforms such as Reddit, Twitter, and other social media sites, and aggregate this information into shared storage solutions like Wasabi s3 storage. - -Looking ahead, the developers of this subnet intend to leverage the storage subnet of Bittensor to augment the data storage capabilities. - -## Subnet owner - -https://github.com/gitphantomman/scraping_subnet/ - -## GitHub - -https://github.com/gitphantomman/scraping_subnet/ - - \ No newline at end of file diff --git a/docs/_subnet-pages/subnet-30.md b/docs/_subnet-pages/subnet-30.md deleted file mode 100644 index 16addc2186..0000000000 --- a/docs/_subnet-pages/subnet-30.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: "Subnet 30" ---- - -# Subnet 30 - -## Name - -TBD - -## Netuid -30 - -## Description - -TBD - -## Subnet owner - -TBD - -## GitHub - -TBD - - \ No newline at end of file diff --git a/docs/_subnet-pages/subnet-31.md b/docs/_subnet-pages/subnet-31.md deleted file mode 100644 index 9f5e56653b..0000000000 --- a/docs/_subnet-pages/subnet-31.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: "Subnet 31" ---- - -# Subnet 31 - -## Name - -Healthcare subnet - -## Netuid -31 - -## Description - -In this innovative healthcare subnet, miners play a crucial role in contributing to disease diagnosis by predicting from medical images. Through continuous training, miners strive to improve their models, with more accurate models earning substantial rewards. Miners have the flexibility to adapt and enhance the structure of their models, datasets, and other factors influencing model accuracy. This collaborative effort aims to advance disease prediction and underscores the vital role miners play in shaping the future of medical diagnostics. - -Validators play a pivotal role in evaluating miner's models by periodically sending diverse images for assessment. They meticulously score miners based on their responses, contributing to the ongoing refinement of models and ensuring the highest standards of performance and accuracy in our collaborative network. - - -## Subnet owner - -https://github.com/bthealthcare/healthcare-subnet - -## GitHub - -https://github.com/bthealthcare/healthcare-subnet - - \ No newline at end of file diff --git a/docs/_subnet-pages/subnet-32.md b/docs/_subnet-pages/subnet-32.md deleted file mode 100644 index da6bed0b18..0000000000 --- a/docs/_subnet-pages/subnet-32.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -title: "Subnet 32" ---- - -# Subnet 32 - -## Name - -It's AI: LLM Detection solution - -## Netuid -32 - -## Description - -This subnet focuses on the detection of AI-generated content. Given the rapid growth of LLM-generated text, such as -ChatGPT's output of 100 billion words daily compared to humans' 100 trillion, -we believe that the ability to accurately determine AI-generated text will become increasingly necessary. - -For example, here are some scenarios where LLM detection is important: - -* **For ML-engineers**. Whether you are sourcing training data, developing a foundational LLM, or fine-tuning on your own data, -you need to ensure that generative text does not make it into your training set. We can help. -* **For teachers**. While tools like ChatGPT offer numerous benefits for the educational sector, these tools also present opportunities for students to cheat on assignments and exams. -Therefore, it is crucial to differentiate between responses authored by genuine students and those generated by LLMs. -* **For bloggers**. Many bloggers are now faced with a lot of AI-generated comments in -their social networks. These comments are not really meaningful, yet they attract the attention of their audience and promote unrelated products. -With our subnet, you can easily identify which comments are ai-generated and automatically ban them. - -And many more, like: -* **For writers**. By utilizing an LLM detection system, writers can assess their text, segment by segment, to identify sections that appear -machine-generated. This enables the writers to refine these areas to enhance the overall human-like quality of their writing. -* **For recruiting**. Have you noticed these days you are receiving far more applications with lower candidate quality? -AI has enabled people to spam the hiring teams with artificially written cover -letters and assessments. We help you find the candidates who care about your mission and your quality standards. -* **For cybersecurity**. Scammers can leverage LLMs to quickly and easily create realistic and personalized phishing emails. -We can help you determine the provenance of any document or email you are reviewing. - -As you can see there are a lot of areas where AI detection can -be very helpful. We believe that this LLM-detection subnet -not only is a useful tool at a good price for people to use, -but it also encourages competition to make better and smarter ways to spot AI-generated content. - -## Subnet owner - -[https://github.com/It-s-AI/llm-detection](https://github.com/It-s-AI/llm-detection.git) - -## GitHub - -[https://github.com/It-s-AI/llm-detection](https://github.com/It-s-AI/llm-detection.git) - - diff --git a/docs/_subnet-pages/subnet-4.md b/docs/_subnet-pages/subnet-4.md deleted file mode 100644 index bf594d0a6f..0000000000 --- a/docs/_subnet-pages/subnet-4.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: "Subnet 4" ---- - -# Subnet 4 - -## Name - -**TARGON**: A Redundant Deterministic Verification of Large Language Models. - -## Netuid -4 - -## Description - -TARGON is a redundant deterministic verification mechanism that can be used to interpret and analyze ground truth sources and a query. - -## Subnet owner - -https://github.com/manifold-inc/targon/ - -## GitHub - -https://github.com/manifold-inc/targon/ - - \ No newline at end of file diff --git a/docs/_subnet-pages/subnet-5.md b/docs/_subnet-pages/subnet-5.md deleted file mode 100644 index 37c9df1a6b..0000000000 --- a/docs/_subnet-pages/subnet-5.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: "Subnet 5" ---- - -# Subnet 5 - -## Name - -OpenKaito - -## Netuid -5 - -## Description - -A search index plays a crucial role in accessing information within Web3 and serves as the foundation for RAG applications. OpenKaito is dedicated to constructing a decentralized search index for Web3, and its incentive mechanism can be outlined as follows: - -1. Miners are encouraged to develop high-quality and efficient indexing and ranking schemes for Web3 data. - -2. Validators will submit structured or vector retrieval queries to perform spot checks on the indexing quality of the miners, using LLM. For instance, for a query "optimism", validators should anticipate receiving high quality content from miners. Miners are incentivized to differentiate between the English word "optimism" and the crypto project "optimism" within massive amounts of X (Twitter) data. The final reward will be determined based on the quality, ranking, recency, and uniqueness of the data indexed by miners. - -3. By collectively executing large-scale content understanding, indexing, and ranking, a decentralized search engine and data analytics platform can be established on top of OpenKaito. - -## Subnet owner - -https://www.kaito.ai - -## GitHub - -https://github.com/OpenKaito/openkaito - - diff --git a/docs/_subnet-pages/subnet-6.md b/docs/_subnet-pages/subnet-6.md deleted file mode 100644 index 5c97e45cb7..0000000000 --- a/docs/_subnet-pages/subnet-6.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: "Subnet 6" ---- - -# Subnet 6 - -## Name - -Nous Finetuning Subnet - -## Netuid -6 - -## Description - -The Nous-Bittensor subnet rewards miners for fine-tuning Large Language Models (LLMs) with data generated from a continuous stream of synthetic data provided by subnet 18 (also on Bittensor). It is the first-ever continuous fine-tuning benchmark, with new data generated daily, and the first incentivized fine-tuning benchmark. - -Additionally, it is the first Bittensor subnet to perform true cross-boundary communication, where data from one subnet is utilized in a secondary subnet. - -## Subnet owner - -[Nous Research](https://nousresearch.com/) - -## GitHub - -https://github.com/NousResearch/finetuning-subnet - - \ No newline at end of file diff --git a/docs/_subnet-pages/subnet-7.md b/docs/_subnet-pages/subnet-7.md deleted file mode 100644 index d6d0562147..0000000000 --- a/docs/_subnet-pages/subnet-7.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: "Subnet 7" ---- - -# Subnet 7 - -## Name - -Storage subnet. - -## Netuid - -7 - -## Description - -The storage subnet will allow nodes to contribute storage space, employing a prototype incentive mechanism similar to Filecoin. It will offer decentralized storage solutions, allowing nodes to serve their hard drive space to the network, proven to validators utilizing Yuma consensus. - -## Subnet owner - -https://github.com/tensorage/tensorage/ - -## GitHub - -https://github.com/tensorage/tensorage/ - - \ No newline at end of file diff --git a/docs/_subnet-pages/subnet-8.md b/docs/_subnet-pages/subnet-8.md deleted file mode 100644 index fad6e64ce0..0000000000 --- a/docs/_subnet-pages/subnet-8.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: "Subnet 8" ---- - -# Subnet 8 - -## Name - -Proprietary Trading Network (PTN) - -## Netuid - -8 - -## Description - -The PTN subnet receives signals from quant and machine learning trading systems, and delivers world's most complete trading signals across a variety of asset classes. - -PTN is the most challenging & competitive subnet in the world. Our subnet miners must provide futures-based signals (long and short) that are highly efficient and effective across various markets (forex, crypto, indices). The top subnet miners provide most returns while never exceeding the drawdown limits. - -## Subnet owner - -[https://www.taoshi.io/](https://www.taoshi.io/) - -## GitHub - -https://github.com/taoshidev/proprietary-trading-network - - diff --git a/docs/_subnet-pages/subnet-9.md b/docs/_subnet-pages/subnet-9.md deleted file mode 100644 index 467f515eb7..0000000000 --- a/docs/_subnet-pages/subnet-9.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: "Subnet 9" ---- - -# Subnet 9 - -## Name - -Pretrain Subnet - -## Netuid -9 - -## Description - -This subnet rewards miners for producing pretrained Foundation-Models on the Falcon Refined Web dataset. It acts like a continuous benchmark whereby miners are rewarded for attaining the best losses on randomly sampled pages of Falcon given a consistent model architecture. The reward mechanism works as follows: - -1. Miners train and periodically host trained model weights linked to their miner key as exampled by the code in neurons/miner.py. -2. Validators run a continuous eval on the hosted models, performing the validation system outlined in neurons/validator.py and setting weights to the chain based on the performance of each miner on the Falcon dataset. -3. The chain aggregates weights from all active validators and runs Yuma Consensus to determine the proportion of TAO emission rewarded to miners and validators. - -## Subnet owner - -Macrocosmos & collaborators - -## GitHub - -https://github.com/RaoFoundation/pretraining - - diff --git a/docs/bittensor-networks.md b/docs/bittensor-networks.md deleted file mode 100644 index fefbd67db6..0000000000 --- a/docs/bittensor-networks.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: "Bittensor Networks" ---- - -# Bittensor Networks - -The below table presents Bittensor networks and a few details: - -| DESCRIPTION | MAINNET | TESTNET | DEVNET | -|:---------------------|:------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------|:----------------------------------------------------------------------------------------| -| **Chain URL** | wss://entrypoint-finney.opentensor.ai:443 | wss://test.finney.opentensor.ai:443 | wss://dev.chain.opentensor.ai:443 | -| **Example Usage** | Default | `btcli wallet swap_hotkey --subtensor.chain_endpoint wss://dev.chain.opentensor.ai:443` **or** `btcli wallet swap_hotkey --subtensor.network test` | `btcli wallet swap_hotkey --subtensor.chain_endpoint wss://dev.chain.opentensor.ai:443` | -| **Block processing** | One block every 12 seconds | One block every 12 seconds | One block every 12 seconds | -| **Mainnet Archive** | wss://archive.chain.opentensor.ai:443 | None | None | -| **Mainnet Lite** | wss://lite.chain.opentensor.ai:443 | None | None | -| **Experimental Mainnet Lite** | wss://lite.finney.test.opentensor.ai:443 | None | None | -| **Network Purpose** | For all | For all | **For OTF-internal development only** | -| **Faucet** | None | None | Available on internal project-basis | -| **Test TAO** | None | Available on request (not compatible with devnet test TAO) | Available internally on request (not compatible with testnet test TAO) | - diff --git a/docs/bittensor-rel-notes.md b/docs/bittensor-rel-notes.md deleted file mode 100644 index fef827f563..0000000000 --- a/docs/bittensor-rel-notes.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: "Releases" ---- - -# Releases - -## Bittensor - -- [Pypi](https://pypi.org/project/bittensor/) -- [Github](https://github.com/opentensor/bittensor/releases) - -## BTCLI - -- [Pypi](https://pypi.org/project/bittensor-cli/) -- [Github](https://github.com/opentensor/btcli/releases) - -## Subtensor - -- [Github](https://github.com/opentensor/subtensor/releases) \ No newline at end of file diff --git a/docs/bt-api-ref.md b/docs/bt-api-ref.md deleted file mode 100644 index 44d5d6a755..0000000000 --- a/docs/bt-api-ref.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: "Bittensor SDK" ---- - -import { HiAcademicCap } from "react-icons/hi2"; -import { MdInstallDesktop } from "react-icons/md"; -import { FaNetworkWired } from "react-icons/fa"; -import { GiMining } from "react-icons/gi"; -import { GrValidate } from "react-icons/gr"; -import { GiHiveMind } from "react-icons/gi"; -import { GiOvermind } from "react-icons/gi"; -import { GiBrainTentacle } from "react-icons/gi"; -import { PiBrainFill } from "react-icons/pi"; -import { GiBrainStem } from "react-icons/gi"; -import { CiWallet } from "react-icons/ci"; -import { SiTrpc } from "react-icons/si"; - - -# Bittensor SDK - -This section presents the Bittensor SDK reference documentation. Follow the below links to specific Python modules or [click here for SDK reference homepage](pathname:///python-api/html/autoapi/bittensor/index.html). - - - - - - - - - diff --git a/docs/btcli-permissions.md b/docs/btcli-permissions.md deleted file mode 100644 index 65aa684863..0000000000 --- a/docs/btcli-permissions.md +++ /dev/null @@ -1,404 +0,0 @@ ---- -title: "Bittensor CLI: Permissions Guide" ---- - -The Bittensor CLI, `btcli` provides a wide range of functionality, and has a range of different requirements for various commands: some require a coldkey private key to authenticate, some require a hotkey private key, and some require neither. Additionally, different functions require different levels of permissions. Some require the user to have special status like being registered with a node, have a validator permit, or be an active member of the senate. - -This page details the requirements for all of the `btcli` commands. - -See also the `btcli` permissions guides for specific Bittensor personas: - -- [Staker's Guide to `BTCLI`](./staking-and-delegation/stakers-btcli-guide) -- [Miner's Guide to `BTCLI`](./miners/miners-btcli-guide) -- [Validator's Guide to `BTCLI`](./validators/validators-btcli-guide) -- [Subnet Creator's Guide to `BTCLI`](./subnets/subnet-creators-btcli-guide) -- [Senator's Guide to `BTCLI`](./governance/senators-btcli-guide) - -Other resources: - -- [Introduction to Wallets, Coldkeys and Hotkeys in Bittensor](./getting-started/wallets) -- [Coldkey and Hotkey Workstation Security](./getting-started/coldkey-hotkey-security) - -## Bittensor work environments and security requirements - -Interacting with Bittensor generally falls into one of three levels of security, depending on whether you need to use your coldkey private key, hotkey private key, or neither. - -The workstations you use to do this work can be referred to as a permissionless workstation (requiring neither private key), a coldkey workstation or a hotkey workstation, depending on which private key is provisioned. - -1. A **permissionless workstation** has only coldkey *public keys* on it. Public keys are sufficient for viewing all information about a wallet, such as TAO and alpha stake balances. Information about wallets, subnets, miners, and validators can and should be viewed without initializing your private keys on a device, to avoid the security risk of compromising your keys. - - :::tip coldkey workstation security - See [Permissionless workstation](./getting-started/coldkey-hotkey-security#permissionless-workstation) - ::: - -1. A **coldkey workstation** contains one or more coldkey private key in the `wallet_path`. For any coldkey associated with mainnet TAO, the coldkey workstation should be held to the highest possible security standards. - - :::tip coldkey workstation security - See [Coldkey workstation](./ getting-started/coldkey-hotkey-security#coldkey-workstation) - ::: - -1. **A hotkey workstation**—which is generally a server used for mining or validation—contains a hotkey private key in the `wallet_path` located in the `btcli config`, as well as a coldkey public key for the corresponding coldkey. Compromised hotkeys can damage your reputation if they are used to maliciously to submit inaccurate weights as a validator, or bad work as a miner. However, ownership of TAO or alpha stake can only be transferred with a coldkey, and a leaked hotkey can be swapped using the coldkey; therefore hotkey leaks are far less dangerous than coldkey leaks. - - :::tip hotkey workstation - See [Hotkey workstation security](./getting-started/coldkey-hotkey-security#hotkey-workstation) - ::: - -## Requirements for `btcli` functions -### Coldkey - -Your coldkey is your primary, fully privileged key; important for all users. This key should be handled on a maximum security **coldkey workstation** only, to avoid catastrophic loss or malicious actions if compromised. - -See [Coldkey and Hotkey Workstation Security](../getting-started/coldkey-hotkey-security). - -Required for: -- Moving and transferring TAO -- Managing stake (add/remove/move) -- Creating hotkeys -- Registering hotkeys in subnets -- Creating and modifying subnets -- Participating in governance of Bittensor as a senator - -### Hotkey - -Hotkeys are used by **miners** and **validators** to sign transactions, and are required for governance. - -Required for: -- Running miners: - - Serving requests from validators - - Making on-chain data commitments (if applicable) -- Running validators: - - making signed requests to miners - - setting weights - - being discoverable by stakers and miners - -### Available liquidity - -Some operations require a TAO balance or alpha stake balance to execute. - -- Transfers of TAO fail if you lack the specified amount -- Staking and unstaking operations fail if they specify more than the owner has -- Registering a hotkey on a subnet to mine or validate has a fee that can be paid with TAO or proof-of-work. -- Creating a subnet requires a fee, which is computed dynamically. The price to create a subnet doubles when someone creates a subnet, and then gradually decreases. This system is designed as a kind of distributed auction, where price is determined by what people are willing to pay given the uncertain estimation of what others are willing to pay. - -### Validator Permit - -To set weights, a validator must meet several requirements. See [Requirements for validation](./validators/#requirements-for-validation). - -### Senate requirements - -See [Senate: Requirements](./senate#requirements) - -## `btcli` commands - -### `config` - -The `btcli config ...` commands are used to configure `btcli`, including: -- selecting the targeted network (`finney` a.k.a. mainnet or `test` for test network) -- setting the directory where your Bittensor wallet coldkeys and/or hotkeys are stored - -These commands don't require any permissions to run. Rather, you run these commands on all `btcli` workstations to initialize them. - -See: [Coldkey and Hotkey Workstation Security](./getting-started/coldkey-hotkey-security) - -
- btcli config - -- `btcli config set` -- `btcli config get` -- `btcli config clear` -- `btcli config metagraph` -- `btcli conf set` -- `btcli conf get` -- `btcli conf clear` -- `btcli conf metagraph` - -- `btcli c set` -- `btcli c get` -- `btcli c clear` -- `btcli c metagraph` -
- -### `wallet` - -`wallet` subcommands have a variety of uses and must be run on all different kinds of workstation. - -The `wallet` command is required to provision keys to `btcli`, so it can access your wallet. This is essentially the equivalent of logging in/authentication. This is true for both coldkeys, which all users require, and hotkeys, which are required only by miners and validators as well as for advanced functions. - -:::tip mind your keys -See: [Coldkey and Hotkey Workstation Security](./getting-started/coldkey-hotkey-security) -::: - -#### Provisioning keys - -1. **`btcli wallet regen-coldkeypub`**: This initializes a wallet for a **permissionless workstation** with a public key only. It allows you to read all information about your wallet, which is public information. However, it doesn't allow you to sign any transactions and therefore doesn't allow you to make any *changes* to the state of the blockchain, including any of your balances or stakes. - -1. **`new coldkey`** is used to initialize a coldkey workstation using a newly created *seed phrase*. This is a high security risk operation due to the inherent risk of handling the seed phrase. - -1. **`regen coldkey`** is used to initialize a coldkey workstation using a pre-existing wallet's *seed phrase*. This is a high security risk operation due to the inherent risk of handling the seed phrase. - -1. **`new hotkey`** is used to initialize a hotkey workstation using a newly created *seed phrase*. This is a high security risk operation due to the inherent risk of handling the seed phrase. Hotkeys should be created on secure coldkey workstation and then carefully provisioned to working nodes for mining and validation. - -1. **`regen hotkey`** is used to initialize a hotkey workstation using a pre-existing wallet's *seed phrase*. This is a high security risk operation due to the inherent risk of handling the seed phrase. - -#### Permissionless operations - -- **`btcli wallet balance`**: Displays a wallet balance. -- **`btcli wallet overview`**: Displays a wallet overview. - -#### Operations requiring coldkey private key: - -- **`swap-hotkey`** rotates a hotkey coldkey owned by the coldkey. -- **`new-hotkey`** creates a new hotkey owned by the coldkey. -- **`transfer`** transfers TAO to another coldkey. -- **`set-identity`** sets the coldkey's public identity information. -- **`sign`(with coldkey)** signs a message with the coldkey. - -#### Operations requiring hotkey private key: -- **`sign`** (with hotkey): sign a message with the hotkey - - -
- `btcli wallet` -#### `btcli wallet list` -#### `btcli wallet swap-hotkey` -#### `btcli wallet regen-coldkey` -#### `btcli wallet regen-coldkeypub` -#### `btcli wallet regen-hotkey` -#### `btcli wallet new-hotkey` -#### `btcli wallet new-coldkey` -#### `btcli wallet create` -#### `btcli wallet balance` -#### `btcli wallet overview` -#### `btcli wallet transfer` -#### `btcli wallet inspect` -#### `btcli wallet faucet` -#### `btcli wallet set-identity` -#### `btcli wallet get-identity` -#### `btcli wallet sign` -#### `btcli wallet swap_hotkey` -#### `btcli wallet regen_coldkey` -#### `btcli wallet regen_coldkeypub` -#### `btcli wallet regen_hotkey` -#### `btcli wallet new_hotkey` -#### `btcli wallet new_coldkey` -#### `btcli wallet set_identity` -#### `btcli wallet get_identity` - -#### `btcli w list` -#### `btcli w swap-hotkey` -#### `btcli w regen-coldkey` -#### `btcli w regen-coldkeypub` -#### `btcli w regen-hotkey` -#### `btcli w new-hotkey` -#### `btcli w new-coldkey` -#### `btcli w create` -#### `btcli w balance` -#### `btcli w overview` -#### `btcli w transfer` -#### `btcli w inspect` -#### `btcli w faucet` -#### `btcli w set-identity` -#### `btcli w get-identity` -#### `btcli w sign` -#### `btcli w swap_hotkey` -#### `btcli w regen_coldkey` -#### `btcli w regen_coldkeypub` -#### `btcli w regen_hotkey` -#### `btcli w new_hotkey` -#### `btcli w new_coldkey` -#### `btcli w set_identity` -#### `btcli w get_identity` -#### `btcli wallets list` -#### `btcli wallets swap-hotkey` -#### `btcli wallets regen-coldkey` -#### `btcli wallets regen-coldkeypub` -#### `btcli wallets regen-hotkey` -#### `btcli wallets new-hotkey` -#### `btcli wallets new-coldkey` -#### `btcli wallets create` -#### `btcli wallets balance` -#### `btcli wallets history` -#### `btcli wallets overview` -#### `btcli wallets transfer` -#### `btcli wallets inspect` -#### `btcli wallets faucet` -#### `btcli wallets set-identity` -#### `btcli wallets get-identity` -#### `btcli wallets sign` -#### `btcli wallets swap_hotkey` -#### `btcli wallets regen_coldkey` -#### `btcli wallets regen_coldkeypub` -#### `btcli wallets regen_hotkey` -#### `btcli wallets new_hotkey` -#### `btcli wallets new_coldkey` -#### `btcli wallets set_identity` -#### `btcli wallets get_identity` -
- -### `stake` - -Read operations require public keys. Write operations (stake add, move, remove...) require a coldkey private key. - -:::tip mind your keys -See: [Coldkey and Hotkey Workstation Security](./getting-started/coldkey-hotkey-security) -::: - -
- btcli stake -#### `btcli stake add` -#### `btcli stake remove` -#### `btcli stake list` -#### `btcli stake move` -#### `btcli stake transfer` -#### `btcli stake swap` -#### `btcli stake child` -##### `btcli stake child get` -##### `btcli stake child set` -##### `btcli stake child revoke` -##### `btcli stake child take` -#### `btcli stake children` -##### `btcli stake children get` -##### `btcli stake children set` -##### `btcli stake children revoke` -##### `btcli stake children take` -#### `btcli st add` -#### `btcli st remove` -#### `btcli st list` -#### `btcli st move` -#### `btcli st transfer` -#### `btcli st swap` -#### `btcli st child` -##### `btcli st child get` -##### `btcli st child set` -##### `btcli st child revoke` -##### `btcli st child take` -#### `btcli st children` -##### `btcli st children get` -##### `btcli st children set` -##### `btcli st children revoke` -##### `btcli st children take` -
- -### `sudo` - -#### Read commands (permissionless) - -- **`get`** (same as `btcli subnet hyperparameters`), displays hyperparameters. -- **`proposals`** displays proposals currently before the senate. -- **`senate`** displays current senators. -- **`get-take`** shows the validator take of a given validator. - -#### Write commands (require coldkey) - -- **`set`** sets the hyperparameters for a subnet (requires the coldkey of the subnet creator). -- **`set-take`** sets the validator take for a validator (requires the validator's coldkey). -- **`senate-vote`** votes on a proposal before the senate (requres a coldkey with senate permissions). - -
- `btcli sudo` -#### `btcli sudo set` -#### `btcli sudo get` -#### `btcli sudo senate` -#### `btcli sudo proposals` -#### `btcli sudo senate-vote` -#### `btcli sudo set-take` -#### `btcli sudo get-take` -#### `btcli sudo senate_vote` -#### `btcli sudo get_take` -#### `btcli sudo set_take` -#### `btcli su set` -#### `btcli su get` - -#### `btcli su senate` -#### `btcli su proposals` -#### `btcli su senate-vote` -#### `btcli su set-take` -#### `btcli su get-take` -#### `btcli su senate_vote` -#### `btcli su get_take` -#### `btcli su set_take` -
- -### `subnets` - -#### Read commands (permissionless) - -- **`list`** lists subnets. -- **`show` alias `metagraph`** displays info about miner and validator activity on the subnet. -- **`hyperparameters`** shows configuration of a specific subnet. -- **`price`** displays a graph of alpha token prices of subnets over time. -- **`burn_cost`** shows current fee to create subnet. - -#### Write commands (require coldkey) - -- **`create`**: Create a subnet (requires burn fee) -- **`register/pow-register`**: Register a UID for the hotkey on a given subnet - -:::tip -hyperparams are set with `btcli sudo`. -::: - -Creating subnets requires a coldkey with sufficient balance. - -Miner and validator registering a hotkey uses a coldkey, has a TAO cost unless proof-of-work - - -
- `btcli subnets` -#### `btcli subnets hyperparameters` -#### `btcli subnets list` -#### `btcli subnets burn-cost` -#### `btcli subnets create` -#### `btcli subnets pow-register` -#### `btcli subnets register` -#### `btcli subnets metagraph` -#### `btcli subnets show` -#### `btcli subnets price` -#### `btcli subnets burn_cost` -#### `btcli subnets pow_register` -#### `btcli s hyperparameters` -#### `btcli s list` -#### `btcli s burn-cost` -#### `btcli s create` -#### `btcli s pow-register` -#### `btcli s register` -#### `btcli s metagraph` -#### `btcli s show` -#### `btcli s price` -#### `btcli s burn_cost` -#### `btcli s pow_register` -#### `btcli subnet hyperparameters` -#### `btcli subnet list` -#### `btcli subnet burn-cost` -#### `btcli subnet create` -#### `btcli subnet pow-register` -#### `btcli subnet register` -#### `btcli subnet metagraph` -#### `btcli subnet show` -#### `btcli subnet price` -#### `btcli subnet burn_cost` -#### `btcli subnet pow_register` - -
- -### `weights` - -Reading weights with `reveal` is permissionless. - -To set weights with `commit`, a validator must meet several requirements. See [Requirements for validation](./#requirements-for-validation). - -
- `btcli weight` -#### `btcli weights reveal` -#### `btcli weights commit` - -#### `btcli wt reveal` -#### `btcli wt commit` -#### `btcli weight reveal` -#### `btcli weight commit` -
- -### `utils` - -#### `btcli utils convert` -`btcli utils convert` is a convenience command for performing conversions between minimal units (RAO) and TAO, or other chain-specific conversions. It is permissionless (no key required) because it performs no on-chain operation, just a local calculation. diff --git a/docs/btcli.md b/docs/btcli.md deleted file mode 100644 index 771bd50b8c..0000000000 --- a/docs/btcli.md +++ /dev/null @@ -1,6882 +0,0 @@ ---- -title: "Bittensor CLI: btcli Reference Document" ---- - -# Bittensor CLI: `btcli` Reference Document - -Command line interface (CLI) for Bittensor. Uses the values in the configuration file. These values can be overriden by passing them explicitly in the command line. - -See [Getting Started](./getting-started/install-btcli.md) to install `btcli`. - -Command line interface (CLI) for Bittensor. Uses the values in the configuration file. These values can be - overriden by passing them explicitly in the command line. - -**Usage**: - -```console -btcli [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--version`: Show BTCLI version -* `--commands`: Show BTCLI commands -* `--install-completion`: Install completion for the current shell. -* `--show-completion`: Show completion for the current shell, to copy it or customize the installation. -* `--help`: Show this message and exit. - -**Commands**: - -* `config`: Config commands, aliases: `c`, `conf` -* `conf` -* `c` -* `wallet`: Wallet commands, aliases: `wallets`, `w` -* `w` -* `wallets` -* `stake`: Stake commands, alias: `st` -* `st` -* `sudo`: Sudo commands, alias: `su` -* `su` -* `subnets`: Subnets commands, alias: `s`, `subnet` -* `s` -* `subnet` -* `weights`: Weights commands, aliases: `wt`, `weight` -* `wt` -* `weight` -* `utils` - -## `btcli config` - -**Usage**: - -```console -btcli config [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--help`: Show this message and exit. - -**Commands**: - -* `set`: Sets or updates configuration values in... -* `get`: Prints the current config file in a table. -* `clear`: Clears the fields in the config file and... -* `metagraph`: Command option to configure the display of... - -### `btcli config set` - -Sets or updates configuration values in the BTCLI config file. - -This command allows you to set default values that will be used across all BTCLI commands. - -**Usage:** - -Interactive mode: - ``` - btcli config set - ``` - -Set specific values: - ``` - btcli config set --wallet-name default --network finney - ``` - ``` - btcli config set --safe-staking --rate-tolerance 0.1 - ``` - -Note: -- Network values can be network names (e.g., 'finney', 'test') or websocket URLs -- Rate tolerance is specified as a decimal (e.g., 0.05 for 0.05%) -- Changes are saved to ~/.bittensor/btcli.yaml -- Use `btcli config get` to view current settings - -**Usage**: - -```console -btcli config set [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--cache, --cache / --no-cache, --no_cache`: Disable caching of some commands. This will disable the `--reuse-last` and `--html` flags on commands such as `subnets metagraph`, `stake show` and `subnets list`. -* `--slippage, --slippage-tolerance, --tolerance FLOAT`: Set the rate tolerance percentage for transactions (e.g. 0.1 for 0.1%). -* `--safe-staking, --safe / --no-safe-staking, --unsafe`: Enable or disable safe staking mode. -* `--allow-partial-stake, --partial, --allow / --no-allow-partial-stake, --no-partial, --not-allow` -* `--help`: Show this message and exit. - -### `btcli config get` - -Prints the current config file in a table. - -**Usage**: - -```console -btcli config get [OPTIONS] -``` - -**Options**: - -* `--help`: Show this message and exit. - -### `btcli config clear` - -Clears the fields in the config file and sets them to 'None'. - - - - To clear the 'chain' and 'network' fields: - - ``` - btcli config clear --chain --network - ``` - - - To clear your config entirely: - - ``` - btcli config clear --all - ``` - -**Usage**: - -```console -btcli config clear [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name` -* `-p, --wallet-path, --wallet_path, --wallet.path` -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey` -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint` -* `--cache` -* `--slippage, --slippage-tolerance, --tolerance` -* `--safe-staking, --safe / --no-safe-staking, --unsafe`: [default: no-safe-staking] -* `--allow-partial-stake, --partial, --allow / --no-allow-partial-stake, --no-partial, --not-allow`: [default: no-allow-partial-stake] -* `--all` -* `--help`: Show this message and exit. - -### `btcli config metagraph` - -Command option to configure the display of the metagraph columns. - -**Usage**: - -```console -btcli config metagraph [OPTIONS] -``` - -**Options**: - -* `--reset`: Restore the display of metagraph columns to show all columns. -* `--help`: Show this message and exit. - -## `btcli conf` - -**Usage**: - -```console -btcli conf [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--help`: Show this message and exit. - -**Commands**: - -* `set`: Sets or updates configuration values in... -* `get`: Prints the current config file in a table. -* `clear`: Clears the fields in the config file and... -* `metagraph`: Command option to configure the display of... - -### `btcli conf set` - -Sets or updates configuration values in the BTCLI config file. - -This command allows you to set default values that will be used across all BTCLI commands. - -**Usage:** - -Interactive mode: - ``` - btcli config set - ``` - -Set specific values: - ``` - btcli config set --wallet-name default --network finney - ``` - ``` - btcli config set --safe-staking --rate-tolerance 0.1 - ``` - -Note: -- Network values can be network names (e.g., 'finney', 'test') or websocket URLs -- Rate tolerance is specified as a decimal (e.g., 0.05 for 0.05%) -- Changes are saved to ~/.bittensor/btcli.yaml -- Use `btcli config get` to view current settings - -**Usage**: - -```console -btcli conf set [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--cache, --cache / --no-cache, --no_cache`: Disable caching of some commands. This will disable the `--reuse-last` and `--html` flags on commands such as `subnets metagraph`, `stake show` and `subnets list`. -* `--slippage, --slippage-tolerance, --tolerance FLOAT`: Set the rate tolerance percentage for transactions (e.g. 0.1 for 0.1%). -* `--safe-staking, --safe / --no-safe-staking, --unsafe`: Enable or disable safe staking mode. -* `--allow-partial-stake, --partial, --allow / --no-allow-partial-stake, --no-partial, --not-allow` -* `--help`: Show this message and exit. - -### `btcli conf get` - -Prints the current config file in a table. - -**Usage**: - -```console -btcli conf get [OPTIONS] -``` - -**Options**: - -* `--help`: Show this message and exit. - -### `btcli conf clear` - -Clears the fields in the config file and sets them to 'None'. - - - - To clear the 'chain' and 'network' fields: - - ``` - btcli config clear --chain --network - ``` - - - To clear your config entirely: - - ``` - btcli config clear --all - ``` - -**Usage**: - -```console -btcli conf clear [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name` -* `-p, --wallet-path, --wallet_path, --wallet.path` -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey` -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint` -* `--cache` -* `--slippage, --slippage-tolerance, --tolerance` -* `--safe-staking, --safe / --no-safe-staking, --unsafe`: [default: no-safe-staking] -* `--allow-partial-stake, --partial, --allow / --no-allow-partial-stake, --no-partial, --not-allow`: [default: no-allow-partial-stake] -* `--all` -* `--help`: Show this message and exit. - -### `btcli conf metagraph` - -Command option to configure the display of the metagraph columns. - -**Usage**: - -```console -btcli conf metagraph [OPTIONS] -``` - -**Options**: - -* `--reset`: Restore the display of metagraph columns to show all columns. -* `--help`: Show this message and exit. - -## `btcli c` - -**Usage**: - -```console -btcli c [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--help`: Show this message and exit. - -**Commands**: - -* `set`: Sets or updates configuration values in... -* `get`: Prints the current config file in a table. -* `clear`: Clears the fields in the config file and... -* `metagraph`: Command option to configure the display of... - -### `btcli c set` - -Sets or updates configuration values in the BTCLI config file. - -This command allows you to set default values that will be used across all BTCLI commands. - -**Usage:** -Interactive mode: - ``` - btcli config set - ``` - -Set specific values: - ``` - btcli config set --wallet-name default --network finney - ``` - ``` - btcli config set --safe-staking --rate-tolerance 0.1 - ``` - -Note: -- Network values can be network names (e.g., 'finney', 'test') or websocket URLs -- Rate tolerance is specified as a decimal (e.g., 0.05 for 0.05%) -- Changes are saved to ~/.bittensor/btcli.yaml -- Use `btcli config get` to view current settings - -**Usage**: - -```console -btcli c set [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--cache, --cache / --no-cache, --no_cache`: Disable caching of some commands. This will disable the `--reuse-last` and `--html` flags on commands such as `subnets metagraph`, `stake show` and `subnets list`. -* `--slippage, --slippage-tolerance, --tolerance FLOAT`: Set the rate tolerance percentage for transactions (e.g. 0.1 for 0.1%). -* `--safe-staking, --safe / --no-safe-staking, --unsafe`: Enable or disable safe staking mode. -* `--allow-partial-stake, --partial, --allow / --no-allow-partial-stake, --no-partial, --not-allow` -* `--help`: Show this message and exit. - -### `btcli c get` - -Prints the current config file in a table. - -**Usage**: - -```console -btcli c get [OPTIONS] -``` - -**Options**: - -* `--help`: Show this message and exit. - -### `btcli c clear` - -Clears the fields in the config file and sets them to 'None'. - - - - To clear the 'chain' and 'network' fields: - - ``` - btcli config clear --chain --network - ``` - - - To clear your config entirely: - - ``` - btcli config clear --all - ``` - -**Usage**: - -```console -btcli c clear [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name` -* `-p, --wallet-path, --wallet_path, --wallet.path` -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey` -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint` -* `--cache` -* `--slippage, --slippage-tolerance, --tolerance` -* `--safe-staking, --safe / --no-safe-staking, --unsafe`: [default: no-safe-staking] -* `--allow-partial-stake, --partial, --allow / --no-allow-partial-stake, --no-partial, --not-allow`: [default: no-allow-partial-stake] -* `--all` -* `--help`: Show this message and exit. - -### `btcli c metagraph` - -Command option to configure the display of the metagraph columns. - -**Usage**: - -```console -btcli c metagraph [OPTIONS] -``` - -**Options**: - -* `--reset`: Restore the display of metagraph columns to show all columns. -* `--help`: Show this message and exit. - -## `btcli view dashboard` - -Display html dashboard with subnets list, stake, and neuron information. - -**Usage**: - -```console -btcli view dashboard -``` - -## `btcli wallet` - -**Usage**: - -```console -btcli wallet [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--help`: Show this message and exit. - -**Commands**: - -* `list`: Displays all the wallets and their... -* `swap-hotkey`: Swap hotkeys of a given wallet on the... -* `regen-coldkey`: Regenerate a coldkey for a wallet on the... -* `regen-coldkeypub`: Regenerates the public part of a coldkey... -* `regen-hotkey`: Regenerates a hotkey for a wallet. -* `new-hotkey`: Create a new hotkey for a wallet. -* `new-coldkey`: Create a new coldkey. -* `create`: Create a complete wallet by setting up... -* `balance`: Check the balance of the wallet. -* `history`: Show the history of the transfers carried... -* `overview`: Displays a detailed overview of the user's... -* `transfer`: Send TAO tokens from one wallet to another... -* `inspect`: Displays the details of the user's wallet... -* `faucet`: Obtain test TAO tokens by performing Proof... -* `set-identity`: Create or update the on-chain identity of... -* `get-identity`: Shows the identity details of a user's... -* `sign`: Allows users to sign a message with the... -* `swap_hotkey`: Swap hotkeys of a given wallet on the... -* `regen_coldkey`: Regenerate a coldkey for a wallet on the... -* `regen_coldkeypub`: Regenerates the public part of a coldkey... -* `regen_hotkey`: Regenerates a hotkey for a wallet. -* `new_hotkey`: Create a new hotkey for a wallet. -* `new_coldkey`: Create a new coldkey. -* `set_identity`: Create or update the on-chain identity of... -* `get_identity`: Shows the identity details of a user's... - -### `btcli wallet list` - -Displays all the wallets and their corresponding hotkeys that are located in the wallet path specified in the config. - -The output display shows each wallet and its associated `ss58` addresses for the coldkey public key and any hotkeys. The output is presented in a hierarchical tree format, with each wallet as a root node and any associated hotkeys as child nodes. The `ss58` address is displayed for each coldkey and hotkey that is not encrypted and exists on the device. - -Upon invocation, the command scans the wallet directory and prints a list of all the wallets, indicating whether the -public keys are available (`?` denotes unavailable or encrypted keys). - - -``` -btcli wallet list --path ~/.bittensor -``` - -Note: This command is read-only and does not modify the filesystem or the blockchain state. It is intended for use with the Bittensor CLI to provide a quick overview of the user's wallets. - -**Usage**: - -```console -btcli wallet list [OPTIONS] -``` - -**Options**: - -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallet swap-hotkey` - -Swap hotkeys of a given wallet on the blockchain. For a registered key pair, for example, a (coldkeyA, hotkeyA) pair, this command swaps the hotkeyA with a new, unregistered, hotkeyB to move the original registration to the (coldkeyA, hotkeyB) pair. - -**Usage:** - -The command is used to swap the hotkey of a wallet for another hotkey on that same wallet. - -**Important:** - -- Make sure that your original key pair (coldkeyA, hotkeyA) is already registered. -- Make sure that you use a newly created hotkeyB in this command. A hotkeyB that is already registered cannot be used in this command. -- Finally, note that this command requires a fee of 1 TAO for recycling and this fee is taken from your wallet (coldkeyA). - -**Example:** - -``` -btcli wallet swap_hotkey destination_hotkey_name --wallet-name your_wallet_name --wallet-hotkey original_hotkey -``` - -**Usage**: - -```console -btcli wallet swap-hotkey [OPTIONS] [DESTINATION_HOTKEY_NAME] -``` - -**Arguments**: - -* `[DESTINATION_HOTKEY_NAME]`: Destination hotkey name. - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--help`: Show this message and exit. - -### `btcli wallet regen-coldkey` - -Regenerate a coldkey for a wallet on the Bittensor blockchain network. - -This command is used to create a new coldkey from an existing mnemonic, seed, or JSON file. - -**Usage:** - -Users can specify a mnemonic, a seed string, or a JSON file path to regenerate a coldkey. The command supports optional password protection for the generated key. - -**Example:** - -``` -btcli wallet regen-coldkey --mnemonic "word1 word2 ... word12" -``` - - -Note: This command is critical for users who need to regenerate their coldkey either for recovery or for security reasons. - -**Usage**: - -```console -btcli wallet regen-coldkey [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--mnemonic TEXT`: Mnemonic used to regenerate your key. For example: horse cart dog ... -* `--seed TEXT`: Seed hex string used to regenerate your key. For example: 0x1234... -* `-j, --json TEXT`: Path to a JSON file containing the encrypted key backup. For example, a JSON file from PolkadotJS. -* `--json-password TEXT`: Password to decrypt the JSON file. -* `--use-password / --no-use-password`: Set this to `True` to protect the generated Bittensor key with a password. [default: use-password] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallet regen-coldkeypub` - -Regenerates the public part of a coldkey (coldkeypub.txt) for a wallet. - -Use this command when you need to move machine for subnet mining. Use the public key or SS58 address from your coldkeypub.txt that you have on another machine to regenerate the coldkeypub.txt on this new machine. - -**Usage:** - -The command requires either a public key in hexadecimal format or an ``SS58`` address from the existing coldkeypub.txt from old machine to regenerate the coldkeypub on the new machine. - -**Example:** - -``` -btcli wallet regen_coldkeypub --ss58_address 5DkQ4... -``` - -Note: This command is particularly useful for users who need to regenerate their coldkeypub, perhaps due to file corruption or loss. You will need either ss58 address or public hex key from your old coldkeypub.txt for the wallet. It is a recovery-focused utility that ensures continued access to your wallet functionalities. - -**Usage**: - -```console -btcli wallet regen-coldkeypub [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--public-key-hex TEXT`: The public key in hex format. -* `--ss58, --ss58-address TEXT`: The SS58 address of the coldkey. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallet regen-hotkey` - -Regenerates a hotkey for a wallet. - -Similar to regenerating a coldkey, this command creates a new hotkey from a mnemonic, seed, or JSON file. - -**Usage:** - -Users can provide a mnemonic, seed string, or a JSON file to regenerate the hotkey. The command supports optional password protection and can overwrite an existing hotkey. - - -``` -btcli wallet regen_hotkey --seed 0x1234... -``` - -Note: This command is essential for users who need to regenerate their hotkey, possibly for security upgrades or key recovery. -It should be used with caution to avoid accidental overwriting of existing keys. - -**Usage**: - -```console -btcli wallet regen-hotkey [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--mnemonic TEXT`: Mnemonic used to regenerate your key. For example: horse cart dog ... -* `--seed TEXT`: Seed hex string used to regenerate your key. For example: 0x1234... -* `-j, --json TEXT`: Path to a JSON file containing the encrypted key backup. For example, a JSON file from PolkadotJS. -* `--json-password TEXT`: Password to decrypt the JSON file. -* `--use-password / --no-use-password`: Set to 'True' to protect the generated Bittensor key with a password. [default: no-use-password] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallet new-hotkey` - -Create a new hotkey for a wallet. - -**Usage:** - -This command is used to generate a new hotkey for managing a neuron or participating in a subnet. It provides options for the mnemonic word count, and supports password protection. It also allows overwriting the -existing hotkey. - -**Example:** - -``` -btcli wallet new-hotkey --n_words 24 -``` - -Note: This command is useful to create additional hotkeys for different purposes, such as running multiple subnet miners or subnet validators or separating operational roles within the Bittensor network. - -**Usage**: - -```console -btcli wallet new-hotkey [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--n-words, --n_words INTEGER`: The number of words used in the mnemonic. Options: [12, 15, 18, 21, 24] -* `--use-password / --no-use-password`: Set to 'True' to protect the generated Bittensor key with a password. [default: no-use-password] -* `--uri TEXT`: Create wallet from uri (e.g. 'Alice', 'Bob', 'Charlie', 'Dave', 'Eve') -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallet new-coldkey` - -Create a new coldkey. A coldkey is required for holding TAO balances and performing high-value transactions. - -**Usage:** - -The command creates a new coldkey. It provides options for the mnemonic word count, and supports password protection. It also allows overwriting an existing coldkey. - -**Example:** - -``` -btcli wallet new_coldkey --n_words 15 -``` - -Note: This command is crucial for users who need to create a new coldkey for enhanced security or as part of setting up a new wallet. It is a foundational step in establishing a secure presence on the Bittensor network. - -**Usage**: - -```console -btcli wallet new-coldkey [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--n-words, --n_words INTEGER`: The number of words used in the mnemonic. Options: [12, 15, 18, 21, 24] -* `--use-password / --no-use-password`: Set this to `True` to protect the generated Bittensor key with a password. [default: use-password] -* `--uri TEXT`: Create wallet from uri (e.g. 'Alice', 'Bob', 'Charlie', 'Dave', 'Eve') -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallet create` - -Create a complete wallet by setting up both coldkey and hotkeys. - -**Usage:** - -The command creates a new coldkey and hotkey. It provides an option for mnemonic word count. It supports password protection for the coldkey and allows overwriting of existing keys. - -**Example:** - -``` -btcli wallet create --n_words 21 -``` - -Note: This command is for new users setting up their wallet for the first time, or for those who wish to completely renew their wallet keys. It ensures a fresh start with new keys for secure and effective participation in the Bittensor network. - -**Usage**: - -```console -btcli wallet create [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--n-words INTEGER` -* `--use-password / --no-use-password`: Set this to `True` to protect the generated Bittensor key with a password. [default: use-password] -* `--uri TEXT`: Create wallet from uri (e.g. 'Alice', 'Bob', 'Charlie', 'Dave', 'Eve') -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallet balance` - -Check the balance of the wallet. This command shows a detailed view of the wallet's coldkey balances, including free and staked balances. - -You can also pass multiple ss58 addresses of coldkeys to check their balance (using --ss58). - -**Example:** - -- To display the balance of a single wallet, use the command with the `--wallet-name` argument and provide the wallet name: - - ``` - btcli w balance --wallet-name WALLET - ``` - -- To use the default config values, use: - - ``` - btcli w balance - ``` - -- To display the balances of all your wallets, use the `--all` argument: - - ``` - btcli w balance --all - ``` - -- To display the balances of ss58 addresses, use the `--ss58` argument: - - ``` - btcli w balance --ss58 <ss58_address> --ss58 <ss58_address> - ``` - -**Usage**: - -```console -btcli wallet balance [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--ss58, --ss58-address TEXT`: The SS58 address of the coldkey. -* `-a, --all`: Whether to display the balances for all the wallets. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallet history` - -Show the history of the transfers carried out with the provided wallet on the Bittensor network. - -**Usage:** - -The output shows the latest transfers of the provided wallet, showing the columns 'From', 'To', 'Amount', 'Extrinsic ID' and 'Block Number'. - -**Example:** - -``` -btcli wallet history -``` - -**Usage**: - -```console -btcli wallet history [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallet overview` - -Displays a detailed overview of the user's registered accounts on the Bittensor network. - -This command compiles and displays comprehensive information about each neuron associated with the user's wallets, including both hotkeys and coldkeys. It is especially useful for users managing multiple accounts or looking for a summary of their network activities and stake distributions. - -**Usage:** - -``` -btcli wallet overview -``` - -``` -btcli wallet overview --all -``` - -Note: This command is read-only and does not modify the blockchain state or account configuration. -It provides a quick and comprehensive view of the user's network presence, making it useful for monitoring account status, -stake distribution, and overall contribution to the Bittensor network. - -**Usage**: - -```console -btcli wallet overview [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-a, --all`: See an overview for all the wallets -* `--sort-by, --sort_by TEXT`: Sort the hotkeys by the specified column title. For example: name, uid, axon. -* `--sort-order, --sort_order TEXT`: Sort the hotkeys in the specified order (ascending/asc or descending/desc/reverse). -* `-in, --include-hotkeys TEXT`: Hotkeys to include. Specify by name or ss58 address. If left empty, all hotkeys, except those in the '--exclude-hotkeys', will be included. -* `-ex, --exclude-hotkeys TEXT`: Hotkeys to exclude. Specify by name or ss58 address. If left empty, all hotkeys, except those in the '--include-hotkeys', will be excluded. -* `-n, --netuids, --netuid TEXT`: Set the netuid(s) to exclude. Separate multiple netuids with a comma, for example: `-n 0,1,2`. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallet transfer` - -Send TAO tokens from one wallet to another wallet on the Bittensor network. - -This command is used for transactions between different wallet accounts, enabling users to send tokens to other -participants on the network. The command displays the user's current balance before prompting for the amount -to transfer (send), ensuring transparency and accuracy in the transaction. - -**Usage:** - -The command requires that you specify the destination address (public key) and the amount of TAO you want transferred. -It checks if sufficient balance exists in your wallet and prompts for confirmation before proceeding with the transaction. - -**Example:** - -``` -btcli wallet transfer --dest 5Dp8... --amount 100 -``` - -Note: This command is used for executing token transfers within the Bittensor network. Users should verify the destination address and the TAO amount before confirming the transaction to avoid errors or loss of funds. - -**Usage**: - -```console -btcli wallet transfer [OPTIONS] -``` - -**Options**: - -* `-d, --destination, --dest TEXT`: Destination address (ss58) of the wallet (coldkey). -* `-a, --amount FLOAT`: Amount (in TAO) to transfer. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallet inspect` - -Displays the details of the user's wallet pairs (coldkey, hotkey) on the Bittensor network. - -The output is presented as a table with the below columns: - -- Coldkey: The coldkey associated with the user's wallet. - -- Balance: The balance of the coldkey. - -- Delegate: The name of the delegate to which the coldkey has staked TAO. - -- Stake: The amount of stake held by both the coldkey and hotkey. - -- Emission: The emission or rewards earned from staking. - -- Netuid: The network unique identifier of the subnet where the hotkey is active (i.e., validating). - -- Hotkey: The hotkey associated with the neuron on the network. - -**Usage:** - -This command can be used to inspect a single wallet or all the wallets located at a specified path. It is useful for a comprehensive overview of a user's participation and performance in the Bittensor network. - -**Example:** - -``` -btcli wallet inspect -``` - -``` -btcli wallet inspect --all -n 1 -n 2 -n 3 -``` - -Note: The `inspect` command is for displaying information only and does not perform any transactions or state changes on the blockchain. It is intended to be used with Bittensor CLI and not as a standalone function in user code. - -**Usage**: - -```console -btcli wallet inspect [OPTIONS] -``` - -**Options**: - -* `-a, --all, --all-wallets`: Inspect all the wallets at the specified wallet path. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `-n, --netuids, --netuid TEXT`: Set the netuid(s) to exclude. Separate multiple netuids with a comma, for example: `-n 0,1,2`. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallet faucet` - -Obtain test TAO tokens by performing Proof of Work (PoW). - -This command is useful for users who need test tokens for operations on a local blockchain. - -**Important:**: THIS COMMAND IS DISABLED ON FINNEY AND TESTNET. - -**Usage:** - -The command uses the proof-of-work (POW) mechanism to validate the user's effort and rewards them with test TAO tokens. It is -typically used in local blockchain environments where transactions do not use real TAO tokens. - -**Example:** - -``` -btcli wallet faucet --faucet.num_processes 4 --faucet.cuda.use_cuda -``` - -Note: This command is meant for used in local environments where users can experiment with the blockchain without using real TAO tokens. Users must have the necessary hardware setup, especially when opting for CUDA-based GPU calculations. It is currently disabled on testnet and mainnet (finney). You can only use this command on a local blockchain. - -**Usage**: - -```console -btcli wallet faucet [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--processors INTEGER`: Number of processors to use for proof of work (POW) registration. -* `-u, --update-interval INTEGER`: The number of nonces to process before checking for next block during registration [default: 50000] -* `--output-in-place / --no-output-in-place`: Whether to output the registration statistics in-place. [default: output-in-place] -* `-v, --verbose`: Whether to output the registration statistics verbosely. -* `--use-cuda, --cuda / --no-use-cuda, --no-cuda`: Set flag to use CUDA for proof of work (POW) registration. [default: no-use-cuda] -* `-d, --dev-id INTEGER`: Set the CUDA device id(s) in the order of speed, where 0 is the fastest. [default: 0] -* `-tbp, --threads-per-block INTEGER`: Set the number of threads per block for CUDA. [default: 256] -* `--max-successes INTEGER`: Set the maximum number of times to successfully run the faucet for this command. [default: 3] -* `--help`: Show this message and exit. - -### `btcli wallet set-identity` - -Create or update the on-chain identity of a coldkey or a hotkey on the Bittensor network. Incurs a 1 TAO transaction fee. - -The on-chain identity includes attributes such as display name, legal name, web URL, PGP fingerprint, and contact information, among others. - -The command prompts the user for the identity attributes and validates the input size for each attribute. It provides an option to update an existing validator hotkey identity. If the user consents to the transaction cost, the identity is updated on the blockchain. - -Each field has a maximum size of 64 bytes. The PGP fingerprint field is an exception and has a maximum size of 20 bytes. The user is prompted to enter the PGP fingerprint as a hex string, which is then converted to bytes. The user is also prompted to enter the coldkey or hotkey ``ss58`` address for the identity to be updated. - -If the user does not have a hotkey, the coldkey address is used by default. If setting a validator identity, the hotkey will be used by default. If the user is setting an identity for a subnet, the coldkey will be used by default. - -**Example:** - -``` -btcli wallet set_identity -``` - -Note: This command should only be used if the user is willing to incur the a recycle fee associated with setting an identity on the blockchain. It is a high-level command that makes changes to the blockchain state and should not be used programmatically as part of other scripts or applications. - -**Usage**: - -```console -btcli wallet set-identity [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--name TEXT`: The display name for the identity. -* `--web-url, --web TEXT`: The web URL for the identity. -* `--image-url, --image TEXT`: The image URL for the identity. -* `--discord TEXT`: The Discord handle for the identity. -* `--description TEXT`: The description for the identity. -* `--additional TEXT`: Additional details for the identity. -* `--github TEXT`: The GitHub repository for the identity. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--help`: Show this message and exit. - -### `btcli wallet get-identity` - -Shows the identity details of a user's coldkey or hotkey. - -The command displays the information in a table format showing: - -- Address: The ``ss58`` address of the queried key. - -- Item: Various attributes of the identity such as stake, rank, and trust. - -- Value: The corresponding values of the attributes. - -**Example:** - -``` -btcli wallet get_identity --key <s58_address> -``` - -Note: This command is primarily used for informational purposes and has no side effects on the blockchain network state. - -**Usage**: - -```console -btcli wallet get-identity [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-k, --ss58, --coldkey_ss58, --coldkey.ss58_address, --coldkey.ss58, --key TEXT`: Coldkey address of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallet sign` - -Allows users to sign a message with the provided wallet or wallet hotkey. Use this command to easily prove your ownership of a coldkey or a hotkey. - -**Usage:** - -Using the provided wallet (coldkey), the command generates a signature for a given message. - -**Example:** - -``` -btcli wallet sign --wallet-name default --message '{"something": "here", "timestamp": 1719908486}' -``` - -``` -btcli wallet sign --wallet-name default --wallet-hotkey hotkey --message '{"something": "here", "timestamp": 1719908486}' -``` - -**Usage**: - -```console -btcli wallet sign [OPTIONS] -``` - -**Options**: - -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--use-hotkey / --no-use-hotkey`: If specified, the message will be signed by the hotkey. If not specified, the user will be prompted. -* `--message TEXT`: The message to encode and sign -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallet swap_hotkey` - -Swap hotkeys of a given wallet on the blockchain. For a registered key pair, for example, a (coldkeyA, hotkeyA) pair, this command swaps the hotkeyA with a new, unregistered, hotkeyB to move the original registration to the (coldkeyA, hotkeyB) pair. - -**Usage:** - -The command is used to swap the hotkey of a wallet for another hotkey on that same wallet. - -**Important:** - -- Make sure that your original key pair (coldkeyA, hotkeyA) is already registered. -- Make sure that you use a newly created hotkeyB in this command. A hotkeyB that is already registered cannot be used in this command. -- Finally, note that this command requires a fee of 1 TAO for recycling and this fee is taken from your wallet (coldkeyA). - -**Example:** - -``` -btcli wallet swap_hotkey destination_hotkey_name --wallet-name your_wallet_name --wallet-hotkey original_hotkey -``` - -**Usage**: - -```console -btcli wallet swap_hotkey [OPTIONS] [DESTINATION_HOTKEY_NAME] -``` - -**Arguments**: - -* `[DESTINATION_HOTKEY_NAME]`: Destination hotkey name. - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--help`: Show this message and exit. - -### `btcli wallet regen_coldkey` - -Regenerate a coldkey for a wallet on the Bittensor blockchain network. - -This command is used to create a new coldkey from an existing mnemonic, seed, or JSON file. - -**Usage:** - -Users can specify a mnemonic, a seed string, or a JSON file path to regenerate a coldkey. The command supports optional password protection for the generated key. - -**Example:** - -``` -btcli wallet regen-coldkey --mnemonic "word1 word2 ... word12" -``` - - -Note: This command is critical for users who need to regenerate their coldkey either for recovery or for security reasons. - -**Usage**: - -```console -btcli wallet regen_coldkey [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--mnemonic TEXT`: Mnemonic used to regenerate your key. For example: horse cart dog ... -* `--seed TEXT`: Seed hex string used to regenerate your key. For example: 0x1234... -* `-j, --json TEXT`: Path to a JSON file containing the encrypted key backup. For example, a JSON file from PolkadotJS. -* `--json-password TEXT`: Password to decrypt the JSON file. -* `--use-password / --no-use-password`: Set this to `True` to protect the generated Bittensor key with a password. [default: use-password] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallet regen_coldkeypub` - -Regenerates the public part of a coldkey (coldkeypub.txt) for a wallet. - -Use this command when you need to move machine for subnet mining. Use the public key or SS58 address from your coldkeypub.txt that you have on another machine to regenerate the coldkeypub.txt on this new machine. - -**Usage:** - -The command requires either a public key in hexadecimal format or an ``SS58`` address from the existing coldkeypub.txt from old machine to regenerate the coldkeypub on the new machine. - -**Example:** - -``` -btcli wallet regen_coldkeypub --ss58_address 5DkQ4... -``` - -Note: This command is particularly useful for users who need to regenerate their coldkeypub, perhaps due to file corruption or loss. You will need either ss58 address or public hex key from your old coldkeypub.txt for the wallet. It is a recovery-focused utility that ensures continued access to your wallet functionalities. - -**Usage**: - -```console -btcli wallet regen_coldkeypub [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--public-key-hex TEXT`: The public key in hex format. -* `--ss58, --ss58-address TEXT`: The SS58 address of the coldkey. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallet regen_hotkey` - -Regenerates a hotkey for a wallet. - -Similar to regenerating a coldkey, this command creates a new hotkey from a mnemonic, seed, or JSON file. - -**Usage:** - -Users can provide a mnemonic, seed string, or a JSON file to regenerate the hotkey. The command supports optional password protection and can overwrite an existing hotkey. - - -``` -btcli wallet regen_hotkey --seed 0x1234... -``` - -Note: This command is essential for users who need to regenerate their hotkey, possibly for security upgrades or key recovery. -It should be used with caution to avoid accidental overwriting of existing keys. - -**Usage**: - -```console -btcli wallet regen_hotkey [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--mnemonic TEXT`: Mnemonic used to regenerate your key. For example: horse cart dog ... -* `--seed TEXT`: Seed hex string used to regenerate your key. For example: 0x1234... -* `-j, --json TEXT`: Path to a JSON file containing the encrypted key backup. For example, a JSON file from PolkadotJS. -* `--json-password TEXT`: Password to decrypt the JSON file. -* `--use-password / --no-use-password`: Set to 'True' to protect the generated Bittensor key with a password. [default: no-use-password] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallet new_hotkey` - -Create a new hotkey for a wallet. - -**Usage:** - -This command is used to generate a new hotkey for managing a neuron or participating in a subnet. It provides options for the mnemonic word count, and supports password protection. It also allows overwriting the -existing hotkey. - -**Example:** - -``` -btcli wallet new-hotkey --n_words 24 -``` - -Note: This command is useful to create additional hotkeys for different purposes, such as running multiple subnet miners or subnet validators or separating operational roles within the Bittensor network. - -**Usage**: - -```console -btcli wallet new_hotkey [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--n-words, --n_words INTEGER`: The number of words used in the mnemonic. Options: [12, 15, 18, 21, 24] -* `--use-password / --no-use-password`: Set to 'True' to protect the generated Bittensor key with a password. [default: no-use-password] -* `--uri TEXT`: Create wallet from uri (e.g. 'Alice', 'Bob', 'Charlie', 'Dave', 'Eve') -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallet new_coldkey` - -Create a new coldkey. A coldkey is required for holding TAO balances and performing high-value transactions. - -**Usage:** - -The command creates a new coldkey. It provides options for the mnemonic word count, and supports password protection. It also allows overwriting an existing coldkey. - -**Example:** - -``` -btcli wallet new_coldkey --n_words 15 -``` - -Note: This command is crucial for users who need to create a new coldkey for enhanced security or as part of setting up a new wallet. It is a foundational step in establishing a secure presence on the Bittensor network. - -**Usage**: - -```console -btcli wallet new_coldkey [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--n-words, --n_words INTEGER`: The number of words used in the mnemonic. Options: [12, 15, 18, 21, 24] -* `--use-password / --no-use-password`: Set this to `True` to protect the generated Bittensor key with a password. [default: use-password] -* `--uri TEXT`: Create wallet from uri (e.g. 'Alice', 'Bob', 'Charlie', 'Dave', 'Eve') -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallet set_identity` - -Create or update the on-chain identity of a coldkey or a hotkey on the Bittensor network. Incurs a 1 TAO transaction fee. - -The on-chain identity includes attributes such as display name, legal name, web URL, PGP fingerprint, and contact information, among others. - -The command prompts the user for the identity attributes and validates the input size for each attribute. It provides an option to update an existing validator hotkey identity. If the user consents to the transaction cost, the identity is updated on the blockchain. - -Each field has a maximum size of 64 bytes. The PGP fingerprint field is an exception and has a maximum size of 20 bytes. The user is prompted to enter the PGP fingerprint as a hex string, which is then converted to bytes. The user is also prompted to enter the coldkey or hotkey ``ss58`` address for the identity to be updated. - -If the user does not have a hotkey, the coldkey address is used by default. If setting a validator identity, the hotkey will be used by default. If the user is setting an identity for a subnet, the coldkey will be used by default. - -**Example:** - -``` -btcli wallet set_identity -``` - -Note: This command should only be used if the user is willing to incur the a recycle fee associated with setting an identity on the blockchain. It is a high-level command that makes changes to the blockchain state and should not be used programmatically as part of other scripts or applications. - -**Usage**: - -```console -btcli wallet set_identity [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--name TEXT`: The display name for the identity. -* `--web-url, --web TEXT`: The web URL for the identity. -* `--image-url, --image TEXT`: The image URL for the identity. -* `--discord TEXT`: The Discord handle for the identity. -* `--description TEXT`: The description for the identity. -* `--additional TEXT`: Additional details for the identity. -* `--github TEXT`: The GitHub repository for the identity. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--help`: Show this message and exit. - -### `btcli wallet get_identity` - -Shows the identity details of a user's coldkey or hotkey. - -The command displays the information in a table format showing: - -- Address: The ``ss58`` address of the queried key. - -- Item: Various attributes of the identity such as stake, rank, and trust. - -- Value: The corresponding values of the attributes. - -**Example:** - -``` -btcli wallet get_identity --key <s58_address> -``` - -Note: This command is primarily used for informational purposes and has no side effects on the blockchain network state. - -**Usage**: - -```console -btcli wallet get_identity [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-k, --ss58, --coldkey_ss58, --coldkey.ss58_address, --coldkey.ss58, --key TEXT`: Coldkey address of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -## `btcli w` - -**Usage**: - -```console -btcli w [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--help`: Show this message and exit. - -**Commands**: - -* `list`: Displays all the wallets and their... -* `swap-hotkey`: Swap hotkeys of a given wallet on the... -* `regen-coldkey`: Regenerate a coldkey for a wallet on the... -* `regen-coldkeypub`: Regenerates the public part of a coldkey... -* `regen-hotkey`: Regenerates a hotkey for a wallet. -* `new-hotkey`: Create a new hotkey for a wallet. -* `new-coldkey`: Create a new coldkey. -* `create`: Create a complete wallet by setting up... -* `balance`: Check the balance of the wallet. -* `history`: Show the history of the transfers carried... -* `overview`: Displays a detailed overview of the user's... -* `transfer`: Send TAO tokens from one wallet to another... -* `inspect`: Displays the details of the user's wallet... -* `faucet`: Obtain test TAO tokens by performing Proof... -* `set-identity`: Create or update the on-chain identity of... -* `get-identity`: Shows the identity details of a user's... -* `sign`: Allows users to sign a message with the... -* `swap_hotkey`: Swap hotkeys of a given wallet on the... -* `regen_coldkey`: Regenerate a coldkey for a wallet on the... -* `regen_coldkeypub`: Regenerates the public part of a coldkey... -* `regen_hotkey`: Regenerates a hotkey for a wallet. -* `new_hotkey`: Create a new hotkey for a wallet. -* `new_coldkey`: Create a new coldkey. -* `set_identity`: Create or update the on-chain identity of... -* `get_identity`: Shows the identity details of a user's... - -### `btcli w list` - -Displays all the wallets and their corresponding hotkeys that are located in the wallet path specified in the config. - -The output display shows each wallet and its associated `ss58` addresses for the coldkey public key and any hotkeys. The output is presented in a hierarchical tree format, with each wallet as a root node and any associated hotkeys as child nodes. The `ss58` address is displayed for each coldkey and hotkey that is not encrypted and exists on the device. - -Upon invocation, the command scans the wallet directory and prints a list of all the wallets, indicating whether the -public keys are available (`?` denotes unavailable or encrypted keys). - - -``` -btcli wallet list --path ~/.bittensor -``` - -Note: This command is read-only and does not modify the filesystem or the blockchain state. It is intended for use with the Bittensor CLI to provide a quick overview of the user's wallets. - -**Usage**: - -```console -btcli w list [OPTIONS] -``` - -**Options**: - -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli w swap-hotkey` - -Swap hotkeys of a given wallet on the blockchain. For a registered key pair, for example, a (coldkeyA, hotkeyA) pair, this command swaps the hotkeyA with a new, unregistered, hotkeyB to move the original registration to the (coldkeyA, hotkeyB) pair. - -**Usage:** - -The command is used to swap the hotkey of a wallet for another hotkey on that same wallet. - -**Important:** - -- Make sure that your original key pair (coldkeyA, hotkeyA) is already registered. -- Make sure that you use a newly created hotkeyB in this command. A hotkeyB that is already registered cannot be used in this command. -- Finally, note that this command requires a fee of 1 TAO for recycling and this fee is taken from your wallet (coldkeyA). - -**Example:** - -``` -btcli wallet swap_hotkey destination_hotkey_name --wallet-name your_wallet_name --wallet-hotkey original_hotkey -``` - -**Usage**: - -```console -btcli w swap-hotkey [OPTIONS] [DESTINATION_HOTKEY_NAME] -``` - -**Arguments**: - -* `[DESTINATION_HOTKEY_NAME]`: Destination hotkey name. - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--help`: Show this message and exit. - -### `btcli w regen-coldkey` - -Regenerate a coldkey for a wallet on the Bittensor blockchain network. - -This command is used to create a new coldkey from an existing mnemonic, seed, or JSON file. - -**Usage:** - -Users can specify a mnemonic, a seed string, or a JSON file path to regenerate a coldkey. The command supports optional password protection for the generated key. - -**Example:** - -``` -btcli wallet regen-coldkey --mnemonic "word1 word2 ... word12" -``` - - -Note: This command is critical for users who need to regenerate their coldkey either for recovery or for security reasons. - -**Usage**: - -```console -btcli w regen-coldkey [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--mnemonic TEXT`: Mnemonic used to regenerate your key. For example: horse cart dog ... -* `--seed TEXT`: Seed hex string used to regenerate your key. For example: 0x1234... -* `-j, --json TEXT`: Path to a JSON file containing the encrypted key backup. For example, a JSON file from PolkadotJS. -* `--json-password TEXT`: Password to decrypt the JSON file. -* `--use-password / --no-use-password`: Set this to `True` to protect the generated Bittensor key with a password. [default: use-password] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli w regen-coldkeypub` - -Regenerates the public part of a coldkey (coldkeypub.txt) for a wallet. - -Use this command when you need to move machine for subnet mining. Use the public key or SS58 address from your coldkeypub.txt that you have on another machine to regenerate the coldkeypub.txt on this new machine. - -**Usage:** - -The command requires either a public key in hexadecimal format or an ``SS58`` address from the existing coldkeypub.txt from old machine to regenerate the coldkeypub on the new machine. - -**Example:** - -``` -btcli wallet regen_coldkeypub --ss58_address 5DkQ4... -``` - -Note: This command is particularly useful for users who need to regenerate their coldkeypub, perhaps due to file corruption or loss. You will need either ss58 address or public hex key from your old coldkeypub.txt for the wallet. It is a recovery-focused utility that ensures continued access to your wallet functionalities. - -**Usage**: - -```console -btcli w regen-coldkeypub [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--public-key-hex TEXT`: The public key in hex format. -* `--ss58, --ss58-address TEXT`: The SS58 address of the coldkey. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli w regen-hotkey` - -Regenerates a hotkey for a wallet. - -Similar to regenerating a coldkey, this command creates a new hotkey from a mnemonic, seed, or JSON file. - -**Usage:** - -Users can provide a mnemonic, seed string, or a JSON file to regenerate the hotkey. The command supports optional password protection and can overwrite an existing hotkey. - - -``` -btcli wallet regen_hotkey --seed 0x1234... -``` - -Note: This command is essential for users who need to regenerate their hotkey, possibly for security upgrades or key recovery. -It should be used with caution to avoid accidental overwriting of existing keys. - -**Usage**: - -```console -btcli w regen-hotkey [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--mnemonic TEXT`: Mnemonic used to regenerate your key. For example: horse cart dog ... -* `--seed TEXT`: Seed hex string used to regenerate your key. For example: 0x1234... -* `-j, --json TEXT`: Path to a JSON file containing the encrypted key backup. For example, a JSON file from PolkadotJS. -* `--json-password TEXT`: Password to decrypt the JSON file. -* `--use-password / --no-use-password`: Set to 'True' to protect the generated Bittensor key with a password. [default: no-use-password] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli w new-hotkey` - -Create a new hotkey for a wallet. - -**Usage:** - -This command is used to generate a new hotkey for managing a neuron or participating in a subnet. It provides options for the mnemonic word count, and supports password protection. It also allows overwriting the -existing hotkey. - -**Example:** - -``` -btcli wallet new-hotkey --n_words 24 -``` - -Note: This command is useful to create additional hotkeys for different purposes, such as running multiple subnet miners or subnet validators or separating operational roles within the Bittensor network. - -**Usage**: - -```console -btcli w new-hotkey [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--n-words, --n_words INTEGER`: The number of words used in the mnemonic. Options: [12, 15, 18, 21, 24] -* `--use-password / --no-use-password`: Set to 'True' to protect the generated Bittensor key with a password. [default: no-use-password] -* `--uri TEXT`: Create wallet from uri (e.g. 'Alice', 'Bob', 'Charlie', 'Dave', 'Eve') -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli w new-coldkey` - -Create a new coldkey. A coldkey is required for holding TAO balances and performing high-value transactions. - -**Usage:** - -The command creates a new coldkey. It provides options for the mnemonic word count, and supports password protection. It also allows overwriting an existing coldkey. - -**Example:** - -``` -btcli wallet new_coldkey --n_words 15 -``` - -Note: This command is crucial for users who need to create a new coldkey for enhanced security or as part of setting up a new wallet. It is a foundational step in establishing a secure presence on the Bittensor network. - -**Usage**: - -```console -btcli w new-coldkey [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--n-words, --n_words INTEGER`: The number of words used in the mnemonic. Options: [12, 15, 18, 21, 24] -* `--use-password / --no-use-password`: Set this to `True` to protect the generated Bittensor key with a password. [default: use-password] -* `--uri TEXT`: Create wallet from uri (e.g. 'Alice', 'Bob', 'Charlie', 'Dave', 'Eve') -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli w create` - -Create a complete wallet by setting up both coldkey and hotkeys. - -**Usage:** - -The command creates a new coldkey and hotkey. It provides an option for mnemonic word count. It supports password protection for the coldkey and allows overwriting of existing keys. - -**Example:** - -``` -btcli wallet create --n_words 21 -``` - -Note: This command is for new users setting up their wallet for the first time, or for those who wish to completely renew their wallet keys. It ensures a fresh start with new keys for secure and effective participation in the Bittensor network. - -**Usage**: - -```console -btcli w create [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--n-words INTEGER` -* `--use-password / --no-use-password`: Set this to `True` to protect the generated Bittensor key with a password. [default: use-password] -* `--uri TEXT`: Create wallet from uri (e.g. 'Alice', 'Bob', 'Charlie', 'Dave', 'Eve') -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli w balance` - -Check the balance of the wallet. This command shows a detailed view of the wallet's coldkey balances, including free and staked balances. - -You can also pass multiple ss58 addresses of coldkeys to check their balance (using --ss58). - -**Example:** - -- To display the balance of a single wallet, use the command with the `--wallet-name` argument and provide the wallet name: - - ``` - btcli w balance --wallet-name WALLET - ``` - -- To use the default config values, use: - - ``` - btcli w balance - ``` - -- To display the balances of all your wallets, use the `--all` argument: - - ``` - btcli w balance --all - ``` - -- To display the balances of ss58 addresses, use the `--ss58` argument: - - ``` - btcli w balance --ss58 <ss58_address> --ss58 <ss58_address> - ``` - -**Usage**: - -```console -btcli w balance [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--ss58, --ss58-address TEXT`: The SS58 address of the coldkey. -* `-a, --all`: Whether to display the balances for all the wallets. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli w history` - -Show the history of the transfers carried out with the provided wallet on the Bittensor network. - -**Usage:** - -The output shows the latest transfers of the provided wallet, showing the columns 'From', 'To', 'Amount', 'Extrinsic ID' and 'Block Number'. - -**Example:** - -``` -btcli wallet history -``` - -**Usage**: - -```console -btcli w history [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli w overview` - -Displays a detailed overview of the user's registered accounts on the Bittensor network. - -This command compiles and displays comprehensive information about each neuron associated with the user's wallets, including both hotkeys and coldkeys. It is especially useful for users managing multiple accounts or looking for a summary of their network activities and stake distributions. - -**Usage:** - -``` -btcli wallet overview -``` - -``` -btcli wallet overview --all -``` - -Note: This command is read-only and does not modify the blockchain state or account configuration. -It provides a quick and comprehensive view of the user's network presence, making it useful for monitoring account status, -stake distribution, and overall contribution to the Bittensor network. - -**Usage**: - -```console -btcli w overview [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-a, --all`: See an overview for all the wallets -* `--sort-by, --sort_by TEXT`: Sort the hotkeys by the specified column title. For example: name, uid, axon. -* `--sort-order, --sort_order TEXT`: Sort the hotkeys in the specified order (ascending/asc or descending/desc/reverse). -* `-in, --include-hotkeys TEXT`: Hotkeys to include. Specify by name or ss58 address. If left empty, all hotkeys, except those in the '--exclude-hotkeys', will be included. -* `-ex, --exclude-hotkeys TEXT`: Hotkeys to exclude. Specify by name or ss58 address. If left empty, all hotkeys, except those in the '--include-hotkeys', will be excluded. -* `-n, --netuids, --netuid TEXT`: Set the netuid(s) to exclude. Separate multiple netuids with a comma, for example: `-n 0,1,2`. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli w transfer` - -Send TAO tokens from one wallet to another wallet on the Bittensor network. - -This command is used for transactions between different wallet accounts, enabling users to send tokens to other -participants on the network. The command displays the user's current balance before prompting for the amount -to transfer (send), ensuring transparency and accuracy in the transaction. - -**Usage:** - -The command requires that you specify the destination address (public key) and the amount of TAO you want transferred. -It checks if sufficient balance exists in your wallet and prompts for confirmation before proceeding with the transaction. - -**Example:** - -``` -btcli wallet transfer --dest 5Dp8... --amount 100 -``` - -Note: This command is used for executing token transfers within the Bittensor network. Users should verify the destination address and the TAO amount before confirming the transaction to avoid errors or loss of funds. - -**Usage**: - -```console -btcli w transfer [OPTIONS] -``` - -**Options**: - -* `-d, --destination, --dest TEXT`: Destination address (ss58) of the wallet (coldkey). -* `-a, --amount FLOAT`: Amount (in TAO) to transfer. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli w inspect` - -Displays the details of the user's wallet pairs (coldkey, hotkey) on the Bittensor network. - -The output is presented as a table with the below columns: - -- Coldkey: The coldkey associated with the user's wallet. - -- Balance: The balance of the coldkey. - -- Delegate: The name of the delegate to which the coldkey has staked TAO. - -- Stake: The amount of stake held by both the coldkey and hotkey. - -- Emission: The emission or rewards earned from staking. - -- Netuid: The network unique identifier of the subnet where the hotkey is active (i.e., validating). - -- Hotkey: The hotkey associated with the neuron on the network. - -**Usage:** - -This command can be used to inspect a single wallet or all the wallets located at a specified path. It is useful for a comprehensive overview of a user's participation and performance in the Bittensor network. - -**Example:** - -``` -btcli wallet inspect -``` - -``` -btcli wallet inspect --all -n 1 -n 2 -n 3 -``` - -Note: The `inspect` command is for displaying information only and does not perform any transactions or state changes on the blockchain. It is intended to be used with Bittensor CLI and not as a standalone function in user code. - -**Usage**: - -```console -btcli w inspect [OPTIONS] -``` - -**Options**: - -* `-a, --all, --all-wallets`: Inspect all the wallets at the specified wallet path. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `-n, --netuids, --netuid TEXT`: Set the netuid(s) to exclude. Separate multiple netuids with a comma, for example: `-n 0,1,2`. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli w faucet` - -Obtain test TAO tokens by performing Proof of Work (PoW). - -This command is useful for users who need test tokens for operations on a local blockchain. - -**Important:**: THIS COMMAND IS DISABLED ON FINNEY AND TESTNET. - -**Usage:** - -The command uses the proof-of-work (POW) mechanism to validate the user's effort and rewards them with test TAO tokens. It is -typically used in local blockchain environments where transactions do not use real TAO tokens. - -**Example:** - -``` -btcli wallet faucet --faucet.num_processes 4 --faucet.cuda.use_cuda -``` - -Note: This command is meant for used in local environments where users can experiment with the blockchain without using real TAO tokens. Users must have the necessary hardware setup, especially when opting for CUDA-based GPU calculations. It is currently disabled on testnet and mainnet (finney). You can only use this command on a local blockchain. - -**Usage**: - -```console -btcli w faucet [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--processors INTEGER`: Number of processors to use for proof of work (POW) registration. -* `-u, --update-interval INTEGER`: The number of nonces to process before checking for next block during registration [default: 50000] -* `--output-in-place / --no-output-in-place`: Whether to output the registration statistics in-place. [default: output-in-place] -* `-v, --verbose`: Whether to output the registration statistics verbosely. -* `--use-cuda, --cuda / --no-use-cuda, --no-cuda`: Set flag to use CUDA for proof of work (POW) registration. [default: no-use-cuda] -* `-d, --dev-id INTEGER`: Set the CUDA device id(s) in the order of speed, where 0 is the fastest. [default: 0] -* `-tbp, --threads-per-block INTEGER`: Set the number of threads per block for CUDA. [default: 256] -* `--max-successes INTEGER`: Set the maximum number of times to successfully run the faucet for this command. [default: 3] -* `--help`: Show this message and exit. - -### `btcli w set-identity` - -Create or update the on-chain identity of a coldkey or a hotkey on the Bittensor network. Incurs a 1 TAO transaction fee. - -The on-chain identity includes attributes such as display name, legal name, web URL, PGP fingerprint, and contact information, among others. - -The command prompts the user for the identity attributes and validates the input size for each attribute. It provides an option to update an existing validator hotkey identity. If the user consents to the transaction cost, the identity is updated on the blockchain. - -Each field has a maximum size of 64 bytes. The PGP fingerprint field is an exception and has a maximum size of 20 bytes. The user is prompted to enter the PGP fingerprint as a hex string, which is then converted to bytes. The user is also prompted to enter the coldkey or hotkey ``ss58`` address for the identity to be updated. - -If the user does not have a hotkey, the coldkey address is used by default. If setting a validator identity, the hotkey will be used by default. If the user is setting an identity for a subnet, the coldkey will be used by default. - -**Example:** - -``` -btcli wallet set_identity -``` - -Note: This command should only be used if the user is willing to incur the a recycle fee associated with setting an identity on the blockchain. It is a high-level command that makes changes to the blockchain state and should not be used programmatically as part of other scripts or applications. - -**Usage**: - -```console -btcli w set-identity [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--name TEXT`: The display name for the identity. -* `--web-url, --web TEXT`: The web URL for the identity. -* `--image-url, --image TEXT`: The image URL for the identity. -* `--discord TEXT`: The Discord handle for the identity. -* `--description TEXT`: The description for the identity. -* `--additional TEXT`: Additional details for the identity. -* `--github TEXT`: The GitHub repository for the identity. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--help`: Show this message and exit. - -### `btcli w get-identity` - -Shows the identity details of a user's coldkey or hotkey. - -The command displays the information in a table format showing: - -- Address: The ``ss58`` address of the queried key. - -- Item: Various attributes of the identity such as stake, rank, and trust. - -- Value: The corresponding values of the attributes. - -**Example:** - -``` -btcli wallet get_identity --key <s58_address> -``` - -Note: This command is primarily used for informational purposes and has no side effects on the blockchain network state. - -**Usage**: - -```console -btcli w get-identity [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-k, --ss58, --coldkey_ss58, --coldkey.ss58_address, --coldkey.ss58, --key TEXT`: Coldkey address of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli w sign` - -Allows users to sign a message with the provided wallet or wallet hotkey. Use this command to easily prove your ownership of a coldkey or a hotkey. - -**Usage:** - -Using the provided wallet (coldkey), the command generates a signature for a given message. - -**Example:** - -``` -btcli wallet sign --wallet-name default --message '{"something": "here", "timestamp": 1719908486}' -``` - -``` -btcli wallet sign --wallet-name default --wallet-hotkey hotkey --message '{"something": "here", "timestamp": 1719908486}' -``` - -**Usage**: - -```console -btcli w sign [OPTIONS] -``` - -**Options**: - -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--use-hotkey / --no-use-hotkey`: If specified, the message will be signed by the hotkey. If not specified, the user will be prompted. -* `--message TEXT`: The message to encode and sign -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli w swap_hotkey` - -Swap hotkeys of a given wallet on the blockchain. For a registered key pair, for example, a (coldkeyA, hotkeyA) pair, this command swaps the hotkeyA with a new, unregistered, hotkeyB to move the original registration to the (coldkeyA, hotkeyB) pair. - -**Usage:** - -The command is used to swap the hotkey of a wallet for another hotkey on that same wallet. - -**Important:** - -- Make sure that your original key pair (coldkeyA, hotkeyA) is already registered. -- Make sure that you use a newly created hotkeyB in this command. A hotkeyB that is already registered cannot be used in this command. -- Finally, note that this command requires a fee of 1 TAO for recycling and this fee is taken from your wallet (coldkeyA). - -**Example:** - -``` -btcli wallet swap_hotkey destination_hotkey_name --wallet-name your_wallet_name --wallet-hotkey original_hotkey -``` - -**Usage**: - -```console -btcli w swap_hotkey [OPTIONS] [DESTINATION_HOTKEY_NAME] -``` - -**Arguments**: - -* `[DESTINATION_HOTKEY_NAME]`: Destination hotkey name. - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--help`: Show this message and exit. - -### `btcli w regen_coldkey` - -Regenerate a coldkey for a wallet on the Bittensor blockchain network. - -This command is used to create a new coldkey from an existing mnemonic, seed, or JSON file. - -**Usage:** - -Users can specify a mnemonic, a seed string, or a JSON file path to regenerate a coldkey. The command supports optional password protection for the generated key. - -**Example:** - -``` -btcli wallet regen-coldkey --mnemonic "word1 word2 ... word12" -``` - - -Note: This command is critical for users who need to regenerate their coldkey either for recovery or for security reasons. - -**Usage**: - -```console -btcli w regen_coldkey [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--mnemonic TEXT`: Mnemonic used to regenerate your key. For example: horse cart dog ... -* `--seed TEXT`: Seed hex string used to regenerate your key. For example: 0x1234... -* `-j, --json TEXT`: Path to a JSON file containing the encrypted key backup. For example, a JSON file from PolkadotJS. -* `--json-password TEXT`: Password to decrypt the JSON file. -* `--use-password / --no-use-password`: Set this to `True` to protect the generated Bittensor key with a password. [default: use-password] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli w regen_coldkeypub` - -Regenerates the public part of a coldkey (coldkeypub.txt) for a wallet. - -Use this command when you need to move machine for subnet mining. Use the public key or SS58 address from your coldkeypub.txt that you have on another machine to regenerate the coldkeypub.txt on this new machine. - -**Usage:** - -The command requires either a public key in hexadecimal format or an ``SS58`` address from the existing coldkeypub.txt from old machine to regenerate the coldkeypub on the new machine. - -**Example:** - -``` -btcli wallet regen_coldkeypub --ss58_address 5DkQ4... -``` - -Note: This command is particularly useful for users who need to regenerate their coldkeypub, perhaps due to file corruption or loss. You will need either ss58 address or public hex key from your old coldkeypub.txt for the wallet. It is a recovery-focused utility that ensures continued access to your wallet functionalities. - -**Usage**: - -```console -btcli w regen_coldkeypub [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--public-key-hex TEXT`: The public key in hex format. -* `--ss58, --ss58-address TEXT`: The SS58 address of the coldkey. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli w regen_hotkey` - -Regenerates a hotkey for a wallet. - -Similar to regenerating a coldkey, this command creates a new hotkey from a mnemonic, seed, or JSON file. - -**Usage:** - -Users can provide a mnemonic, seed string, or a JSON file to regenerate the hotkey. The command supports optional password protection and can overwrite an existing hotkey. - - -``` -btcli wallet regen_hotkey --seed 0x1234... -``` - -Note: This command is essential for users who need to regenerate their hotkey, possibly for security upgrades or key recovery. -It should be used with caution to avoid accidental overwriting of existing keys. - -**Usage**: - -```console -btcli w regen_hotkey [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--mnemonic TEXT`: Mnemonic used to regenerate your key. For example: horse cart dog ... -* `--seed TEXT`: Seed hex string used to regenerate your key. For example: 0x1234... -* `-j, --json TEXT`: Path to a JSON file containing the encrypted key backup. For example, a JSON file from PolkadotJS. -* `--json-password TEXT`: Password to decrypt the JSON file. -* `--use-password / --no-use-password`: Set to 'True' to protect the generated Bittensor key with a password. [default: no-use-password] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli w new_hotkey` - -Create a new hotkey for a wallet. - -**Usage:** - -This command is used to generate a new hotkey for managing a neuron or participating in a subnet. It provides options for the mnemonic word count, and supports password protection. It also allows overwriting the -existing hotkey. - -**Example:** - -``` -btcli wallet new-hotkey --n_words 24 -``` - -Note: This command is useful to create additional hotkeys for different purposes, such as running multiple subnet miners or subnet validators or separating operational roles within the Bittensor network. - -**Usage**: - -```console -btcli w new_hotkey [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--n-words, --n_words INTEGER`: The number of words used in the mnemonic. Options: [12, 15, 18, 21, 24] -* `--use-password / --no-use-password`: Set to 'True' to protect the generated Bittensor key with a password. [default: no-use-password] -* `--uri TEXT`: Create wallet from uri (e.g. 'Alice', 'Bob', 'Charlie', 'Dave', 'Eve') -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli w new_coldkey` - -Create a new coldkey. A coldkey is required for holding TAO balances and performing high-value transactions. - -**Usage:** - -The command creates a new coldkey. It provides options for the mnemonic word count, and supports password protection. It also allows overwriting an existing coldkey. - -**Example:** - -``` -btcli wallet new_coldkey --n_words 15 -``` - -Note: This command is crucial for users who need to create a new coldkey for enhanced security or as part of setting up a new wallet. It is a foundational step in establishing a secure presence on the Bittensor network. - -**Usage**: - -```console -btcli w new_coldkey [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--n-words, --n_words INTEGER`: The number of words used in the mnemonic. Options: [12, 15, 18, 21, 24] -* `--use-password / --no-use-password`: Set this to `True` to protect the generated Bittensor key with a password. [default: use-password] -* `--uri TEXT`: Create wallet from uri (e.g. 'Alice', 'Bob', 'Charlie', 'Dave', 'Eve') -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli w set_identity` - -Create or update the on-chain identity of a coldkey or a hotkey on the Bittensor network. Incurs a 1 TAO transaction fee. - -The on-chain identity includes attributes such as display name, legal name, web URL, PGP fingerprint, and contact information, among others. - -The command prompts the user for the identity attributes and validates the input size for each attribute. It provides an option to update an existing validator hotkey identity. If the user consents to the transaction cost, the identity is updated on the blockchain. - -Each field has a maximum size of 64 bytes. The PGP fingerprint field is an exception and has a maximum size of 20 bytes. The user is prompted to enter the PGP fingerprint as a hex string, which is then converted to bytes. The user is also prompted to enter the coldkey or hotkey ``ss58`` address for the identity to be updated. - -If the user does not have a hotkey, the coldkey address is used by default. If setting a validator identity, the hotkey will be used by default. If the user is setting an identity for a subnet, the coldkey will be used by default. - -**Example:** - -``` -btcli wallet set_identity -``` - -Note: This command should only be used if the user is willing to incur the a recycle fee associated with setting an identity on the blockchain. It is a high-level command that makes changes to the blockchain state and should not be used programmatically as part of other scripts or applications. - -**Usage**: - -```console -btcli w set_identity [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--name TEXT`: The display name for the identity. -* `--web-url, --web TEXT`: The web URL for the identity. -* `--image-url, --image TEXT`: The image URL for the identity. -* `--discord TEXT`: The Discord handle for the identity. -* `--description TEXT`: The description for the identity. -* `--additional TEXT`: Additional details for the identity. -* `--github TEXT`: The GitHub repository for the identity. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--help`: Show this message and exit. - -### `btcli w get_identity` - -Shows the identity details of a user's coldkey or hotkey. - -The command displays the information in a table format showing: - -- Address: The ``ss58`` address of the queried key. - -- Item: Various attributes of the identity such as stake, rank, and trust. - -- Value: The corresponding values of the attributes. - -**Example:** - -``` -btcli wallet get_identity --key <s58_address> -``` - -Note: This command is primarily used for informational purposes and has no side effects on the blockchain network state. - -**Usage**: - -```console -btcli w get_identity [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-k, --ss58, --coldkey_ss58, --coldkey.ss58_address, --coldkey.ss58, --key TEXT`: Coldkey address of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -## `btcli wallets` - -**Usage**: - -```console -btcli wallets [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--help`: Show this message and exit. - -**Commands**: - -* `list`: Displays all the wallets and their... -* `swap-hotkey`: Swap hotkeys of a given wallet on the... -* `regen-coldkey`: Regenerate a coldkey for a wallet on the... -* `regen-coldkeypub`: Regenerates the public part of a coldkey... -* `regen-hotkey`: Regenerates a hotkey for a wallet. -* `new-hotkey`: Create a new hotkey for a wallet. -* `new-coldkey`: Create a new coldkey. -* `create`: Create a complete wallet by setting up... -* `balance`: Check the balance of the wallet. -* `history`: Show the history of the transfers carried... -* `overview`: Displays a detailed overview of the user's... -* `transfer`: Send TAO tokens from one wallet to another... -* `inspect`: Displays the details of the user's wallet... -* `faucet`: Obtain test TAO tokens by performing Proof... -* `set-identity`: Create or update the on-chain identity of... -* `get-identity`: Shows the identity details of a user's... -* `sign`: Allows users to sign a message with the... -* `swap_hotkey`: Swap hotkeys of a given wallet on the... -* `regen_coldkey`: Regenerate a coldkey for a wallet on the... -* `regen_coldkeypub`: Regenerates the public part of a coldkey... -* `regen_hotkey`: Regenerates a hotkey for a wallet. -* `new_hotkey`: Create a new hotkey for a wallet. -* `new_coldkey`: Create a new coldkey. -* `set_identity`: Create or update the on-chain identity of... -* `get_identity`: Shows the identity details of a user's... - -### `btcli wallets list` - -Displays all the wallets and their corresponding hotkeys that are located in the wallet path specified in the config. - -The output display shows each wallet and its associated `ss58` addresses for the coldkey public key and any hotkeys. The output is presented in a hierarchical tree format, with each wallet as a root node and any associated hotkeys as child nodes. The `ss58` address is displayed for each coldkey and hotkey that is not encrypted and exists on the device. - -Upon invocation, the command scans the wallet directory and prints a list of all the wallets, indicating whether the -public keys are available (`?` denotes unavailable or encrypted keys). - - -``` -btcli wallet list --path ~/.bittensor -``` - -Note: This command is read-only and does not modify the filesystem or the blockchain state. It is intended for use with the Bittensor CLI to provide a quick overview of the user's wallets. - -**Usage**: - -```console -btcli wallets list [OPTIONS] -``` - -**Options**: - -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallets swap-hotkey` - -Swap hotkeys of a given wallet on the blockchain. For a registered key pair, for example, a (coldkeyA, hotkeyA) pair, this command swaps the hotkeyA with a new, unregistered, hotkeyB to move the original registration to the (coldkeyA, hotkeyB) pair. - -**Usage:** - -The command is used to swap the hotkey of a wallet for another hotkey on that same wallet. - -**Important:** - -- Make sure that your original key pair (coldkeyA, hotkeyA) is already registered. -- Make sure that you use a newly created hotkeyB in this command. A hotkeyB that is already registered cannot be used in this command. -- Finally, note that this command requires a fee of 1 TAO for recycling and this fee is taken from your wallet (coldkeyA). - -**Example:** - -``` -btcli wallet swap_hotkey destination_hotkey_name --wallet-name your_wallet_name --wallet-hotkey original_hotkey -``` - -**Usage**: - -```console -btcli wallets swap-hotkey [OPTIONS] [DESTINATION_HOTKEY_NAME] -``` - -**Arguments**: - -* `[DESTINATION_HOTKEY_NAME]`: Destination hotkey name. - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--help`: Show this message and exit. - -### `btcli wallets regen-coldkey` - -Regenerate a coldkey for a wallet on the Bittensor blockchain network. - -This command is used to create a new coldkey from an existing mnemonic, seed, or JSON file. - -**Usage:** - -Users can specify a mnemonic, a seed string, or a JSON file path to regenerate a coldkey. The command supports optional password protection for the generated key. - -**Example:** - -``` -btcli wallet regen-coldkey --mnemonic "word1 word2 ... word12" -``` - - -Note: This command is critical for users who need to regenerate their coldkey either for recovery or for security reasons. - -**Usage**: - -```console -btcli wallets regen-coldkey [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--mnemonic TEXT`: Mnemonic used to regenerate your key. For example: horse cart dog ... -* `--seed TEXT`: Seed hex string used to regenerate your key. For example: 0x1234... -* `-j, --json TEXT`: Path to a JSON file containing the encrypted key backup. For example, a JSON file from PolkadotJS. -* `--json-password TEXT`: Password to decrypt the JSON file. -* `--use-password / --no-use-password`: Set this to `True` to protect the generated Bittensor key with a password. [default: use-password] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallets regen-coldkeypub` - -Regenerates the public part of a coldkey (coldkeypub.txt) for a wallet. - -Use this command when you need to move machine for subnet mining. Use the public key or SS58 address from your coldkeypub.txt that you have on another machine to regenerate the coldkeypub.txt on this new machine. - -**Usage:** - -The command requires either a public key in hexadecimal format or an ``SS58`` address from the existing coldkeypub.txt from old machine to regenerate the coldkeypub on the new machine. - -**Example:** - -``` -btcli wallet regen_coldkeypub --ss58_address 5DkQ4... -``` - -Note: This command is particularly useful for users who need to regenerate their coldkeypub, perhaps due to file corruption or loss. You will need either ss58 address or public hex key from your old coldkeypub.txt for the wallet. It is a recovery-focused utility that ensures continued access to your wallet functionalities. - -**Usage**: - -```console -btcli wallets regen-coldkeypub [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--public-key-hex TEXT`: The public key in hex format. -* `--ss58, --ss58-address TEXT`: The SS58 address of the coldkey. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallets regen-hotkey` - -Regenerates a hotkey for a wallet. - -Similar to regenerating a coldkey, this command creates a new hotkey from a mnemonic, seed, or JSON file. - -**Usage:** - -Users can provide a mnemonic, seed string, or a JSON file to regenerate the hotkey. The command supports optional password protection and can overwrite an existing hotkey. - - -``` -btcli wallet regen_hotkey --seed 0x1234... -``` - -Note: This command is essential for users who need to regenerate their hotkey, possibly for security upgrades or key recovery. -It should be used with caution to avoid accidental overwriting of existing keys. - -**Usage**: - -```console -btcli wallets regen-hotkey [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--mnemonic TEXT`: Mnemonic used to regenerate your key. For example: horse cart dog ... -* `--seed TEXT`: Seed hex string used to regenerate your key. For example: 0x1234... -* `-j, --json TEXT`: Path to a JSON file containing the encrypted key backup. For example, a JSON file from PolkadotJS. -* `--json-password TEXT`: Password to decrypt the JSON file. -* `--use-password / --no-use-password`: Set to 'True' to protect the generated Bittensor key with a password. [default: no-use-password] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallets new-hotkey` - -Create a new hotkey for a wallet. - -**Usage:** - -This command is used to generate a new hotkey for managing a neuron or participating in a subnet. It provides options for the mnemonic word count, and supports password protection. It also allows overwriting the -existing hotkey. - -**Example:** - -``` -btcli wallet new-hotkey --n_words 24 -``` - -Note: This command is useful to create additional hotkeys for different purposes, such as running multiple subnet miners or subnet validators or separating operational roles within the Bittensor network. - -**Usage**: - -```console -btcli wallets new-hotkey [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--n-words, --n_words INTEGER`: The number of words used in the mnemonic. Options: [12, 15, 18, 21, 24] -* `--use-password / --no-use-password`: Set to 'True' to protect the generated Bittensor key with a password. [default: no-use-password] -* `--uri TEXT`: Create wallet from uri (e.g. 'Alice', 'Bob', 'Charlie', 'Dave', 'Eve') -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallets new-coldkey` - -Create a new coldkey. A coldkey is required for holding TAO balances and performing high-value transactions. - -**Usage:** - -The command creates a new coldkey. It provides options for the mnemonic word count, and supports password protection. It also allows overwriting an existing coldkey. - -**Example:** - -``` -btcli wallet new_coldkey --n_words 15 -``` - -Note: This command is crucial for users who need to create a new coldkey for enhanced security or as part of setting up a new wallet. It is a foundational step in establishing a secure presence on the Bittensor network. - -**Usage**: - -```console -btcli wallets new-coldkey [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--n-words, --n_words INTEGER`: The number of words used in the mnemonic. Options: [12, 15, 18, 21, 24] -* `--use-password / --no-use-password`: Set this to `True` to protect the generated Bittensor key with a password. [default: use-password] -* `--uri TEXT`: Create wallet from uri (e.g. 'Alice', 'Bob', 'Charlie', 'Dave', 'Eve') -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallets create` - -Create a complete wallet by setting up both coldkey and hotkeys. - -**Usage:** - -The command creates a new coldkey and hotkey. It provides an option for mnemonic word count. It supports password protection for the coldkey and allows overwriting of existing keys. - -**Example:** - -``` -btcli wallet create --n_words 21 -``` - -Note: This command is for new users setting up their wallet for the first time, or for those who wish to completely renew their wallet keys. It ensures a fresh start with new keys for secure and effective participation in the Bittensor network. - -**Usage**: - -```console -btcli wallets create [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--n-words INTEGER` -* `--use-password / --no-use-password`: Set this to `True` to protect the generated Bittensor key with a password. [default: use-password] -* `--uri TEXT`: Create wallet from uri (e.g. 'Alice', 'Bob', 'Charlie', 'Dave', 'Eve') -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallets balance` - -Check the balance of the wallet. This command shows a detailed view of the wallet's coldkey balances, including free and staked balances. - -You can also pass multiple ss58 addresses of coldkeys to check their balance (using --ss58). - -**Example:** - -- To display the balance of a single wallet, use the command with the `--wallet-name` argument and provide the wallet name: - - ``` - btcli w balance --wallet-name WALLET - ``` - -- To use the default config values, use: - - ``` - btcli w balance - ``` - -- To display the balances of all your wallets, use the `--all` argument: - - ``` - btcli w balance --all - ``` - -- To display the balances of ss58 addresses, use the `--ss58` argument: - - ``` - btcli w balance --ss58 <ss58_address> --ss58 <ss58_address> - ``` - -**Usage**: - -```console -btcli wallets balance [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--ss58, --ss58-address TEXT`: The SS58 address of the coldkey. -* `-a, --all`: Whether to display the balances for all the wallets. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallets history` - -Show the history of the transfers carried out with the provided wallet on the Bittensor network. - -**Usage:** - -The output shows the latest transfers of the provided wallet, showing the columns 'From', 'To', 'Amount', 'Extrinsic ID' and 'Block Number'. - -**Example:** - -``` -btcli wallet history -``` - -**Usage**: - -```console -btcli wallets history [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallets overview` - -Displays a detailed overview of the user's registered accounts on the Bittensor network. - -This command compiles and displays comprehensive information about each neuron associated with the user's wallets, including both hotkeys and coldkeys. It is especially useful for users managing multiple accounts or looking for a summary of their network activities and stake distributions. - -**Usage:** - -``` -btcli wallet overview -``` - -``` -btcli wallet overview --all -``` - -Note: This command is read-only and does not modify the blockchain state or account configuration. -It provides a quick and comprehensive view of the user's network presence, making it useful for monitoring account status, -stake distribution, and overall contribution to the Bittensor network. - -**Usage**: - -```console -btcli wallets overview [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-a, --all`: See an overview for all the wallets -* `--sort-by, --sort_by TEXT`: Sort the hotkeys by the specified column title. For example: name, uid, axon. -* `--sort-order, --sort_order TEXT`: Sort the hotkeys in the specified order (ascending/asc or descending/desc/reverse). -* `-in, --include-hotkeys TEXT`: Hotkeys to include. Specify by name or ss58 address. If left empty, all hotkeys, except those in the '--exclude-hotkeys', will be included. -* `-ex, --exclude-hotkeys TEXT`: Hotkeys to exclude. Specify by name or ss58 address. If left empty, all hotkeys, except those in the '--include-hotkeys', will be excluded. -* `-n, --netuids, --netuid TEXT`: Set the netuid(s) to exclude. Separate multiple netuids with a comma, for example: `-n 0,1,2`. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallets transfer` - -Send TAO tokens from one wallet to another wallet on the Bittensor network. - -This command is used for transactions between different wallet accounts, enabling users to send tokens to other -participants on the network. The command displays the user's current balance before prompting for the amount -to transfer (send), ensuring transparency and accuracy in the transaction. - -**Usage:** - -The command requires that you specify the destination address (public key) and the amount of TAO you want transferred. -It checks if sufficient balance exists in your wallet and prompts for confirmation before proceeding with the transaction. - -**Example:** - -``` -btcli wallet transfer --dest 5Dp8... --amount 100 -``` - -Note: This command is used for executing token transfers within the Bittensor network. Users should verify the destination address and the TAO amount before confirming the transaction to avoid errors or loss of funds. - -**Usage**: - -```console -btcli wallets transfer [OPTIONS] -``` - -**Options**: - -* `-d, --destination, --dest TEXT`: Destination address (ss58) of the wallet (coldkey). -* `-a, --amount FLOAT`: Amount (in TAO) to transfer. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallets inspect` - -Displays the details of the user's wallet pairs (coldkey, hotkey) on the Bittensor network. - -The output is presented as a table with the below columns: - -- Coldkey: The coldkey associated with the user's wallet. - -- Balance: The balance of the coldkey. - -- Delegate: The name of the delegate to which the coldkey has staked TAO. - -- Stake: The amount of stake held by both the coldkey and hotkey. - -- Emission: The emission or rewards earned from staking. - -- Netuid: The network unique identifier of the subnet where the hotkey is active (i.e., validating). - -- Hotkey: The hotkey associated with the neuron on the network. - -**Usage:** - -This command can be used to inspect a single wallet or all the wallets located at a specified path. It is useful for a comprehensive overview of a user's participation and performance in the Bittensor network. - -**Example:** - -``` -btcli wallet inspect -``` - -``` -btcli wallet inspect --all -n 1 -n 2 -n 3 -``` - -Note: The `inspect` command is for displaying information only and does not perform any transactions or state changes on the blockchain. It is intended to be used with Bittensor CLI and not as a standalone function in user code. - -**Usage**: - -```console -btcli wallets inspect [OPTIONS] -``` - -**Options**: - -* `-a, --all, --all-wallets`: Inspect all the wallets at the specified wallet path. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `-n, --netuids, --netuid TEXT`: Set the netuid(s) to exclude. Separate multiple netuids with a comma, for example: `-n 0,1,2`. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallets faucet` - -Obtain test TAO tokens by performing Proof of Work (PoW). - -This command is useful for users who need test tokens for operations on a local blockchain. - -**Important:**: THIS COMMAND IS DISABLED ON FINNEY AND TESTNET. - -**Usage:** - -The command uses the proof-of-work (POW) mechanism to validate the user's effort and rewards them with test TAO tokens. It is -typically used in local blockchain environments where transactions do not use real TAO tokens. - -**Example:** - -``` -btcli wallet faucet --faucet.num_processes 4 --faucet.cuda.use_cuda -``` - -Note: This command is meant for used in local environments where users can experiment with the blockchain without using real TAO tokens. Users must have the necessary hardware setup, especially when opting for CUDA-based GPU calculations. It is currently disabled on testnet and mainnet (finney). You can only use this command on a local blockchain. - -**Usage**: - -```console -btcli wallets faucet [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--processors INTEGER`: Number of processors to use for proof of work (POW) registration. -* `-u, --update-interval INTEGER`: The number of nonces to process before checking for next block during registration [default: 50000] -* `--output-in-place / --no-output-in-place`: Whether to output the registration statistics in-place. [default: output-in-place] -* `-v, --verbose`: Whether to output the registration statistics verbosely. -* `--use-cuda, --cuda / --no-use-cuda, --no-cuda`: Set flag to use CUDA for proof of work (POW) registration. [default: no-use-cuda] -* `-d, --dev-id INTEGER`: Set the CUDA device id(s) in the order of speed, where 0 is the fastest. [default: 0] -* `-tbp, --threads-per-block INTEGER`: Set the number of threads per block for CUDA. [default: 256] -* `--max-successes INTEGER`: Set the maximum number of times to successfully run the faucet for this command. [default: 3] -* `--help`: Show this message and exit. - -### `btcli wallets set-identity` - -Create or update the on-chain identity of a coldkey or a hotkey on the Bittensor network. Incurs a 1 TAO transaction fee. - -The on-chain identity includes attributes such as display name, legal name, web URL, PGP fingerprint, and contact information, among others. - -The command prompts the user for the identity attributes and validates the input size for each attribute. It provides an option to update an existing validator hotkey identity. If the user consents to the transaction cost, the identity is updated on the blockchain. - -Each field has a maximum size of 64 bytes. The PGP fingerprint field is an exception and has a maximum size of 20 bytes. The user is prompted to enter the PGP fingerprint as a hex string, which is then converted to bytes. The user is also prompted to enter the coldkey or hotkey ``ss58`` address for the identity to be updated. - -If the user does not have a hotkey, the coldkey address is used by default. If setting a validator identity, the hotkey will be used by default. If the user is setting an identity for a subnet, the coldkey will be used by default. - -**Example:** - -``` -btcli wallet set_identity -``` - -Note: This command should only be used if the user is willing to incur the a recycle fee associated with setting an identity on the blockchain. It is a high-level command that makes changes to the blockchain state and should not be used programmatically as part of other scripts or applications. - -**Usage**: - -```console -btcli wallets set-identity [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--name TEXT`: The display name for the identity. -* `--web-url, --web TEXT`: The web URL for the identity. -* `--image-url, --image TEXT`: The image URL for the identity. -* `--discord TEXT`: The Discord handle for the identity. -* `--description TEXT`: The description for the identity. -* `--additional TEXT`: Additional details for the identity. -* `--github TEXT`: The GitHub repository for the identity. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--help`: Show this message and exit. - -### `btcli wallets get-identity` - -Shows the identity details of a user's coldkey or hotkey. - -The command displays the information in a table format showing: - -- Address: The ``ss58`` address of the queried key. - -- Item: Various attributes of the identity such as stake, rank, and trust. - -- Value: The corresponding values of the attributes. - -**Example:** - -``` -btcli wallet get_identity --key <s58_address> -``` - -Note: This command is primarily used for informational purposes and has no side effects on the blockchain network state. - -**Usage**: - -```console -btcli wallets get-identity [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-k, --ss58, --coldkey_ss58, --coldkey.ss58_address, --coldkey.ss58, --key TEXT`: Coldkey address of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallets sign` - -Allows users to sign a message with the provided wallet or wallet hotkey. Use this command to easily prove your ownership of a coldkey or a hotkey. - -**Usage:** - -Using the provided wallet (coldkey), the command generates a signature for a given message. - -**Example:** - -``` -btcli wallet sign --wallet-name default --message '{"something": "here", "timestamp": 1719908486}' -``` - -``` -btcli wallet sign --wallet-name default --wallet-hotkey hotkey --message '{"something": "here", "timestamp": 1719908486}' -``` - - -**Usage**: - -```console -btcli wallets sign [OPTIONS] -``` - -**Options**: - -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--use-hotkey / --no-use-hotkey`: If specified, the message will be signed by the hotkey. If not specified, the user will be prompted. -* `--message TEXT`: The message to encode and sign -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallets swap_hotkey` - -Swap hotkeys of a given wallet on the blockchain. For a registered key pair, for example, a (coldkeyA, hotkeyA) pair, this command swaps the hotkeyA with a new, unregistered, hotkeyB to move the original registration to the (coldkeyA, hotkeyB) pair. - -**Usage:** - -The command is used to swap the hotkey of a wallet for another hotkey on that same wallet. - -**Important:** - -- Make sure that your original key pair (coldkeyA, hotkeyA) is already registered. -- Make sure that you use a newly created hotkeyB in this command. A hotkeyB that is already registered cannot be used in this command. -- Finally, note that this command requires a fee of 1 TAO for recycling and this fee is taken from your wallet (coldkeyA). - -**Example:** - -``` -btcli wallet swap_hotkey destination_hotkey_name --wallet-name your_wallet_name --wallet-hotkey original_hotkey -``` - -**Usage**: - -```console -btcli wallets swap_hotkey [OPTIONS] [DESTINATION_HOTKEY_NAME] -``` - -**Arguments**: - -* `[DESTINATION_HOTKEY_NAME]`: Destination hotkey name. - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--help`: Show this message and exit. - -### `btcli wallets regen_coldkey` - -Regenerate a coldkey for a wallet on the Bittensor blockchain network. - -This command is used to create a new coldkey from an existing mnemonic, seed, or JSON file. - -**Usage:** - -Users can specify a mnemonic, a seed string, or a JSON file path to regenerate a coldkey. The command supports optional password protection for the generated key. - -**Example:** - -``` -btcli wallet regen-coldkey --mnemonic "word1 word2 ... word12" -``` - - -Note: This command is critical for users who need to regenerate their coldkey either for recovery or for security reasons. - -**Usage**: - -```console -btcli wallets regen_coldkey [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--mnemonic TEXT`: Mnemonic used to regenerate your key. For example: horse cart dog ... -* `--seed TEXT`: Seed hex string used to regenerate your key. For example: 0x1234... -* `-j, --json TEXT`: Path to a JSON file containing the encrypted key backup. For example, a JSON file from PolkadotJS. -* `--json-password TEXT`: Password to decrypt the JSON file. -* `--use-password / --no-use-password`: Set this to `True` to protect the generated Bittensor key with a password. [default: use-password] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallets regen_coldkeypub` - -Regenerates the public part of a coldkey (coldkeypub.txt) for a wallet. - -Use this command when you need to move machine for subnet mining. Use the public key or SS58 address from your coldkeypub.txt that you have on another machine to regenerate the coldkeypub.txt on this new machine. - -**Usage:** - -The command requires either a public key in hexadecimal format or an ``SS58`` address from the existing coldkeypub.txt from old machine to regenerate the coldkeypub on the new machine. - -**Example:** - -``` -btcli wallet regen_coldkeypub --ss58_address 5DkQ4... -``` - -Note: This command is particularly useful for users who need to regenerate their coldkeypub, perhaps due to file corruption or loss. You will need either ss58 address or public hex key from your old coldkeypub.txt for the wallet. It is a recovery-focused utility that ensures continued access to your wallet functionalities. - -**Usage**: - -```console -btcli wallets regen_coldkeypub [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--public-key-hex TEXT`: The public key in hex format. -* `--ss58, --ss58-address TEXT`: The SS58 address of the coldkey. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallets regen_hotkey` - -Regenerates a hotkey for a wallet. - -Similar to regenerating a coldkey, this command creates a new hotkey from a mnemonic, seed, or JSON file. - -**Usage:** - -Users can provide a mnemonic, seed string, or a JSON file to regenerate the hotkey. The command supports optional password protection and can overwrite an existing hotkey. - - -``` -btcli wallet regen_hotkey --seed 0x1234... -``` - -Note: This command is essential for users who need to regenerate their hotkey, possibly for security upgrades or key recovery. -It should be used with caution to avoid accidental overwriting of existing keys. - -**Usage**: - -```console -btcli wallets regen_hotkey [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--mnemonic TEXT`: Mnemonic used to regenerate your key. For example: horse cart dog ... -* `--seed TEXT`: Seed hex string used to regenerate your key. For example: 0x1234... -* `-j, --json TEXT`: Path to a JSON file containing the encrypted key backup. For example, a JSON file from PolkadotJS. -* `--json-password TEXT`: Password to decrypt the JSON file. -* `--use-password / --no-use-password`: Set to 'True' to protect the generated Bittensor key with a password. [default: no-use-password] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallets new_hotkey` - -Create a new hotkey for a wallet. - -**Usage:** - -This command is used to generate a new hotkey for managing a neuron or participating in a subnet. It provides options for the mnemonic word count, and supports password protection. It also allows overwriting the -existing hotkey. - -**Example:** - -``` -btcli wallet new-hotkey --n_words 24 -``` - -Note: This command is useful to create additional hotkeys for different purposes, such as running multiple subnet miners or subnet validators or separating operational roles within the Bittensor network. - -**Usage**: - -```console -btcli wallets new_hotkey [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--n-words, --n_words INTEGER`: The number of words used in the mnemonic. Options: [12, 15, 18, 21, 24] -* `--use-password / --no-use-password`: Set to 'True' to protect the generated Bittensor key with a password. [default: no-use-password] -* `--uri TEXT`: Create wallet from uri (e.g. 'Alice', 'Bob', 'Charlie', 'Dave', 'Eve') -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallets new_coldkey` - -Create a new coldkey. A coldkey is required for holding TAO balances and performing high-value transactions. - -**Usage:** - -The command creates a new coldkey. It provides options for the mnemonic word count, and supports password protection. It also allows overwriting an existing coldkey. - -**Example:** - -``` -btcli wallet new_coldkey --n_words 15 -``` - -Note: This command is crucial for users who need to create a new coldkey for enhanced security or as part of setting up a new wallet. It is a foundational step in establishing a secure presence on the Bittensor network. - -**Usage**: - -```console -btcli wallets new_coldkey [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--n-words, --n_words INTEGER`: The number of words used in the mnemonic. Options: [12, 15, 18, 21, 24] -* `--use-password / --no-use-password`: Set this to `True` to protect the generated Bittensor key with a password. [default: use-password] -* `--uri TEXT`: Create wallet from uri (e.g. 'Alice', 'Bob', 'Charlie', 'Dave', 'Eve') -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wallets set_identity` - -Create or update the on-chain identity of a coldkey or a hotkey on the Bittensor network. Incurs a 1 TAO transaction fee. - -The on-chain identity includes attributes such as display name, legal name, web URL, PGP fingerprint, and contact information, among others. - -The command prompts the user for the identity attributes and validates the input size for each attribute. It provides an option to update an existing validator hotkey identity. If the user consents to the transaction cost, the identity is updated on the blockchain. - -Each field has a maximum size of 64 bytes. The PGP fingerprint field is an exception and has a maximum size of 20 bytes. The user is prompted to enter the PGP fingerprint as a hex string, which is then converted to bytes. The user is also prompted to enter the coldkey or hotkey ``ss58`` address for the identity to be updated. - -If the user does not have a hotkey, the coldkey address is used by default. If setting a validator identity, the hotkey will be used by default. If the user is setting an identity for a subnet, the coldkey will be used by default. - -**Example:** - -``` -btcli wallet set_identity -``` - -Note: This command should only be used if the user is willing to incur the a recycle fee associated with setting an identity on the blockchain. It is a high-level command that makes changes to the blockchain state and should not be used programmatically as part of other scripts or applications. - -**Usage**: - -```console -btcli wallets set_identity [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--name TEXT`: The display name for the identity. -* `--web-url, --web TEXT`: The web URL for the identity. -* `--image-url, --image TEXT`: The image URL for the identity. -* `--discord TEXT`: The Discord handle for the identity. -* `--description TEXT`: The description for the identity. -* `--additional TEXT`: Additional details for the identity. -* `--github TEXT`: The GitHub repository for the identity. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--help`: Show this message and exit. - -### `btcli wallets get_identity` - -Shows the identity details of a user's coldkey or hotkey. - -The command displays the information in a table format showing: - -- Address: The ``ss58`` address of the queried key. - -- Item: Various attributes of the identity such as stake, rank, and trust. - -- Value: The corresponding values of the attributes. - -**Example:** - -``` -btcli wallet get_identity --key <s58_address> -``` - -Note: This command is primarily used for informational purposes and has no side effects on the blockchain network state. - -**Usage**: - -```console -btcli wallets get_identity [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-k, --ss58, --coldkey_ss58, --coldkey.ss58_address, --coldkey.ss58, --key TEXT`: Coldkey address of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -## `btcli stake` - -**Usage**: - -```console -btcli stake [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--help`: Show this message and exit. - -**Commands**: - -* `add`: Stake TAO to one or more hotkeys on... -* `remove`: Unstake TAO from one or more hotkeys and... -* `list`: Display detailed stake information for a... -* `move`: Move staked TAO between hotkeys while... -* `transfer`: Transfer stake between coldkeys while... -* `swap`: Swap stake between different subnets while... -* `child`: Child Hotkey commands, alias: `children` -* `children` - -### `btcli stake add` - -Stake TAO to one or more hotkeys on specific netuids with your coldkey. - -Stake is always added through your coldkey's free balance. For stake movement, see the `btcli stake move` command. - -Common Examples: -1. Interactive staking (guided prompts): - ``` - btcli stake add - ``` - -2. Safe staking with rate tolerance of 10% with partial transaction disabled: - ``` - btcli stake add --amount 100 --netuid 1 --safe --tolerance 0.1 --no-partial - ``` - -3. Allow partial stake if rates change with tolerance of 10%: - ``` - btcli stake add --amount 300 --safe --partial --tolerance 0.1 - ``` - -4. Unsafe staking with no rate protection: - ``` - btcli stake add --amount 300 --netuid 1 --unsafe - ``` - -5. Stake to multiple hotkeys: - ``` - btcli stake add --amount 200 --include-hotkeys hk_ss58_1,hk_ss58_2,hk_ss58_3 - ``` - -6. Stake all balance to a subnet: - ``` - btcli stake add --all --netuid 3 - ``` - -Safe Staking Parameters:--safe: Enables rate tolerance checks - --tolerance: Maximum % rate change allowed (0.05 = 5%) - --partial: Complete partial stake if rates exceed tolerance - -**Usage**: - -```console -btcli stake add [OPTIONS] -``` - -**Options**: - -* `-a, --all-tokens, --all`: When set, the command stakes all the available TAO from the coldkey. -* `--amount FLOAT`: The amount of TAO to stake [default: 0.0] -* `-in, --include-hotkeys, --hotkey-ss58-address TEXT`: Specifies hotkeys by name or ss58 address to stake to. For example, `-in hk1,hk2` -* `-ex, --exclude-hotkeys TEXT`: Specifies hotkeys by name or ss58 address to not to stake to (use this option only with `--all-hotkeys`) i.e. `--all-hotkeys -ex hk3,hk4` -* `--all-hotkeys / --no-all-hotkeys`: When set, this command stakes to all hotkeys associated with the wallet. Do not use if specifying hotkeys in `--include-hotkeys`. [default: no-all-hotkeys] -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `--all-netuids / --no-all-netuids`: Use all netuids [default: no-all-netuids] -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--slippage, --slippage-tolerance, --tolerance FLOAT`: Set the rate tolerance percentage for transactions (default: 0.05%). -* `--safe-staking, --safe / --no-safe-staking, --unsafe`: Enable or disable safe staking mode (default: enabled). -* `--allow-partial-stake, --partial, --allow, --allow-partial / --no-allow-partial-stake, --no-partial, --not-allow, --not-partial`: Enable or disable partial stake mode (default: disabled). -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli stake remove` - -Unstake TAO from one or more hotkeys and transfer them back to the user's coldkey wallet. - -This command is used to withdraw TAO or Alpha stake from different hotkeys. - -Common Examples: -1. Interactive unstaking (guided prompts): - ``` - btcli stake remove - ``` - -2. Safe unstaking with 10% rate tolerance: - ``` - btcli stake remove --amount 100 --netuid 1 --safe --tolerance 0.1 - ``` - -3. Allow partial unstake if rates change: - ``` - btcli stake remove --amount 300 --safe --partial - ``` - -4. Unstake from multiple hotkeys: - ``` - btcli stake remove --amount 200 --include-hotkeys hk1,hk2,hk3 - ``` - -5. Unstake all from a hotkey: - ``` - btcli stake remove --all - ``` - -6. Unstake all Alpha from a hotkey and stake to Root: - ``` - btcli stake remove --all-alpha - ``` - -Safe Staking Parameters: - --safe: Enables rate tolerance checks during unstaking - --tolerance: Max allowed rate change (0.05 = 5%) - --partial: Complete partial unstake if rates exceed tolerance - -**Usage**: - -```console -btcli stake remove [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `--all-netuids / --no-all-netuids`: Use all netuids [default: no-all-netuids] -* `-a, --amount FLOAT`: The amount of TAO to unstake. [default: 0.0] -* `--hotkey-ss58-address TEXT`: The ss58 address of the hotkey to unstake from. -* `-in, --include-hotkeys TEXT`: Specifies the hotkeys by name or ss58 address to unstake from. For example, `-in hk1,hk2` -* `-ex, --exclude-hotkeys TEXT`: Specifies the hotkeys by name or ss58 address not to unstake from (only use with `--all-hotkeys`) i.e. `--all-hotkeys -ex hk3,hk4` -* `--all-hotkeys / --no-all-hotkeys`: When set, this command unstakes from all the hotkeys associated with the wallet. Do not use if specifying hotkeys in `--include-hotkeys`. [default: no-all-hotkeys] -* `--slippage, --slippage-tolerance, --tolerance FLOAT`: Set the rate tolerance percentage for transactions (default: 0.05%). -* `--safe-staking, --safe / --no-safe-staking, --unsafe`: Enable or disable safe staking mode (default: enabled). -* `--allow-partial-stake, --partial, --allow, --allow-partial / --no-allow-partial-stake, --no-partial, --not-allow, --not-partial`: Enable or disable partial stake mode (default: disabled). -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `-i, --interactive`: Enter interactive mode for unstaking. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli stake list` - -Display detailed stake information for a wallet across all subnets. - -Shows stake allocations, exchange rates, and emissions for each hotkey. - -Common Examples: -1. Basic stake overview: -``` -btcli stake list --wallet.name my_wallet -``` - -2. Live updating view with refresh: -``` -btcli stake list --wallet.name my_wallet --live -``` - -3. View specific coldkey by address: -``` -btcli stake list --ss58 5Dk...X3q -``` - -4. Verbose output with full values: -``` -btcli stake list --wallet.name my_wallet --verbose -``` - -**Usage**: - -```console -btcli stake list [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--ss58, --coldkey_ss58, --coldkey.ss58_address, --coldkey.ss58 TEXT`: Coldkey address of the wallet -* `--live`: Display live view of the table -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--help`: Show this message and exit. - -### `btcli stake move` - -Move staked TAO between hotkeys while keeping the same coldkey ownership. - -This command allows you to: -- Move stake from one hotkey to another hotkey -- Move stake between different subnets -- Keep the same coldkey ownership - -You can specify: -- The origin subnet (--origin-netuid) -- The destination subnet (--dest-netuid) -- The destination hotkey (--dest-hotkey) -- The amount to move (--amount) - -If no arguments are provided, an interactive selection menu will be shown. - -**Example:** - -``` -btcli stake move -``` - -**Usage**: - -```console -btcli stake move [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--origin-netuid INTEGER`: Origin netuid -* `--dest-netuid INTEGER`: Destination netuid -* `--dest-ss58, --dest TEXT`: Destination hotkey -* `--amount FLOAT`: The amount of TAO to stake -* `--stake-all, --all`: Stake all -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--help`: Show this message and exit. - -### `btcli stake transfer` - -Transfer stake between coldkeys while keeping the same hotkey ownership. - -This command allows you to: -- Transfer stake from one coldkey to another coldkey -- Keep the same hotkey ownership -- Transfer stake between different subnets - -You can specify: -- The origin subnet (--origin-netuid) -- The destination subnet (--dest-netuid) -- The destination wallet/address (--dest) -- The amount to transfer (--amount) - -If no arguments are provided, an interactive selection menu will be shown. - -**Example:** - -Transfer 100 TAO from subnet 1 to subnet 2: -``` -btcli stake transfer --origin-netuid 1 --dest-netuid 2 --dest wallet2 --amount 100 -``` - -Using SS58 address: -``` -btcli stake transfer --origin-netuid 1 --dest-netuid 2 --dest 5FrLxJsyJ5x9n2rmxFwosFraxFCKcXZDngEP9H7qjkKgHLcK --amount 100 -``` - -**Usage**: - -```console -btcli stake transfer [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--origin-netuid INTEGER`: The netuid to transfer stake from -* `--dest-netuid INTEGER`: The netuid to transfer stake to -* `--dest-ss58, --dest, --dest-coldkey TEXT`: The destination wallet name or SS58 address to transfer stake to -* `-a, --amount FLOAT`: Amount of stake to transfer -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli stake swap` - -Swap stake between different subnets while keeping the same coldkey-hotkey pair ownership. - -This command allows you to: -- Move stake from one subnet to another subnet -- Keep the same coldkey ownership -- Keep the same hotkey ownership - -You can specify: -- The origin subnet (--origin-netuid) -- The destination subnet (--dest-netuid) -- The amount to swap (--amount) - -If no arguments are provided, an interactive selection menu will be shown. - -**Example:** - -Swap 100 TAO from subnet 1 to subnet 2: -``` -btcli stake swap --wallet-name default --wallet-hotkey default --origin-netuid 1 --dest-netuid 2 --amount 100 -``` - -**Usage**: - -```console -btcli stake swap [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-o, --origin-netuid, --origin INTEGER`: The netuid to swap stake from -* `-d, --dest-netuid, --dest INTEGER`: The netuid to swap stake to -* `-a, --amount FLOAT`: Amount of stake to swap -* `--swap-all, --all`: Swap all available stake -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--wait-for-inclusion / --no-wait-for-inclusion`: If `True`, waits until the transaction is included in a block. [default: wait-for-inclusion] -* `--wait-for-finalization / --no-wait-for-finalization`: If `True`, waits until the transaction is finalized on the blockchain. [default: wait-for-finalization] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli stake child` - -**Usage**: - -```console -btcli stake child [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--help`: Show this message and exit. - -**Commands**: - -* `get`: Get all the child hotkeys on a specified... -* `set`: Set child hotkeys on specified subnets. -* `revoke`: Remove all children hotkeys on a specified... -* `take`: Get and set your child hotkey take on a... - -#### `btcli stake child get` - -Get all the child hotkeys on a specified subnet. - -Users can specify the subnet and see the child hotkeys and the proportion that is given to them. This command is used to view the authority delegated to different hotkeys on the subnet. - -**Example:** - -``` -btcli stake child get --netuid 1 -``` -``` -btcli stake child get --all-netuids -``` - -**Usage**: - -```console -btcli stake child get [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet (e.g. 2) -* `--all-netuids, --all, --allnetuids`: When set, gets the child hotkeys from all the subnets. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -#### `btcli stake child set` - -Set child hotkeys on specified subnets. - -Users can specify the 'proportion' to delegate to child hotkeys (ss58 address). The sum of proportions cannot be greater than 1. - -This command is used to delegate authority to different hotkeys, securing their position and influence on the subnet. - -**Example:** - -``` -btcli stake child set -c 5FCL3gmjtQV4xxxxuEPEFQVhyyyyqYgNwX7drFLw7MSdBnxP -c 5Hp5dxxxxtGg7pu8dN2btyyyyVA1vELmM9dy8KQv3LxV8PA7 --hotkey default --netuid 1 -p 0.3 -p 0.7 -``` - -**Usage**: - -```console -btcli stake child set [OPTIONS] -``` - -**Options**: - -* `-c, --children TEXT`: Enter child hotkeys (ss58) -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `--all-netuids / --no-all-netuids`: Use all netuids [default: no-all-netuids] -* `-p, --proportions, --prop FLOAT`: Enter the stake weight proportions for the child hotkeys (sum should be less than or equal to 1) -* `--wait-for-inclusion / --no-wait-for-inclusion`: If `True`, waits until the transaction is included in a block. [default: wait-for-inclusion] -* `--wait-for-finalization / --no-wait-for-finalization`: If `True`, waits until the transaction is finalized on the blockchain. [default: wait-for-finalization] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -#### `btcli stake child revoke` - -Remove all children hotkeys on a specified subnet. - -This command is used to remove delegated authority from all child hotkeys, removing their position and influence on the subnet. - -**Example:** - -``` -btcli stake child revoke --hotkey <parent_hotkey> --netuid 1 -``` - -**Usage**: - -```console -btcli stake child revoke [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet, (e.g. 8) -* `--all-netuids, --all, --allnetuids`: When this flag is used it sets child hotkeys on all the subnets. -* `--wait-for-inclusion / --no-wait-for-inclusion`: If `True`, waits until the transaction is included in a block. [default: wait-for-inclusion] -* `--wait-for-finalization / --no-wait-for-finalization`: If `True`, waits until the transaction is finalized on the blockchain. [default: wait-for-finalization] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -#### `btcli stake child take` - -Get and set your child hotkey take on a specified subnet. - -The child hotkey take must be between 0 - 18%. - -**Example:** - -To get the current take value, do not use the '--take' option: - - ``` - btcli stake child take --hotkey <child_hotkey> --netuid 1 - ``` - -To set a new take value, use the '--take' option: - - ``` - btcli stake child take --hotkey <child_hotkey> --take 0.12 --netuid 1 - ``` - -**Usage**: - -```console -btcli stake child take [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--hotkey TEXT` -* `--netuid INTEGER`: The netuid of the subnet, (e.g. 23) -* `--all-netuids, --all, --allnetuids`: When this flag is used it sets child hotkeys on all the subnets. -* `-t, --take FLOAT`: Use to set the take value for your child hotkey. When not used, the command will fetch the current take value. -* `--wait-for-inclusion / --no-wait-for-inclusion`: If `True`, waits until the transaction is included in a block. [default: wait-for-inclusion] -* `--wait-for-finalization / --no-wait-for-finalization`: If `True`, waits until the transaction is finalized on the blockchain. [default: wait-for-finalization] -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli stake children` - -**Usage**: - -```console -btcli stake children [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--help`: Show this message and exit. - -**Commands**: - -* `get`: Get all the child hotkeys on a specified... -* `set`: Set child hotkeys on specified subnets. -* `revoke`: Remove all children hotkeys on a specified... -* `take`: Get and set your child hotkey take on a... - -#### `btcli stake children get` - -Get all the child hotkeys on a specified subnet. - -Users can specify the subnet and see the child hotkeys and the proportion that is given to them. This command is used to view the authority delegated to different hotkeys on the subnet. - -**Example:** - -``` -btcli stake child get --netuid 1 -``` -``` -btcli stake child get --all-netuids -``` - -**Usage**: - -```console -btcli stake children get [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet (e.g. 2) -* `--all-netuids, --all, --allnetuids`: When set, gets the child hotkeys from all the subnets. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -#### `btcli stake children set` - -Set child hotkeys on specified subnets. - -Users can specify the 'proportion' to delegate to child hotkeys (ss58 address). The sum of proportions cannot be greater than 1. - -This command is used to delegate authority to different hotkeys, securing their position and influence on the subnet. - -**Example:** - -``` -btcli stake child set -c 5FCL3gmjtQV4xxxxuEPEFQVhyyyyqYgNwX7drFLw7MSdBnxP -c 5Hp5dxxxxtGg7pu8dN2btyyyyVA1vELmM9dy8KQv3LxV8PA7 --hotkey default --netuid 1 -p 0.3 -p 0.7 -``` - -**Usage**: - -```console -btcli stake children set [OPTIONS] -``` - -**Options**: - -* `-c, --children TEXT`: Enter child hotkeys (ss58) -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `--all-netuids / --no-all-netuids`: Use all netuids [default: no-all-netuids] -* `-p, --proportions, --prop FLOAT`: Enter the stake weight proportions for the child hotkeys (sum should be less than or equal to 1) -* `--wait-for-inclusion / --no-wait-for-inclusion`: If `True`, waits until the transaction is included in a block. [default: wait-for-inclusion] -* `--wait-for-finalization / --no-wait-for-finalization`: If `True`, waits until the transaction is finalized on the blockchain. [default: wait-for-finalization] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -#### `btcli stake children revoke` - -Remove all children hotkeys on a specified subnet. - -This command is used to remove delegated authority from all child hotkeys, removing their position and influence on the subnet. - -**Example:** - -``` -btcli stake child revoke --hotkey <parent_hotkey> --netuid 1 -``` - -**Usage**: - -```console -btcli stake children revoke [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet, (e.g. 8) -* `--all-netuids, --all, --allnetuids`: When this flag is used it sets child hotkeys on all the subnets. -* `--wait-for-inclusion / --no-wait-for-inclusion`: If `True`, waits until the transaction is included in a block. [default: wait-for-inclusion] -* `--wait-for-finalization / --no-wait-for-finalization`: If `True`, waits until the transaction is finalized on the blockchain. [default: wait-for-finalization] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -#### `btcli stake children take` - -Get and set your child hotkey take on a specified subnet. - -The child hotkey take must be between 0 - 18%. - -**Example:** - -To get the current take value, do not use the '--take' option: - - ``` - btcli stake child take --hotkey <child_hotkey> --netuid 1 - ``` - -To set a new take value, use the '--take' option: - - ``` - btcli stake child take --hotkey <child_hotkey> --take 0.12 --netuid 1 - ``` - -**Usage**: - -```console -btcli stake children take [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--hotkey TEXT` -* `--netuid INTEGER`: The netuid of the subnet, (e.g. 23) -* `--all-netuids, --all, --allnetuids`: When this flag is used it sets child hotkeys on all the subnets. -* `-t, --take FLOAT`: Use to set the take value for your child hotkey. When not used, the command will fetch the current take value. -* `--wait-for-inclusion / --no-wait-for-inclusion`: If `True`, waits until the transaction is included in a block. [default: wait-for-inclusion] -* `--wait-for-finalization / --no-wait-for-finalization`: If `True`, waits until the transaction is finalized on the blockchain. [default: wait-for-finalization] -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -## `btcli st` - -**Usage**: - -```console -btcli st [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--help`: Show this message and exit. - -**Commands**: - -* `add`: Stake TAO to one or more hotkeys on... -* `remove`: Unstake TAO from one or more hotkeys and... -* `list`: Display detailed stake information for a... -* `move`: Move staked TAO between hotkeys while... -* `transfer`: Transfer stake between coldkeys while... -* `swap`: Swap stake between different subnets while... -* `child`: Child Hotkey commands, alias: `children` -* `children` - -### `btcli st add` - -Stake TAO to one or more hotkeys on specific netuids with your coldkey. - -Stake is always added through your coldkey's free balance. For stake movement, see -the `btcli stake move` command. - - -Common Examples: -1. Interactive staking (guided prompts): - ``` - btcli stake add - ``` - -2. Safe staking with rate tolerance of 10% with partial transaction disabled: - ``` - btcli stake add --amount 100 --netuid 1 --safe --tolerance 0.1 --no-partial - ``` - -3. Allow partial stake if rates change with tolerance of 10%: - ``` - btcli stake add --amount 300 --safe --partial --tolerance 0.1 - ``` - -4. Unsafe staking with no rate protection: - ``` - btcli stake add --amount 300 --netuid 1 --unsafe - ``` - -5. Stake to multiple hotkeys: - ``` - btcli stake add --amount 200 --include-hotkeys hk_ss58_1,hk_ss58_2,hk_ss58_3 - ``` - -6. Stake all balance to a subnet: - ``` - btcli stake add --all --netuid 3 - ``` - -Safe Staking Parameters: --safe: Enables rate tolerance checks - --tolerance: Maximum % rate change allowed (0.05 = 5%) - --partial: Complete partial stake if rates exceed tolerance - -**Usage**: - -```console -btcli st add [OPTIONS] -``` - -**Options**: - -* `-a, --all-tokens, --all`: When set, the command stakes all the available TAO from the coldkey. -* `--amount FLOAT`: The amount of TAO to stake [default: 0.0] -* `-in, --include-hotkeys, --hotkey-ss58-address TEXT`: Specifies hotkeys by name or ss58 address to stake to. For example, `-in hk1,hk2` -* `-ex, --exclude-hotkeys TEXT`: Specifies hotkeys by name or ss58 address to not to stake to (use this option only with `--all-hotkeys`) i.e. `--all-hotkeys -ex hk3,hk4` -* `--all-hotkeys / --no-all-hotkeys`: When set, this command stakes to all hotkeys associated with the wallet. Do not use if specifying hotkeys in `--include-hotkeys`. [default: no-all-hotkeys] -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `--all-netuids / --no-all-netuids`: Use all netuids [default: no-all-netuids] -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--slippage, --slippage-tolerance, --tolerance FLOAT`: Set the rate tolerance percentage for transactions (default: 0.05%). -* `--safe-staking, --safe / --no-safe-staking, --unsafe`: Enable or disable safe staking mode (default: enabled). -* `--allow-partial-stake, --partial, --allow, --allow-partial / --no-allow-partial-stake, --no-partial, --not-allow, --not-partial`: Enable or disable partial stake mode (default: disabled). -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli st remove` - -Unstake TAO from one or more hotkeys and transfer them back to the user's coldkey wallet. - -This command is used to withdraw TAO or Alpha stake from different hotkeys. - -Common Examples: -1. Interactive unstaking (guided prompts): - ``` - btcli stake remove - ``` - -2. Safe unstaking with 10% rate tolerance: - ``` - btcli stake remove --amount 100 --netuid 1 --safe --tolerance 0.1 - ``` - -3. Allow partial unstake if rates change: - ``` - btcli stake remove --amount 300 --safe --partial - ``` - -4. Unstake from multiple hotkeys: - ``` - btcli stake remove --amount 200 --include-hotkeys hk1,hk2,hk3 - ``` - -5. Unstake all from a hotkey: - ``` - btcli stake remove --all - ``` - -6. Unstake all Alpha from a hotkey and stake to Root: - ``` - btcli stake remove --all-alpha - ``` - -Safe Staking Parameters: --safe: Enables rate tolerance checks during unstaking - --tolerance: Max allowed rate change (0.05 = 5%) - --partial: Complete partial unstake if rates exceed tolerance - -**Usage**: - -```console -btcli st remove [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `--all-netuids / --no-all-netuids`: Use all netuids [default: no-all-netuids] -* `-a, --amount FLOAT`: The amount of TAO to unstake. [default: 0.0] -* `--hotkey-ss58-address TEXT`: The ss58 address of the hotkey to unstake from. -* `-in, --include-hotkeys TEXT`: Specifies the hotkeys by name or ss58 address to unstake from. For example, `-in hk1,hk2` -* `-ex, --exclude-hotkeys TEXT`: Specifies the hotkeys by name or ss58 address not to unstake from (only use with `--all-hotkeys`) i.e. `--all-hotkeys -ex hk3,hk4` -* `--all-hotkeys / --no-all-hotkeys`: When set, this command unstakes from all the hotkeys associated with the wallet. Do not use if specifying hotkeys in `--include-hotkeys`. [default: no-all-hotkeys] -* `--slippage, --slippage-tolerance, --tolerance FLOAT`: Set the rate tolerance percentage for transactions (default: 0.05%). -* `--safe-staking, --safe / --no-safe-staking, --unsafe`: Enable or disable safe staking mode (default: enabled). -* `--allow-partial-stake, --partial, --allow, --allow-partial / --no-allow-partial-stake, --no-partial, --not-allow, --not-partial`: Enable or disable partial stake mode (default: disabled). -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `-i, --interactive`: Enter interactive mode for unstaking. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli st list` - -Display detailed stake information for a wallet across all subnets. - -Shows stake allocations, exchange rates, and emissions for each hotkey. - -Common Examples: -1. Basic stake overview: -``` -btcli stake list --wallet.name my_wallet -``` - -2. Live updating view with refresh: -``` -btcli stake list --wallet.name my_wallet --live -``` - -3. View specific coldkey by address: -``` -btcli stake list --ss58 5Dk...X3q -``` - -4. Verbose output with full values: -``` -btcli stake list --wallet.name my_wallet --verbose -``` - -**Usage**: - -```console -btcli st list [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--ss58, --coldkey_ss58, --coldkey.ss58_address, --coldkey.ss58 TEXT`: Coldkey address of the wallet -* `--live`: Display live view of the table -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--help`: Show this message and exit. - -### `btcli st move` - -Move staked TAO between hotkeys while keeping the same coldkey ownership. - -This command allows you to: -- Move stake from one hotkey to another hotkey -- Move stake between different subnets -- Keep the same coldkey ownership - -You can specify: -- The origin subnet (--origin-netuid) -- The destination subnet (--dest-netuid) -- The destination hotkey (--dest-hotkey) -- The amount to move (--amount) - -If no arguments are provided, an interactive selection menu will be shown. - -**Example:** - -``` -btcli stake move -``` - -**Usage**: - -```console -btcli st move [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--origin-netuid INTEGER`: Origin netuid -* `--dest-netuid INTEGER`: Destination netuid -* `--dest-ss58, --dest TEXT`: Destination hotkey -* `--amount FLOAT`: The amount of TAO to stake -* `--stake-all, --all`: Stake all -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--help`: Show this message and exit. - -### `btcli st transfer` - -Transfer stake between coldkeys while keeping the same hotkey ownership. - -This command allows you to: -- Transfer stake from one coldkey to another coldkey -- Keep the same hotkey ownership -- Transfer stake between different subnets - -You can specify: -- The origin subnet (--origin-netuid) -- The destination subnet (--dest-netuid) -- The destination wallet/address (--dest) -- The amount to transfer (--amount) - -If no arguments are provided, an interactive selection menu will be shown. - -**Example:** - -Transfer 100 TAO from subnet 1 to subnet 2: -``` -btcli stake transfer --origin-netuid 1 --dest-netuid 2 --dest wallet2 --amount 100 -``` - -Using SS58 address: -``` -btcli stake transfer --origin-netuid 1 --dest-netuid 2 --dest 5FrLxJsyJ5x9n2rmxFwosFraxFCKcXZDngEP9H7qjkKgHLcK --amount 100 -``` - -**Usage**: - -```console -btcli st transfer [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--origin-netuid INTEGER`: The netuid to transfer stake from -* `--dest-netuid INTEGER`: The netuid to transfer stake to -* `--dest-ss58, --dest, --dest-coldkey TEXT`: The destination wallet name or SS58 address to transfer stake to -* `-a, --amount FLOAT`: Amount of stake to transfer -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli st swap` - -Swap stake between different subnets while keeping the same coldkey-hotkey pair ownership. - -This command allows you to: -- Move stake from one subnet to another subnet -- Keep the same coldkey ownership -- Keep the same hotkey ownership - -You can specify: -- The origin subnet (--origin-netuid) -- The destination subnet (--dest-netuid) -- The amount to swap (--amount) - -If no arguments are provided, an interactive selection menu will be shown. - -**Example:** - -Swap 100 TAO from subnet 1 to subnet 2: -``` -btcli stake swap --wallet-name default --wallet-hotkey default --origin-netuid 1 --dest-netuid 2 --amount 100 -``` - -**Usage**: - -```console -btcli st swap [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-o, --origin-netuid, --origin INTEGER`: The netuid to swap stake from -* `-d, --dest-netuid, --dest INTEGER`: The netuid to swap stake to -* `-a, --amount FLOAT`: Amount of stake to swap -* `--swap-all, --all`: Swap all available stake -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--wait-for-inclusion / --no-wait-for-inclusion`: If `True`, waits until the transaction is included in a block. [default: wait-for-inclusion] -* `--wait-for-finalization / --no-wait-for-finalization`: If `True`, waits until the transaction is finalized on the blockchain. [default: wait-for-finalization] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli st child` - -**Usage**: - -```console -btcli st child [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--help`: Show this message and exit. - -**Commands**: - -* `get`: Get all the child hotkeys on a specified... -* `set`: Set child hotkeys on specified subnets. -* `revoke`: Remove all children hotkeys on a specified... -* `take`: Get and set your child hotkey take on a... - -#### `btcli st child get` - -Get all the child hotkeys on a specified subnet. - -Users can specify the subnet and see the child hotkeys and the proportion that is given to them. This command is used to view the authority delegated to different hotkeys on the subnet. - -**Example:** - -``` -btcli stake child get --netuid 1 -``` -``` -btcli stake child get --all-netuids -``` - -**Usage**: - -```console -btcli st child get [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet (e.g. 2) -* `--all-netuids, --all, --allnetuids`: When set, gets the child hotkeys from all the subnets. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -#### `btcli st child set` - -Set child hotkeys on specified subnets. - -Users can specify the 'proportion' to delegate to child hotkeys (ss58 address). The sum of proportions cannot be greater than 1. - -This command is used to delegate authority to different hotkeys, securing their position and influence on the subnet. - -**Example:** - -``` -btcli stake child set -c 5FCL3gmjtQV4xxxxuEPEFQVhyyyyqYgNwX7drFLw7MSdBnxP -c 5Hp5dxxxxtGg7pu8dN2btyyyyVA1vELmM9dy8KQv3LxV8PA7 --hotkey default --netuid 1 -p 0.3 -p 0.7 -``` - -**Usage**: - -```console -btcli st child set [OPTIONS] -``` - -**Options**: - -* `-c, --children TEXT`: Enter child hotkeys (ss58) -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `--all-netuids / --no-all-netuids`: Use all netuids [default: no-all-netuids] -* `-p, --proportions, --prop FLOAT`: Enter the stake weight proportions for the child hotkeys (sum should be less than or equal to 1) -* `--wait-for-inclusion / --no-wait-for-inclusion`: If `True`, waits until the transaction is included in a block. [default: wait-for-inclusion] -* `--wait-for-finalization / --no-wait-for-finalization`: If `True`, waits until the transaction is finalized on the blockchain. [default: wait-for-finalization] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -#### `btcli st child revoke` - -Remove all children hotkeys on a specified subnet. - -This command is used to remove delegated authority from all child hotkeys, removing their position and influence on the subnet. - -**Example:** - -``` -btcli stake child revoke --hotkey <parent_hotkey> --netuid 1 -``` - -**Usage**: - -```console -btcli st child revoke [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet, (e.g. 8) -* `--all-netuids, --all, --allnetuids`: When this flag is used it sets child hotkeys on all the subnets. -* `--wait-for-inclusion / --no-wait-for-inclusion`: If `True`, waits until the transaction is included in a block. [default: wait-for-inclusion] -* `--wait-for-finalization / --no-wait-for-finalization`: If `True`, waits until the transaction is finalized on the blockchain. [default: wait-for-finalization] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -#### `btcli st child take` - -Get and set your child hotkey take on a specified subnet. - -The child hotkey take must be between 0 - 18%. - -**Example:** - -To get the current take value, do not use the '--take' option: - - ``` - btcli stake child take --hotkey <child_hotkey> --netuid 1 - ``` - -To set a new take value, use the '--take' option: - - ``` - btcli stake child take --hotkey <child_hotkey> --take 0.12 --netuid 1 - ``` - -**Usage**: - -```console -btcli st child take [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--hotkey TEXT` -* `--netuid INTEGER`: The netuid of the subnet, (e.g. 23) -* `--all-netuids, --all, --allnetuids`: When this flag is used it sets child hotkeys on all the subnets. -* `-t, --take FLOAT`: Use to set the take value for your child hotkey. When not used, the command will fetch the current take value. -* `--wait-for-inclusion / --no-wait-for-inclusion`: If `True`, waits until the transaction is included in a block. [default: wait-for-inclusion] -* `--wait-for-finalization / --no-wait-for-finalization`: If `True`, waits until the transaction is finalized on the blockchain. [default: wait-for-finalization] -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli st children` - -**Usage**: - -```console -btcli st children [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--help`: Show this message and exit. - -**Commands**: - -* `get`: Get all the child hotkeys on a specified... -* `set`: Set child hotkeys on specified subnets. -* `revoke`: Remove all children hotkeys on a specified... -* `take`: Get and set your child hotkey take on a... - -#### `btcli st children get` - -Get all the child hotkeys on a specified subnet. - -Users can specify the subnet and see the child hotkeys and the proportion that is given to them. This command is used to view the authority delegated to different hotkeys on the subnet. - -**Example:** - -``` -btcli stake child get --netuid 1 -``` -``` -btcli stake child get --all-netuids -``` - -**Usage**: - -```console -btcli st children get [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet (e.g. 2) -* `--all-netuids, --all, --allnetuids`: When set, gets the child hotkeys from all the subnets. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -#### `btcli st children set` - -Set child hotkeys on specified subnets. - -Users can specify the 'proportion' to delegate to child hotkeys (ss58 address). The sum of proportions cannot be greater than 1. - -This command is used to delegate authority to different hotkeys, securing their position and influence on the subnet. - -**Example:** - -``` -btcli stake child set -c 5FCL3gmjtQV4xxxxuEPEFQVhyyyyqYgNwX7drFLw7MSdBnxP -c 5Hp5dxxxxtGg7pu8dN2btyyyyVA1vELmM9dy8KQv3LxV8PA7 --hotkey default --netuid 1 -p 0.3 -p 0.7 -``` - -**Usage**: - -```console -btcli st children set [OPTIONS] -``` - -**Options**: - -* `-c, --children TEXT`: Enter child hotkeys (ss58) -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `--all-netuids / --no-all-netuids`: Use all netuids [default: no-all-netuids] -* `-p, --proportions, --prop FLOAT`: Enter the stake weight proportions for the child hotkeys (sum should be less than or equal to 1) -* `--wait-for-inclusion / --no-wait-for-inclusion`: If `True`, waits until the transaction is included in a block. [default: wait-for-inclusion] -* `--wait-for-finalization / --no-wait-for-finalization`: If `True`, waits until the transaction is finalized on the blockchain. [default: wait-for-finalization] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -#### `btcli st children revoke` - -Remove all children hotkeys on a specified subnet. - -This command is used to remove delegated authority from all child hotkeys, removing their position and influence on the subnet. - -**Example:** - -``` -btcli stake child revoke --hotkey <parent_hotkey> --netuid 1 -``` - -**Usage**: - -```console -btcli st children revoke [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet, (e.g. 8) -* `--all-netuids, --all, --allnetuids`: When this flag is used it sets child hotkeys on all the subnets. -* `--wait-for-inclusion / --no-wait-for-inclusion`: If `True`, waits until the transaction is included in a block. [default: wait-for-inclusion] -* `--wait-for-finalization / --no-wait-for-finalization`: If `True`, waits until the transaction is finalized on the blockchain. [default: wait-for-finalization] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -#### `btcli st children take` - -Get and set your child hotkey take on a specified subnet. - -The child hotkey take must be between 0 - 18%. - -**Example:** - -To get the current take value, do not use the '--take' option: - - ``` - btcli stake child take --hotkey <child_hotkey> --netuid 1 - ``` - -To set a new take value, use the '--take' option: - - ``` - btcli stake child take --hotkey <child_hotkey> --take 0.12 --netuid 1 - ``` - -**Usage**: - -```console -btcli st children take [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--hotkey TEXT` -* `--netuid INTEGER`: The netuid of the subnet, (e.g. 23) -* `--all-netuids, --all, --allnetuids`: When this flag is used it sets child hotkeys on all the subnets. -* `-t, --take FLOAT`: Use to set the take value for your child hotkey. When not used, the command will fetch the current take value. -* `--wait-for-inclusion / --no-wait-for-inclusion`: If `True`, waits until the transaction is included in a block. [default: wait-for-inclusion] -* `--wait-for-finalization / --no-wait-for-finalization`: If `True`, waits until the transaction is finalized on the blockchain. [default: wait-for-finalization] -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -## `btcli sudo` - -**Usage**: - -```console -btcli sudo [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--help`: Show this message and exit. - -**Commands**: - -* `set`: Used to set hyperparameters for a specific... -* `get`: Shows a list of the hyperparameters for... -* `senate`: Shows the Senate members of the... -* `proposals`: View active proposals for the senate in... -* `senate-vote`: Cast a vote on an active proposal in... -* `set-take`: Allows users to change their delegate take... -* `get-take`: Allows users to check their delegate take... -* `senate_vote`: Cast a vote on an active proposal in... -* `get_take`: Allows users to check their delegate take... -* `set_take`: Allows users to change their delegate take... - -### `btcli sudo set` - -Used to set hyperparameters for a specific subnet. - -This command allows subnet owners to modify hyperparameters such as its tempo, emission rates, and other hyperparameters. - -**Example:** - -``` -btcli sudo set --netuid 1 --param tempo --value 400 -``` - -**Usage**: - -```console -btcli sudo set [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `--param, --parameter TEXT`: The subnet hyperparameter to set -* `--value TEXT`: Value to set the hyperparameter to. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli sudo get` - -Shows a list of the hyperparameters for the specified subnet. - -**Example:** - -``` -btcli sudo get --netuid 1 -``` - -**Usage**: - -```console -btcli sudo get [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli sudo senate` - -Shows the Senate members of the Bittensor's governance protocol. - -This command lists the delegates involved in the decision-making process of the Bittensor network, showing their names and wallet addresses. This information is crucial for understanding who holds governance roles within the network. - -**Example:** -``` -btcli sudo senate -``` - -**Usage**: - -```console -btcli sudo senate [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli sudo proposals` - -View active proposals for the senate in the Bittensor's governance protocol. - -This command displays the details of ongoing proposals, including proposal hashes, votes, thresholds, and proposal data. - -**Example:** -``` -btcli sudo proposals -``` - -**Usage**: - -```console -btcli sudo proposals [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli sudo senate-vote` - -Cast a vote on an active proposal in Bittensor's governance protocol. - -This command is used by Senate members to vote on various proposals that shape the network's future. Use `btcli sudo proposals` to see the active proposals and their hashes. - -**Usage:** -The user must specify the hash of the proposal they want to vote on. The command then allows the Senate member to cast a 'Yes' or 'No' vote, contributing to the decision-making process on the proposal. This command is crucial for Senate members to exercise their voting rights on key proposals. It plays a vital role in the governance and evolution of the Bittensor network. - -**Example:** -``` -btcli sudo senate_vote --proposal <proposal_hash> -``` - -**Usage**: - -```console -btcli sudo senate-vote [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--proposal, --proposal-hash TEXT`: The hash of the proposal to vote on. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--vote-aye / --vote-nay`: The vote casted on the proposal -* `--help`: Show this message and exit. - -### `btcli sudo set-take` - -Allows users to change their delegate take percentage. - -This command can be used to update the delegate takes. To run the command, the user must have a configured wallet with both hotkey and coldkey. -The command makes sure the new take value is within 0-18% range. - -**Example:** -``` -btcli sudo set-take --wallet-name my_wallet --wallet-hotkey my_hotkey -``` - -**Usage**: - -```console -btcli sudo set-take [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--take FLOAT`: The new take value. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli sudo get-take` - -Allows users to check their delegate take percentage. - -This command can be used to fetch the delegate take of your hotkey. - -**Example:** -``` -btcli sudo get-take --wallet-name my_wallet --wallet-hotkey my_hotkey -``` - -**Usage**: - -```console -btcli sudo get-take [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli sudo senate_vote` - -Cast a vote on an active proposal in Bittensor's governance protocol. - -This command is used by Senate members to vote on various proposals that shape the network's future. Use `btcli sudo proposals` to see the active proposals and their hashes. - -**Usage:** -The user must specify the hash of the proposal they want to vote on. The command then allows the Senate member to cast a 'Yes' or 'No' vote, contributing to the decision-making process on the proposal. This command is crucial for Senate members to exercise their voting rights on key proposals. It plays a vital role in the governance and evolution of the Bittensor network. - -**Example:** -``` -btcli sudo senate_vote --proposal <proposal_hash> -``` - -**Usage**: - -```console -btcli sudo senate_vote [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--proposal, --proposal-hash TEXT`: The hash of the proposal to vote on. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--vote-aye / --vote-nay`: The vote casted on the proposal -* `--help`: Show this message and exit. - -### `btcli sudo get_take` - -Allows users to check their delegate take percentage. - -This command can be used to fetch the delegate take of your hotkey. - -**Example:** -``` -btcli sudo get-take --wallet-name my_wallet --wallet-hotkey my_hotkey -``` - -**Usage**: - -```console -btcli sudo get_take [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli sudo set_take` - -Allows users to change their delegate take percentage. - -This command can be used to update the delegate takes. To run the command, the user must have a configured wallet with both hotkey and coldkey. -The command makes sure the new take value is within 0-18% range. - -**Example:** -``` -btcli sudo set-take --wallet-name my_wallet --wallet-hotkey my_hotkey -``` - -**Usage**: - -```console -btcli sudo set_take [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--take FLOAT`: The new take value. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -## `btcli su` - -**Usage**: - -```console -btcli su [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--help`: Show this message and exit. - -**Commands**: - -* `set`: Used to set hyperparameters for a specific... -* `get`: Shows a list of the hyperparameters for... -* `senate`: Shows the Senate members of the... -* `proposals`: View active proposals for the senate in... -* `senate-vote`: Cast a vote on an active proposal in... -* `set-take`: Allows users to change their delegate take... -* `get-take`: Allows users to check their delegate take... -* `senate_vote`: Cast a vote on an active proposal in... -* `get_take`: Allows users to check their delegate take... -* `set_take`: Allows users to change their delegate take... - -### `btcli su set` - -Used to set hyperparameters for a specific subnet. - -This command allows subnet owners to modify hyperparameters such as its tempo, emission rates, and other hyperparameters. - -**Example:** - -``` -btcli sudo set --netuid 1 --param tempo --value 400 -``` - -**Usage**: - -```console -btcli su set [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `--param, --parameter TEXT`: The subnet hyperparameter to set -* `--value TEXT`: Value to set the hyperparameter to. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli su get` - -Shows a list of the hyperparameters for the specified subnet. - -**Example:** - -``` -btcli sudo get --netuid 1 -``` - -**Usage**: - -```console -btcli su get [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli su senate` - -Shows the Senate members of the Bittensor's governance protocol. - -This command lists the delegates involved in the decision-making process of the Bittensor network, showing their names and wallet addresses. This information is crucial for understanding who holds governance roles within the network. - -**Example:** -``` -btcli sudo senate -``` - -**Usage**: - -```console -btcli su senate [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli su proposals` - -View active proposals for the senate in the Bittensor's governance protocol. - -This command displays the details of ongoing proposals, including proposal hashes, votes, thresholds, and proposal data. - -**Example:** -``` -btcli sudo proposals -``` - -**Usage**: - -```console -btcli su proposals [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli su senate-vote` - -Cast a vote on an active proposal in Bittensor's governance protocol. - -This command is used by Senate members to vote on various proposals that shape the network's future. Use `btcli sudo proposals` to see the active proposals and their hashes. - -**Usage:** -The user must specify the hash of the proposal they want to vote on. The command then allows the Senate member to cast a 'Yes' or 'No' vote, contributing to the decision-making process on the proposal. This command is crucial for Senate members to exercise their voting rights on key proposals. It plays a vital role in the governance and evolution of the Bittensor network. - -**Example:** -``` -btcli sudo senate_vote --proposal <proposal_hash> -``` - -**Usage**: - -```console -btcli su senate-vote [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--proposal, --proposal-hash TEXT`: The hash of the proposal to vote on. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--vote-aye / --vote-nay`: The vote casted on the proposal -* `--help`: Show this message and exit. - -### `btcli su set-take` - -Allows users to change their delegate take percentage. - -This command can be used to update the delegate takes. To run the command, the user must have a configured wallet with both hotkey and coldkey. -The command makes sure the new take value is within 0-18% range. - -**Example:** -``` -btcli sudo set-take --wallet-name my_wallet --wallet-hotkey my_hotkey -``` - -**Usage**: - -```console -btcli su set-take [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--take FLOAT`: The new take value. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli su get-take` - -Allows users to check their delegate take percentage. - -This command can be used to fetch the delegate take of your hotkey. - -**Example:** -``` -btcli sudo get-take --wallet-name my_wallet --wallet-hotkey my_hotkey -``` - -**Usage**: - -```console -btcli su get-take [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli su senate_vote` - -Cast a vote on an active proposal in Bittensor's governance protocol. - -This command is used by Senate members to vote on various proposals that shape the network's future. Use `btcli sudo proposals` to see the active proposals and their hashes. - -**Usage:** -The user must specify the hash of the proposal they want to vote on. The command then allows the Senate member to cast a 'Yes' or 'No' vote, contributing to the decision-making process on the proposal. This command is crucial for Senate members to exercise their voting rights on key proposals. It plays a vital role in the governance and evolution of the Bittensor network. - -**Example:** -``` -btcli sudo senate_vote --proposal <proposal_hash> -``` - -**Usage**: - -```console -btcli su senate_vote [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--proposal, --proposal-hash TEXT`: The hash of the proposal to vote on. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--vote-aye / --vote-nay`: The vote casted on the proposal -* `--help`: Show this message and exit. - -### `btcli su get_take` - -Allows users to check their delegate take percentage. - -This command can be used to fetch the delegate take of your hotkey. - -**Example:** -``` -btcli sudo get-take --wallet-name my_wallet --wallet-hotkey my_hotkey -``` - -**Usage**: - -```console -btcli su get_take [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli su set_take` - -Allows users to change their delegate take percentage. - -This command can be used to update the delegate takes. To run the command, the user must have a configured wallet with both hotkey and coldkey. -The command makes sure the new take value is within 0-18% range. - -**Example:** -``` -btcli sudo set-take --wallet-name my_wallet --wallet-hotkey my_hotkey -``` - -**Usage**: - -```console -btcli su set_take [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--take FLOAT`: The new take value. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -## `btcli subnets` - -**Usage**: - -```console -btcli subnets [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--help`: Show this message and exit. - -**Commands**: - -* `hyperparameters`: Shows a list of the hyperparameters for... -* `list`: List all subnets and their detailed... -* `burn-cost`: Shows the required amount of TAO to be... -* `create`: Registers a new subnet on the network. -* `pow-register`: Register a neuron (a subnet validator or a... -* `register`: Register a neuron (a subnet validator or a... -* `metagraph`: Displays detailed information about a... -* `show`: Displays detailed information about a... -* `price`: Shows the historical price of a subnet for... -* `burn_cost`: Shows the required amount of TAO to be... -* `pow_register`: Register a neuron (a subnet validator or a... - -### `btcli subnets hyperparameters` - -Shows a list of the hyperparameters for the specified subnet. - -**Example:** - -``` -btcli sudo get --netuid 1 -``` - -**Usage**: - -```console -btcli subnets hyperparameters [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli subnets list` - -List all subnets and their detailed information. - - Common Examples: - 1. List all subnets: - ``` - btcli subnets list - ``` - - 2. List all subnets in live mode: - ``` - btcli subnets list --live - ``` - -Output Columns: Netuid - Subnet identifier number - Name - Subnet name with currency symbol (τ/α/β etc) - Price (τ_in/α_in) - Exchange rate (TAO per alpha token) - Market Cap (α * Price) - Total value in TAO (alpha tokens × price) - Emission (τ) - TAO rewards emitted per block to subnet - P (τ_in, α_in) - Pool reserves (Tao reserves, alpha reserves) in liquidity pool - Stake (α_out) - Total staked alpha tokens across all hotkeys (alpha outstanding) - Supply (α) - Circulating alpha token supply - Tempo (k/n) - Block interval for subnet updates - - **Example:** - - ``` - btcli subnets list - ``` - -**Usage**: - -```console -btcli subnets list [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--live`: Display live view of the table -* `--help`: Show this message and exit. - -### `btcli subnets burn-cost` - -Shows the required amount of TAO to be recycled for creating a new subnet, i.e., cost of registering a new subnet. - -The current implementation anneals the cost of creating a subnet over a period of two days. If the displayed cost is unappealing to you, check back in a day or two to see if it has decreased to a more affordable level. - -**Example:** - -``` -btcli subnets burn_cost -``` - -**Usage**: - -```console -btcli subnets burn-cost [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli subnets create` - -Registers a new subnet on the network. - -This command allows you to create a new subnet and set the subnet's identity. -You also have the option to set your own identity after the registration is complete. - -Common Examples: -1. Interactive subnet creation: -``` -btcli subnets create -``` - -2. Create with GitHub repo and contact email: - -``` -btcli subnets create --subnet-name MySubnet --github-repo https://github.com/myorg/mysubnet --subnet-contact team@mysubnet.net -``` -**Usage**: - -```console -btcli subnets create [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--subnet-name, --name TEXT`: Name of the subnet -* `--github-repo, --repo TEXT`: GitHub repository URL -* `--subnet-contact, --contact, --email TEXT`: Contact email for subnet -* `--subnet-url, --url TEXT`: Subnet URL -* `--discord-handle, --discord TEXT`: Discord handle -* `--description TEXT`: Description -* `--additional-info TEXT`: Additional information -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli subnets pow-register` - -Register a neuron (a subnet validator or a subnet miner) using Proof of Work (POW). - -This method is an alternative registration process that uses computational work for securing a neuron's place on the subnet. - -The command starts by verifying the existence of the specified subnet. If the subnet does not exist, it terminates with an error message. On successful verification, the POW registration process is initiated, which requires solving computational puzzles. - -The command also supports additional wallet and subtensor arguments, enabling further customization of the registration process. - -**Example:** - -``` -btcli pow_register --netuid 1 --num_processes 4 --cuda -``` - -Note: This command is suitable for users with adequate computational resources to participate in POW registration. -It requires a sound understanding of the network's operations and POW mechanics. Users should ensure their systems meet the necessary hardware and software requirements, particularly when opting for CUDA-based GPU acceleration. - -This command may be disabled by the subnet owner. For example, on netuid 1 this is permanently disabled. - -**Usage**: - -```console -btcli subnets pow-register [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `--processors INTEGER`: Number of processors to use for POW registration. -* `-u, --update-interval INTEGER`: The number of nonces to process before checking for the next block during registration [default: 50000] -* `--output-in-place / --no-output-in-place`: Whether to output the registration statistics in-place. [default: output-in-place] -* `-v, --verbose`: Whether to output the registration statistics verbosely. -* `--use-cuda, --cuda / --no-use-cuda, --no-cuda`: Set the flag to use CUDA for POW registration. [default: no-use-cuda] -* `-d, --dev-id INTEGER`: Set the CUDA device id(s), in the order of the device speed (0 is the fastest). [default: 0] -* `-tbp, --threads-per-block INTEGER`: Set the number of threads per block for CUDA. [default: 256] -* `--help`: Show this message and exit. - -### `btcli subnets register` - -Register a neuron (a subnet validator or a subnet miner) in the specified subnet by recycling some TAO. - -Before registering, the command checks if the specified subnet exists and whether the user's balance is sufficient to cover the registration cost. - -The registration cost is determined by the current recycle amount for the specified subnet. If the balance is insufficient or the subnet does not exist, the command will exit with an error message. - -**Example:** - -``` -btcli subnets register --netuid 1 -``` - -**Usage**: - -```console -btcli subnets register [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli subnets metagraph` - -Displays detailed information about a subnet including participants and their state. - -**Example:** - -``` -btcli subnets list -``` - -**Usage**: - -```console -btcli subnets metagraph [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--help`: Show this message and exit. - -### `btcli subnets show` - -Displays detailed information about a subnet including participants and their state. - -**Example:** - -``` -btcli subnets list -``` - -**Usage**: - -```console -btcli subnets show [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--help`: Show this message and exit. - -### `btcli subnets price` - -Shows the historical price of a subnet for the past 24 hours. - -This command displays the historical price of a subnet for the past 24 hours. -If the `--all` flag is used, the command will display the price for all subnets in html format. -If the `--html` flag is used, the command will display the price in an HTML chart. -If the `--log-scale` flag is used, the command will display the price in log scale. -If no html flag is used, the command will display the price in the cli. - -**Example:** - -``` -btcli subnets price --netuid 1 -``` -``` -btcli subnets price --netuid 1 --html --log -``` -``` -btcli subnets price --all --html -``` -``` -btcli subnets price --netuids 1,2,3,4 --html -``` - -**Usage**: - -```console -btcli subnets price [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `-n, --netuids, --netuid TEXT`: Netuid(s) to show the price for. -* `--interval-hours, --interval INTEGER`: The number of hours to show the historical price for. [default: 24] -* `--all-netuids, --all`: Show the price for all subnets. -* `--log-scale, --log`: Show the price in log scale. -* `--html`: Display the table as HTML in the browser. -* `--help`: Show this message and exit. - -### `btcli subnets burn_cost` - -Shows the required amount of TAO to be recycled for creating a new subnet, i.e., cost of registering a new subnet. - -The current implementation anneals the cost of creating a subnet over a period of two days. If the displayed cost is unappealing to you, check back in a day or two to see if it has decreased to a more affordable level. - -**Example:** - -``` -btcli subnets burn_cost -``` - -**Usage**: - -```console -btcli subnets burn_cost [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli subnets pow_register` - -Register a neuron (a subnet validator or a subnet miner) using Proof of Work (POW). - -This method is an alternative registration process that uses computational work for securing a neuron's place on the subnet. - -The command starts by verifying the existence of the specified subnet. If the subnet does not exist, it terminates with an error message. On successful verification, the POW registration process is initiated, which requires solving computational puzzles. - -The command also supports additional wallet and subtensor arguments, enabling further customization of the registration process. - -**Example:** - -``` -btcli pow_register --netuid 1 --num_processes 4 --cuda -``` - -Note: This command is suitable for users with adequate computational resources to participate in POW registration. -It requires a sound understanding of the network's operations and POW mechanics. Users should ensure their systems meet the necessary hardware and software requirements, particularly when opting for CUDA-based GPU acceleration. - -This command may be disabled by the subnet owner. For example, on netuid 1 this is permanently disabled. - -**Usage**: - -```console -btcli subnets pow_register [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `--processors INTEGER`: Number of processors to use for POW registration. -* `-u, --update-interval INTEGER`: The number of nonces to process before checking for the next block during registration [default: 50000] -* `--output-in-place / --no-output-in-place`: Whether to output the registration statistics in-place. [default: output-in-place] -* `-v, --verbose`: Whether to output the registration statistics verbosely. -* `--use-cuda, --cuda / --no-use-cuda, --no-cuda`: Set the flag to use CUDA for POW registration. [default: no-use-cuda] -* `-d, --dev-id INTEGER`: Set the CUDA device id(s), in the order of the device speed (0 is the fastest). [default: 0] -* `-tbp, --threads-per-block INTEGER`: Set the number of threads per block for CUDA. [default: 256] -* `--help`: Show this message and exit. - -## `btcli s` - -**Usage**: - -```console -btcli s [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--help`: Show this message and exit. - -**Commands**: - -* `hyperparameters`: Shows a list of the hyperparameters for... -* `list`: List all subnets and their detailed... -* `burn-cost`: Shows the required amount of TAO to be... -* `create`: Registers a new subnet on the network. -* `pow-register`: Register a neuron (a subnet validator or a... -* `register`: Register a neuron (a subnet validator or a... -* `metagraph`: Displays detailed information about a... -* `show`: Displays detailed information about a... -* `price`: Shows the historical price of a subnet for... -* `burn_cost`: Shows the required amount of TAO to be... -* `pow_register`: Register a neuron (a subnet validator or a... - -### `btcli s hyperparameters` - -Shows a list of the hyperparameters for the specified subnet. - -**Example:** - -``` -btcli sudo get --netuid 1 -``` - -**Usage**: - -```console -btcli s hyperparameters [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli s list` - -List all subnets and their detailed information. - - Common Examples: - 1. List all subnets: - ``` - btcli subnets list - ``` - - 2. List all subnets in live mode: - ``` - btcli subnets list --live - ``` - -Output Columns: Netuid - Subnet identifier number - Name - Subnet name with currency symbol (τ/α/β etc) - Price (τ_in/α_in) - Exchange rate (TAO per alpha token) - Market Cap (α * Price) - Total value in TAO (alpha tokens × price) - Emission (τ) - TAO rewards emitted per block to subnet - P (τ_in, α_in) - Pool reserves (Tao reserves, alpha reserves) in liquidity pool - Stake (α_out) - Total staked alpha tokens across all hotkeys (alpha outstanding) - Supply (α) - Circulating alpha token supply - Tempo (k/n) - Block interval for subnet updates - - **Example:** - - ``` - btcli subnets list - ``` - -**Usage**: - -```console -btcli s list [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--live`: Display live view of the table -* `--help`: Show this message and exit. - -### `btcli s burn-cost` - -Shows the required amount of TAO to be recycled for creating a new subnet, i.e., cost of registering a new subnet. - -The current implementation anneals the cost of creating a subnet over a period of two days. If the displayed cost is unappealing to you, check back in a day or two to see if it has decreased to a more affordable level. - -**Example:** - -``` -btcli subnets burn_cost -``` - -**Usage**: - -```console -btcli s burn-cost [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli s create` - -Registers a new subnet on the network. - -This command allows you to create a new subnet and set the subnet's identity. -You also have the option to set your own identity after the registration is complete. - -Common Examples: -1. Interactive subnet creation: -``` -btcli subnets create -``` - -2. Create with GitHub repo and contact email: - -``` -btcli subnets create --subnet-name MySubnet --github-repo https://github.com/myorg/mysubnet --subnet-contact team@mysubnet.net -``` - -**Usage**: - -```console -btcli s create [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--subnet-name, --name TEXT`: Name of the subnet -* `--github-repo, --repo TEXT`: GitHub repository URL -* `--subnet-contact, --contact, --email TEXT`: Contact email for subnet -* `--subnet-url, --url TEXT`: Subnet URL -* `--discord-handle, --discord TEXT`: Discord handle -* `--description TEXT`: Description -* `--additional-info TEXT`: Additional information -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli s pow-register` - -Register a neuron (a subnet validator or a subnet miner) using Proof of Work (POW). - -This method is an alternative registration process that uses computational work for securing a neuron's place on the subnet. - -The command starts by verifying the existence of the specified subnet. If the subnet does not exist, it terminates with an error message. On successful verification, the POW registration process is initiated, which requires solving computational puzzles. - -The command also supports additional wallet and subtensor arguments, enabling further customization of the registration process. - -**Example:** - -``` -btcli pow_register --netuid 1 --num_processes 4 --cuda -``` - -Note: This command is suitable for users with adequate computational resources to participate in POW registration. -It requires a sound understanding of the network's operations and POW mechanics. Users should ensure their systems meet the necessary hardware and software requirements, particularly when opting for CUDA-based GPU acceleration. - -This command may be disabled by the subnet owner. For example, on netuid 1 this is permanently disabled. - -**Usage**: - -```console -btcli s pow-register [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `--processors INTEGER`: Number of processors to use for POW registration. -* `-u, --update-interval INTEGER`: The number of nonces to process before checking for the next block during registration [default: 50000] -* `--output-in-place / --no-output-in-place`: Whether to output the registration statistics in-place. [default: output-in-place] -* `-v, --verbose`: Whether to output the registration statistics verbosely. -* `--use-cuda, --cuda / --no-use-cuda, --no-cuda`: Set the flag to use CUDA for POW registration. [default: no-use-cuda] -* `-d, --dev-id INTEGER`: Set the CUDA device id(s), in the order of the device speed (0 is the fastest). [default: 0] -* `-tbp, --threads-per-block INTEGER`: Set the number of threads per block for CUDA. [default: 256] -* `--help`: Show this message and exit. - -### `btcli s register` - -Register a neuron (a subnet validator or a subnet miner) in the specified subnet by recycling some TAO. - -Before registering, the command checks if the specified subnet exists and whether the user's balance is sufficient to cover the registration cost. - -The registration cost is determined by the current recycle amount for the specified subnet. If the balance is insufficient or the subnet does not exist, the command will exit with an error message. - -**Example:** - -``` -btcli subnets register --netuid 1 -``` - -**Usage**: - -```console -btcli s register [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli s metagraph` - -Displays detailed information about a subnet including participants and their state. - -**Example:** - -``` -btcli subnets list -``` - -**Usage**: - -```console -btcli s metagraph [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--help`: Show this message and exit. - -### `btcli s show` - -Displays detailed information about a subnet including participants and their state. - -**Example:** - -``` -btcli subnets list -``` - -**Usage**: - -```console -btcli s show [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--help`: Show this message and exit. - -### `btcli s price` - -Shows the historical price of a subnet for the past 24 hours. - -This command displays the historical price of a subnet for the past 24 hours. -If the `--all` flag is used, the command will display the price for all subnets in html format. -If the `--html` flag is used, the command will display the price in an HTML chart. -If the `--log-scale` flag is used, the command will display the price in log scale. -If no html flag is used, the command will display the price in the cli. - -**Example:** - -``` -btcli subnets price --netuid 1 -``` -``` -btcli subnets price --netuid 1 --html --log -``` -``` -btcli subnets price --all --html -``` -``` -btcli subnets price --netuids 1,2,3,4 --html -``` - -**Usage**: - -```console -btcli s price [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `-n, --netuids, --netuid TEXT`: Netuid(s) to show the price for. -* `--interval-hours, --interval INTEGER`: The number of hours to show the historical price for. [default: 24] -* `--all-netuids, --all`: Show the price for all subnets. -* `--log-scale, --log`: Show the price in log scale. -* `--html`: Display the table as HTML in the browser. -* `--help`: Show this message and exit. - -### `btcli s burn_cost` - -Shows the required amount of TAO to be recycled for creating a new subnet, i.e., cost of registering a new subnet. - -The current implementation anneals the cost of creating a subnet over a period of two days. If the displayed cost is unappealing to you, check back in a day or two to see if it has decreased to a more affordable level. - -**Example:** - -``` -btcli subnets burn_cost -``` - -**Usage**: - -```console -btcli s burn_cost [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli s pow_register` - -Register a neuron (a subnet validator or a subnet miner) using Proof of Work (POW). - -This method is an alternative registration process that uses computational work for securing a neuron's place on the subnet. - -The command starts by verifying the existence of the specified subnet. If the subnet does not exist, it terminates with an error message. On successful verification, the POW registration process is initiated, which requires solving computational puzzles. - -The command also supports additional wallet and subtensor arguments, enabling further customization of the registration process. - -**Example:** - -``` -btcli pow_register --netuid 1 --num_processes 4 --cuda -``` - -Note: This command is suitable for users with adequate computational resources to participate in POW registration. -It requires a sound understanding of the network's operations and POW mechanics. Users should ensure their systems meet the necessary hardware and software requirements, particularly when opting for CUDA-based GPU acceleration. - -This command may be disabled by the subnet owner. For example, on netuid 1 this is permanently disabled. - -**Usage**: - -```console -btcli s pow_register [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `--processors INTEGER`: Number of processors to use for POW registration. -* `-u, --update-interval INTEGER`: The number of nonces to process before checking for the next block during registration [default: 50000] -* `--output-in-place / --no-output-in-place`: Whether to output the registration statistics in-place. [default: output-in-place] -* `-v, --verbose`: Whether to output the registration statistics verbosely. -* `--use-cuda, --cuda / --no-use-cuda, --no-cuda`: Set the flag to use CUDA for POW registration. [default: no-use-cuda] -* `-d, --dev-id INTEGER`: Set the CUDA device id(s), in the order of the device speed (0 is the fastest). [default: 0] -* `-tbp, --threads-per-block INTEGER`: Set the number of threads per block for CUDA. [default: 256] -* `--help`: Show this message and exit. - -## `btcli subnet` - -**Usage**: - -```console -btcli subnet [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--help`: Show this message and exit. - -**Commands**: - -* `hyperparameters`: Shows a list of the hyperparameters for... -* `list`: List all subnets and their detailed... -* `burn-cost`: Shows the required amount of TAO to be... -* `create`: Registers a new subnet on the network. -* `pow-register`: Register a neuron (a subnet validator or a... -* `register`: Register a neuron (a subnet validator or a... -* `metagraph`: Displays detailed information about a... -* `show`: Displays detailed information about a... -* `price`: Shows the historical price of a subnet for... -* `burn_cost`: Shows the required amount of TAO to be... -* `pow_register`: Register a neuron (a subnet validator or a... - -### `btcli subnet hyperparameters` - -Shows a list of the hyperparameters for the specified subnet. - -**Example:** - -``` -btcli sudo get --netuid 1 -``` - -**Usage**: - -```console -btcli subnet hyperparameters [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli subnet list` - -List all subnets and their detailed information. - - Common Examples: - 1. List all subnets: - ``` - btcli subnets list - ``` - - 2. List all subnets in live mode: - ``` - btcli subnets list --live - ``` - -Output Columns: Netuid - Subnet identifier number - Name - Subnet name with currency symbol (τ/α/β etc) - Price (τ_in/α_in) - Exchange rate (TAO per alpha token) - Market Cap (α * Price) - Total value in TAO (alpha tokens × price) - Emission (τ) - TAO rewards emitted per block to subnet - P (τ_in, α_in) - Pool reserves (Tao reserves, alpha reserves) in liquidity pool - Stake (α_out) - Total staked alpha tokens across all hotkeys (alpha outstanding) - Supply (α) - Circulating alpha token supply - Tempo (k/n) - Block interval for subnet updates - - **Example:** - - ``` - btcli subnets list - ``` - -**Usage**: - -```console -btcli subnet list [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--live`: Display live view of the table -* `--help`: Show this message and exit. - -### `btcli subnet burn-cost` - -Shows the required amount of TAO to be recycled for creating a new subnet, i.e., cost of registering a new subnet. - -The current implementation anneals the cost of creating a subnet over a period of two days. If the displayed cost is unappealing to you, check back in a day or two to see if it has decreased to a more affordable level. - -**Example:** - -``` -btcli subnets burn_cost -``` - -**Usage**: - -```console -btcli subnet burn-cost [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli subnet create` - -Registers a new subnet on the network. - -This command allows you to create a new subnet and set the subnet's identity. -You also have the option to set your own identity after the registration is complete. - -Common Examples: -1. Interactive subnet creation: -``` -btcli subnets create -``` - -2. Create with GitHub repo and contact email: - -``` -btcli subnets create --subnet-name MySubnet --github-repo https://github.com/myorg/mysubnet --subnet-contact team@mysubnet.net -``` - -**Usage**: - -```console -btcli subnet create [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--subnet-name, --name TEXT`: Name of the subnet -* `--github-repo, --repo TEXT`: GitHub repository URL -* `--subnet-contact, --contact, --email TEXT`: Contact email for subnet -* `--subnet-url, --url TEXT`: Subnet URL -* `--discord-handle, --discord TEXT`: Discord handle -* `--description TEXT`: Description -* `--additional-info TEXT`: Additional information -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli subnet pow-register` - -Register a neuron (a subnet validator or a subnet miner) using Proof of Work (POW). - -This method is an alternative registration process that uses computational work for securing a neuron's place on the subnet. - -The command starts by verifying the existence of the specified subnet. If the subnet does not exist, it terminates with an error message. On successful verification, the POW registration process is initiated, which requires solving computational puzzles. - -The command also supports additional wallet and subtensor arguments, enabling further customization of the registration process. - -**Example:** - -``` -btcli pow_register --netuid 1 --num_processes 4 --cuda -``` - -Note: This command is suitable for users with adequate computational resources to participate in POW registration. -It requires a sound understanding of the network's operations and POW mechanics. Users should ensure their systems meet the necessary hardware and software requirements, particularly when opting for CUDA-based GPU acceleration. - -This command may be disabled by the subnet owner. For example, on netuid 1 this is permanently disabled. - -**Usage**: - -```console -btcli subnet pow-register [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `--processors INTEGER`: Number of processors to use for POW registration. -* `-u, --update-interval INTEGER`: The number of nonces to process before checking for the next block during registration [default: 50000] -* `--output-in-place / --no-output-in-place`: Whether to output the registration statistics in-place. [default: output-in-place] -* `-v, --verbose`: Whether to output the registration statistics verbosely. -* `--use-cuda, --cuda / --no-use-cuda, --no-cuda`: Set the flag to use CUDA for POW registration. [default: no-use-cuda] -* `-d, --dev-id INTEGER`: Set the CUDA device id(s), in the order of the device speed (0 is the fastest). [default: 0] -* `-tbp, --threads-per-block INTEGER`: Set the number of threads per block for CUDA. [default: 256] -* `--help`: Show this message and exit. - -### `btcli subnet register` - -Register a neuron (a subnet validator or a subnet miner) in the specified subnet by recycling some TAO. - -Before registering, the command checks if the specified subnet exists and whether the user's balance is sufficient to cover the registration cost. - -The registration cost is determined by the current recycle amount for the specified subnet. If the balance is insufficient or the subnet does not exist, the command will exit with an error message. - -**Example:** - -``` -btcli subnets register --netuid 1 -``` - -**Usage**: - -```console -btcli subnet register [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli subnet metagraph` - -Displays detailed information about a subnet including participants and their state. - -**Example:** - -``` -btcli subnets list -``` - -**Usage**: - -```console -btcli subnet metagraph [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--help`: Show this message and exit. - -### `btcli subnet show` - -Displays detailed information about a subnet including participants and their state. - -**Example:** - -``` -btcli subnets list -``` - -**Usage**: - -```console -btcli subnet show [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--help`: Show this message and exit. - -### `btcli subnet price` - -Shows the historical price of a subnet for the past 24 hours. - -This command displays the historical price of a subnet for the past 24 hours. -If the `--all` flag is used, the command will display the price for all subnets in html format. -If the `--html` flag is used, the command will display the price in an HTML chart. -If the `--log-scale` flag is used, the command will display the price in log scale. -If no html flag is used, the command will display the price in the cli. - -**Example:** - -``` -btcli subnets price --netuid 1 -``` -``` -btcli subnets price --netuid 1 --html --log -``` -``` -btcli subnets price --all --html -``` -``` -btcli subnets price --netuids 1,2,3,4 --html -``` - -**Usage**: - -```console -btcli subnet price [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `-n, --netuids, --netuid TEXT`: Netuid(s) to show the price for. -* `--interval-hours, --interval INTEGER`: The number of hours to show the historical price for. [default: 24] -* `--all-netuids, --all`: Show the price for all subnets. -* `--log-scale, --log`: Show the price in log scale. -* `--html`: Display the table as HTML in the browser. -* `--help`: Show this message and exit. - -### `btcli subnet burn_cost` - -Shows the required amount of TAO to be recycled for creating a new subnet, i.e., cost of registering a new subnet. - -The current implementation anneals the cost of creating a subnet over a period of two days. If the displayed cost is unappealing to you, check back in a day or two to see if it has decreased to a more affordable level. - -**Example:** - -``` -btcli subnets burn_cost -``` - -**Usage**: - -```console -btcli subnet burn_cost [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli subnet pow_register` - -Register a neuron (a subnet validator or a subnet miner) using Proof of Work (POW). - -This method is an alternative registration process that uses computational work for securing a neuron's place on the subnet. - -The command starts by verifying the existence of the specified subnet. If the subnet does not exist, it terminates with an error message. On successful verification, the POW registration process is initiated, which requires solving computational puzzles. - -The command also supports additional wallet and subtensor arguments, enabling further customization of the registration process. - -**Example:** - -``` -btcli pow_register --netuid 1 --num_processes 4 --cuda -``` - -Note: This command is suitable for users with adequate computational resources to participate in POW registration. -It requires a sound understanding of the network's operations and POW mechanics. Users should ensure their systems meet the necessary hardware and software requirements, particularly when opting for CUDA-based GPU acceleration. - -This command may be disabled by the subnet owner. For example, on netuid 1 this is permanently disabled. - -**Usage**: - -```console -btcli subnet pow_register [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `--processors INTEGER`: Number of processors to use for POW registration. -* `-u, --update-interval INTEGER`: The number of nonces to process before checking for the next block during registration [default: 50000] -* `--output-in-place / --no-output-in-place`: Whether to output the registration statistics in-place. [default: output-in-place] -* `-v, --verbose`: Whether to output the registration statistics verbosely. -* `--use-cuda, --cuda / --no-use-cuda, --no-cuda`: Set the flag to use CUDA for POW registration. [default: no-use-cuda] -* `-d, --dev-id INTEGER`: Set the CUDA device id(s), in the order of the device speed (0 is the fastest). [default: 0] -* `-tbp, --threads-per-block INTEGER`: Set the number of threads per block for CUDA. [default: 256] -* `--help`: Show this message and exit. - -## `btcli weights` - -**Usage**: - -```console -btcli weights [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--help`: Show this message and exit. - -**Commands**: - -* `reveal`: Reveal weights for a specific subnet. -* `commit`: Commit weights for specific subnet. - -### `btcli weights reveal` - -Reveal weights for a specific subnet. - -You must specify the netuid, the UIDs you are interested in, and weights you wish to reveal. - -**Example:** - -``` -btcli wt reveal --netuid 1 --uids 1,2,3,4 --weights 0.1,0.2,0.3,0.4 --salt 163,241,217,11,161,142,147,189 -``` - -**Usage**: - -```console -btcli weights reveal [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `-u, --uids TEXT`: Corresponding UIDs for the specified netuid, e.g. -u 1,2,3 ... -* `-w, --weights TEXT`: Weights for the specified UIDs, e.g. `-w 0.2,0.4,0.1 ...` Must correspond to the order of the UIDs. -* `-s, --salt TEXT`: Corresponding salt for the hash function, e.g. -s 163,241,217 ... -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli weights commit` - -Commit weights for specific subnet. - -Use this command to commit weights for a specific subnet. You must specify the netuid, the UIDs you are interested in, and the weights you wish to commit. - -**Example:** - -``` -btcli wt commit --netuid 1 --uids 1,2,3,4 --w 0.1,0.2,0.3 -``` - -Note: This command is used to commit weights for a specific subnet and requires the user to have the necessary -permissions. - -**Usage**: - -```console -btcli weights commit [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `-u, --uids TEXT`: UIDs of interest for the specified netuid, e.g. -u 1,2,3 ... -* `-w, --weights TEXT`: Weights for the specified UIDs, e.g. `-w 0.2,0.4,0.1 ...` Must correspond to the order of the UIDs. -* `-s, --salt TEXT`: Corresponding salt for the hash function, e.g. -s 163 -s 241 -s 217 ... -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -## `btcli wt` - -**Usage**: - -```console -btcli wt [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--help`: Show this message and exit. - -**Commands**: - -* `reveal`: Reveal weights for a specific subnet. -* `commit`: Commit weights for specific subnet. - -### `btcli wt reveal` - -Reveal weights for a specific subnet. - -You must specify the netuid, the UIDs you are interested in, and weights you wish to reveal. - -**Example:** - -``` -btcli wt reveal --netuid 1 --uids 1,2,3,4 --weights 0.1,0.2,0.3,0.4 --salt 163,241,217,11,161,142,147,189 -``` - -**Usage**: - -```console -btcli wt reveal [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `-u, --uids TEXT`: Corresponding UIDs for the specified netuid, e.g. -u 1,2,3 ... -* `-w, --weights TEXT`: Weights for the specified UIDs, e.g. `-w 0.2,0.4,0.1 ...` Must correspond to the order of the UIDs. -* `-s, --salt TEXT`: Corresponding salt for the hash function, e.g. -s 163,241,217 ... -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli wt commit` - -Commit weights for specific subnet. - -Use this command to commit weights for a specific subnet. You must specify the netuid, the UIDs you are interested in, and the weights you wish to commit. - -**Example:** - -``` -btcli wt commit --netuid 1 --uids 1,2,3,4 --w 0.1,0.2,0.3 -``` - -Note: This command is used to commit weights for a specific subnet and requires the user to have the necessary -permissions. - -**Usage**: - -```console -btcli wt commit [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `-u, --uids TEXT`: UIDs of interest for the specified netuid, e.g. -u 1,2,3 ... -* `-w, --weights TEXT`: Weights for the specified UIDs, e.g. `-w 0.2,0.4,0.1 ...` Must correspond to the order of the UIDs. -* `-s, --salt TEXT`: Corresponding salt for the hash function, e.g. -s 163 -s 241 -s 217 ... -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -## `btcli weight` - -**Usage**: - -```console -btcli weight [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--help`: Show this message and exit. - -**Commands**: - -* `reveal`: Reveal weights for a specific subnet. -* `commit`: Commit weights for specific subnet. - -### `btcli weight reveal` - -Reveal weights for a specific subnet. - -You must specify the netuid, the UIDs you are interested in, and weights you wish to reveal. - -**Example:** - -``` -btcli wt reveal --netuid 1 --uids 1,2,3,4 --weights 0.1,0.2,0.3,0.4 --salt 163,241,217,11,161,142,147,189 -``` - -**Usage**: - -```console -btcli weight reveal [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `-u, --uids TEXT`: Corresponding UIDs for the specified netuid, e.g. -u 1,2,3 ... -* `-w, --weights TEXT`: Weights for the specified UIDs, e.g. `-w 0.2,0.4,0.1 ...` Must correspond to the order of the UIDs. -* `-s, --salt TEXT`: Corresponding salt for the hash function, e.g. -s 163,241,217 ... -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### `btcli weight commit` - -Commit weights for specific subnet. - -Use this command to commit weights for a specific subnet. You must specify the netuid, the UIDs you are interested in, and the weights you wish to commit. - -**Example:** - -``` -btcli wt commit --netuid 1 --uids 1,2,3,4 --w 0.1,0.2,0.3 -``` - -Note: This command is used to commit weights for a specific subnet and requires the user to have the necessary -permissions. - -**Usage**: - -```console -btcli weight commit [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--netuid INTEGER`: The netuid of the subnet in the network, (e.g. 1). -* `-u, --uids TEXT`: UIDs of interest for the specified netuid, e.g. -u 1,2,3 ... -* `-w, --weights TEXT`: Weights for the specified UIDs, e.g. `-w 0.2,0.4,0.1 ...` Must correspond to the order of the UIDs. -* `-s, --salt TEXT`: Corresponding salt for the hash function, e.g. -s 163 -s 241 -s 217 ... -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -## `btcli utils` - -**Usage**: - -```console -btcli utils [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--help`: Show this message and exit. - -**Commands**: - -* `convert`: Allows for converting between tao and rao... - -### `btcli utils convert` - -Allows for converting between tao and rao using the specified flags - -**Usage**: - -```console -btcli utils convert [OPTIONS] -``` - -**Options**: - -* `--rao TEXT`: Convert amount from Rao -* `--tao FLOAT`: Convert amount from Tao -* `--help`: Show this message and exit. ---- -Made with :heart: by The Openτensor Foundaτion \ No newline at end of file diff --git a/docs/btcli/btcli-playground.md b/docs/btcli/btcli-playground.md deleted file mode 100644 index a155ddc9ae..0000000000 --- a/docs/btcli/btcli-playground.md +++ /dev/null @@ -1,203 +0,0 @@ ---- -title: "BTCLI Live Coding Playground" ---- - - - -This page gives the user a chance to try out some BTCLI functionality right in the browser. - -The BTCLI Live Coding Playground is an ephemeral environment run in a container, meaning nothing stays in between requests, so you'll have to load in you wallet each time. For this reason, you must only use test wallets in the playground. Any coldkey used in the playground should be considered compromised. - -The BTCLI Live Coding Playground is also experimental and a bit flakey, so if you see error responses, try again, but if they persist, the service may be down. - -For a more satisfying experience, [install btcli locally](../getting-started/install-btcli) and try [managing stake with BTCLI](../staking-and-delegation/managing-stake-btcli) - -:::danger -This is not a secure code execution environment. This page is for practice/education/entertainment purposes only. - -**Do not enter the seed phrase for a wallet with _real (main "finney" network)_ TAO into this or any insecure applicaiton!** - -See: - -- [Handle your Seed Phrase/Mnemonic Securely](../keys/handle-seed-phrase) -- [Coldkey and Hotkey Workstation Security](../getting-started/coldkey-hotkey-security) - ::: - -## Import wallets and check balances. - -I've created two wallets for this tutorial and put some testnet TAO into them. Run the code below to import them into bittensor-codex(the code execution service), and list them to see their public keys. - -### Import both wallets and list their keys - -:::tip run it! - - - -```shell -btcli wallet regen-coldkey \ ---mnemonic "add aerobic there stool organ switch about diagram arctic vague replace seminar" \ ---wallet.name 'playground-test1' \ ---no-use-password --wallet.path ~/.bittensor/wallets - -btcli wallet regen-coldkey \ ---mnemonic "nominee sort fringe gauge tank sure core memory abandon lamp alter flash" \ ---wallet.name 'playground-test2' \ ---no-use-password --wallet.path ~/.bittensor/wallets - -btcli wallet list --wallet.path ~/.bittensor/wallets - -``` - - - -::: - -### Check balance for `playground-test1` - -:::tip run it! - - - -```shell -btcli wallet regen-coldkey \ ---mnemonic "add aerobic there stool organ switch about diagram arctic vague replace seminar" \ ---wallet.name 'playground-test1' \ ---no-use-password --wallet.path ~/.bittensor/wallets - -btcli wallet balance \ ---wallet.name 'playground-test1' \ ---wallet.path ~/.bittensor/wallets \ ---network test -``` - - - -::: - -### Check balance for `playground-test2` - -:::tip run it! - - - -```shell - -btcli wallet regen-coldkey \ ---mnemonic "nominee sort fringe gauge tank sure core memory abandon lamp alter flash" \ ---wallet.name 'playground-test2' \ ---no-use-password --wallet.path ~/.bittensor/wallets - -btcli wallet balance \ ---wallet.name 'playground-test2' \ ---wallet.path ~/.bittensor/wallets \ ---network test -``` - - - -::: - -## Transfer - -Transfer some TAO from `playground-test1` to `playground-test2`. We can get the `--destination` address from the `wallet list` command above. - -:::info - -- The command returning a `request failed` response in the browser does not mean that the request failed on-chain. To confirm, check the wallet balance of `playground-test2` using the command above. -- You can also replace the wallet address under the `--destination` flag to transfer testnet TAO to your address. - ::: - -Run the following command to transfer testnet TAO: - -:::tip run it! - - - - -```shell -btcli wallet regen-coldkey \ ---mnemonic "add aerobic there stool organ switch about diagram arctic vague replace seminar" \ ---wallet.name 'playground-test1' \ ---no-use-password --wallet.path ~/.bittensor/wallets - -btcli wallet transfer \ ---amount 0.1 \ ---wallet.name 'playground-test1' \ ---network test \ ---destination "5ESAWH9HDB9PZvs1q5j3aWF3x1wo88kwaqNcJEabGKsHMvX6" \ ---no-prompt \ ---wallet.path ~/.bittensor/wallets -``` - - - -::: - -:::info Challenges - -1. Check your balance to make sure the transfer executed successfully on chain. -2. Switch the values to transfer TAO back from `playground-test2` to `playground-test1`. -3. Transfer some testnet TAO to a wallet you manage on another device. Just please don't take all of it. -4. If you have some extra testnet TAO, transfer some to the playground-test wallets to refill them. - - _Note: Testnet TAO has no monetary value._ - -::: - -## Subnets - -### Subnet list - -:::tip run it! - - - -```shell - -btcli subnet list -``` - - - -::: - -### Subnet show - -:::tip run it! - - - -```shell -btcli subnet show --netuid 3 -``` - - - -::: - -## List a wallet's stakes - -See [Staking/Delegation Overview](../staking-and-delegation/delegation). - -:::tip run it! - - - -```shell -btcli wallet regen-coldkey \ ---mnemonic "add aerobic there stool organ switch about diagram arctic vague replace seminar" \ ---wallet.name 'playground-test1' \ ---no-use-password --wallet.path ~/.bittensor/wallets - -btcli stake list --network test --wallet.name playground-test1 --wallet-path ~/.bittensor/wallets --no-prompt - -``` - - - -::: - - :::info Challenge - Try staking and unstaking from the playground-test wallets! - -::: diff --git a/docs/btcli/overview.md b/docs/btcli/overview.md deleted file mode 100644 index 20cc4c597b..0000000000 --- a/docs/btcli/overview.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: "Bittensor CLI Overview" ---- - -# Bittensor CLI Overview - -The Bittensor command line interface (CLI), `btcli`, provides the simplest way to interact with the Bittensor network and its subnets from the command line. This includes managing [wallets (coldkeys and hotkeys)](../getting-started/wallets), TAO balances, transfer, staking and unstaking functions, node registration, governance functions, and more. - - -See: -- [Install `btcli`](../getting-started/install-btcli) -- [Managing Stake with BTCLI](../staking-and-delegation/managing-stake-btcli.md) -- [`btcli reference document`](../btcli.md) \ No newline at end of file diff --git a/docs/concepts/_equations.md b/docs/concepts/_equations.md deleted file mode 100644 index 4d5a72f3d2..0000000000 --- a/docs/concepts/_equations.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: "Equations" ---- - -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Equations - -$$ -W = \begin{bmatrix} w_{0,0} & w_{0,1} & w_{0,2} & w_{0,3} \\\\ w_{1,0} & w_{1,1} & w_{1,2} & w_{1,3} \\\\ w_{2,0} & w_{2,1} & w_{2,2} & w_{2,3} \\\\ w_{3,0} & w_{3,1} & w_{3,2} & w_{3,3} \end{bmatrix} -$$ -$$ -T = \begin{bmatrix} t_{0,0} & t_{0,1} & t_{0,2} & t_{0,3} \\\\ t_{1,0} & t_{1,1} & t_{1,2} & t_{1,3} \\\\ t_{2,0} & t_{2,1} & t_{2,2} & t_{2,3} \\\\ t_{3,0} & t_{3,1} & t_{3,2} & t_{3,3} \end{bmatrix} -$$ -$$ -B = \begin{bmatrix} b_{0,0} & b_{0,1} & b_{0,2} & b_{0,3} \\\\ b_{1,0} & b_{1,1} & b_{1,2} & b_{1,3} \\\\ b_{2,0} & b_{2,1} & b_{2,2} & b_{2,3} \\\\ b_{3,0} & b_{3,1} & b_{3,2} & b_{3,3} \end{bmatrix} -$$ -$$ -S = \begin{bmatrix} s_{0} \\\\ s_{1} \\\\ s_{2} \\\\ s_{3} \end{bmatrix} -$$ - diff --git a/docs/dynamic-tao/_dtao-btcli.md b/docs/dynamic-tao/_dtao-btcli.md deleted file mode 100644 index 08b0cae694..0000000000 --- a/docs/dynamic-tao/_dtao-btcli.md +++ /dev/null @@ -1,1955 +0,0 @@ ---- -title: "BTCLI with Dynamic TAO" ---- - -# BTCLI with Dynamic TAO - -This page documents the command line interface (CLI) for Bittensor with dynamic TAO enabled. Dynamic TAO is a planned evolution of Bittensor currently being tested. - -Access the Dynamic TAO-enabled Bittensor test network at: `wss://rao.chain.opentensor.ai:443/` - -:::tip Looking for legacy BTCLI doc? -For current/legacy `btcli` doc that supports the `btcli root` commands, see [Bittensor CLI](../btcli.md). -::: - -**Usage**: - -```bash -btcli [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--version` -* `--install-completion`: Install completion for the current shell. -* `--show-completion`: Show completion for the current shell, to copy it or customize the installation. -* `--help`: Show this message and exit. - -**Commands**: - -* `config`: Config commands, aliases: `c`, `conf` -* `wallet`: Wallet commands, aliases: `wallets`, `w` -* `stake`: Stake commands, alias: `s`, `st` -* `sudo`: Sudo commands, alias: `su` -* `subnet`: Subnet commands, alias: `s`, `subnets` -* `utils`: Utility commands. ??? This seems to work but is not in the `--help` output ??? -* `weights`: Weights commands, aliases: `wt`, `weight` - -## btcli config - -**Usage**: - -```bash -btcli config [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--help`: Show this message and exit. - -### btcli config clear - -Clears the fields in the config file and sets them to `None`. - -#### EXAMPLE - - - To clear the `chain` and `network` fields: - -```bash - btcli config clear --chain --network -``` - - - To clear your config entirely: - -```bash - btcli config clear --all -``` - -**Usage**: - -```bash -btcli config clear [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name` -* `-p, --wallet-path, --wallet_path, --wallet.path` -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey` -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint` -* `--cache` -* `--all` -* `--help`: Show this message and exit. - -### btcli config get - -Prints the current config file in a table. - -**Usage**: - -```bash -btcli config get [OPTIONS] -``` - -**Options**: - -* `--help`: Show this message and exit. - -### btcli config metagraph - -Command option to configure the display of the metagraph columns. - -**Usage**: - -```bash -btcli config metagraph [OPTIONS] -``` - -**Options**: - -* `--reset`: Restore the display of metagraph columns to show all columns. -* `--help`: Show this message and exit. - -### btcli config set - -Sets the values in the config file. To set the metagraph configuration, use the command `btcli config metagraph` - -**Usage**: - -```bash -btcli config set [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--cache, --cache / --no-cache, --no_cache`: Disable caching of some commands. This will disable the `--reuse-last` and `--html` flags on commands such as `subnets metagraph`, `stake show` and `subnets list`. -* `--help`: Show this message and exit. - -## btcli stake - -**Usage**: - -```bash -btcli stake [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--help`: Show this message and exit. - -### btcli stake add - -Stake TAO to one or more hotkeys associated with the user's coldkey. - -This command is used by a subnet validator to stake to their own hotkey. Compare this command with `btcli root delegate` (supported in legacy `btcli` only) that is typically run by a TAO holder to delegate their TAO to a delegate's hotkey. - -This command is used by a subnet validator to allocate stake TAO to their different hotkeys, securing their position and influence on the network. - -#### EXAMPLE - -```bash -btcli stake add --amount 100 --wallet-name --wallet-hotkey -``` - -**Usage**: - -```bash -btcli stake add [OPTIONS] -``` - -**Options**: - -* `-a, --all-tokens, --all`: When set, the command stakes all the available TAO from the coldkey. -* `--amount FLOAT`: The amount of TAO to stake [default: 0.0] -* `-m, --max-stake FLOAT`: Stake is sent to a hotkey only until the hotkey's total stake is less than or equal to this maximum staked TAO. If a hotkey already has stake greater than this amount, then stake is not added to this hotkey. [default: 0.0] -* `-in, --include-hotkeys, --hotkey-ss58-address TEXT`: Specifies hotkeys by name or ss58 address to stake to. For example, `-in hk1,hk2` -* `-ex, --exclude-hotkeys TEXT`: Specifies hotkeys by name or ss58 address to not to stake to (use this option only with `--all-hotkeys`) i.e. `--all-hotkeys -ex hk3,hk4` -* `--all-hotkeys / --`no-all-hotkeys``: When set, this command stakes to all hotkeys associated with the wallet. Do not use if specifying hotkeys in `--include-hotkeys`. [default: `no-all-hotkeys`] -* `--netuid INTEGER`: The netuid of the subnet in the root network, (e.g. 1). -* `--all-netuids / --no-all-netuids`: Use all netuids [default: no-all-netuids] -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### btcli stake child - -**Usage**: - -```bash -btcli stake child [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--help`: Show this message and exit. - -#### btcli stake child get - -Get all the child hotkeys on a specified subnet. - -Users can specify the subnet and see the child hotkeys and the proportion that is given to them. This command is used to view the authority delegated to different hotkeys on the subnet. - -#### EXAMPLE - -```bash -btcli stake child get --all-netuids -``` - -**Usage**: - -```bash -btcli stake child get [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet (e.g. 2) -* `--all-netuids, --all, --allnetuids`: When set, gets the child hotkeys from all the subnets. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -#### btcli stake child revoke - -Remove all children hotkeys on a specified subnet. - -This command is used to remove delegated authority from all child hotkeys, removing their position and influence on the subnet. - -#### EXAMPLE - -```bash -btcli stake child revoke --hotkey --netuid 1 -``` - -**Usage**: - -```bash -btcli stake child revoke [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet, (e.g. 8) -* `--all-netuids, --all, --allnetuids`: When this flag is used it sets child hotkeys on all the subnets. -* `--wait-for-inclusion / --no-wait-for-inclusion`: If `True`, waits until the transaction is included in a block. [default: wait-for-inclusion] -* `--wait-for-finalization / --no-wait-for-finalization`: If `True`, waits until the transaction is finalized on the blockchain. [default: wait-for-finalization] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -#### btcli stake child set - -Set child hotkeys on specified subnets. - -Users can specify the 'proportion' to delegate to child hotkeys (ss58 address). The sum of proportions cannot be greater than 1. - -This command is used to delegate authority to different hotkeys, securing their position and influence on the subnet. - -#### EXAMPLE - -```bash -btcli stake child set -c 5FCL3gmjtQV4xxxxuEPEFQVhyyyyqYgNwX7drFLw7MSdBnxP -c 5Hp5dxxxxtGg7pu8dN2btyyyyVA1vELmM9dy8KQv3LxV8PA7 --hotkey default --netuid 1 -p 0.3 -p 0.7 -``` - -**Usage**: - -```bash -btcli stake child set [OPTIONS] -``` - -**Options**: - -* `-c, --children TEXT`: Enter child hotkeys (ss58) -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet in the root network, (e.g. 1). -* `--all-netuids / --no-all-netuids`: Use all netuids [default: no-all-netuids] -* `-p, --proportions, --prop FLOAT`: Enter the stake weight proportions for the child hotkeys (sum should be less than or equal to 1) -* `--wait-for-inclusion / --no-wait-for-inclusion`: If `True`, waits until the transaction is included in a block. [default: wait-for-inclusion] -* `--wait-for-finalization / --no-wait-for-finalization`: If `True`, waits until the transaction is finalized on the blockchain. [default: wait-for-finalization] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -#### btcli stake child take - -Get and set your child hotkey take on a specified subnet. - -The child hotkey take must be between 0 - 18%. - -#### EXAMPLE - -To get the current take value, do not use the '--take' option: - -```bash - btcli stake child take --hotkey --netuid 1 -``` - -To set a new take value, use the '--take' option: - -```bash - btcli stake child take --hotkey --take 0.12 --netuid 1 -``` - -**Usage**: - -```bash -btcli stake child take [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--hotkey TEXT` -* `--netuid INTEGER`: The netuid of the subnet, (e.g. 23) -* `--all-netuids, --all, --allnetuids`: When this flag is used it sets child hotkeys on all the subnets. -* `-t, --take FLOAT`: Use to set the take value for your child hotkey. When not used, the command will fetch the current take value. -* `--wait-for-inclusion / --no-wait-for-inclusion`: If `True`, waits until the transaction is included in a block. [default: wait-for-inclusion] -* `--wait-for-finalization / --no-wait-for-finalization`: If `True`, waits until the transaction is finalized on the blockchain. [default: wait-for-finalization] -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### btcli stake children - -**Usage**: - -```bash -btcli stake children [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--help`: Show this message and exit. - -#### btcli stake children get - -Get all the child hotkeys on a specified subnet. - -Users can specify the subnet and see the child hotkeys and the proportion that is given to them. This command is used to view the authority delegated to different hotkeys on the subnet. - -#### EXAMPLE - -```bash -btcli stake child get --all-netuids -``` - -**Usage**: - -```bash -btcli stake children get [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet (e.g. 2) -* `--all-netuids, --all, --allnetuids`: When set, gets the child hotkeys from all the subnets. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -#### btcli stake children revoke - -Remove all children hotkeys on a specified subnet. - -This command is used to remove delegated authority from all child hotkeys, removing their position and influence on the subnet. - -#### EXAMPLE - -```bash -btcli stake child revoke --hotkey --netuid 1 -``` - -**Usage**: - -```bash -btcli stake children revoke [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet, (e.g. 8) -* `--all-netuids, --all, --allnetuids`: When this flag is used it sets child hotkeys on all the subnets. -* `--wait-for-inclusion / --no-wait-for-inclusion`: If `True`, waits until the transaction is included in a block. [default: wait-for-inclusion] -* `--wait-for-finalization / --no-wait-for-finalization`: If `True`, waits until the transaction is finalized on the blockchain. [default: wait-for-finalization] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -#### btcli stake children set - -Set child hotkeys on specified subnets. - -Users can specify the 'proportion' to delegate to child hotkeys (ss58 address). The sum of proportions cannot be greater than 1. - -This command is used to delegate authority to different hotkeys, securing their position and influence on the subnet. - -#### EXAMPLE - -```bash -btcli stake child set -c 5FCL3gmjtQV4xxxxuEPEFQVhyyyyqYgNwX7drFLw7MSdBnxP -c 5Hp5dxxxxtGg7pu8dN2btyyyyVA1vELmM9dy8KQv3LxV8PA7 --hotkey default --netuid 1 -p 0.3 -p 0.7 -``` - -**Usage**: - -```bash -btcli stake children set [OPTIONS] -``` - -**Options**: - -* `-c, --children TEXT`: Enter child hotkeys (ss58) -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet in the root network, (e.g. 1). -* `--all-netuids / --no-all-netuids`: Use all netuids [default: no-all-netuids] -* `-p, --proportions, --prop FLOAT`: Enter the stake weight proportions for the child hotkeys (sum should be less than or equal to 1) -* `--wait-for-inclusion / --no-wait-for-inclusion`: If `True`, waits until the transaction is included in a block. [default: wait-for-inclusion] -* `--wait-for-finalization / --no-wait-for-finalization`: If `True`, waits until the transaction is finalized on the blockchain. [default: wait-for-finalization] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -#### btcli stake children take - -Get and set your child hotkey take on a specified subnet. - -The child hotkey take must be between 0 - 18%. - -#### EXAMPLE - -To get the current take value, do not use the '--take' option: - -```bash - btcli stake child take --hotkey --netuid 1 -``` - -To set a new take value, use the '--take' option: - -```bash - btcli stake child take --hotkey --take 0.12 --netuid 1 -``` - -**Usage**: - -```bash -btcli stake children take [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--hotkey TEXT` -* `--netuid INTEGER`: The netuid of the subnet, (e.g. 23) -* `--all-netuids, --all, --allnetuids`: When this flag is used it sets child hotkeys on all the subnets. -* `-t, --take FLOAT`: Use to set the take value for your child hotkey. When not used, the command will fetch the current take value. -* `--wait-for-inclusion / --no-wait-for-inclusion`: If `True`, waits until the transaction is included in a block. [default: wait-for-inclusion] -* `--wait-for-finalization / --no-wait-for-finalization`: If `True`, waits until the transaction is finalized on the blockchain. [default: wait-for-finalization] -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### btcli stake list - -List all stake accounts for wallet. - -**Usage**: - -```bash -btcli stake list [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### btcli stake move - -Move Staked TAO to a hotkey from one subnet to another. - -THe move commands converts the origin subnet's dTao to Tao, and then converts Tao to destination subnet's dTao. - -#### EXAMPLE - -```bash -btcli stake move -``` - -**Usage**: - -```bash -btcli stake move [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--origin-netuid INTEGER`: Origin netuid [required] -* `--destination-netuid INTEGER`: Destination netuid [required] -* `--destination-hotkey TEXT`: Destination hotkey -* `--amount FLOAT`: The amount of TAO to stake [default: 0.0] -* `--stake-all, --all`: Stake all -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--help`: Show this message and exit. - -### btcli stake remove - -Unstake TAO from one or more hotkeys and transfer them back to the user's coldkey. - -This command is used to withdraw TAO previously staked to different hotkeys. - -#### EXAMPLE - -```bash -btcli stake remove --amount 100 -in hk1,hk2 -``` - -:::tip -This command is for users who wish to reallocate their stake or withdraw them from the network. It allows for flexible management of TAO stake across different neurons (hotkeys) on the network. -::: - - -**Usage**: - -```bash -btcli stake remove [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--netuid INTEGER`: The netuid of the subnet in the root network, (e.g. 1). -* `--all-netuids / --no-all-netuids`: Use all netuids [default: no-all-netuids] -* `--unstake-all, --all`: When set, this command unstakes all staked TAO from the specified hotkeys. -* `-a, --amount FLOAT`: The amount of TAO to unstake. [default: 0.0] -* `--hotkey-ss58-address TEXT`: The ss58 address of the hotkey to unstake from. -* `--keep-stake, --keep FLOAT`: Sets the maximum amount of TAO to remain staked in each hotkey. [default: 0.0] -* `-in, --include-hotkeys TEXT`: Specifies the hotkeys by name or ss58 address to unstake from. For example, `-in hk1,hk2` -* `-ex, --exclude-hotkeys TEXT`: Specifies the hotkeys by name or ss58 address not to unstake from (only use with `--all-hotkeys`) i.e. `--all-hotkeys -ex hk3,hk4` -* `--all-hotkeys / --`no-all-hotkeys``: When set, this command unstakes from all the hotkeys associated with the wallet. Do not use if specifying hotkeys in `--include-hotkeys`. [default: `no-all-hotkeys`] -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -## btcli subnet - -**Usage**: - -```bash -btcli subnet [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--help`: Show this message and exit. - - -### btcli subnet create - -Registers a new subnet. - -#### EXAMPLE - -```bash -btcli subnets create -``` - -**Usage**: - -```bash -btcli subnet create [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### btcli subnet hyperparameters - -Shows a list of the hyperparameters for the specified subnet. - -The output of this command is the same as that of `btcli subnets hyperparameters`. - -#### EXAMPLE - -```bash -btcli sudo get --netuid 1 -``` - -**Usage**: - -```bash -btcli subnet hyperparameters [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet in the root network, (e.g. 1). -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### btcli subnet list - -List all subnets and their detailed information. - -This command displays a table with the below columns: - -- NETUID: The subnet's netuid. -- N: The number of neurons (subnet validators and subnet miners) in the subnet. -- MAX_N: The maximum allowed number of neurons in the subnet. -- EMISSION: The percentage of emissions to the subnet as of the last tempo. -- TEMPO: The subnet's tempo, expressed in number of blocks. -- RECYCLE: The recycle register cost for this subnet. -- POW: The proof of work (PoW) difficulty. -- SUDO: The subnet owner's name or the owner's ss58 address. - -#### EXAMPLE - -```bash -btcli subnets list -``` - -**Usage**: - -```bash -btcli subnet list [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### btcli subnet lock-cost - -Shows the required amount of TAO to be locked for creating a new subnet, i.e., cost of registering a new subnet. - -The current implementation anneals the cost of creating a subnet over a period of two days. If the displayed cost is unappealing to you, check back in a day or two to see if it has decreased to a more affordable level. - -#### EXAMPLE - -```bash -btcli subnets lock_cost -``` - -**Usage**: - -```bash -btcli subnet lock-cost [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### btcli subnet metagraph - -Disabled for dynamic TAO. - - - -### btcli subnet pow-register - -Register a neuron (a subnet validator or a subnet miner) using Proof of Work (POW). - -This method is an alternative registration process that uses computational work for securing a neuron's place on the subnet. - -The command starts by verifying the existence of the specified subnet. If the subnet does not exist, it terminates with an error message. On successful verification, the POW registration process is initiated, which requires solving computational puzzles. - -The command also supports additional wallet and subtensor arguments, enabling further customization of the registration process. - -#### EXAMPLE - -```bash -btcli pow_register --netuid 1 --num_processes 4 --cuda -``` - -:::tip -This command is suitable for users with adequate computational resources to participate in POW registration. It requires a sound understanding of the network's operations and POW mechanics. Users should ensure their systems meet the necessary hardware and software requirements, particularly when opting for CUDA-based GPU acceleration. -::: - - -This command may be disabled by the subnet owner. For example, on netuid 1 this is permanently disabled. - -**Usage**: - -```bash -btcli subnet pow-register [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet in the root network, (e.g. 1). -* `--processors INTEGER`: Number of processors to use for POW registration. -* `-u, --update-interval INTEGER`: The number of nonces to process before checking for the next block during registration [default: 50000] -* `--output-in-place / --no-output-in-place`: Whether to output the registration statistics in-place. [default: output-in-place] -* `-v, --verbose`: Whether to output the registration statistics verbosely. -* `--use-cuda, --cuda / --no-use-cuda, --no-cuda`: Set the flag to use CUDA for POW registration. [default: no-use-cuda] -* `-d, --dev-id INTEGER`: Set the CUDA device id(s), in the order of the device speed (0 is the fastest). [default: 0] -* `-tbp, --threads-per-block INTEGER`: Set the number of threads per block for CUDA. [default: 256] -* `--help`: Show this message and exit. - -### btcli subnet register - -Register a neuron (a subnet validator or a subnet miner) in the specified subnet by recycling some TAO. - -Before registering, the command checks if the specified subnet exists and whether the user's balance is sufficient to cover the registration cost. - -The registration cost is determined by the current recycle amount for the specified subnet. If the balance is insufficient or the subnet does not exist, the command will exit with an error message. - -#### EXAMPLE - -```bash -btcli subnets register --netuid 1 -``` - -**Usage**: - -```bash -btcli subnet register [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet in the root network, (e.g. 1). -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### btcli subnet show - -Displays detailed information about a subnet including participants and their state. - -#### EXAMPLE - -```bash -btcli subnets list -``` - -**Usage**: - -```bash -btcli subnet show [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet in the root network, (e.g. 1). -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--help`: Show this message and exit. - -## btcli sudo - -**Usage**: - -```bash -btcli sudo [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--help`: Show this message and exit. - - -### btcli sudo get - -Shows a list of the hyperparameters for the specified subnet. - -The output of this command is the same as that of `btcli subnets hyperparameters`. - -#### EXAMPLE - -```bash -btcli sudo get --netuid 1 -``` - -**Usage**: - -```bash -btcli sudo get [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--netuid INTEGER`: The netuid of the subnet in the root network, (e.g. 1). -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### btcli sudo get-take - -Allows users to check their delegate take percentage. - -This command can be used to fetch the delegate take of your hotkey. - -#### EXAMPLE -```bash -btcli sudo get-take --wallet-name my_wallet --wallet-hotkey my_hotkey -``` - -**Usage**: - -```bash -btcli sudo get-take [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### btcli sudo proposals - -View active proposals for the senate in the Bittensor's governance protocol. - -This command displays the details of ongoing proposals, including proposal hashes, votes, thresholds, and proposal data. - -#### EXAMPLE -```bash -btcli sudo proposals -``` - -**Usage**: - -```bash -btcli sudo proposals [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### btcli sudo senate - -Shows the Senate members of the Bittensor's governance protocol. - -This command lists the delegates involved in the decision-making process of the Bittensor network, showing their names and wallet addresses. This information is crucial for understanding who holds governance roles within the network. - -#### EXAMPLE -```bash -btcli sudo senate -``` - -**Usage**: - -```bash -btcli sudo senate [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### btcli sudo senate-vote - -Cast a vote on an active proposal in Bittensor's governance protocol. - -This command is used by Senate members to vote on various proposals that shape the network's future. Use `btcli sudo proposals` to see the active proposals and their hashes. - -USAGE -The user must specify the hash of the proposal they want to vote on. The command then allows the Senate member to cast a 'Yes' or 'No' vote, contributing to the decision-making process on the proposal. This command is crucial for Senate members to exercise their voting rights on key proposals. It plays a vital role in the governance and evolution of the Bittensor network. - -#### EXAMPLE -```bash -btcli sudo senate_vote --proposal -``` - -**Usage**: - -```bash -btcli sudo senate-vote [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--proposal, --proposal-hash TEXT`: The hash of the proposal to vote on. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--vote-aye / --vote-nay`: The vote casted on the proposal -* `--help`: Show this message and exit. - -### btcli sudo set - -Used to set hyperparameters for a specific subnet. - -This command allows subnet owners to modify hyperparameters such as its tempo, emission rates, and other hyperparameters. - -#### EXAMPLE - -```bash -btcli sudo set --netuid 1 --param tempo --value 400 -``` - -**Usage**: - -```bash -btcli sudo set [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--netuid INTEGER`: The netuid of the subnet in the root network, (e.g. 1). -* `--param, --parameter TEXT`: The subnet hyperparameter to set -* `--value TEXT`: Value to set the hyperparameter to. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### btcli sudo set-take - -Allows users to change their delegate take percentage. - -This command can be used to update the delegate takes. To run the command, the user must have a configured wallet with both hotkey and coldkey. -The command makes sure the new take value is within 0-18% range. - -#### EXAMPLE -```bash -btcli sudo set-take --wallet-name my_wallet --wallet-hotkey my_hotkey -``` - -**Usage**: - -```bash -btcli sudo set-take [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--take FLOAT`: The new take value. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -## btcli utils - -**Usage**: - -```bash -btcli utils [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--help`: Show this message and exit. - -### btcli utils convert - -Allows for converting between tao and rao using the specified flags - -**Usage**: - -```bash -btcli utils convert [OPTIONS] -``` - -**Options**: - -* `--rao TEXT`: Convert amount from Rao -* `--tao FLOAT`: Convert amount from Tao -* `--help`: Show this message and exit. - -## btcli wallet - -**Usage**: - -```bash -btcli wallet [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--help`: Show this message and exit. - - -### btcli wallet balance - -Check the balance of the wallet. This command shows a detailed view of the wallet's coldkey balances, including free and staked balances. - -You can also pass multiple ss58 addresses of coldkeys to check their balance (using --ss58). - -EXAMPLES: - -- To display the balance of a single wallet, use the command with the `--wallet-name` argument and provide the wallet name: - -```bash - btcli w balance --wallet-name WALLET -``` - -- To use the default config values, use: - -```bash - btcli w balance -``` - -- To display the balances of all your wallets, use the `--all` argument: - -```bash - btcli w balance --all -``` - -- To display the balances of ss58 addresses, use the `--ss58` argument: - -```bash - btcli w balance --ss58 --ss58 -``` - -**Usage**: - -```bash -btcli wallet balance [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--ss58, --ss58-address TEXT`: The SS58 address of the coldkey. -* `-a, --all`: Whether to display the balances for all the wallets. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### btcli wallet create - -Create a complete wallet by setting up both coldkey and hotkeys. - -USAGE - -The command creates a new coldkey and hotkey. It provides an option for mnemonic word count. It supports password protection for the coldkey and allows overwriting of existing keys. - -#### EXAMPLE - -```bash -btcli wallet create --n_words 21 -``` - -:::tip -This command is for new users setting up their wallet for the first time, or for those who wish to completely renew their wallet keys. It ensures a fresh start with new keys for secure and effective participation in the Bittensor network. -::: - - -**Usage**: - -```bash -btcli wallet create [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--n-words INTEGER` -* `--use-password / --no-use-password`: Set this to `True` to protect the generated Bittensor key with a password. [default: use-password] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### btcli wallet faucet - -Obtain test TAO tokens by performing Proof of Work (PoW). - -This command is useful for users who need test tokens for operations on a local blockchain. - -**IMPORTANT**: THIS COMMAND IS DISABLED ON FINNEY AND TESTNET. - -USAGE - -The command uses the proof-of-work (POW) mechanism to validate the user's effort and rewards them with test TAO tokens. It is -typically used in local blockchain environments where transactions do not use real TAO tokens. - -#### EXAMPLE - -```bash -btcli wallet faucet --faucet.num_processes 4 --faucet.cuda.use_cuda -``` - -:::tip -This command is meant for used in local environments where users can experiment with the blockchain without using real TAO tokens. Users must have the necessary hardware setup, especially when opting for CUDA-based GPU calculations. It is currently disabled on testnet and mainnet (finney). You can only use this command on a local blockchain. -::: - - -**Usage**: - -```bash -btcli wallet faucet [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--processors INTEGER`: Number of processors to use for proof of work (POW) registration. -* `-u, --update-interval INTEGER`: The number of nonces to process before checking for next block during registration [default: 50000] -* `--output-in-place / --no-output-in-place`: Whether to output the registration statistics in-place. [default: output-in-place] -* `-v, --verbose`: Whether to output the registration statistics verbosely. -* `--use-cuda, --cuda / --no-use-cuda, --no-cuda`: Set flag to use CUDA for proof of work (POW) registration. [default: no-use-cuda] -* `-d, --dev-id INTEGER`: Set the CUDA device id(s) in the order of speed, where 0 is the fastest. [default: 0] -* `-tbp, --threads-per-block INTEGER`: Set the number of threads per block for CUDA. [default: 256] -* `--max-successes INTEGER`: Set the maximum number of times to successfully run the faucet for this command. [default: 3] -* `--help`: Show this message and exit. - -### btcli wallet get-identity - -Shows the identity details of a user's coldkey or hotkey. - -The command displays the information in a table format showing: - -- **Address**: The ``ss58`` address of the queried key. - -- **Item**: Various attributes of the identity such as stake, rank, and trust. - -- **Value**: The corresponding values of the attributes. - -#### EXAMPLE - -```bash -btcli wallet get_identity --key -``` - -:::tip -This command is primarily used for informational purposes and has no side effects on the blockchain network state. -::: - - -**Usage**: - -```bash -btcli wallet get-identity [OPTIONS] -``` - -**Options**: - -* `-k, --key, --ss58 TEXT`: The coldkey or hotkey ss58 address to query. -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### btcli wallet history - -Show the history of the transfers carried out with the provided wallet on the Bittensor network. - -USAGE - -The output shows the latest transfers of the provided wallet, showing the columns 'From', 'To', 'Amount', 'Extrinsic ID' and 'Block Number'. - -#### EXAMPLE - -```bash -btcli wallet history -``` - -**Usage**: - -```bash -btcli wallet history [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### btcli wallet inspect - -Disabled for dynamic TAO. - - - -### btcli wallet list - -Displays all the wallets and their corresponding hotkeys that are located in the wallet path specified in the config. - -The output display shows each wallet and its associated `ss58` addresses for the coldkey public key and any hotkeys. The output is presented in a hierarchical tree format, with each wallet as a root node and any associated hotkeys as child nodes. The `ss58` address is displayed for each coldkey and hotkey that is not encrypted and exists on the device. - -Upon invocation, the command scans the wallet directory and prints a list of all the wallets, indicating whether the -public keys are available (`?` denotes unavailable or encrypted keys). - -#### EXAMPLE - -```bash -btcli wallet list --path ~/.bittensor -``` - -**NOTE**: This command is read-only and does not modify the filesystem or the blockchain state. It is intended for use with the Bittensor CLI to provide a quick overview of the user's wallets. - -**Usage**: - -```bash -btcli wallet list [OPTIONS] -``` - -**Options**: - -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### btcli wallet new-coldkey - -Create a new coldkey. A coldkey is required for holding TAO balances and performing high-value transactions. - -USAGE - -The command creates a new coldkey. It provides options for the mnemonic word count, and supports password protection. It also allows overwriting an existing coldkey. - -#### EXAMPLE - -```bash -btcli wallet new_coldkey --n_words 15 -``` - -:::tip -This command is crucial for users who need to create a new coldkey for enhanced security or as part of setting up a new wallet. It is a foundational step in establishing a secure presence on the Bittensor network. -::: - - -**Usage**: - -```bash -btcli wallet new-coldkey [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--n-words, --n_words INTEGER`: The number of words used in the mnemonic. Options: [12, 15, 18, 21, 24] -* `--use-password / --no-use-password`: Set this to `True` to protect the generated Bittensor key with a password. [default: use-password] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### btcli wallet new-hotkey - -Create a new hotkey for a wallet. - -USAGE - -This command is used to generate a new hotkey for managing a neuron or participating in a subnet. It provides options for the mnemonic word count, and supports password protection. It also allows overwriting the -existing hotkey. - -#### EXAMPLE - -```bash -btcli wallet new-hotkey --n_words 24 -``` - -:::tip -This command is useful to create additional hotkeys for different purposes, such as running multiple subnet miners or subnet validators or separating operational roles within the Bittensor network. -::: - - -**Usage**: - -```bash -btcli wallet new-hotkey [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--n-words, --n_words INTEGER`: The number of words used in the mnemonic. Options: [12, 15, 18, 21, 24] -* `--use-password / --no-use-password`: Set to 'True' to protect the generated Bittensor key with a password. [default: no-use-password] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### btcli wallet overview - -Disabled for dynamic TAO. - - - -### btcli wallet regen-coldkey - -Regenerate a coldkey for a wallet on the Bittensor blockchain network. - -This command is used to create a new coldkey from an existing mnemonic, seed, or JSON file. - -USAGE - -Users can specify a mnemonic, a seed string, or a JSON file path to regenerate a coldkey. The command supports optional password protection for the generated key. - -#### EXAMPLE - -```bash -btcli wallet regen-coldkey --mnemonic "word1 word2 ... word12" -``` - - -:::tip -This command is critical for users who need to regenerate their coldkey either for recovery or for security reasons. -::: - - -**Usage**: - -```bash -btcli wallet regen-coldkey [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--mnemonic TEXT`: Mnemonic used to regenerate your key. For example: horse cart dog ... -* `--seed TEXT`: Seed hex string used to regenerate your key. For example: 0x1234... -* `-j, --json TEXT`: Path to a JSON file containing the encrypted key backup. For example, a JSON file from PolkadotJS. -* `--json-password TEXT`: Password to decrypt the JSON file. -* `--use-password / --no-use-password`: Set this to `True` to protect the generated Bittensor key with a password. [default: use-password] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### btcli wallet regen-coldkeypub - -Regenerates the public part of a coldkey (coldkeypub.txt) for a wallet. - -Use this command when you need to move machine for subnet mining. Use the public key or SS58 address from your coldkeypub.txt that you have on another machine to regenerate the coldkeypub.txt on this new machine. - -USAGE - -The command requires either a public key in hexadecimal format or an ``SS58`` address from the existing coldkeypub.txt from old machine to regenerate the coldkeypub on the new machine. - -#### EXAMPLE - -```bash -btcli wallet regen_coldkeypub --ss58_address 5DkQ4... -``` - -:::tip -This command is particularly useful for users who need to regenerate their coldkeypub, perhaps due to file corruption or loss. You will need either ss58 address or public hex key from your old coldkeypub.txt for the wallet. It is a recovery-focused utility that ensures continued access to your wallet functionalities. -::: - - -**Usage**: - -```bash -btcli wallet regen-coldkeypub [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--public-key-hex TEXT`: The public key in hex format. -* `--ss58, --ss58-address TEXT`: The SS58 address of the coldkey. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### btcli wallet regen-hotkey - -Regenerates a hotkey for a wallet. - -Similar to regenerating a coldkey, this command creates a new hotkey from a mnemonic, seed, or JSON file. - -USAGE - -Users can provide a mnemonic, seed string, or a JSON file to regenerate the hotkey. The command supports optional password protection and can overwrite an existing hotkey. - -#### Example usage - -```bash -btcli wallet regen_hotkey --seed 0x1234... -``` - -:::tip -This command is essential for users who need to regenerate their hotkey, possibly for security upgrades or key recovery. It should be used with caution to avoid accidental overwriting of existing keys. -::: - - -**Usage**: - -```bash -btcli wallet regen-hotkey [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--mnemonic TEXT`: Mnemonic used to regenerate your key. For example: horse cart dog ... -* `--seed TEXT`: Seed hex string used to regenerate your key. For example: 0x1234... -* `-j, --json TEXT`: Path to a JSON file containing the encrypted key backup. For example, a JSON file from PolkadotJS. -* `--json-password TEXT`: Password to decrypt the JSON file. -* `--use-password / --no-use-password`: Set to 'True' to protect the generated Bittensor key with a password. [default: no-use-password] -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### btcli wallet set-identity - -Create or update the on-chain identity of a coldkey or a hotkey on the Bittensor network. **Incurs a 1 TAO transaction fee.** - -The on-chain identity includes attributes such as display name, legal name, web URL, PGP fingerprint, and contact information, among others. - -The command prompts the user for the identity attributes and validates the input size for each attribute. It provides an option to update an existing validator hotkey identity. If the user consents to the transaction cost, the identity is updated on the blockchain. - -Each field has a maximum size of 64 bytes. The PGP fingerprint field is an exception and has a maximum size of 20 bytes. The user is prompted to enter the PGP fingerprint as a hex string, which is then converted to bytes. The user is also prompted to enter the coldkey or hotkey ``ss58`` address for the identity to be updated. - -If the user does not have a hotkey, the coldkey address is used by default. If setting a validator identity, the hotkey will be used by default. If the user is setting an identity for a subnet, the coldkey will be used by default. - -#### EXAMPLE - -```bash -btcli wallet set_identity -``` - -:::tip -This command should only be used if the user is willing to incur the a recycle fee associated with setting an identity on the blockchain. It is a high-level command that makes changes to the blockchain state and should not be used programmatically as part of other scripts or applications. -::: - - -**Usage**: - -```bash -btcli wallet set-identity [OPTIONS] -``` - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--display-name, --display TEXT`: The display name for the identity. -* `--legal-name, --legal TEXT`: The legal name for the identity. -* `--web-url, --web TEXT`: The web URL for the identity. -* `--riot-handle, --riot TEXT`: The Riot handle for the identity. -* `--email TEXT`: The email address for the identity. -* `--pgp-fingerprint, --pgp TEXT`: The PGP fingerprint for the identity. -* `--image-url, --image TEXT`: The image URL for the identity. -* `-i, --info TEXT`: The info for the identity. -* `-x, -𝕏, --twitter-url, --twitter TEXT`: The 𝕏 (Twitter) URL for the identity. -* `--validator / --not-validator`: Are you updating a validator hotkey identity? -* `--netuid INTEGER`: Netuid if you are updating identity of a subnet owner -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--help`: Show this message and exit. - -### btcli wallet sign - -Allows users to sign a message with the provided wallet or wallet hotkey. Use this command to easily prove your ownership of a coldkey or a hotkey. - -USAGE - -Using the provided wallet (coldkey), the command generates a signature for a given message. - -EXAMPLES - -```bash -btcli wallet sign --wallet-name default --message '{"something": "here", "timestamp": 1719908486}' -``` - -```bash -btcli wallet sign --wallet-name default --wallet-hotkey hotkey --message '{"something": "here", "timestamp": 1719908486}' -``` - -**Usage**: - -```bash -btcli wallet sign [OPTIONS] -``` - -**Options**: - -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--use-hotkey / --no-use-hotkey`: If specified, the message will be signed by the hotkey. If not specified, the user will be prompted. -* `--message TEXT`: The message to encode and sign -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### btcli wallet swap-hotkey - -Swap hotkeys of a given wallet on the blockchain. For a registered key pair, for example, a (coldkeyA, hotkeyA) pair, this command swaps the hotkeyA with a new, unregistered, hotkeyB to move the original registration to the (coldkeyA, hotkeyB) pair. - -USAGE - -The command is used to swap the hotkey of a wallet for another hotkey on that same wallet. - -IMPORTANT - -- Make sure that your original key pair (coldkeyA, hotkeyA) is already registered. -- Make sure that you use a newly created hotkeyB in this command. A hotkeyB that is already registered cannot be used in this command. -- Finally, note that this command requires a fee of 1 TAO for recycling and this fee is taken from your wallet (coldkeyA). - -#### EXAMPLE - -```bash -btcli wallet swap_hotkey destination_hotkey_name --wallet-name your_wallet_name --wallet-hotkey original_hotkey -``` - -**Usage**: - -```bash -btcli wallet swap-hotkey [OPTIONS] [DESTINATION_HOTKEY_NAME] -``` - -**Arguments**: - -* `[DESTINATION_HOTKEY_NAME]`: Destination hotkey name. - -**Options**: - -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--prompt, --prompt / -y, --no-prompt, --yes, --no_prompt`: Enable or disable interactive prompts. [default: prompt] -* `--help`: Show this message and exit. - -### btcli wallet transfer - -Disabled for dynamic TAO. - - - -## btcli weights - -**Usage**: - -```bash -btcli weights [OPTIONS] COMMAND [ARGS]... -``` - -**Options**: - -* `--help`: Show this message and exit. - - -### btcli weights commit - -Commit weights for specific subnet. - -Use this command to commit weights for a specific subnet. You must specify the netuid, the UIDs you are interested in, and the weights you wish to commit. - -#### EXAMPLE - -```bash -btcli wt commit --netuid 1 --uids 1,2,3,4 --w 0.1,0.2,0.3 -``` - -:::tip -This command is used to commit weights for a specific subnet and requires the user to have the necessary permissions. -::: - - -**Usage**: - -```bash -btcli weights commit [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--netuid INTEGER`: The netuid of the subnet in the root network, (e.g. 1). -* `-u, --uids TEXT`: UIDs of interest for the specified netuid, e.g. -u 1,2,3 ... -* `-w, --weights TEXT`: Weights for the specified UIDs, e.g. `-w 0.2,0.4,0.1 ...` Must correspond to the order of the UIDs. -* `-s, --salt TEXT`: Corresponding salt for the hash function, e.g. -s 163 -s 241 -s 217 ... -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. - -### btcli weights reveal - -Reveal weights for a specific subnet. - -You must specify the netuid, the UIDs you are interested in, and weights you wish to reveal. - -#### EXAMPLE - -```bash -btcli wt reveal --netuid 1 --uids 1,2,3,4 --weights 0.1,0.2,0.3,0.4 --salt 163,241,217,11,161,142,147,189 -``` - -**Usage**: - -```bash -btcli weights reveal [OPTIONS] -``` - -**Options**: - -* `--network, --subtensor.network, --chain, --subtensor.chain_endpoint TEXT`: The subtensor network to connect to. Default: finney. -* `--wallet-name, --name, --wallet_name, --wallet.name TEXT`: Name of the wallet. -* `-p, --wallet-path, --wallet_path, --wallet.path TEXT`: Path where the wallets are located. For example: `/Users/btuser/.bittensor/wallets`. -* `-H, --hotkey, --wallet_hotkey, --wallet-hotkey, --wallet.hotkey TEXT`: Hotkey of the wallet -* `--netuid INTEGER`: The netuid of the subnet in the root network, (e.g. 1). -* `-u, --uids TEXT`: Corresponding UIDs for the specified netuid, e.g. -u 1,2,3 ... -* `-w, --weights TEXT`: Weights for the specified UIDs, e.g. `-w 0.2,0.4,0.1 ...` Must correspond to the order of the UIDs. -* `-s, --salt TEXT`: Corresponding salt for the hash function, e.g. -s 163,241,217 ... -* `--quiet`: Display only critical information on the console. -* `--verbose`: Enable verbose output. -* `--help`: Show this message and exit. diff --git a/docs/dynamic-tao/_dtao_cruft.md b/docs/dynamic-tao/_dtao_cruft.md deleted file mode 100644 index 6d66778a03..0000000000 --- a/docs/dynamic-tao/_dtao_cruft.md +++ /dev/null @@ -1,330 +0,0 @@ - -### Example - -Consider the following subnets: - -#### Case 1: Sum of alpha prices greater than 1 - -1. Gaming Subnet: - - TAO reserve (τ_in): 10,000 TAO - - Alpha reserve (α_in): 8,000 Alpha - - Alpha outstanding (α_out): 50,000 Alpha - - Hence alpha price = $$ R = \frac{\tau_{in}}{\alpha_{in}} = \frac{10000}{8000} = 1.25 $$ - -2. AI Subnet: - - TAO reserve (τ_in): 15,000 TAO - - Alpha reserve (α_in): 15,000 Alpha - - Alpha outstanding (α_out): 80,000 Alpha - - Hence alpha price = $$ R = \frac{\tau_{in}}{\alpha_{in}} = \frac{15000}{15000} = 1.0 $$ - -3. Storage Subnet: - - TAO reserve (τ_in): 5,000 TAO - - Alpha reserve (α_in): 10,000 Alpha - - Alpha outstanding (α_out): 30,000 Alpha - - Hence alpha price = $$ R = \frac{\tau_{in}}{\alpha_{in}} = \frac{5000}{10000} = 0.5 $$ - -Hence, sum of all alpha prices $$ = 1.25 + 1.0 + 0.5 = 2.75 \gt 1.0 $$ - -As a result, the emissions to the subnets are as follows: - -1. Emissions to the Gaming Subnet: - - Emission into TAO reserve (τ_in): 0 TAO - - Emission into alpha reserve (α_in): 1.0 Alpha - - Emission into alpha outstanding (α_out): 1.0 Alpha - -2. Emissions to the AI Subnet: - - Emission into TAO reserve (τ_in): 0 TAO - - Emission into alpha reserve (α_in): 1.0 Alpha - - Emission into alpha outstanding (α_out): 1.0 Alpha - -3. Emissions to the Storage Subnet: - - Emission into TAO reserve (τ_in): 0 TAO - - Emission into alpha reserve (α_in): 1.0 Alpha - - Emission into alpha outstanding (α_out): 1.0 Alpha - -#### Case 2: Sum of alpha prices less than 1 - -Let's change the state of the subnets to the below: - -1. Gaming Subnet: - - TAO reserve (τ_in): 10,000 TAO - - Alpha reserve (α_in): **40,000** Alpha - - Alpha outstanding (α_out): 50,000 Alpha - - Hence alpha price = $$ R = \frac{\tau_{in}}{\alpha_{in}} = \frac{10000}{40000} = 0.25 $$ - -2. AI Subnet: - - TAO reserve (τ_in): 15,000 TAO - - Alpha reserve (α_in): **50,000** Alpha - - Alpha outstanding (α_out): 80,000 Alpha - - Hence alpha price = $$ R = \frac{\tau_{in}}{\alpha_{in}} = \frac{15000}{50000} = 0.3 $$ - -3. Storage Subnet: - - TAO reserve (τ_in): 5,000 TAO - - Alpha reserve (α_in): **25,000** Alpha - - Alpha outstanding (α_out): 30,000 Alpha - - Hence alpha price = $$ R = \frac{\tau_{in}}{\alpha_{in}} = \frac{5000}{25000} = 0.2 $$ - -Hence, sum of all alpha prices $$ = 0.25 + 0.3 + 0.2 = 0.75 \lt 1.0 $$ - -As a result, the emissions to the subnets are as follows: - -1. Total TAO reserves across all 3 subnets: 10,000 + 15,000 + 5,000 = 30,000 TAO -2. Emissions to the Gaming Subnet: - - Emission into TAO reserve (τ_in): $$\; \frac{10,000}{30,000} = 0.3333 \text{ TAO}$$ - - Emission into alpha reserve (α_in): 0 Alpha - - Emission into alpha outstanding (α_out): 1.0 Alpha - - New $k$ = (10,000 + 0.3333) × 40,000 = 400,013,320 - -3. Emissions to the AI Subnet: - - Emission into TAO reserve (τ_in): $$\; \frac{15,000}{30,000} = 0.5 \text{ TAO}$$ - - Emission into alpha reserve (α_in): 0 Alpha - - Emission into alpha outstanding (α_out): 1.0 Alpha - - New $k$ = (15,000 + 0.5) × 50,000 = 750,025,000 - -4. Emissions to the Storage Subnet: - - Emission into TAO reserve (τ_in): $$\; \frac{5,000}{30,000} = 0.1667 \text{ TAO}$$ - - Emission into alpha reserve (α_in): 0 Alpha - - Emission into alpha outstanding (α_out): 1.0 Alpha - - New $k$ = (5,000 + 0.1667) × 25,000 = 125,004,175 - -- Note that all the TAO emissions in the block sum to 1.0 (0.3333 + 0.5 + 0.1667). -- Also note that the emissions change the constant product $k$ for each subnet. - - -### Emission (alpha) - -Represents the portion of the one $\alpha$ per block emission into a subnet that is received by this hotkey in this subnet, according to YC2 in the subnet. This can change every block. - -:::caution Subnet zero does not receive any emissions -Subnet zero does not receive any emissions, either of TAO or $\alpha$. This is consistent with the fact that subnet zero does not have a pool associated with it. -::: - -### Emission (TAO) - -Shows how a fraction of the one τ per block emission is distributed among all the subnet pools. For each subnet, this fraction is first calculated by dividing the subnet's TAO Pool (τ_in) by the sum of all TAO Pool (τ_in) across all the subnets. This fraction is then added to the TAO Pool (τ_in) of the subnet. This can change every block. - -:::caution Subnet zero does not receive any emissions -Subnet zero does not receive any emissions, either of TAO or $\alpha$. This is consistent with the fact that subnet zero does not have a pool associated with it. -::: - ---- - - -## Tempo - -The tempo status of the subnet. Represented as $$\frac{k}{n}$$ where "k" is the number of blocks elapsed since the last tempo and "n" is the total number of blocks in the tempo. The number "n" is a subnet hyperparameter and does not change every block. - ---- - - -## Slippage -## Exchange Value - -This is the potential instantaneous TAO you will receive, without considering slippage, if you [unstake](#unstaking) at this instant from this hotkey on this subnet. See [Swap](#swap) description. This can change every block. - -:::tip Compare with TAO Equiv -Whereas the [TAO Equiv](#local-weight-or-tao-equiv) indicates a validator's local stake weight, this Exchange Value shows TAO you will receive if you unstake now. -::: - -## Swap - -This is the actual τ you will receive, after subtracting in the slippage charge, if you unstake from this hotkey now on this subnet. The slippage is calculated as: - -$$ -\text{Slippage} = 1 - \frac{\text{Swap(α → τ)}}{\text{Exchange Value}(α \times τ/α)} -$$ - -This can change every block. - ---- - -:::danger The Emissions section is preliminary -The below Emissions section is still not settled yet. Proceed with caution. -::: - - - -### Constant product k - -The subnet pool algorithm is set up to always maintain a **constant product** $k$ of the two reserves. That is, - -$$ -k = \text{(TAO reserves)}\times\text{(α reserves)} -$$ - -Anytime either of the reserves **increases**, for example as a result of a random external action such as some stake TAO entering the pool, the subnet pool algorithm automatically recalculates, using the new reserves, how much the other reserve should **decrease** in order to maintain the same constant product $$k$$. - -:::tip Staking and unstaking do not change the constant product -Staking and unstaking operations do not change the constant product $k$, but result in **slippage** due to the fact that these are exchange (i.e., swap) operations. On the contrary, emissions into a subnet pool do change the constant product $k$ but do not result in slippage, due to the fact that these are not swap operations. See [Slippage](#slippage). Also see [Emissions](#emissions). -::: - -### Slippage - -When we stake we exchange TAO for the alpha token in the pool. The following occurs while we stake: -1. Prior to the staking operation, we know the expected price of the alpha token. This expected price is the reserve ratio, as described in [Rate](#rate-τ_inα_in), prior to the staking operation. -2. However, the very action of our staking changes the token reserve ratio, because we are adding TAO to the TAO reserves. -3. Mathematically the pool is required to maintain the constant product $k$. As a result, the pool algorithm automatically adjusts the alpha token reserves to keep the constant product $k$ unchanged. This results in a change in the reserve ratio. -4. This means that the actual price at which our staking operation is executed is different from our original expected price of the alpha token. This difference between the original expected alpha token price and the actual actual token price at which staking operation is performed is called **slippage**. - -### Example - -As described in the [Staking](#staking) section, a staking event results in the staked TAO being added to the τ_in reserves of the subnet pool. The subnet pool algorithm calculates the number of units by which the $\alpha_{in}$ reserves should decrease. These units are then taken out of the $\alpha_{in}$ reserves and sent to the validator’s hotkey in the subnet. See an example below. - -The below example shows how staking 5 TAO works. - -Let us assume the following initial state of TAO and $\alpha$ reserves in a subnet: -- TAO reserves: 10 TAO tokens -- $\alpha$ reserves: 100 $\alpha$ tokens - -Hence, the constant product 𝑘 = 10 × 100 =1000. - -**Without slippage** - -- Expected price of $$\alpha$$ token: - -$$ -= \frac{\text{TAO reserves}}{\text{α reserves}} = \frac{10}{100} = \text{0.1 TAO per α} -$$ - -- Hence, the expected number of α tokens: - -$$ -\text{} = \frac{\text{TAO staked}}{\text{Expected α price}} = \frac{5}{0.1} = \text{50 α tokens} -$$ - -**With slippage** - -- **Initial relative price** of $\alpha$ is = reserve ratio of subnet pool $\alpha$ = (TAO token reserves of pool $\alpha$)/($\alpha$ token reserves) = 10/100 = 0.1 TAO. -- Stake 5 TAO: This adds 5 TAO into the TAO reserves of the pool. Hence, the new TAO reserve = 10 + 5 = 15 TAO tokens. -- Using the new TAO reserve of 15, the subnet pool algorithm calculates what should be the new $\alpha$ reserves, in order to maintain k at 1000. -- Calculating: -$$ -\begin{split} -& 15 \times\text{new α reserves} = 1000\\ -\implies & \text{new α reserves} = 1000/15 = 66.667 \text{ α}. -\end{split} -$$ - -- Hence, the $\alpha$ that is **taken out of** the $α_{in}$ reserve and sent to the validator’s hotkey is: -$$ -\text{Stake in α tokens} = 100 − 66.67 = 33.33 \text{ α} -$$ - -Hence, when you stake 5 TAO, your stake is $$33.33 \text{ α}$$, taking into account the slippage. As a result: - -- Slippage in terms of $$\alpha$$ tokens: - -$$ -\begin{split} -\text{Slippage} & = \text{Expected α tokens} - \text{Actual α tokens obtained}\\ -& = 50-33.33 = 16.6667 α -\end{split} -$$ - -- The percentage of slippage: - -$$ -\begin{split} -\text{Percentage slippage} & = \frac{\text{Slippage α tokens}}{\text{Expected α tokens}}\times 100\% \\ -& = \frac{16.6667}{50}\times 100\% \\ -& = 33.333\% -\end{split} -$$ - -### Effect of slippage - -- TAO reserves: 15 tokens -- $\alpha$ reserves: 66.67 $\alpha$ tokens -- Constant product 𝑘 = 15 × 66.67 = 1000 (unchanged) -- **New relative price** of $\alpha$ after the staking event = reserve ratio of subnet pool $\alpha$ = (TAO token reserves of pool $\alpha$)/($\alpha$ token reserves) = 15/66.67 = 0.225 TAO. -- **Price impact due to slippage**: As a result of the slippage, staking 5 TAO into subnet $\alpha$ changed the relative price of $\alpha$ token: it **increased** from 0.1 TAO to 0.225 TAO. All else being equal, slippage leads to an increase in $\alpha$ token's relative price when we stake. - - - - -The below example shows how unstaking 20 $\alpha$ works. Let’s continue with the state of the TAO and $\alpha$ reserves after the [above staking operation](#example-1): - -- TAO reserves: 15 tokens -- $\alpha$ reserves: 66.67 $\alpha$ tokens -- Constant product 𝑘 = 15 × 66.67 = 1000 - -**Without slippage** - -:::tip Don't know what slippage is? -See [Slippage](#slippage) if you are not familiar with it. -::: - -- Expected price of $$\alpha$$ token before unstaking: - -$$ -= \frac{\text{TAO reserves}}{\text{α reserves}} = \frac{15}{66.667} = \text{0.225 TAO per α} -$$ - -- Hence, the expected number of TAO tokens: - -$$ -\begin{split} -\text{} & = \text{α unstaked}\times{\text{Expected α price}}\\ -& = 20\times0.225 \\ -&= \text{4.5 TAO tokens} -\end{split} -$$ - - -**With slippage** - -- Relative price $\alpha$ is = reserve ratio of subnet pool $\alpha$ = (TAO token reserves of pool $\alpha$)/($\alpha$ token reserves) = 15/66.67 = 0.225 TAO (same as the relative price after the above staking operation) -- Unstake 20 $\alpha$: This adds 20 $\alpha$ to the $\alpha$ side of the pool. New $\alpha$ reserves = 66.67 + 20 = 86.67 $\alpha$ tokens. -- Using the new $\alpha$ reserve of 86.67, the subnet pool algorithm calculates what should be the new TAO reserve in order to maintain $k$ at 1000. -- Calculating: - -$$ -\begin{split} -& 86.67 \times\text{new TAO reserves} = 1000\\ -\implies & \text{new TAO reserves} = 1000/86.67 = 11.54 \text{ TAO} -\end{split} -$$ - -- Hence, the TAO that is taken out of the TAO reserves of the pool and sent to the TAO holder’s coldkey is: 15 − 11.54 = 3.46 TAO. -$$ -\text{Unstaked TAO tokens} = 15 − 11.54 = 3.46 \text{ TAO} -$$ - -Hence, when you unstake 20 $$\text{α}$$, your unstaked TAO is $$3.46 \text{ TAO}$$, taking into account the slippage. As a result: - -- Slippage in terms of TAO tokens: - -$$ -\begin{split} -\text{Slippage} & = \text{Expected TAO tokens} - \text{Actual TAO tokens obtained}\\ -& = 4.5-3.46 = 1.04\text{ TAO} -\end{split} -$$ - -- The percentage of slippage: - -$$ -\begin{split} -\text{Percentage slippage} & = \frac{\text{Slippage TAO tokens}}{\text{Expected TAO tokens}}\times 100\% \\ -& = \frac{1.04}{4.5}\times 100\% \\ -& = 23.1\% -\end{split} -$$ - -### Effect of slippage - -- TAO reserves: 11.54 TAO tokens -- $\alpha$ reserves: 86.67 $\alpha$ tokens -- Constant product 𝑘 = 11.54 × 66.67 = 1000 (unchanged) -- **New relative price** of $\alpha$ after the unstaking event = reserve ratio of subnet pool $\alpha$ = (TAO token reserves of pool $\alpha$)/($\alpha$ token reserves) = 11.54/86.67 = 0.133 TAO per $\alpha$. -- **Price impact due to slippage**: As a result of slippage, unstaking 20 $\alpha$ changed the $\alpha$ price: it **decreased** from 0.225 TAO to 0.113 TAO. All else being equal, unstaking from a subnet leads to a decrease in its $\alpha$ token's relative price. - ---- - - -### Constant product vs. relative price - -The constant product $k$ is a critical concept to understand how the relative price of an alpha token works. See the following: - - A subnet pool algorithm operates purely on the basis of maintaining the constant product $k$. The pool algorithm does not have any built-in mechanism to either target or maintain specific prices for the alpha tokens of a subnet. - - The relative price of an alpha token is only **indirectly** determined by the ratio of the token reserves. Furthermore, controlling these relative prices is **not the goal of the pool algorithm**. - - Hence, the relative price of a token **is a result, not a target,** of the token exchange activity. \ No newline at end of file diff --git a/docs/dynamic-tao/_weights-dtao.md b/docs/dynamic-tao/_weights-dtao.md deleted file mode 100644 index f9a2df7504..0000000000 --- a/docs/dynamic-tao/_weights-dtao.md +++ /dev/null @@ -1,250 +0,0 @@ ---- -title: "Governance in Dynamic TAO" ---- - - -## Governance and voting - -Dynamic TAO also incorporates the consensus/voting function of subnet validators into the mechanism of their alpha token stake holdings ??? - - -## Local weight or TAO Equiv - -A hotkey's stake, i.e., [stake(α)](#staking), represents subnet-specific stake. As a result, a [hotkey's stake share](#hotkeys-stake-share) can only represent the validator's staking power **within the subnet**. Moreover, an $\alpha$ token of a subnet is not fungible with an $\alpha$ token of another subnet. For this very reason, when a hotkey is validating in multiple subnets, the hotkey's stake share in one subnet cannot be simply added to the same hotkey's stake share in a different subnet. - -This is where the TAO-equivalent value of the hotkeys stake share (α / α_out) comes into play. As we saw in the [Staking](#staking) section, any TAO staked into a subnet is added to the TAO reserves of the subnet pool, i.e., added to τ_in. Similarly any TAO unstaked from a subnet is removed from the TAO reserves of the subnet pool. As a consequence, τ_in reserve represents the total voting power of the subnet as a whole. Hence, - -$$ -\text{a subnet's total voting power}\times\text{hotkey's stake share in the subnet} -$$ - -represents the **hotkey's local voting power proportional to its stake share in the subnet**. It is calculated as: - -$$ -\tau_{in}\times\text{hotkey's stake share} = \tau_{in}\times\frac{\alpha}{\alpha_{out}} -$$ - -and is expressed in TAO units. This can change every block. - -:::caution Local voting power is also referred as local weight -This local voting power or local weight represents the hotkey's influence in the subnet. -::: - -### Example - -For example, for a validator's hotkey in a given subnet: - -- Total outstanding alpha (α_out) = 30,000 alpha tokens. -- The hotkey's alpha stake ($\alpha$) = 6,000 alpha tokens. -- TAO reserve in the subnet's pool (τ_in) = 5,000 TAO. - -- Then, this validator's hotkey stake share = (6,000/30,000) = 0.2 or 20%. -- Hence, this validator hotkey's local voting power, i.e., **local weight** = τ_in x hotkey's stake share = 5000 x 0.2 = 1000 TAO. - -:::tip Stake share → TAO-denominated voting power -Hence, while the hotkey's stake share in this subnet is 20%, its actual local weight (local voting power) in the subnet is 1,000 TAO units. This is the power of Dynamic TAO mechanism. It converts a hotkey's alpha stake share into an equivalent TAO-denominated voting power in the subnet. This makes alpha stakes comparable across different subnets, even though these subnets might have very different amounts of alpha tokens outstanding. -::: - - -## Global weight - -Global weight of a validator hotkey is the sum of the [local weights](#local-weight-or-tao-equiv) for all the subnets, including subnet zero, where this hotkey is validating. - -### Example - -Let's say that a validator's hotkey has the following positions in four different subnets, including in subnet zero. - -- Subnet zero: - - validator's stake: 1000 TAO - - validator's stake share: 10% (i.e., out of all TAO stake in subnet zero, this validator holds 10% of it) -- Gaming subnet: - - validator's [stake share](#hotkeys-stake-share) = (α / α_out) = 30% - - τ_in in this subnet pool = 10,000 TAO - -- AI subnet: - - validator's [stake share](#hotkeys-stake-share) = (α / α_out) = 40% - - τ_in in this subnet pool = 15,000 TAO - -- Storage subnet: - - validator's [stake share](#hotkeys-stake-share) = (α / α_out) = 20% - - τ_in in this subnet pool = 5,000 TAO - -Hence, the [local weights, or local voting power](#local-weight-or-tao-equiv) of this hotkey in each subnet are as below: - -- For subnet zero: 1000 TAO (TAO number used as is, without any multiplier, see [subnet zero](#subnet-zero)) -- Gaming subnet: $$\tau_{in}\times\text{hotkey's stake share}$$ = 0.30 × 10,000 = 3,000 TAO -- Similarly, for AI subnet: 0.40 × 15,000 = 6,000 TAO -- For Storage subnet: 0.20 × 5,000 = 1,000 TAO - -Hence the global weight of this hotkey is: 1000 + 3000 + 6000 + 1000 = 11,000 TAO. - -### Root weight - -Notice that in the above calculation, we used the hotkey's subnet zero stake of 1000 TAO as it is while calculating the global weight of the hotkey. However, in Dynamic TAO it is normal to multiply the subnet zero stake TAO number by a factor called `root_weight` that varies from 0 to 1. - -Hence, for `root_weight` of 0.5, the subnet zero stake of the hotkey will now be `root_weight` x 1000 = 0.5 x 1000 = 500 TAO. Hence, under this condition, the updated global weight of this hotkey is: 500 + 3000 + 6000 + 1000 = 10,500 TAO. - -### Global weight vs. local weight - -The two quantities defined above for a validator hotkey, i.e., the hotkey's global weight (across all subnets where it is validating) and its local weight (per subnet), are critically important. - -:::caution global weight appears in every subnet -In addition to the local weight of a hotkey in a subnet, this hotkey's global weight also appears in this subnet. This is why global weight of a validator's hotkey is critical. -::: - -Note that in the above, **both local weight and global weight of a hotkey are expressed in TAO units.** However, to represent a validator hotkey's overall stake weight in a subnet, instead of using the two individual TAO units (one for global weight and second for local weight), a new quantity called [**validator's stake weight in a subnet**](#validator-stake-weight), is defined as follows: -- The local weight of a hotkey is normalized with respect to the sum of all the local weights of all other hotkeys in this subnet, so that they all sum to 1.0. This normalized local weight represents the hotkey's relative proportion of its **influence in the subnet**. -- Similarly the global weight of the hotkey is normalized with respect to the sum of all the global weights of all other hotkeys for the subnets in question, to sum to 1.0. This normalized global weight represents the hotkey's relative proportion of its **influence in the subnets in question**. - - -## Validator stake weight - -A validator hotkey's stake weight is defined for a subnet. It varies from 0 to 1. It is defined as the sum of the hotkey's normalized global and local weights, as follows: - -For any subnet $i$, the validator hotkey's stake weight is: - -$$ -\begin{split} -& = \text{(global\_split}\times\text{normalized global weight)} + \text{(1-global\_split}\times\text{normalized local weight)}\\\\ -& = \text{global\_split}\times\frac{\text{hotkey's global weight}}{\text{sum of all global weights of all hotkeys in the subnets in question}}\\ \\ -& + \text{ (1-global\_split)}\times\frac{\text{hotkey's local weight}}{\text{sum of all local weights in the subnet}} -\end{split} -$$ - -### Global split - -A parameter called `global_split`, which varies between 0 and 1, controls the balance between the normalized global and local weights. In effect, the `global_split` parameter controls the balance between the validator hotkeys local and global influence. - -:::tip Why global stake matters -Also see [Why global stake matters](#why-global-stake-matters). -::: - -### Example - -We will use the example from [Global weight](#global-weight) section and extend it to show the validator stake weight. - -#### Assumptions - -- Assume `root_weight` is 0.5. - -- Subnet zero: - - Total TAO outstanding = 10,000 TAO (this is the total TAO stake held by all the hotkeys in subnet zero) - - Hence, sum of all global weights in subnet zero = 10,000 TAO - - Validator's stake share = 10% × 10,000 = 1,000 TAO (also calculated in the above example) - -- Gaming Subnet: - - Assume total α_out = 50,000 $\alpha$ - - Validator's stake share = 30% × 50,000 = 15,000 $\alpha$ - - TAO reserve = 10,000 τ - - TAO reserve is also the sum of all global weights in this gaming subnet = 10,000 TAO - - Local weight = (15,000/50,000) × 10,000 = 3,000 τ (also calculated in the above example) - -- AI Subnet: - - Assume total α_out = 80,000 $\alpha$ - - Validator's stake share = 40% × 80,000 = 32,000 $\alpha$ - - TAO reserve = 15,000 τ - - TAO reserve is also the sum of all global weights in this AI subnet = 15,000 TAO - - Local weight = (32,000/80,000) × 15,000 = 6,000 τ (also calculated in the above example) - -- Storage Subnet: - - Assume total α_out = 30,000 $\alpha$ - - Validator's stake share = 20% × 30,000 = 6,000 $\alpha$ - - TAO reserve = 5,000 τ - - TAO reserve is also the sum of all global weights in this storage subnet = 5,000 TAO - - Local weight = (6,000/30,000) × 5,000 = 1,000 τ (also calculated in the above example) - -Hence, sum of all global weights in the all the above subnets is = (`root_weight` x subnet zero's total global weight) + sum of all global weights in gaming subnet + sum of all global weights in AI subnet + sum of all global weights in storage subnet - -= (0.5 x 10,000) + 10,000 + 15,000 + 5,000 -= 35,000 TAO. This is the global weights in all the subnets where this validator's hotkey is validating. - -#### Validator stake weight for each subnet - -- Hotkey's global weight = 10,500 TAO (from the above [Root weight](#root-weight) section). -- Total global subnet weights = 35,000 TAO (from above). -- Assume `global_split` is 0.3. - - -1. Gaming Subnet: - - - Local weight of the hotkey: 3000 TAO (from the above example) - - Sum of all local weights in this subnet = TAO reserve = 10,000 TAO - - Hence, the validator's stake weight in this gaming subnet = 0.3 × (10,500/35,000) + 0.7 × (3,000/10,000) - = 0.3 × 0.30 + 0.7 × 0.30 - = 0.09 + 0.21 - = 0.30 (30% influence in the gaming subnet) - -2. AI Subnet: - - Local weight of the hotkey: 6000 TAO (from the above example) - - Sum of all local weights in this subnet = TAO reserve = 15,000 TAO - - Hence, the validator's stake weight in this AI subnet = 0.3 × (10,500/35,000) + 0.7 × (6,000/15,000) - = 0.3 × 0.30 + 0.7 × 0.40 - = 0.09 + 0.28 - = 0.37 (37% influence in the AI subnet) - -3. Storage Subnet: - - Local weight of the hotkey: 1000 TAO (from the above example) - - Sum of all local weights in this subnet = TAO reserve = 5,000 TAO - - Hence, the validator's stake weight in this storage subnet = 0.3 × (10,500/35,000) + 0.7 × (1,000/5,000) - = 0.3 × 0.30 + 0.7 × 0.20 - = 0.09 + 0.14 - = 0.23 (23% influence in the storage subnet) - -4. Subnet zero: (special case - only local weight matters) - - Validator's stake weight = 1,000/10,000 = 0.10 (10% influence in the subnet zero) - - -## Intuitions of Dynamic TAO - -This section presents a summary of intuitions about Dynamic TAO. It is intended to help in conceptually grasping the Dynamic TAO mechanism. - - -### TAO and alpha - -- The entire TAO token emitted from the coinbase in the lifetime of Bittensor network exists: - - In coldkeys: In a TAO holder’s own coldkeys, for example, as subnet zero emissions into a subnet owner’s coldkey, and in exchange-owned coldkeys. - - In subnet zero hotkeys: In the validator hotkeys of subnet zero as staked TAO and dividends. - - In TAO reserves of subnet pools. - - TAO exists nowhere else. - - Furthermore, for the Bittensor network operations, only staked TAO matters, i.e., only the staked TAO in the validator hotkeys and in TAO reserves act as fuel in the Bittensor network operations. This means that for any discussions on consensus power, only the sum total of the entire staked TAO is considered—the TAO that is in the coldkeys or in exchanges does not contribute directly to Bittensor network operations. -- Similarly, the entire $\alpha$ token emitted from the coinbase in the lifetime of Bittensor network exists as follows: - - **An $\alpha$ token does not exist in a coldkey**. It only exists in the hotkeys of subnet validators, subnet miners and subnet owners. - - In the subnet pool reserves. - - A $\alpha$ token of one subnet is not fungible with a $\alpha$ token of another subnet. - - -### Pool reserves - -- No one directly owns the subnet pool reserves. These reserves exist to provide liquidity to the subnet pools. -- However, as we saw in [Local weights vs TAO reserve](#local-weights-vs-tao-reserve) , a validator who holds X% of the $\alpha$ stake in a subnet is said to own the same X% of the TAO reserve pool of that subnet. -- In Dynamic TAO the sum of α_in (also called alpha reserve) and α_out (all the alpha stake in the subnet) is treated as the the sum total of all alpha. **This is not not strictly true.** This sum total only represents the alpha associated with staking and unstaking. There is the another source of alpha, which is the emissions alpha. This emissions alpha is awarded to validators, subnet owners and miners. -- More important, these emissions alpha bypasses the subnet pool and gets into the subnet directly from the coinbase. Furthermore, the only way for this emissions alpha to come out of the subnet is via unstaking, even though they did not participate in staking. - - -### Why global stake matters - -When a validator’s stake is global it protects the Bittensor network much better. It does so by making it hard for a rogue validator (or for a cabal of rogue validators) to acquire 51% of the consensus voting power. Here is a simple example showing how it works: - -Let's say we have 52 subnets and hypothetically a total 52,000 staked TAO tokens distributed amongst all the validators across these 52 subnets. - - -
- -
- -
- -- When the stake is global, every validator’s stake is 100% global, hence every validator’s stake will appear in every subnet. A rogue validator would have to hold at least 51% of the total staked TAO, i.e., at least 26,500 TAO (51% of 52,000 TAO), to take control of the consensus power. This consensus power would appear in every subnet, giving the rogue validator a control over all the subnets. - -- Let’s now make stake 100% local. This means that only the stake the validator has in a subnet is applicable for that subnet. This validator's stake in other subnets is not taken into account in this subnet. For simplicity, assume that all the validators’ stake is evenly spread among these 52 subnets. Then each subnet will have 1000 TAO tokens (52,000/52) as a combined stake of its validators. - -- **But notice this**: In this case, when the stake is 100% local, a validator in a subnet only needs 500 TAO tokens + 1 to take over that subnet. Hence shifting stake from 100% global to 100% local has resulted in severely degrading the security of subnets. - -As we saw in [Validator stake weight](#validator-stake-weight), the Dynamic TAO scheme makes use of both global and local characteristics of the stake to strengthen the overall consensus security of the Bittensor network. diff --git a/docs/dynamic-tao/dtao-faq.md b/docs/dynamic-tao/dtao-faq.md deleted file mode 100644 index 0d5bb9f96e..0000000000 --- a/docs/dynamic-tao/dtao-faq.md +++ /dev/null @@ -1,135 +0,0 @@ ---- -title: "Dynamic TAO FAQ" ---- -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -## Timing / Rollout - -### What is the rollout timeline for Dyanmic TAO? What determines the timing? - -Dynamic TAO was introduced by proposal, approved by senate vote, and deployed as an upgrade to Bittensor main network on February 13, 2025 after a year of research, development, and testing. - -Any subsequent modifications require a new proposal to be introduced to a new upgrade following the same process. - -### How will Dynamic TAO take effect? - -The state of the network as far as ledger balances and consensus power will not change immediately upon upgrade; it will occur gradually as subnet specific alpha tokens are emitted and staked into circulation. - -In Dynamic TAO, validator *weight*—a critical score that determines consensus power as well as the allocation of emissions—is determined by a combination of TAO and alpha token holdings. When Dynamic TAO is initiated, there will be no alpha in circulation, so validator's stake weights will be entirely determined by their share of TAO stake. - -But far more alpha than TAO is emitted into circulation every block. As a result, over time there will be more alpha relative to TAO in overall circulation, and the relative weight of a validator in a given subnet will depend more on their alpha stake share relative to their share of the TAO stake on Subnet Zero. - -In order to hasten the process of alpha gaining the majority of stake power in the network, the contribution of TAO stake to validator stake weight is reduced by a global parameter called *TAO weight*. Currently, this is planned to be **18%**, in order to achieve a weight parity between TAO and total alpha in approximately 100 days. - -See [Emissions](../emissions.md) - -
- -
- -
- -### Will there be a cap on alpha currency? - -Yes. There is a hard cap of 21 million for any subnet's alpha token, the same as for TAO itself. Alpha tokens follow a halving schedule as well. - -At the time of writing, 2 alpha tokens per subnet will be emitted each block, while only 1 TAO is emitted and shared across the whole network. - -## TAO-holders / Stakers - -### How has staking changed? - -Instead of staking TAO to a validator, in Dynamic TAO, you stake to a validator on a specific subnet. This can be either a mining subnet (most subnets) or the unique root subnet, a.k.a. Subnet Zero. - -- When you stake on a mining subnet, you exchange TAO for a dynamic token, the *alpha* of the subnet on which the validator is working, and stake that into the validator's hotkey. - -- When you stake on the root subnet, you stake TAO for TAO. Your emissions are TAO. - -### What is the risk/reward profile of staking into a subnet? - -Each new subnet has its own token, referred to as its alpha. When you stake into a validator within a given subnet, you exchange TAO for that subnet's alpha. When you unstake from the validator in that subnet, you exchange the alpha for TAO. Staking and unstaking is therefore sensitive to the price of the alpha. This price of a subnet's alpha is the ratio of TAO in its reserve to alpha in reserve. - -Staking TAO into a subnet essentially exchanges TAO for that subnet’s alpha token. To exit value, alpha must be exchanged back for TAO at the going rate. - -Held stake (alpha tokens) may increase or decrease in TAO value as the price of the alpha changes. - -### How do emissions to root subnet/Subnet 0 stakers work? - -**Network-wide Impact**: Your stake contributes weight across all subnets where your validator operates. This means your stake extracts emissions from multiple subnets simultaneously. See [Validator stake weight](dtao-guide#validator-stake-weight) for more details. - -**Proportional emission and TAO weight**: TAO and alpha are emitted to a validator's stakers in proportion to the validators' holdings in each token. See [Emission in Dynamic TAO: Extraction](../emissions.md#extraction) - -### Can users transfer alpha tokens (subnet tokens)? - -It is up to the subnet creator, and is configured using the `TransferToggle` hyperparameter. - -When enabled, a holder of alpha stake can transfer its ownership to another coldkey/wallet using [`btcli stake transfer`](../staking-and-delegation/managing-stake-btcli#transferring-stake) or [`transfer_stake`](pathname:///python-api/html/autoapi/bittensor/core/async_subtensor/index.html#bittensor.core.async_subtensor.AsyncSubtensor.transfer_stake). - -### How will Dynamic TAO affect governance of the network? - -Dynamic TAO does not directly change Bittensor's on-chain governance mechanism (i.e., proposals and voting). - -## Subnets - -### Root Subnet/Subnet Zero - -In Dynamic TAO, Subnet Zero is a special subnet. It is the only subnet that does not have its own $\alpha$ currency. No miners can register on subnet zero, and no validation work is performed. However validators can register, and $\tau$-holders can stake to those validators, as with any other subnet. This offers a mechanism for $\tau$-holders to stake $\tau$ into validators in a subnet-agnostic way. This works because the weight of a validator in a subnet includes both their share of that subnet's $\alpha$ and their share of staked TAO in Subnet Zero. - -Subnet Zero is sometimes called the root subnet, since it sort of replaces the root network in the pre-Dyanmic-TAO architecture. However, Subnet Zero does not perform consensus over subnets, which was the defining function of the root network. - -### What will it take to start and manage a subnet in Dyanmic TAO? - -The process of registering a subnet in Dynamic TAO will be very similar to the process of registering a submit previously, except that the cost to register the subnet is now burned, rather than being a lock cost returned to the subnet creator on de-registration. This is because subnets are not deregistered in Dynamic TAO. - - -### What is the cost of creating a subnet? - -Subnet registration cost is dynamic. It doubles when a subnet is registered, and decreases at a slow rate such that the price halves after 38,880 blocks—roughly five and a half days. This implies that, if the demand for new subnets is steady, one should be created roughly every five and a half days. - -### How will Dynamic TAO affect subnet governance (weight-setting)? - -Each validator’s weight in the subnet is a function of the alpha staked to them on the subnet, plus the TAO staked to them in Subnet Zero, with the value of the TAO being multiplied by the TAO weight, which is between 0 and 1. - -See [validator stake weight](./dtao-guide.md#walidator-stake-weight). - -### What happens when a subnet is abandoned? - -If no participants use or mine a subnet, its token will likely drop to negligible value. Other subnets and the root remain unaffected. Each subnet’s success or failure is largely self-contained. - -:::Note -Currently, the protocol does not automatically deregister subnets. Abandoned subnets may be revived. -::: - -### Do subnet creators control emissions for their own tokens? - -**No**. Emissions are calculated by protocol logic (e.g., in `run_coinbase.rs`) and are based on network-wide parameters. Subnet founders cannot arbitrarily print tokens—emission follows the same consistent rules across all subnets. - -See [Emissions in Dynamic TAO](../emissions.md) - -### What happens to previously locked registration costs from pre-Dynamic-TAO subnets? - -They are returned to subnet creators when Dynamic TAO is initiated, on the same coldkey that registered. - -## Miners and Validators - -### How will miners (and validators) manage the proliferation of subnets? - -Miners and validators must now consider the TAO value of the alpha token they are mining. - -Miners can and must shift their work among subnets, depending on the value of the subnets and their own ability to compete. More subnets will mean more opportunities for specialized work. - -Miners/validators may need to watch markets (token prices, volumes) to optimize their allocations, much as proof-of-work miners in other crypto systems monitor different chains to see which is most profitable to mine. - -## Where can I find more technical details right now? - -- Codebase: Refer to the Bittensor codebase, especially `run_coinbase.rs`, which calculates emissions logic for subnets and the root network. -- The [Dynamic TAO White Paper](https://drive.google.com/file/d/1vkuxOFPJyUyoY6dQzfIWwZm2_XL3AEOx/view) - diff --git a/docs/dynamic-tao/dtao-guide.md b/docs/dynamic-tao/dtao-guide.md deleted file mode 100644 index 6d5a1921e5..0000000000 --- a/docs/dynamic-tao/dtao-guide.md +++ /dev/null @@ -1,114 +0,0 @@ ---- -title: "Core Dynamic TAO Concepts" ---- - -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Core Dynamic TAO Concepts - -Dynamic TAO is a recent evolution of the integrated tokenomic and governance model that underlies the Bittensor network. It represents a significant step in Bittensor's trajectory toward more thorough decentralization, by eliminating the centralized role of the root network in judging the value of subnetworks. Instead, in the Dynamic TAO model, the relative value of subnets is determined in a wholly distributed fashion: by the amount of TAO that users have staked into their currency reserves. - -## Subnet liquidity reserves - -The key mechanism introduced with Dynamic TAO is that each subnet functions as its own automated market marker (AMM), with two liquidity reserves, one containing TAO($$\tau$$)—the currency of the Bittensor network, and one containing a subnet specific "dynamic" currency, referred to as that subnet's alpha ($$\alpha$$) token. The alpha token is purchased by staking TAO into the subnet's reserve, which is initialized with a negligible amount of liquidity (1e-9). - -A subnet's economy therefore consists of three pools of currency: -- **Tao reserves**: the amount of tao ($$\tau$$) that has been staked into the subnet -- **Alpha reserves**: the amount of alpha ($$\alpha$$) available for purchase -- **Alpha outstanding**: the amount of alpha ($$\alpha$$) held in the hotkeys of a subnet's participants, also referred to as the total *stake* in the subnet - -:::tip Terminology: alpha tokens -Each subnet has its own currency with its own name, but in the abstract a given subnet's token is referred to as its $\alpha$ token. With a set of subnets in mind, we refer to $\alpha$ as the token for subnet $\alpha$, $$\beta$$ as the token for subnet $$\beta$$, $$\gamma$$ as the token for subnet $$\gamma$$, and so on. - -These subnet tokens contrast with TAO ($$\tau$$), the token of the Bittensor network as a whole. A subnet pool's reserve ratio (tao/alpha) determines the price of its alpha token. -::: -The *price* of a subnet's alpha token is determined by the ratio of TAO in that subnet's reserve to its alpha in reserve. Alpha currency that is not held in reserve but is which is held in the hotkeys of subnet participants is referred to as *alpha outstanding*. - -Run `btcli subnet list` with the Dynamic TAO-enabled `btcli` to view information about the subnets and their currency reserves on Bittensor testnet. - -```txt - ┃ ┃ Price ┃ Market Cap ┃ ┃ ┃ ┃ ┃ - Netuid ┃ Name ┃ (τ_in/α_in) ┃ (α * Price) ┃ Emission (τ) ┃ P (τ_in, α_in) ┃ Stake (α_out) ┃ Supply (α) ┃ Tempo (k/n) -━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━ - 0 │ τ root │ 1.00 τ/Τ │ τ 5.93m │ τ 0.0000 │ -, - │ Τ 5.93m │ 5.93m Τ /21M │ -/- - 3 │ γ templar │ 0.02 τ/γ │ τ 57.32 │ τ 0.0197 │ τ 31.44, 1.43k γ │ 1.18k γ │ 2.61k γ /21M │ 67/99 - 9 │ ι pretrain │ 0.02 τ/ι │ τ 55.38 │ τ 0.0194 │ τ 30.91, 1.46k ι │ 1.16k ι │ 2.61k ι /21M │ 73/99 - 1 │ α apex │ 0.02 τ/α │ τ 54.45 │ τ 0.0192 │ τ 30.65, 1.47k α │ 1.14k α │ 2.61k α /21M │ 65/99 - 2 │ β omron │ 0.02 τ/β │ τ 54.45 │ τ 0.0192 │ τ 30.65, 1.47k β │ 1.14k β │ 2.61k β /21M │ 66/99 - 4 │ δ targon │ 0.02 τ/δ │ τ 54.45 │ τ 0.0192 │ τ 30.65, 1.47k δ │ 1.14k δ │ 2.61k δ /21M │ 68/99 - ... -``` -See: [Using Dynamic TAO](./index.md#using-dynamic-tao) - -## Price/rate of alpha tokens - -### Ideal price -For each subnet, you'll see that *Price* (listed in the third column) is a function of TAO in reserve `τ_in` over alpha in reserve `α_in` - -$$ -Price = \frac{\tau_{in}}{\alpha_{in}} -$$ - -For example, if for subnet $\varepsilon$, its subnet pool contains TAO reserves of 1000 TAO units and its alpha reserves of 16000 $\varepsilon$ units, then the relative price of the $\varepsilon$ token is: - -$$ -R = \frac{\tau_{in}}{\alpha_{in}} = \frac{1000}{16000} = 0.0625 -$$ - -Hence, -$$ -\text{1 } \varepsilon = 0.0625 \text{ TAO} -$$ - -This exchange rate can change every block when staking or unstaking or emissions occur on this subnet. - -## Emission in Dynamic TAO - -Liquidity is steadily emitted into the Bittensor token economy according to an algorithm intended to foster growth while stabilizing prices and protecting them from manipulation. - -Each block: -- the chain emits TAO and injects it into the TAO reserves of the subnets. - -- the chain emits alpha tokens at twice the base alpha emission rate (which starts at 1 α/block and follows the same halving schedule as TAO). These emitted alpha tokens are allocoated between: - - the subnet's alpha reserve (increasing available liquidity) - - alpha outstanding (incentives for miners, validators, and subnet creators) - -See the main article: [Emissions](../emissions) - -## Decentralized evaluation of subnets - -The relative value or *weight* of subnets within Bittensor is critically important as it determines emissions to different subnets and their participant miners and validators. Prior to Dynamic TAO, relative weight among subnets within the Bittensor network is determined by Yuma Consensus over the evaluations of the Root Network validators. This gives a fundamentally centralizing role to the holders of Root Network validator keys. - -In Dynamic TAO, the relative weight is determined organically according to the emergent market value of the subnet, as represented by its stabilized token price. TAO-holders can stake TAO into subnets in exchange for the subnet-specific dynamic currency, referred to as the subnet's alpha ($$\alpha$$) token. In this way, stakers 'vote with their TAO' for the value of the subnet, determining the emissions to the validators and miners working in it. In return, stakers extract a share of the subnet's emissions. - -## Subnet Zero - -In Dynamic TAO, Subnet Zero—or *Root Subnet*—is a special subnet. It is the only subnet that does not have its own $\alpha$ currency. No miners can register on subnet zero, and no validation work is performed. However validators can register, and $\tau$-holders can stake to those validators, as with any other subnet. This offers a mechanism for $\tau$-holders to stake $\tau$ into validators in a subnet-agnostic way. This works because the weight of a validator in a subnet includes both their share of that subnet's $\alpha$ and their share of TAO staked into the root subnet. in Subnet Zero. - -Over time, the emissions generated by TAO staked into Subnet Zero will decrease, relative to stake held in the alpha currency of active subnets. See [Note on evolution of Bittensor token economy](../emissions#note-on-evolution-of-bittensor-token-economy). - -## Validator stake weight - -A validator's stake weight in a subnet equals their alpha stake plus their TAO stake times the `tao_weight` parameter: - -$$ - -\text{Validator stake weight} = \text{Alpha stake} (\alpha) + \text{TAO stake} (\tau) \times \text{TAO weight} - -$$ -:::tip -A validator's stake weight in Subnet Zero is simply their staked TAO. -::: - -A validator's relative stake weight (their stake weight over the total stake weight) in a subnet determines their voting power when evaluating miners, and determines their share of emissions. - -$$ - -\text{Validator x's relative stake weight} -= \frac{\alpha_x + \tau_x \times w_{\tau}} - {\displaystyle \sum_{v \in \text{validators}} - \bigl(\alpha_v + \tau_v \times w_{\tau}\bigr)} - -$$ - diff --git a/docs/dynamic-tao/dtao-transition.md b/docs/dynamic-tao/dtao-transition.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/dynamic-tao/index.md b/docs/dynamic-tao/index.md deleted file mode 100644 index ecc2c39d9d..0000000000 --- a/docs/dynamic-tao/index.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: "Dynamic TAO" ---- - -import { HiOutlineCommandLine } from "react-icons/hi2"; -import { HiAcademicCap } from "react-icons/hi2"; - -# Dynamic TAO - -Dynamic TAO is a recent major evolution of Bittensor's integrated tokenomic and governance model, representing a significant step in Bittensor's trajectory toward more thorough decentralization. - -It was introduced by proposal, approved by senate vote, and introduced as an upgrade to Bittensor main network on February 13, 2025 after a year of research, development, and testing. - -See the [Dynamic TAO White Paper](https://drive.google.com/file/d/1vkuxOFPJyUyoY6dQzfIWwZm2_XL3AEOx/view) for a full explanation. - -See: [Conceptual guide to Dynamic TAO](./dtao-guide.md) - -## What to expect with Dynamic TAO - -Most operations will remain unchanged, including the main workflows for miners (e.g., registering on subnets) and validators (e.g., setting weights on miners). -Simply update the Bittensor SDK and/or `btcli`, and you will be prepared to work with the Dynamic TAO-enabled Bittensor test network. - -:::danger -The migration to Dynamic TAO includes breaking changes. Older versions of the SDK and `btcli` are not compatible with Dynamic TAO. If a participant on your subnet does not upgrade their tooling, they will fall out of consensus. - -The changes to `btcli` and the Bittensor SDK are not backwards compatible. -::: - -## Using Dynamic TAO - -To use Dynamic TAO, make sure you upgrade to the most recent stable versions of the Bittensor SDK and `btcli`. - -See: -- [Bittensor SDK release page](https://pypi.org/project/bittensor/) -- [Bittensor CLI release page](https://pypi.org/project/bittensor-cli/) -- [Upgrade the Bittensor SDK](../getting-started/installation.md#upgrade) - - -### Subnet tokens/liquidity pools - -The most visible difference introduced with Dynamic TAO is the addition of one new token per subnet in the Bittensor network. - -Run `btcli subnet list` to view information about the subnets and their currency reserves: - -For example: -```txt - Subnets - Network: rao - - - ┃ ┃ Price ┃ Market Cap ┃ ┃ ┃ ┃ ┃ - Netuid ┃ Name ┃ (τ_in/α_in) ┃ (α * Price) ┃ Emission (τ) ┃ P (τ_in, α_in) ┃ Stake (α_out) ┃ Supply (α) ┃ Tempo (k/n) -━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━ - 0 │ τ root │ 1.00 τ/Τ │ τ 5.93m │ τ 0.0000 │ -, - │ Τ 5.93m │ 5.93m Τ /21M │ -/- - 3 │ γ templar │ 0.02 τ/γ │ τ 57.32 │ τ 0.0197 │ τ 31.44, 1.43k γ │ 1.18k γ │ 2.61k γ /21M │ 67/99 - 9 │ ι pretrain │ 0.02 τ/ι │ τ 55.38 │ τ 0.0194 │ τ 30.91, 1.46k ι │ 1.16k ι │ 2.61k ι /21M │ 73/99 - 1 │ α apex │ 0.02 τ/α │ τ 54.45 │ τ 0.0192 │ τ 30.65, 1.47k α │ 1.14k α │ 2.61k α /21M │ 65/99 - 2 │ β omron │ 0.02 τ/β │ τ 54.45 │ τ 0.0192 │ τ 30.65, 1.47k β │ 1.14k β │ 2.61k β /21M │ 66/99 - 4 │ δ targon │ 0.02 τ/δ │ τ 54.45 │ τ 0.0192 │ τ 30.65, 1.47k δ │ 1.14k δ │ 2.61k δ /21M │ 68/99 - ... -``` - -### Gradual impact on consensus dynamics - -The rollout of Dynamic TAO is calculated to have a gradual impact. When Dynamic TAO is first released, the weight of all validators (in terms of stake) will remain unchanged, because a biasing variable known as *TAO weight*, which controls the relative weight of TAO and alpha currencies, will heavily favor TAO—which currently has 100% weight since alpha currencies don't exist. Over time (an estimated 100 days), this *TAO Weight* will shift to favor alpha currencies over TAO. diff --git a/docs/dynamic-tao/sdk-cheat-sheet.md b/docs/dynamic-tao/sdk-cheat-sheet.md deleted file mode 100644 index 152301fa4b..0000000000 --- a/docs/dynamic-tao/sdk-cheat-sheet.md +++ /dev/null @@ -1,568 +0,0 @@ ---- -title: "Dynamic TAO SDK Cheat Sheet" ---- - -This page provides a quick reference for the core functionalities for the Bittensor Python SDK that have changed for [Dynamic TAO](./index.md), and some example scripts to demonstrate functionality such as [viewing exchange rates](#example-viewing-exchange-rates) and [staking and unstaking](#example-staking-and-unstaking) into subnets. - - -Updates to the `subtensor` and `async_subtensor` modules and the `DynamicInfo` class provide new ways to view information related to new Dynamic TAO features, such as alpha token prices, token reserve amounts, and wallet balances. Functionality around staking and unstaking has been updated to reflect the new nature of staking/unstaking in Dynamic TAO. - -See [Dynamic TAO Overview](./index.md). - -## Updating your SDK - -### Option 1: Use the release candidate - -To update to the Dynamic TAO-enabled versions of the SDK, run: - -``` -pip install bittensor -``` - -### Option 2: Install from source - -1. Clone the Bittensor repository from GitHub: [`https://github.com/opentensor/bittensor`](https://github.com/opentensor/bittensor) -1. Check out the `rao` branch. -1. Run `pip install .` - -## Using the SDK for sync or async requests - -The Bittensor `subtensor` and `async_subtensor` modules offer the synchronous and asynchronous options for the same functionality. - -Import Bittensor and alias the correct module, for example, the following configuration for async calls to the Bittensor test network: - - ```python - import bittensor as bt - sub = bt.AsyncSubtensor(network="test") - ``` - -Or the following configuration for synchronous calls to Bittensor test network: - - ```python - import bittensor as bt - sub = bt.Subtensor(network="test") - ``` - - -## The `DynamicInfo` object - -The state of a subnet, with all of the new attributes, is encapsulated in a `DynamicInfo` object. This is what is returned by the `subnet` and `all_subnets` methods. - -```python -@dataclass -class DynamicInfo: - netuid: int - owner_hotkey: str - owner_coldkey: str - subnet_name: str - symbol: str - tempo: int - last_step: int - blocks_since_last_step: int - emission: Balance - alpha_in: Balance - alpha_out: Balance - tao_in: Balance - price: Balance - k: float - is_dynamic: bool - alpha_out_emission: Balance - alpha_in_emission: Balance - tao_in_emission: Balance - pending_alpha_emission: Balance - pending_root_emission: Balance - network_registered_at: int - subnet_identity: Optional[SubnetIdentity] - -``` -## Viewing subnets -Subnets evolve substantially in Dynamic TAO! Each subnet has its own currency, known as its alpha token, and an internal economy comprising a currency reserve of TAO, a reserve of its own alpha token, and a ledger of staked balances, to keep track of all of its stakers—those who have put TAO into its reserve in exchange for alpha. - -#### `all_subnets` -```python -all_subnets( - block_number: Optional[int] = None -) -> List[DynamicInfo] - -``` - -Description: Fetches information about all subnets at a certain block height (or current block if None). - -Returns: A list of DynamicInfo objects (detailed below). - -#### `subnet` -```python -subnet( - netuid: int, - block_number: Optional[int] = None -) -> DynamicInfo - -``` -Fetches information about a single subnet identified by netuid. - -Returns a DynamicInfo object describing the subnet’s current state. - - -#### `metagraph` -```python -metagraph( - netuid: int, - block: Optional[int] = None -) -> bittensor.Metagraph -``` - - -Returns the metagraph for a specified subnet netuid. The metagraph includes detailed data on the neurons in the subnet. - -## Exchange rates -You can query the DynamicInfo object for the exchange rates between TAO and alpha tokens. -You can use `all_subnets` or `subnet` to get the DynamicInfo object. - -```python -subnet = sub.subnet(netuid=1) -``` -### Calculate exhange rates -#### `tao_to_alpha` - -```python -tao_to_alpha(self, tao: Union[Balance, float, int]) -> Balance: -``` -Description: Returns an 'ideal' estimate of how much Alpha a staker would receive at the current price, *ignoring slippage*. - -Parameters: - `tao`: Amount of TAO to stake. - -#### `alpha_to_tao` -```python -alpha_to_tao(self, alpha: Union[Balance, float, int]) -> Balance: -``` -Description: Returns an 'ideal' estimate of how much TAO would be yielded by unstaking at the current price, *ignoring slippage*. -Parameters: - `alpha`: Amount of Alpha to unstake. - -#### `tao_to_alpha_with_slippage` -```python -tao_to_alpha_with_slippage(tao: Union[Balance, float, int], percentage: bool = False) -> Union[tuple[Balance, Balance], float]: -``` -Returns an estimate of how much Alpha would a staker receive if they stake their TAO using the current pool state. - -Parameters: - `tao`: Amount of TAO to stake. - `percentage`: If True, returns the percentage difference between the estimated amount and ideal amount as if there was no slippage. - -Returns: - Tuple of balances where the first part is the amount of Alpha received, and the - second part (slippage) is the difference between the estimated amount and ideal - amount as if there was no slippage - OR - Percentage of the slippage as a float - -#### `alpha_to_tao_with_slippage` -```python -alpha_to_tao_with_slippage(alpha: Union[Balance, float, int], percentage: bool = False) -> Union[tuple[Balance, Balance], float]: -``` -Returns an estimate of how much TAO would a staker receive if they unstake their alpha using the current pool state. - -Parameters: - `alpha`: Amount of Alpha to unstake. - `percentage`: If True, returns the percentage difference between the estimated amount and ideal amount as if there was no slippage. - -Returns: - Tuple of balances where the first part is the amount of TAO received, and the - second part (slippage) is the difference between the estimated amount and ideal - amount as if there was no slippage - OR - Percentage of the slippage as a float - -### Display current exchange rates - -The following script displays exchange rates for a subnet alpha token, with and without slippage. - -```python -import bittensor as bt - -sub = bt.Subtensor(network="test") -subnet = sub.subnet(netuid=1) - -print("alpha_to_tao_with_slippage", subnet.alpha_to_tao_with_slippage(100)) -print("alpha_to_tao_with_slippage percentage", subnet.alpha_to_tao_with_slippage(100, percentage=True)) - -print("tao_to_alpha_with_slippage", subnet.tao_to_alpha_with_slippage(100)) -print("tao_to_alpha_with_slippage percentage", subnet.tao_to_alpha_with_slippage(100, percentage=True)) - -print("tao_to_alpha", subnet.tao_to_alpha(100)) -print("alpha_to_tao", subnet.alpha_to_tao(100)) -``` - -## Managing stake - -#### `get_stake` -```python -get_stake( - hotkey_ss58: str, - coldkey_ss58: str, - netuid: int -) -> bittensor.Balance - -``` - -Description: Retrieves the staked balance for a given (hotkey, coldkey) pair on a specific subnet. Returns a `bittensor.Balance` object with the staked amount. -Parameters: -- hotkey_ss58: Hotkey SS58 address. -- coldkey_ss58: Coldkey SS58 address (owner). -- netuid: Unique ID of the subnet. - - - -#### `add_stake` - -```python -async add_stake( - wallet, - hotkey: str, - netuid: int, - tao_amount: Union[float, bittensor.Balance, int] -) -``` -Description: Adds (stakes) an amount of TAO (tao_amount) to a specific subnet (netuid) under the provided hotkey. - -Parameters: -- wallet: Your Bittensor wallet object. -- hotkey: The SS58 address (hotkey) to be staked. -- netuid: Unique ID of the subnet on which you want to stake. -- tao_amount: Amount to stake, can be a float, integer, or bittensor.Balance object. - -#### `unstake` -```python -unstake( - wallet, - hotkey: str, - netuid: int, - amount: Union[float, bittensor.Balance, int] -) - -``` - -Description: Unstakes amount of TAO from the specified hotkey on a given netuid. - -Parameters: -- wallet: Your Bittensor wallet object. -- hotkey: The SS58 address (hotkey) from which you want to remove stake. -- netuid: Unique ID of the subnet. -- amount: Amount to unstake. - - -#### `get_balance` -```python -get_balance( - address: str, - block: Optional[int] = None -) -> bittensor.Balance - -``` - -Description: Returns the current (or specified block’s) coldkey TAO balance for an address. - -Parameters: -- address: SS58 address to check. -- block: Optional block number at which to fetch the balance. Uses the latest block if None. - - -#### `get_current_block` -```python -get_current_block() -> int - -``` -Description: Returns the current chain block number. -#### `wait_for_block` -```python -wait_for_block( -block: Optional[int] = None -) - -``` -Description: Waits for the next block to arrive or waits until a specified block number is reached if provided. - -Update: we have added proper nonce protection allowing you to run gather operations on stake/unstake/transfers, such as: -```python -scatter_stake = await asyncio.gather(*[ sub.add_stake( hotkey, coldkey, netuid, amount ) for netuid in range(64) ] ) -``` - - -### Staking -The following script incrementally stakes 3 TAO into several subnets over many blocks: - -```python - -import bittensor as bt -sub = bt.Subtensor(network="test") -wallet = bt.wallet(name="ExampleWalletName") -wallet.unlock_coldkey() - -to_buy = [119, 277, 18, 5] # list of netuids to stake into -increment = 0.01 # amount of TAO to stake -total_spend = 0 # total amount of TAO spent -stake = {} # dictionary to store the stake for each netuid - -while total_spend < 3: - for netuid in to_buy: - subnet = sub.subnet(netuid) - print(f"slippage for subnet {netuid}", subnet.slippage(increment)) - sub.add_stake( - wallet = wallet, - netuid = netuid, - hotkey = subnet.owner_hotkey, - tao_amount = increment, - ) - - current_stake = sub.get_stake( - coldkey_ss58 = wallet.coldkeypub.ss58_address, - hotkey_ss58 = subnet.owner_hotkey, - netuid = netuid, - ) - stake[netuid] = current_stake - total_spend += increment - print (f'netuid {netuid} price {subnet.price} stake {current_stake}') - sub.wait_for_block() -``` -```console -Enter your password: -Decrypting... - -slippage for subnet 119 -5.484198655671355 -netuid 119 price τ0.027592398 stake Ⲃ1.449590749 -slippage for subnet 277 -22.54931028877199 -netuid 277 price τ0.014734147 stake इ2.714201361 -slippage for subnet 18 -48.319842544421064 -netuid 18 price τ0.001067641 stake σ28.105321031 -slippage for subnet 5 -36.69607695087895 -netuid 5 price τ0.001784484 stake ε11.208213619 - -... - -``` -### Unstaking - -The below script will reverse the effects of the above, by incrementally unstaking alpha tokens from the list of subnets to yield TAO. - -```python - -import bittensor as bt -sub = bt.Subtensor(network="test") -wallet = bt.wallet(name="ExampleWalletName") -wallet.unlock_coldkey() - -to_sell = [119, 277, 18, 5] # list of netuids to unstake from -increment = 0.01 # amount of alpha to unstake -total_sell = 0 # total amount of alpha unstaked -stake = {} # dictionary to store the stake for each netuid - -while total_sell < 3: - for netuid in to_sell: - subnet = sub.subnet(netuid) - print(f"slippage for subnet {netuid}", subnet.alpha_slippage(increment)) - - sub.remove_stake( - wallet = wallet, - netuid = netuid, - hotkey = subnet.owner_hotkey, - amount = increment, - ) - current_stake = sub.get_stake( - coldkey_ss58 = wallet.coldkeypub.ss58_address, - hotkey_ss58 = subnet.owner_hotkey, - netuid = netuid, - ) - stake[netuid] = current_stake - total_sell += increment - print (f'netuid {netuid} price {subnet.price} stake {current_stake}') - sub.wait_for_block() -``` -```console -Enter your password: -Decrypting... - -slippage for subnet 119 -5.480567515602973 -netuid 119 price τ0.027590441 stake Ⲃ2.899319570 -slippage for subnet 277 -22.534224516416796 -netuid 277 price τ0.014730536 stake इ5.429337492 -slippage for subnet 18 -48.29992457746112 -netuid 18 price τ0.001068362 stake σ65.558512653 -slippage for subnet 5 -36.680744412524845 -netuid 5 price τ0.001785179 stake ε33.619312896 - -... - -``` - -## Subnet registration - -### Register - -You can register your hotkey on a subnet using the `burned_register` method. This is necessary for staking, mining or validating. - -#### `burned_register` -```python -burned_register( - wallet, - netuid: int, -) -> bool -``` - -Description: Registers a hotkey on a subnet. - -Parameters: -- wallet: Your Bittensor wallet object. -- netuid: Unique ID of the subnet. - -Returns: -- bool: True if the registration was successful, False otherwise. - -Sample script: -```python -import bittensor as bt -logging = bt.logging -logging.set_info() -sub = bt.Subtensor(network="test") -wallet = bt.wallet( - name="ExampleWalletName", - hotkey="ExampleHotkey", -) -wallet.unlock_coldkey() -reg = sub.burned_register(wallet=wallet, netuid=3) -``` - - -### View registered subnets - -#### `get_netuids_for_hotkey` -```python -get_netuids_for_hotkey( - hotkey: str, -) -> list[int] - -``` - -Description: Returns the netuids in which a hotkey is registered. - -Parameters: -- hotkey: SS58 address to check. - -Example usage: -```python -import bittensor as bt -sub = bt.Subtensor(network="test") -wallet = bt.wallet( - name="ExampleWalletName", - hotkey="ExampleHotkey", -) -wallet.unlock_coldkey() -netuids = sub.get_netuids_for_hotkey(wallet.hotkey.ss58_address) -print(netuids) -``` - -#### `btcli wallet overview` -You can also use the `btcli` to check subnet registrations using `btcli wallet overview`. -This displays the registrations to subnets by hotkeys controlled by the wallet: - - -```shell - Wallet - - ExampleWalletName : 5G4mxrN8msvc4jjwp7xoBrtAejTfAMLCMTFGCivY5inmySbq - Network: test -Subnet: 250: unknown ኤ - - COLDKEY HOTKEY UID ACTIVE STAKE(ኤ) RANK TRUST CONSENSUS INCENTIVE DIVIDENDS EMISSION(… VTRUST VPE… UPDAT… AXON HOTKEY_SS58 - ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - ExampleWalletName ExampleHotkey 8 False 706.38 0.00 0.00 0.00 0.00 0.00 4945923.0… 0.00 * 57118 none 5GEXJdUXxL - ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - 1 706.38 ኤ 0.0000 0.0000 0.0000 0.0000 0.0000 ρ4945923 0.0000 - -Subnet: 3: gamma γ - - COLDKEY HOTKEY UID ACTIVE STAKE(γ) RANK TRUST CONSENSUS INCENTIVE DIVIDENDS EMISSION(… VTRUST VPE… UPDAT… AXON HOTKEY_SS58 - ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - ExampleWalletName ExampleHotkey 10 False 0.00 0.00 0.00 0.00 0.00 0.00 0.0000 0.00 32210… none 5GEXJdUXxL - ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - 1 0.00 γ 0.0000 0.0000 0.0000 0.0000 0.0000 ρ0 0.0000 - -Subnet: 119: vidac Ⲃ - - COLDKEY HOTKEY UID ACTIVE STAKE(Ⲃ) RANK TRUST CONSENSUS INCENTIVE DIVIDENDS EMISSION(… VTRUST VPE… UPDAT… AXON HOTKEY_SS58 - ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - ExampleWalletName ExampleHotkey 103 False 268.38 0.01 1.00 0.01 0.01 0.00 3470929.0… 0.00 57625 none 5GEXJdUXxL - ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - 1 268.38 Ⲃ 0.0094 1.0000 0.0093 0.0094 0.0000 ρ3470929 0.0000 - -``` - - -## View a hotkey's emissions - -This script displays the last day's emissions for a specified hotkey on all subnets on which the hotkey is registered. - -This could be useful for a miner to see how much they've been extracting from the different subnets, if they've been mining on several. - -Be aware that daily emissions can fluctuate widely. See [Emissions](../emissions.md). - -```python -from bittensor.core.async_subtensor import AsyncSubtensor -import sys -import asyncio - -# This is the validator HK for Opentensor Foundation, substitute with the hotkey of the miner/validator you wish to inspect -HOTKEY = "5F4tQyWrhfGVcNhoqeiNsR6KjD4wMZ2kfhLj4oHYuyHbZAc3" - -# Speicfy which subnets you wish to inspect, by UID -NETUIDS = range(0,64) -BLOCKTIME = 12 - -subtensor_address = "finney" # or "test" or locally with "ws://127.0.0.1:9944" - -async def main(): - async with AsyncSubtensor(f"{subtensor_address}") as subtensor: - all_sn_dynamic_info_list = await subtensor.all_subnets() - - all_sn_dynamic_info = {info.netuid: info for info in all_sn_dynamic_info_list} - daily_blocks = (60 * 60 * 24) / BLOCKTIME # Number of blocks per day - - - print(f"Hotkey: {HOTKEY}") - - subnets = await asyncio.gather(*[subtensor.subnet_exists(netuid) for netuid in range(1, 8)]) - metagraphs = await asyncio.gather(*[ subtensor.metagraph(netuid=id) for id in NETUIDS]) - for id in NETUIDS: - print(f"UID: {id}") - - metagraph = metagraphs[id] - tempo_multiplier = daily_blocks / metagraph.tempo - - subnet_info = all_sn_dynamic_info.get(id) - - uid = metagraph.hotkeys.index(HOTKEY) if HOTKEY in metagraph.hotkeys else None - - if uid is None: - print(f"Hotkey {HOTKEY} not found in the metagraph") - else: - daily_rewards_alpha = float(metagraph.emission[uid] * tempo_multiplier) - daily_rewards_tao = float(daily_rewards_alpha * subnet_info.price.tao) - alpha_to_tao_with_slippage, slippage = subnet_info.alpha_to_tao_with_slippage( - alpha=daily_rewards_alpha - ) - - print(f"Daily Rewards Alpha: {daily_rewards_alpha}") - print(f"Daily Rewards Tao: {daily_rewards_tao}") - print(f"Alpha to Tao with Slippage: {alpha_to_tao_with_slippage}") - -asyncio.run(main()) - -``` \ No newline at end of file diff --git a/docs/dynamic-tao/sdk-cheat-sheet.md.bak b/docs/dynamic-tao/sdk-cheat-sheet.md.bak deleted file mode 100644 index 806ce3eb4f..0000000000 --- a/docs/dynamic-tao/sdk-cheat-sheet.md.bak +++ /dev/null @@ -1,455 +0,0 @@ ---- -title: "Dynamic TAO SDK Cheat Sheet" ---- - -This page provides a quick reference for the core functionalities for the Bittensor Python SDK that have changed for [Dynamic TAO](./index.md), and some example scripts to demonstrate functionality such as [viewing exchange rates](#example-viewing-exchange-rates) and [staking and unstaking](#example-staking-and-unstaking) into subnets. - - -Updates to the `subtensor` and `async_subtensor` modules and the `DynamicInfo` class provide new ways to view information related to new Dynamic TAO features, such as alpha token prices and token reserves amounts. - -## Updating your SDK - -### option 1: use the release candidate - -To update to the Dynamic TAO-enabled versions of the SDK, run: - -``` -pip install bittensor -``` - -### option 2: install from source - -1. Clone the Bittensor repository from GitHub: [`https://github.com/opentensor/bittensor`](https://github.com/opentensor/bittensor) -1. Check out the `rao` branch. -1. Run `pip install .` - - -## Using the SDK for sync or async requests - -The Bittensor `subtensor` and `async_subtensor` modules offer the synchronous and asynchronous options for the same functionality. - -Import bittensor and alias the correct module, for example, the following configuration for async calls to the Bittensor test network: - - ```python - import bittensor as bt - sub = bt.AsyncSubtensor(network="test") - ``` - -Or the following configuration for synchronous calls to Bittensor mainnet ('finney'): - - ```python - import bittensor as bt - sub = bt.Subtensor(network="finney") - ``` - - -## The `DynamicInfo` object - -The state of a subnet, with all of the new attributes, is encapsulated in a `DynamicInfo` object. This is what is returned by the `subnet` and `all_subnets` methods. - -``` -@dataclass -class DynamicInfo: - netuid: int - owner_hotkey: str - owner_coldkey: str - subnet_name: str - symbol: str - tempo: int - last_step: int - blocks_since_last_step: int - emission: Balance - alpha_in: Balance - alpha_out: Balance - tao_in: Balance - price: Balance - k: float - is_dynamic: bool - alpha_out_emission: Balance - alpha_in_emission: Balance - tao_in_emission: Balance - pending_alpha_emission: Balance - pending_root_emission: Balance - network_registered_at: int - subnet_identity: Optional[SubnetIdentity] - -``` -## Viewing subnets -Subnets evolve substantially in Dynamic TAO! Each subnet has its own currency, known as its alpha token, and an internal economy comprising a currency reserve of TAO, a reserve of its own alpha token, and a ledger of staked balances, to keep track of all of its stakers—those who have put TAO into its reserve in exchange for alpha. - -### `all_subnets` -```python -all_subnets( - block_number: Optional[int] = None -) -> List[DynamicInfo] - -``` - -Description: Fetches information about all subnets at a certain block height (or current block if None). -Returns: A list of DynamicInfo objects (detailed below). - -### `get_netuids` -```python -get_netuids(self, block: Optional[int] = None) -> list[int] - -``` -Retrieves a list of all subnets currently active within the Bittensor network. This function provides an overview of the various subnets and their identifiers. - -Parameters: - - block (Optional[int]): The blockchain block number for the query. - -Returns: -- `list`[int]: A list of network UIDs representing each active subnet. - - - -### `subnet` -```python -subnet( - netuid: int, - block_number: Optional[int] = None -) -> DynamicInfo - -``` -Description: Fetches information about a single subnet identified by netuid. -Returns: A DynamicInfo object describing the subnet’s current state (see section Subnet DynamicInfo). - -### `metagraph` -```python -metagraph( - netuid: int, - block: Optional[int] = None -) -> bittensor.Metagraph -``` -Description: Returns the metagraph for a specified subnet netuid. The metagraph includes detailed data on the neurons in the subnet. - -## Calculating exchange rates -### `tao_to_alpha` -```python -tao_to_alpha(self, tao: Balance) -> Balance -``` -Description: Returns an 'ideal' estimate of how much Alpha a staker would receive at the current price, *ignoring slippage*. -Parameters: - `tao`: Amount of TAO to stake. -### `alpha_to_tao` -```python -alpha_to_tao(self, alpha: Balance) -> Balance -``` -Description: Returns an 'ideal' estimate of how much TAO would be yielded by unstaking at the current price, *ignoring slippage*. -Parameters: - `alpha`: Amount of Alpha to unstake. - -### `tao_to_alpha_with_slippage` -```python -tao_to_alpha(self, tao: Balance) -> Balance - -``` -Returns an estimate of how much Alpha would a staker receive if they stake their tao using the current pool state. -Parameters: - `tao`: Amount of TAO to stake. -Returns: - Tuple of balances where the first part is the amount of Alpha received, and the - second part (slippage) is the difference between the estimated amount and ideal - amount as if there was no slippage - -### `alpha_to_tao_with_slippage` - -Returns an estimate of how much TAO would a staker receive if they unstake their alpha using the current pool state. -Parameters: - `alpha`: Amount of Alpha to unstake. -Returns: - Tuple of balances where the first part is the amount of TAO received, and the - second part (slippage) is the difference between the estimated amount and ideal - amount as if there was no slippage - -## Managing stake - -### `get_stake` -```python -get_stake( - hotkey_ss58: str, - coldkey_ss58: str, - netuid: int -) -> bittensor.Balance - -``` - -Description: Retrieves the staked balance for a given (hotkey, coldkey) pair on a specific subnet. Returns a `bittensor.Balance` object with the staked amount. -Parameters: -- hotkey_ss58: Hotkey SS58 address. -- coldkey_ss58: Coldkey SS58 address (owner). -- netuid: Unique ID of the subnet. - - - -### `add_stake` - -```python -async add_stake( - wallet, - hotkey: str, - netuid: int, - tao_amount: Union[float, bittensor.Balance, int] -) -``` -Description: Adds (stakes) an amount of TAO (tao_amount) to a specific subnet (netuid) under the provided hotkey. - -Parameters: -- wallet: Your Bittensor wallet object. -- hotkey: The SS58 address (hotkey) to be staked. -- netuid: Unique ID of the subnet on which you want to stake. -- tao_amount: Amount to stake, can be a float, integer, or bittensor.Balance object. - -### `unstake` -```python -unstake( - wallet, - hotkey: str, - netuid: int, - amount: Union[float, bittensor.Balance, int] -) - -``` - -Description: Unstakes amount of TAO from the specified hotkey on a given netuid. -Parameters: -- wallet: Your Bittensor wallet object. -- hotkey: The SS58 address (hotkey) from which you want to remove stake. -- netuid: Unique ID of the subnet. -- amount: Amount to unstake. - - -### `get_balance` -```python -get_balance( - address: str, - block: Optional[int] = None -) -> bittensor.Balance - -``` - -Description: Returns the current (or specified block’s) coldkey TAO balance for an address. - -Parameters: -- address: SS58 address to check. -- block: Optional block number at which to fetch the balance. Uses the latest block if None. - - - - -### `get_current_block` -```python -get_current_block() -> int - -``` -Description: Returns the current chain block number. -### `wait_for_block` -```python -wait_for_block( -block: Optional[int] = None -) - -``` -Description: Waits for the next block to arrive or waits until a specified block number is reached if provided. - -Update: we have added proper nonce protection allowing you to run gather operations on stake/unstake/transfers -scatter_stake = await asyncio.gather(*[ sub.add_stake( hotkey, coldkey, netuid, amount ) for netuid in range(64) ] ) - - -## Example: Viewing exchange rates - -The following script displays exchange rates for a subnet alpha token, with and without slippage. - -``` -import bittensor as bt - -sub = bt.Subtensor(network="test") -subnet = sub.subnet(netuid=1) - -print("alpha_to_tao_with_slippage", subnet.alpha_to_tao_with_slippage(100)) -print("alpha_to_tao_with_slippage percentage", subnet.alpha_to_tao_with_slippage(100, percentage=True)) - -print("tao_to_alpha_with_slippage", subnet.tao_to_alpha_with_slippage(100)) -print("tao_to_alpha_with_slippage percentage", subnet.tao_to_alpha_with_slippage(100, percentage=True)) - -print("tao_to_alpha", subnet.tao_to_alpha(100)) -print("alpha_to_tao", subnet.alpha_to_tao(100)) -``` - -## Example: staking and unstaking - -The following script incrementally stakes 3 TAO into several subnets over many blocks: - -```python - -import bittensor as bt -sub = bt.Subtensor(network="test") -wallet = bt.wallet(name="ExampleWalletName") -wallet.unlock_coldkey() - -to_buy = [119, 277, 18, 5] -increment = 0.01 -total_spend = 0 -stake = {} - -while total_spend < 3: - for netuid in to_buy: - subnet = sub.subnet(netuid) - print("slippage for subnet " + str(netuid)) - print(subnet.slippage(100)) - sub.add_stake( - wallet = wallet, - netuid = netuid, - hotkey = subnet.owner_hotkey, - tao_amount = increment, - ) - - current_stake = sub.get_stake( - coldkey_ss58 = wallet.coldkeypub.ss58_address, - hotkey_ss58 = subnet.owner_hotkey, - netuid = netuid, - ) - stake[netuid] = current_stake - total_spend += increment - print ('netuid', netuid, 'price', subnet.price, 'stake', current_stake ) - sub.wait_for_block() -``` -```console -Enter your password: -Decrypting... - -slippage for subnet 119 -5.484198655671355 -netuid 119 price τ0.027592398 stake Ⲃ1.449590749 -slippage for subnet 277 -22.54931028877199 -netuid 277 price τ0.014734147 stake इ2.714201361 -slippage for subnet 18 -48.319842544421064 -netuid 18 price τ0.001067641 stake σ28.105321031 -slippage for subnet 5 -36.69607695087895 -netuid 5 price τ0.001784484 stake ε11.208213619 - -... - -``` - - - -The below script will reverse the effects of the above, by incrementally unstaking alpha tokens from the list of subnets to yield TAO. - -``` - -import bittensor as bt -sub = bt.Subtensor(network="test") -wallet = bt.wallet(name="ExampleWalletName") -wallet.unlock_coldkey() - -to_sell = [119, 277, 18, 5] -increment = 0.01 -total_sell = 0 -stake = {} - -while total_sell < 3: - for netuid in to_sell: - subnet = sub.subnet(netuid) - print("slippage for subnet " + str(netuid)) - print(subnet.slippage(100)) - - sub.remove_stake( - wallet = wallet, - netuid = netuid, - hotkey = subnet.owner_hotkey, - amount = increment, - ) - current_stake = sub.get_stake( - coldkey_ss58 = wallet.coldkeypub.ss58_address, - hotkey_ss58 = subnet.owner_hotkey, - netuid = netuid, - ) - stake[netuid] = current_stake - total_sell += increment - print ('netuid', netuid, 'price', subnet.price, 'stake', current_stake ) - sub.wait_for_block() -``` -```console -Enter your password: -Decrypting... - -slippage for subnet 119 -5.480567515602973 -netuid 119 price τ0.027590441 stake Ⲃ2.899319570 -slippage for subnet 277 -22.534224516416796 -netuid 277 price τ0.014730536 stake इ5.429337492 -slippage for subnet 18 -48.29992457746112 -netuid 18 price τ0.001068362 stake σ65.558512653 -slippage for subnet 5 -36.680744412524845 -netuid 5 price τ0.001785179 stake ε33.619312896 - -... - -``` - - - - -## Register on a subnet - -The following script registers a hotkey on a subnet. This is necessary for staking, mining or validating. - -```python -import bittensor as bt -logging = bt.logging -logging.set_info() -sub = bt.Subtensor(network="test") -wallet = bt.wallet( - name="ExampleWalletName", - hotkey="ExampleHotkey", -) -wallet.unlock_coldkey() -reg = sub.burned_register(wallet=wallet, netuid=3) -``` - - -## View your wallet - -The `btcli` currently offers a nicer overview of the wallet than the SDK. This displays the registrations to subnets by hotkeys controlled by the wallet: - - - - -```shell - Wallet - - ExampleWalletName : 5G4mxrN8msvc4jjwp7xoBrtAejTfAMLCMTFGCivY5inmySbq - Network: test -Subnet: 250: unknown ኤ - - COLDKEY HOTKEY UID ACTIVE STAKE(ኤ) RANK TRUST CONSENSUS INCENTIVE DIVIDENDS EMISSION(… VTRUST VPE… UPDAT… AXON HOTKEY_SS58 - ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - ExampleWalletName ExampleHotkey 8 False 706.38 0.00 0.00 0.00 0.00 0.00 4945923.0… 0.00 * 57118 none 5GEXJdUXxL - ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - 1 706.38 ኤ 0.0000 0.0000 0.0000 0.0000 0.0000 ρ4945923 0.0000 - -Subnet: 3: gamma γ - - COLDKEY HOTKEY UID ACTIVE STAKE(γ) RANK TRUST CONSENSUS INCENTIVE DIVIDENDS EMISSION(… VTRUST VPE… UPDAT… AXON HOTKEY_SS58 - ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - ExampleWalletName ExampleHotkey 10 False 0.00 0.00 0.00 0.00 0.00 0.00 0.0000 0.00 32210… none 5GEXJdUXxL - ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - 1 0.00 γ 0.0000 0.0000 0.0000 0.0000 0.0000 ρ0 0.0000 - -Subnet: 119: vidac Ⲃ - - COLDKEY HOTKEY UID ACTIVE STAKE(Ⲃ) RANK TRUST CONSENSUS INCENTIVE DIVIDENDS EMISSION(… VTRUST VPE… UPDAT… AXON HOTKEY_SS58 - ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - ExampleWalletName ExampleHotkey 103 False 268.38 0.01 1.00 0.01 0.01 0.00 3470929.0… 0.00 57625 none 5GEXJdUXxL - ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - 1 268.38 Ⲃ 0.0094 1.0000 0.0093 0.0094 0.0000 ρ3470929 0.0000 - -``` - diff --git a/docs/dynamic-tao/staking-unstaking-dtao.md b/docs/dynamic-tao/staking-unstaking-dtao.md deleted file mode 100644 index dc9b632b54..0000000000 --- a/docs/dynamic-tao/staking-unstaking-dtao.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: "Understanding Pricing and Anticipating Slippage" ---- - -# Understanding Pricing and Anticipating Slippage - -Each Bittensor subnet operates as a *constant product AMM*, meaning that it will accept trades that conserve the product of the quantities of the two tokens in reserve, TAO and alpha. To calulate the price in one token of batch of the other token that a buyer wishes to acquire—alpha if they are staking, or TAO if they are unstaking—the algorithm assumes that the transaction does not change this product, so the product of TAO and alpha is the same before and after. - -When staking, the product K of TAO in reserve and alpha in reserve is the same before and after the transaction, so the initial product must be equal to the product after the cost in TAO is added to the reserve, and the stake is removed from the reserve and placed in the staked hotkey: - -$$ -\tau_{\mathrm{in}} \,\alpha_{\mathrm{in}} = k -$$ -$$ -(\tau_{\mathrm{in}} + \text{cost}) \bigl(\alpha_{\mathrm{in}} - \text{stake}\bigr) = k -$$ -$$ -(\tau_{\mathrm{in}} + \text{cost}) \bigl(\alpha_{\mathrm{in}} - \text{stake}\bigr) - = \tau_{\mathrm{in}} \,\alpha_{\mathrm{in}} -$$ - - -This means that if we choose to stake in a certain amount of TAO (if we specify the cost), then the yielded stake (the quantity of alpha to be removed from reserve and granted to the staked hotkey) is: - -$$ -\text{Stake} = \alpha_{\text{in}} - \frac{\tau_{\text{in}} \alpha_{\text{in}}} {\tau_{\text{in}} + \text{cost}} - -$$ - -For example, suppose that a subnet has 100 alpha in reserve and 10 TAO, and we want to stake in 5 TAO. - -The price at this moment is 10 TAO / 100 alpha, or 10 alpha per TAO, so if we stake 5 TAO, we would expect 50 alpha, without taking slippage into account. - -With slippage, the yielded alpha stake will be: - -$$ -\text{Stake} = 100 - \frac{ 10 * 100} {10 + 5} - -$$ - -or 33.333 alpha sent to the hotkey. So in this case, the slippage is the difference between the ideal expectation of 50 and the actual swap value of 33.33333: -$$ -16.667 = 50 - 33.333 -$$ - -This slippage is 50% of the actual swap value, which is extremely high, because we chose small values for the available liquidity. In general, slippage is high when available liquidity is limited compared to the magnitude of the transaction, since the transaction itself is changing the price significantly. - -:::tip -`btcli` shows the slippage of staking and unstaking operations, so you don't need to calculate it yourself. See [Stake into a node](#stake-into-a-node). -::: - diff --git a/docs/emissions.md b/docs/emissions.md deleted file mode 100644 index 508e00c93d..0000000000 --- a/docs/emissions.md +++ /dev/null @@ -1,143 +0,0 @@ ---- -title: "Emission" ---- - -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Emission - -Emission is the process by which the Bittensor network allocates TAO and alpha to participants, including miners, validators, stakers, and subnet creators. - -It unfolds in two stages: - -- Injection into subnets -- Extraction by participants - -See the [Dynamic TAO White Paper](https://drive.google.com/file/d/1vkuxOFPJyUyoY6dQzfIWwZm2_XL3AEOx/view) for a full explanation. - -### Injection - -The first stage of emissions is *injection of liquidity* into the subnet pools. Liquidity is injected to each subnet in proportion to the price of its token compared to the price of other subnet tokens. This is designed to incentivize development on the most valuable subnets. - -Each block: - -- TAO is injected into the subnet's **TAO reserve**. -- Alpha is injected into the subnet's **alpha reserve**. -- Alpha is allocated to *alpha outstanding*, to be extracted by participants. - -#### TAO reserve injection - -A subnet's TAO reserve injection is computed in proportion to the price of its alpha token over the sum of prices for all the subnets in Bittensor. - -Given set $\mathbb{S}$ of all subnets, and a total per block TAO emission $\Delta\bar{\tau}$, which begins at 1 TAO and follows a halving schedule, TAO emission $\Delta\tau_i$ to subnet $i$ with price $p_i$ is: - -$$ -\Delta\tau_i = \Delta\bar{\tau} \times -\frac - {p_i} - {\sum_{j \in \mathbb{S}} -\bigl(p_j)} -$$ - -#### Alpha reserve injection - -Alpha is then injected in proportion to the price of the token, so that growth of a subnet's liquidity pools does not not change the price of the alpha token. - -Recall that token price for a subnet is its TAO in reserve divided by its alpha reserve: - -$$ -p_i = \frac - {\tau_i} - {\alpha_i} -$$ - -So in order to inject alpha without changing the price, it should follow: - -$$ -\Delta\alpha_i = \frac - {\Delta\tau_i} - {p_i} -$$ - -When we fill in this equation with the previous formula for $\Delta\tau_i$, the price $p_i$ is cancelled out of the equation, yielding: - -$$ -\Delta\alpha_i = - \frac - {\Delta\bar{\tau}} - {\sum_{j \in \mathbb{S}} - \bigl(p_j)} -$$ - - -However, alpha injection is also capped at 1 by the algorithm, to prevent runaway inflation. Therefore, with cap or *alpha emission rate* $\Delta\bar{\alpha_i}$, emission $\Delta\alpha_i$ to subnet $i$ is: - -$$ -\Delta\alpha_i = \min\left\{ - \frac - {\Delta\bar{\tau}} - {\sum_{j \in \mathbb{S}} - \bigl(p_j)}, - \Delta\bar{\alpha_i} \right\} - -$$ - -The cap or *alpha emission rate* $\Delta\bar{\alpha_i}$ for subnet $i$, starts at 1 and follows a halving schedule identical to that of TAO, beginning when subnet $i$ is created. - -#### Alpha outstanding injection - -Each block, liquidity is also set aside to be emitted to participants (validators, miners, stakers, and subnet creator). The quantity per block is equal to the *alpha emission rate* $\Delta\bar{\alpha_i}$ for subnet $i$. - -### Extraction - -At the end of each tempo (360 blocks), the quantity of alpha accumulated over each block of the tempo is extracted by network participants in the following proportions: - -1. 18% by subnet owner -1. 41% of emissions go to miners. The allocation to particular miners is determined by [Yuma Consensus: Miner emissions#miner-emissions](./yuma-consensus). -1. 41% by validators and their stakers. - 1. First, the allocation to validators miners is determined by [Yuma Consensus: Validator Emissions](./yuma-consensus#validator-emissions). - 1. Then, validators extract their take from that allocation. - 1. Then, TAO and alpha are emitted to stakers in proportion to the validators' holdings in each token. TAO emissions are sourced by swapping a portion of alpha emissions to TAO through the subnet's liquidity pool. - - For validator x's TAO stake $\tau_x$, and alpha stake $\alpha_x$, and the global TAO weight $w_{\tau}$: - - - TAO is emitted to stakers on the root subnet (i.e. stakers in TAO) in proportion to the validator's stake weight's proportion of TAO. - - $$ - \text{proportional emissions (\%) to root stakers} - = \frac{\tau_{x}{} \, w_{\tau}} - {\alpha_{x} + \tau_{x} \, w_{\tau}} - $$ - - - Alpha is emitted to stakers on the mining subnet (i.e. stakers in alpha) in proportion to the validator's stake weight's proportion of alpha: - $$ - \text{proportional emissions (\%) to alpha stakers} - = \frac{\alpha_{x}} - {\alpha_{x} + \tau_{x} \, w_{\tau}} - $$ - - Validators who hold both root TAO and subnet alphas will extract both types of token. - - See [Core Dynamic TAO Concepts: Validator stake weight](../subnets/understanding-subnets#validator-stake-weight) - -### Note on evolution of Bittensor token economy - -When Dynamic TAO is initiated, there will be no alpha in circulation, so validator's stake weights will be entirely determined by their share of TAO stake. - -But far more alpha than TAO is emitted into circulation every block. As a result, over time there will be more alpha relative to TAO in overall circulation, and the relative weight of a validator in a given subnet will depend more on their alpha stake share relative to their share of the TAO stake on Subnet Zero. - -In order to hasten the process of alpha gaining the majority of stake power in the network, the contribution of TAO stake to validator stake weight is reduced by a global parameter called *TAO weight*. Currently, this is planned to be **18%**, in order to achieve a weight parity between TAO and total alpha in approximately 100 days. - -
- -
- -
\ No newline at end of file diff --git a/docs/errors-and-troubleshooting.md b/docs/errors-and-troubleshooting.md deleted file mode 100644 index 34922ec656..0000000000 --- a/docs/errors-and-troubleshooting.md +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: "Troubleshooting" ---- - -# Troubleshooting - -This document presents helpful hints to troubleshoot the errors you may get while working in the Bittensor ecosystem. - -## Priority is too low - -Running a `btcli` command sometimes gives me the below error: - -```bash -{'code': 1014, 'message': 'Priority is too low: (18446744073709551615 vs 18446744073709551615)', 'data': 'The transaction has too low priority to replace another transaction already in the pool.'} -``` - -**Likely cause and remedy**: This means that you are submitting the same, duplicate transaction that you have already submitted. For example, if you are running a script, it is trying to submit transactions too quickly, most likely. You just have to wait for a few minutes before you run the command again. - - -## SSLCertVerificationError - -Running any `btcli` command gives the following error, on macOS: - -```bash -SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer -certificate (_ssl.c:1000) -``` - -**Likely cause and remedy:** The `certifi` version used in the `openssl` on your machine is incompatible with the Bittensor requirement. You can solve this issue by any one of the below ways: - -**Remedy 1**: Follow this below exact method, as described in this StackOverflow page: [https://stackoverflow.com/a/43855394](https://stackoverflow.com/a/43855394): - -```bash -Go to the folder where Python is installed, e.g., in my case (Mac OS) it is installed in the Applications folder with the folder name 'Python 3.6'. Now double click on 'Install Certificates.command'. You will no longer face this error. -``` - -**Remedy 2**: Run the below commands: - -- On macOS when not using any Python virtual environment: - ```bash - brew reinstall openssl - ``` -- On macOS when using a virtual environment: - ```bash - pip install urllib3 --force-reinstall - ``` - -## KeyFileError - -```bash -KeyFileError: Keyfile at: /path/to/.bittensor/wallets/some-coldkey/hotkeys/somehotkey does not exist -``` - -**Likely cause and remedy:** A key you are passing as a parameter in a `btcli` command is not registered in the network. Make sure you first register the keys in your desired network before using the keys. - -See: - -- [Miner registration](./miners/index.md#miner-registration) -- [Validator registration](./validators/index.md#validator-registration) - -## Balances.transfer not found - -``` -ValueError: Call function 'Balances.transfer' not found -``` - -**Likely cause and remedy**: You are working with an older version of Bittensor. Update your Bittensor to the latest version. See [Install Bittensor](./getting-started/installation.md). - - -## Genesis mismatch - -``` -Reason: Genesis mismatch. Banned, disconnecting. -``` - -These messages are mostly harmless and you can ignore them. Your lite node will sync properly. See the "best" block numbers in the terminal log. If these block numbers are closer or approaching the current block as seen on either [https://bittensor.com/scan](https://bittensor.com/scan) or [Polkadot JS](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fentrypoint-finney.opentensor.ai%3A443#/explorer), then your local node is syncing properly. - -You get these error messages very often because one or the other Bittensor blockchain validator nodes is running an older version of Polkadot SDK. When it says, "Banned, disconnecting", it is saying the mismatched blockchain validator node is being disconnected. This usually is fine because you don't need to be connected to all the blockchain validator nodes. diff --git a/docs/errors/custom.md b/docs/errors/custom.md deleted file mode 100644 index 0c655c24bd..0000000000 --- a/docs/errors/custom.md +++ /dev/null @@ -1,84 +0,0 @@ ---- -title: "Subtensor Custom Errors" ---- - -# Custom Errors - -This page documents custom errors that can arise from Subtensor, the blockchain underlying the Bittensor network. - -These errors are returned in the format: - -```json -{ - "code": 1010, - "message": "Invalid Transaction", - "data": "Custom error: [Error Code]" -} -``` -Related: -- [Source code in GitHub](https://github.com/opentensor/subtensor/blob/main/pallets/subtensor/src/lib.rs#L1686) -- [Subtensor Standard Errors](./subtensor.md) - Bittensor's custom error codes -- [Substrate Errors](https://polkadot.js.org/docs/substrate/errors/) - Errors from the underlying Substrate framework - -## Error Codes - -### Error Code 0 -**Error**: `ColdKeyInSwapSchedule` -**Description**: Your coldkey is set to be swapped. No transfer operations are possible. - -### Error Code 1 -**Error**: `StakeAmountTooLow` -**Description**: The amount you are staking/unstaking/moving is below the minimum TAO equivalent. -**Minimum**: 500,000 RAO (0.0005 TAO) - -### Error Code 2 -**Error**: `BalanceTooLow` -**Description**: The amount of stake you have is less than you have requested. - -### Error Code 3 -**Error**: `SubnetDoesntExist` -**Description**: This subnet does not exist. - -### Error Code 4 -**Error**: `HotkeyAccountDoesntExist` -**Description**: Hotkey is not registered on Bittensor network. - -### Error Code 5 -**Error**: `NotEnoughStakeToWithdraw` -**Description**: You do not have enough TAO equivalent stake to remove/move/transfer, including the unstake fee. - -### Error Code 6 -**Error**: `RateLimitExceeded` -**Description**: Too many transactions submitted (other than Axon serve/publish extrinsic). - -### Error Code 7 -**Error**: `InsufficientLiquidity` -**Description**: The subnet's pool does not have sufficient liquidity for this transaction. - -### Error Code 8 -**Error**: `SlippageTooHigh` -**Description**: The slippage exceeds your limit. Try reducing the transaction amount. - -### Error Code 9 -**Error**: `TransferDisallowed` -**Description**: This subnet does not allow stake transfer. - -### Error Code 10 -**Error**: `HotKeyNotRegisteredInNetwork` -**Description**: The hotkey is not registered in the selected subnet. - -### Error Code 11 -**Error**: `InvalidIpAddress` -**Description**: Axon connection info cannot be parsed into a valid IP address. - -### Error Code 12 -**Error**: `ServingRateLimitExceeded` -**Description**: Rate limit exceeded for axon serve/publish extrinsic. - -### Error Code 13 -**Error**: `InvalidPort` -**Description**: Axon connection info cannot be parsed into a valid port. - -### Error Code 255 -**Error**: `BadRequest` -**Description**: Unclassified error. diff --git a/docs/errors/index.md b/docs/errors/index.md deleted file mode 100644 index aaa6b7e49a..0000000000 --- a/docs/errors/index.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: "Subtensor Error Codes" ---- - -# Subtensor Error Codes - -This section documents the various types of errors that can arise from Subtensor, the blockchain underlying the Bittensor network. - -These errors can surface through different interfaces including the Bittensor CLI (`btcli`), the Bittensor Python SDK, or extrinsic transaction interfaces such as PolkadotJS. - - -Subtensor errors can be categorized into three main types: - -1. [Subtensor Standard Errors](./subtensor.md) have a well defined error code. -1. [Custom Errors](./custom.md) are a little trickier, as they only display a numerical code. -1. [Substrate Errors](https://polkadot.js.org/docs/substrate/errors/) are inherited by Subtensor from Substrate, the underlying software on top of which it is built. - -## Error Format - -Most errors from the Bittensor network are returned in the following format: - -```json -{ - "code": 1010, - "message": "Invalid Transaction", - "data": "Custom error: [Error Code]" -} -``` - -## Related - -- [Bittensor CLI](../btcli.md) - Command line interface documentation -- [Bittensor Python SDK](../bt-api-ref.md) - Python SDK documentation -- [Subtensor Nodes](../subtensor-nodes/index.md) - Information about running Subtensor nodes \ No newline at end of file diff --git a/docs/errors/subtensor.md b/docs/errors/subtensor.md deleted file mode 100644 index c3d5a5e6e0..0000000000 --- a/docs/errors/subtensor.md +++ /dev/null @@ -1,421 +0,0 @@ ---- -title: "Subtensor Standard Errors" ---- - -# Subtensor Standard Errors - -This page documents the standard errors that can arise from Subtensor, the blockchain underlying the Bittensor network. - -Related: -- [Source code in GitHub](https://github.com/opentensor/subtensor/blob/main/pallets/subtensor/src/macros/errors.rs) -- [Subtensor Custom Errors](./custom.md) -- [Substrate Errors](https://polkadot.js.org/docs/substrate/errors/) - Errors from the underlying Substrate framework - - -## Network and Subnet Errors - -### `SubNetworkDoesNotExist` - -The specified subnet does not exist. - -### `RootNetworkDoesNotExist` - -The root network does not exist. - - -### `SubnetNotExists` - -Trying to perform action on non-existent subnet. - -### `NotRootSubnet` - -Netuid does not match for setting root network weights. - -### `CanNotSetRootNetworkWeights` - -Cannot set weights for the root network. - -### `RegistrationNotPermittedOnRootSubnet` - -Operation is not permitted on the root subnet. - -### `AllNetworksInImmunity` - -All subnets are in the immunity period. - - -### `MechanismDoesNotExist` - -Trying to register a subnet into a mechanism that does not exist. - - -### `SubNetRegistrationDisabled` - -Registration is disabled for this subnet. - -### `NoNeuronIdAvailable` - -No neuron ID is available in the subnet. - -## Hotkey and Coldkey Errors - -### `HotKeyNotRegisteredInSubNet` - -The hotkey is not registered in the specified subnet. - -### `HotKeyAccountNotExists` - -The specified hotkey does not exist. - -### `HotKeyNotRegisteredInNetwork` - -The hotkey is not registered in the specified subnet. - -### `NonAssociatedColdKey` - -Request made by a coldkey that is not associated with the hotkey account. - -### `HotKeyAlreadyRegisteredInSubNet` - -The caller is requesting a redundant registration for a neuron. - -### `NewHotKeyIsSameWithOld` - -The new hotkey is the same as old one. - -### `HotKeyAlreadyDelegate` - -The hotkey is attempting to become a delegate when already a delegate. - -### `TransactorAccountShouldBeHotKey` - -The hotkey is required to be the origin. - -### `NewColdKeyIsHotkey` - -New coldkey is hotkey. - -### `ColdKeyAlreadyAssociated` - -The coldkey has already been swapped. - -### `ColdkeyIsInArbitration` - -The coldkey is in arbitration. - -### `UnableToRecoverPublicKey` - -Public key cannot be recovered. - -### `InvalidRecoveredPublicKey` - -Recovered public key is invalid. - -## Stake and Balance Errors - -### `NotEnoughStake` - -The caller does not have enough stake to perform this action. - -### `NotEnoughStakeToWithdraw` - -Not enough stake to withdraw. - -### `NotEnoughStakeToSetWeights` - -Less than minimum stake required to set weights. - -### `NotEnoughStakeToSetChildkeys` - -Parent hotkey doesn't have enough own stake. - -### `NotEnoughBalanceToStake` - -Not enough balance in coldkey account. - -### `BalanceWithdrawalError` - -Could not withdraw from coldkey account. - -### `ZeroBalanceAfterWithdrawn` - -Balance would be zero after withdrawal. - -### `StakeTooLowForRoot` - -Hotkey with too little stake attempting to join root subnet. - -### `NotEnoughBalanceToPaySwapHotKey` - -Not enough balance to pay swapping hotkey. - -### `NotEnoughBalanceToPaySwapColdKey` - -Not enough balance to pay for the swap. - -### `AmountTooLow` - -Stake amount is too low. - -### `ZeroMaxStakeAmount` - -Zero max stake amount. - -### `CannotUnstakeLock` - -Cannot unstake lock amount. - -### `NotEnoughAlphaOutToRecycle` - -Not enough AlphaOut to recycle. - -### `CannotBurnOrRecycleOnRootSubnet` - -Cannot burn/recycle TAO from root subnet. - -### `InsufficientLiquidity` - -Not enough liquidity in the pool. - -### `SlippageTooHigh` - -Transaction slippage is above your limit. - -### `TransferDisallowed` - -Transfers are disallowed on this subnet. - -## Weight Setting Errors - -### `NeuronNoValidatorPermit` - -Attempting to set non-self weights without being a permitted validator. - -### `WeightVecNotEqualSize` - -Weight keys and values vectors have different sizes. - -### `DuplicateUids` - -Attempting to set weights with duplicate UIDs. - -### `UidVecContainInvalidOne` - -Attempting to set weight to non-existent UID. - -### `WeightVecLengthIsLow` - -Setting weights with fewer elements than allowed. - -### `MaxWeightExceeded` - -Weight value exceeds MaxWeightLimit. - -### `SettingWeightsTooFast` - -Exceeded rate limit for setting weights. - -### `IncorrectWeightVersionKey` - -Incorrect weight version key. - -### `UidsLengthExceedUidsInSubNet` - -More UIDs than allowed. - -### `NoWeightsCommitFound` - -No commit found for hotkey+netuid combination. - -### `InvalidRevealCommitHashNotMatch` - -Committed hash does not match reveal data. - -### `CommitRevealEnabled` - -Attempting to call set_weights when commit/reveal is enabled. - -### `CommitRevealDisabled` - -Attempting to commit/reveal weights when disabled. - -### `TooManyUnrevealedCommits` - -Maximum commit limit reached. - -### `ExpiredWeightCommit` - -Attempted to reveal expired weights. - -### `RevealTooEarly` - -Attempted to reveal weights too early. - -### `InputLengthsUnequal` - -Mismatched vector input lengths in batch reveal. - -### `CommittingWeightsTooFast` - -Exceeded rate limit for setting weights. - -### `LiquidAlphaDisabled` - -Attempting to set alpha high/low while disabled. - -### `AlphaHighTooLow` - -Alpha high value is too low (> 0.8 required). - -### `AlphaLowOutOfRange` - -Alpha low value is out of allowed range (0 < alpha_low < 0.8). - -## Rate Limiting Errors - -### `ServingRateLimitExceeded` - -Rate limit exceeded for axon serve/publish. - -### `NetworkTxRateLimitExceeded` - -Rate limit exceeded for add network transaction. - -### `DelegateTxRateLimitExceeded` - -Rate limit exceeded for delegate transaction. - -### `HotKeySetTxRateLimitExceeded` - -Rate limit exceeded for setting/swapping hotkey. - -### `StakingRateLimitExceeded` - -Rate limit exceeded for staking. - -### `TxRateLimitExceeded` - -Default transaction rate limit exceeded. - -### `TxChildkeyTakeRateLimitExceeded` - -Childkey take rate limit exceeded. - -## Registration and Network Management - -### `TooManyRegistrationsThisBlock` - -Too many registrations in this block. - -### `TooManyRegistrationsThisInterval` - -Too many registration attempts in interval. - -### `CouldNotJoinSenate` - -Not able to join the senate. - -### `NotSenateMember` - -Not a senate member. - -### `NotSubnetOwner` - -Not a subnet owner. - -### `FirstEmissionBlockNumberAlreadySet` - -First emission block number already set. - -### `NeedWaitingMoreBlocksToStarCall` - -Need to wait for more blocks. - -## Delegation and Childkey Errors - -### `DelegateTakeTooLow` - -Delegate take is too low. - -### `DelegateTakeTooHigh` - -Delegate take is too high. - -### `InvalidChild` - -Invalid child for a hotkey. - -### `DuplicateChild` - -Duplicate child when setting children. - -### `ProportionOverflow` - -Proportion overflow when setting children. - -### `TooManyChildren` - -Too many children. - -### `InvalidChildkeyTake` - -Childkey take is invalid. - -## Other Errors - -### `InvalidIpType` - -Invalid IP type (must be IPv4 or IPv6). - -### `InvalidIpAddress` - -Invalid IP address. - -### `InvalidPort` - -Invalid port. - -### `InvalidWorkBlock` - -Invalid PoW hash block. - -### `InvalidDifficulty` - -PoW hash block does not meet network difficulty. - -### `InvalidSeal` - -PoW hash seal does not match work. - -### `FaucetDisabled` - -Faucet is disabled. - -### `SwapAlreadyScheduled` - -Swap already scheduled. - -### `FailedToSchedule` - -Failed to schedule swap. - -### `InvalidIdentity` - -Invalid identity. - -### `ActivityCutoffTooLow` - -Activity cutoff is too low. - -### `CallDisabled` - -Call is disabled. - -### `SubtokenDisabled` - -SubToken disabled. - -### `SameNetuid` - -Invalid netuid duplication. - diff --git a/docs/evm-tutorials/ed25519-verify-precompile.md b/docs/evm-tutorials/ed25519-verify-precompile.md deleted file mode 100644 index 1aae5a4488..0000000000 --- a/docs/evm-tutorials/ed25519-verify-precompile.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: "Ed25519 Verify Precompile" ---- - -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Ed25519 Verify Precompile - -This precompile is deployed on the subtensor EVM at the address `0x0000000000000000000000000000000000000402`. This precompile allows you to verify an `ed25519` signature. - -You can use this precompile to verify proof of `ss58` account ownership on the EVM side. For example, you may need to do such verification for an airdrop to TAO owners. While EVM functionality doesn't allow airdropping directly to `ss58` addresses (because EVM is using H160 address schema), one can implement an airdrop via claiming. An owner of `ss58` address eligible for an airdrop can send an EVM transaction which includes the proof of `ss58` address ownership, for example, a signed message, uniquely specific for a given airdrop. - -For a complete code example see [`ed25519-verify.js`](https://github.com/opentensor/evm-bittensor/blob/main/examples/ed25519-verify.js). - -:::danger Stop. Did you install the dependencies? -Before you proceed, make sure you finished the [Install](./install.md) step. -::: - -## Run - -Navigate to the `examples` directory of the EVM-Bittensor repo: - - ```bash - cd examples - ``` -To run this precompile, execute: - - ```bash - node ed25519-verify.js - ``` - -This example demonstrates how to: - -1. Sign an arbitrary message with `ed25519` key. - - Any substrate keyring can be initialized as `ed25519` with the same seed phrase or private key as used for signing subtensor transactions, even if they are usually used to create `sr25519` signatures. - - The precompile only allows verification of 32-byte messages. However, the arbitrary message can be converted into 32-byte message by calculating the message hash (like it is done in this below example): - - ```javascript - const messageHash = ethers.keccak256(messageHex); // Hash the message to fit into bytes32 - ``` - -2. Verify the signature using the precompile contract. -3. Fail the verification of the signature using the corrupted message hash with the precompile contract. -4. Fail the verification of the corrupted signature with the precompile contract. \ No newline at end of file diff --git a/docs/evm-tutorials/evm-localnet-with-metamask-wallet.md b/docs/evm-tutorials/evm-localnet-with-metamask-wallet.md deleted file mode 100644 index 856493d9e8..0000000000 --- a/docs/evm-tutorials/evm-localnet-with-metamask-wallet.md +++ /dev/null @@ -1,108 +0,0 @@ ---- -title: "EVM Localnet with Metamask Wallet" ---- - -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# EVM Localnet with Metamask Wallet - -This tutorial is for how to set up your Metamask wallet to use with EVM localnet on Bittensor. You must run either this step or [EVM Testnet with Metamask Wallet](./evm-testnet-with-metamask-wallet.md) tutorial before you can run other tutorials in this section. - -:::tip blog post: EVM on Bittensor -If you are new to EVM, try this [blog post](https://blog.bittensor.com/evm-on-bittensor-draft-6f323e69aff7) for a simplified explanation. -::: - -Key values: -- **EVM Subtensor Mainnet Chain ID:**: `964` (UTF-8 encoded TAO symbol) -- **EVM Subtensor Testnet Chain ID:**: `945` (UTF-8 encoded alpha character) -- **Opentensor EVM-Bittensor GitHub repo with code examples:** https://github.com/opentensor/evm-bittensor/tree/main - -## Step 1. Run EVM-enabled localnet - -```bash -git clone https://github.com/opentensor/subtensor -./scripts/localnet.sh -``` - -## Step 2. Set Chain ID - -The bare local network doesn't have the Chain ID setup and it needs to be configured with an admin extrinsic. Use [sudo section of Polkadot AppsUI](https://polkadot.js.org/apps/?rpc=ws%3A%2F%2F127.0.0.1%3A9944#/sudo) to call this extrinsic to set the ChainID to 945 (to simulate Testnet) or 964 (to simulate Mainnet): - -``` -adminUtils >> sudoSetEvmChainId -``` - -## Step 3. Create a Metamask wallet - -1. If you don't already have it, [install Metamask wallet](https://metamask.io/download/) browser extension. -2. Create a new account. - -## Step 4. Add EVM localnet to Metamask - -Follow the below steps: - -1. Open Metamask Wallet extension on your browser. Click on the drop-down **Select a network** menu at the top left. -2. Click on **+ Add a Custom Network** button. -3. Enter the following details: - - **Network name:** "Subtensor Local" - - **Default RPC URL:** http://localhost:9944/ - - **Chain ID:** `964` or `945`, depending on your setting in Step 2 - - **Currency symbol:** TAO -6. Click **Save**. -7. Click on **Select a network** again and switch to the Subtensor Local network. - -With the above steps, you have successfully configured your Metamask wallet with the EVM localnet. - -## Step 5. Configure private key and RPC endpoint - -:::danger Stop. Did you install the dependencies? -Before you proceed, make sure you finished the [Install](./install.md) step. -::: - -In this step you will copy the private key from your Metamask wallet account and paste it into the configuration file in the repo. This step will ensure that you are not prompted with password each and every step as you run these tutorials. - - -1. Navigate to the `examples` directory of the EVM-Bittensor repo: - - ```bash - cd examples - ``` - -2. Create `config.js` file by copying the `config-example.js` file: - - ```bash - cp config-example.js config.js - ``` - -3. On Metamask wallet extension, your wallet account will have a H160 account address, starting with the `0x` prefix (for example: `0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf`), and also your wallet account name. -4. Click on your wallet account name, which will open the drop-down menu. -5. Click on the ⋮ (three vertical dots, i.e., vertical ellipsis) next to the wallet account and select **Account details**. It will open a view with a QR code, your wallet account H160 address and a **Show private key** button. -6. Click on the **Show private key** button, enter the password. You will then see the private key for your wallet account. Copy this private key. -7. Paste this private key into `ethPrivateKey` string in your `config.js` file as shown below (mangled for security): - - ```javascript - const ethPrivateKey = "02c1c4112233snipsnipsnipgh933aca491e090e0b7xxyy1b124b86d9382b01a8"; - ``` - -8. Finally, edit the `module.exports` section of the `config.js` file to use the localnet URLs, as shown below: - ```javascript - module.exports = { - ethPrivateKey, - subSeed, - rpcUrl: rpcUrlLocal, - wsUrl: wsUrlLocal, - } - ``` - -Save the `config.js` file. Now your setup is ready to run the tutorials with EVM localnet. - -## Step 6 (Optional). Disable white list for contract deployment - -If you are planning to deploy contracts locally, you need to disable the premission control. This can be done with the following extrinsic in [sudo section of Polkadot AppsUI](https://polkadot.js.org/apps/?rpc=ws%3A%2F%2F127.0.0.1%3A9944#/sudo): - -``` -evm >> disableWhitelist -``` - -Select **Yes** and then click Submit Sudo. diff --git a/docs/evm-tutorials/evm-mainnet-with-metamask-wallet.md b/docs/evm-tutorials/evm-mainnet-with-metamask-wallet.md deleted file mode 100644 index 7a7d2465e2..0000000000 --- a/docs/evm-tutorials/evm-mainnet-with-metamask-wallet.md +++ /dev/null @@ -1,84 +0,0 @@ ---- -title: "EVM Mainnet with Metamask Wallet" ---- -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# EVM Mainnet with Metamask Wallet - -This tutorial is for how to set up your Metamask wallet to use with the Mainnet (finney) on Bittensor. You must run this step before you can run other tutorials in this section. - -:::tip blog post: EVM on Bittensor -If you are new to EVM, try this [blog post](https://blog.bittensor.com/evm-on-bittensor-draft-6f323e69aff7) for a simplified explanation. -::: - -Key values: -- The **Bittensor Mainnet URL:** `https://lite.chain.opentensor.ai` -- **EVM Subtensor Chain ID:** `964` (UTF-8 encoded TAO symbol) -- **Opentensor EVM-Bittensor GitHub repo:** `https://github.com/opentensor/evm-bittensor/tree/main` - - -## Step 1. Create a Metamask wallet - -1. If you don't already have it, [install Metamask wallet](https://metamask.io/download/) browser extension. -2. Create a new account. - -### Step 2. Add Mainnet to Metamask - -#### Option 1. Adding with Chainlist - -Open [Subtensor page on ChainList.org](https://chainlist.org/chain/964) and click on "Connect Wallet". - -#### Adding maunally - -Add the Mainnet to Metamask from within the Metamask wallet. Follow the below steps: - -1. Open Metamask Wallet extension on your browser. Click on the ⋮ (three vertical dots, i.e., vertical ellipsis) at the top right. -2. Select **Settings** from the drop-down menu. -3. Select **Networks** > **Add network**. -4. Click on **Add a network manually** at the bottom of the networks list. -5. Enter the following details: - - **Network name:** "Subtensor" - - **EVM RPC URL:** `https://lite.chain.opentensor.ai` - - **Chain ID:** `964` - - **Currency symbol:** TAO -6. Click **Save**. -7. Then click on **Switch network**. - -With the above steps, you have successfully configured your Metamask wallet with the Mainnet. - -## Step 3 Obtain TAO - -We cannot provide you with specific advice for where/how to obtain TAO; however, if you need to transfer tokens to the account you created in MetaMask, use a site like https://snow-address-converter.netlify.app/ to convert your H160-format address (the one that starts with "0x") to substrate's SS58 version (starting with "5"). When sending TAO to your account from an account managed via substrate wallet applications and/or exchange accounts, use the SS58 version of the address as the destination. - -## Step 4. Copy Metamask wallet private key into config - -:::danger Stop. Did you install the dependencies? -Before you proceed, make sure you finished the [Install](./install.md) step. -::: - -In this step you will copy the private key from your Metamask wallet account and paste it into the configuration file in the repo. This step will ensure that you are not prompted with password each and every step as you run these tutorials. - - -1. Navigate to the `examples` directory of the EVM-Bittensor repo: - - ```bash - cd examples - ``` - -2. Create `config.js` file by copying the `config-example.js` file: - - ```bash - cp config-example.js config.js - ``` - -3. On Metamask wallet extension, your wallet account will have a H160 account address, starting with the `0x` prefix (for example: `0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf`), and also your wallet account name. -4. Click on your wallet account name, which will open the drop-down menu. -5. Click on the ⋮ (three vertical dots, i.e., vertical ellipsis) next to the wallet account and select **Account details**. It will open a view with a QR code, your wallet account H160 address and a **Show private key** button. -6. Click on the **Show private key** button, enter the password. You will then see the private key for your wallet account. Copy this private key. -7. Paste this private key into `ethPrivateKey` string in your `config.js` file as shown below (mangled for security): - -```javascript -const ethPrivateKey = "02c1c4112233snipsnipsnipgh933aca491e090e0b7xxyy1b124b86d9382b01a8"; -``` -Save the `config.js` file. Now your setup is ready to run the tutorials with EVM Mainnet. diff --git a/docs/evm-tutorials/evm-on-subtensor.md b/docs/evm-tutorials/evm-on-subtensor.md deleted file mode 100644 index cfa49fff9a..0000000000 --- a/docs/evm-tutorials/evm-on-subtensor.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: "EVM on Subtensor" ---- - -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# EVM on Subtensor - -Ethereum compatibility layer is now available on the subtensor. Using this EVM feature you can: -- Deploy and interact with any Ethereum smart contract, without any need to change it, on the subtensor blockchain. -- Access all the standard Ethereum JSON-RPC methods from this EVM compatibility layer on Bittensor. - -When this EVM feature is turned ON, it allows the subtensor blockchain to execute Ethereum-compatible smart contracts. - -:::danger EVM smart contract executes on subtensor -Note that all operations performed by the subtensor EVM feature are executed solely on the subtensor blockchain, not on the Ethereum blockchain. -::: - -This document explains in simple terms what this EVM on subtensor is and how it works. Head on over to the [EVM Tutorials](./index.md) to start learning how to use this feature. - -## Ethereum vs Bittensor smart contracts - -On the Ethereum network, nodes such as full nodes, validator nodes and archive nodes run the Ethereum Virtual Environment (EVM) run-time environment. Smart contracts operate under this EVM. See the below high-level diagram. - -When we say “smart contracts on Bittensor” we refer to the new EVM compability feature in the Bittensor subtensor blockchain. When this EVM feature is turned ON, it allows the subtensor blockchain to execute Ethereum-compatible smart contracts. **Note that all operations performed by this new subtensor EVM feature are executed solely on the subtensor blockchain, not on the Ethereum blockchain.** See the below diagram showing how smart contracts on subtensor work: - - - - - - - - - - -Next, see [EVM Tutorials](./index.md) to start learning how to use this feature. diff --git a/docs/evm-tutorials/evm-testnet-with-metamask-wallet.md b/docs/evm-tutorials/evm-testnet-with-metamask-wallet.md deleted file mode 100644 index 17079ed1be..0000000000 --- a/docs/evm-tutorials/evm-testnet-with-metamask-wallet.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: "EVM Testnet with Metamask Wallet" ---- - -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# EVM Testnet with Metamask Wallet - -This tutorial is for how to set up your Metamask wallet to use with the testnet on Bittensor. You must run this step before you can run other tutorials in this section. - -:::tip blog post: EVM on Bittensor -If you are new to EVM, try this [blog post](https://blog.bittensor.com/evm-on-bittensor-draft-6f323e69aff7) for a simplified explanation. -::: - -Key values: - -- The **Bittensor Testnet URL:** `https://test.chain.opentensor.ai` -- **EVM Subtensor Chain ID:** `945` (UTF-8 encoded alpha character) -- **Opentensor EVM-Bittensor GitHub repo:** `https://github.com/opentensor/evm-bittensor/tree/main` - -## Step 1. Create a Metamask wallet - -1. If you don't already have it, [install Metamask wallet](https://metamask.io/download/) browser extension. -2. Create a new account. - -### Step 2. Add testnet to Metamask - -Add the testnet to Metamask from within the Metamask wallet. Follow the below steps: - -1. Open Metamask Wallet extension on your browser. Click on the ⋮ (three vertical dots, i.e., vertical ellipsis) at the top right. -2. Select **Settings** from the drop-down menu. -3. Select **Networks** > **Add network**. -4. Click on **Add a network manually** at the bottom of the networks list. -5. Enter the following details: - - **Network name:** "Subtensor" - - **EVM RPC URL:** `https://test.chain.opentensor.ai` - - **Chain ID:** `945` - - **Currency symbol:** TAO -6. Click **Save**. -7. Then click on **Switch network**. - -With the above steps, you have successfully configured your Metamask wallet with the testnet. - -## Step 3 Obtain TAO - -Next, request testnet TAO in the Bittensor community [Discord](https://discord.com/channels/799672011265015819/1107738550373454028/threads/1331693251589312553). Alternatively, you can transfer some testnet TAO to your wallet address using the [BTCLI Live Coding Playground](../btcli/btcli-playground.md#transfer). - -## Step 4. Copy Metamask wallet private key into config - -:::danger Stop. Did you install the dependencies? -Before you proceed, make sure you finished the [Install](./install.md) step. -::: - -In this step you will copy the private key from your Metamask wallet account and paste it into the configuration file in the repo. This step will ensure that you are not prompted with password each and every step as you run these tutorials. - -1. Navigate to the `examples` directory of the EVM-Bittensor repo: - - ```bash - cd examples - ``` - -2. Create `config.js` file by copying the `config-example.js` file: - - ```bash - cp config-example.js config.js - ``` - -3. On Metamask wallet extension, your wallet account will have a H160 account address, starting with the `0x` prefix (for example: `0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf`), and also your wallet account name. -4. Click on your wallet account name, which will open the drop-down menu. -5. Click on the ⋮ (three vertical dots, i.e., vertical ellipsis) next to the wallet account and select **Account details**. It will open a view with a QR code, your wallet account H160 address and a **Show private key** button. -6. Click on the **Show private key** button, enter the password. You will then see the private key for your wallet account. Copy this private key. -7. Paste this private key into `ethPrivateKey` string in your `config.js` file as shown below (mangled for security): - -```javascript -const ethPrivateKey = - "02c1c4112233snipsnipsnipgh933aca491e090e0b7xxyy1b124b86d9382b01a8"; -``` - -Save the `config.js` file. Now your setup is ready to run the tutorials with EVM testnet. diff --git a/docs/evm-tutorials/hardhat-config-for-subtensor-evm.md b/docs/evm-tutorials/hardhat-config-for-subtensor-evm.md deleted file mode 100644 index 0cca194579..0000000000 --- a/docs/evm-tutorials/hardhat-config-for-subtensor-evm.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -title: "Hardhat Configuration for Subtensor EVM" ---- - -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Hardhat Configuration for Subtensor EVM - -You can use [Hardhat](https://hardhat.org/) development environment for the EVM feature on subtensor. The Hardhat networks can be configured using the `hardhat.config.ts` file, as shown below. - -The below code configures two subtensor EVM networks for Hardhat: - -1. EVM Localnet with URL: http://127.0.0.1:9944 -2. EVM Testnet with URL: https://test.chain.opentensor.ai -3. EVM Mainnet with URL: https://lite.chain.opentensor.ai -4. EVM Version **Cancun** that matches **Solidity 0.8.24**. - -:::tip Full example -See [ERC-20 Example Token repository](https://github.com/gztensor/subtensor-erc20) for a complete example of `hardhat.config.ts` configuration. -::: - -```js title="Partial snippet of hardhat.config.ts file" -const hardhatConfig: HardhatUserConfig = { - solidity: "0.8.24", - defaultNetwork: "subevm", - networks: { - subevm: { - url: "https://test.chain.opentensor.ai", - accounts: [config.ethPrivateKey] - }, - mainnet: { - url: "https://lite.chain.opentensor.ai", - accounts: [config.ethPrivateKey] - }, - local: { - url: "http://127.0.0.1:9944", - accounts: [config.ethPrivateKey] - } - }, - mocha: { - timeout: 300000 - }, -}; -``` diff --git a/docs/evm-tutorials/index.md b/docs/evm-tutorials/index.md deleted file mode 100644 index d11c912725..0000000000 --- a/docs/evm-tutorials/index.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: "EVM smart contracts on Bittensor" ---- - -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -import { HiAcademicCap } from "react-icons/hi2"; -import { MdInstallDesktop } from "react-icons/md"; -import { FaNetworkWired } from "react-icons/fa"; -import { GiMining } from "react-icons/gi"; -import { GrValidate } from "react-icons/gr"; -import { GiHiveMind } from "react-icons/gi"; -import { GiOvermind } from "react-icons/gi"; -import { GiBrainTentacle } from "react-icons/gi"; -import { PiBrainFill } from "react-icons/pi"; -import { GiBrainStem } from "react-icons/gi"; -import { CiWallet } from "react-icons/ci"; -import { SiTrpc } from "react-icons/si"; -import { GoKey } from "react-icons/go"; -import { GiCardExchange } from "react-icons/gi"; -import { BiSolidNetworkChart } from "react-icons/bi"; -import { FaMoneyBillTransfer } from "react-icons/fa6"; -import { GrStakeholder } from "react-icons/gr"; - -# EVM smart contracts on Bittensor - -Full Ethereum virtual machine (EVM) compatibility is now available on subtensor (the blockchain in Bittensor). This allows users to: - -- Deploy most EVM smart contracts on subtensor without changing the code -- Interact with deployed smart contracts on the subtensor blockchain -- Access standard Ethereum JSON-RPC methods from this EVM compatibility layer on [Subtensor](https://github.com/opentensor/subtensor), Bittensor's substrate blockchain. - -## Before you proceed - -Before you proceed to use EVM on subtensor, make a note of the following: - -1. **EVM smart contract executes on subtensor**: The EVM feature allows the subtensor blockchain to execute Ethereum-compatible smart contracts. Note that all operations performed by this new subtensor EVM feature are executed solely on the subtensor blockchain, not on the Ethereum blockchain. -2. **1 TAO = 1e18 on subtensor EVM**: While working with the subtensor EVM, 1 TAO should be written as 1 followed by 18 zeroes, i.e., 1e18. See this code example: [https://github.com/opentensor/evm-bittensor/blob/main/examples/withdraw.js#L58](https://github.com/opentensor/evm-bittensor/blob/main/examples/withdraw.js#L58). - -Run the below tutorials to learn how to use the EVM feature on the Bittensor blockchain. - - - - - - - - - - - - - - - - diff --git a/docs/evm-tutorials/install.md b/docs/evm-tutorials/install.md deleted file mode 100644 index d259a415c9..0000000000 --- a/docs/evm-tutorials/install.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: "Install" ---- - -# Install - -Before you can run any EVM tutorials, you must install the dependencies. Follow the below steps: - -1. Clone the Opentensor EVM-Bittensor GitHub repo: - - ```bash - git clone https://github.com/opentensor/evm-bittensor.git - ``` - -2. Navigate to `evm-bittensor` directory: - - ```bash - cd evm-bittensor - ``` - -3. Install the dependencies: - - ```bash - npm install - ``` - diff --git a/docs/evm-tutorials/remix-config-for-subtensor-evm.md b/docs/evm-tutorials/remix-config-for-subtensor-evm.md deleted file mode 100644 index 0bb8cf32d0..0000000000 --- a/docs/evm-tutorials/remix-config-for-subtensor-evm.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: "Remix IDE Configuration for Subtensor EVM" ---- - -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Remix IDE Configuration for Subtensor EVM - -You can use [Remix IDE](https://remix.ethereum.org/#lang=en&optimize=false&runs=200&evmVersion=cancun&version=soljson-v0.8.24+commit.e11b9ed9.js) for the EVM feature on subtensor. The link above automatically configures Remix to use EVM Version **Cancun** that matches **Solidity 0.8.24**. - -Below is the full list of Remix IDE configurations: - -## Step 1. Configure Metamask - -Use the BitTensor guides to configure Metamask with [localnet](./evm-localnet-with-metamask-wallet.md), [Testnet](./evm-testnet-with-metamask-wallet.md), or [Mainnet](./evm-mainnet-with-metamask-wallet.md). - -## Step 2. Connect Metamask to Remix. - -In the left side panel under "Environment" select "Injected Provider - Metamask". - -## Step 3. Configure Solidity Compiler - -In Solidity Compiler tab select - -- **Compiler**: `0.8.24` -- **EVM Version**: `cancun` diff --git a/docs/evm-tutorials/staking-precompile.md b/docs/evm-tutorials/staking-precompile.md deleted file mode 100644 index 1ea10c2044..0000000000 --- a/docs/evm-tutorials/staking-precompile.md +++ /dev/null @@ -1,115 +0,0 @@ ---- -title: "Staking Precompile" ---- - -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Staking Precompile - -Staking precompile allows Ethereum code to interact with the staking feature of subtensor. For example, by using the staking precompile, the subtensor methods [`add_stake`](https://github.com/opentensor/subtensor/blob/main/pallets/subtensor/src/staking/add_stake.rs) or [`remove_stake`](https://github.com/opentensor/subtensor/blob/main/pallets/subtensor/src/staking/remove_stake.rs) can be called in order to delegate stake to a hotkey or undelegate stake from a hotkey. - -In this tutorial you will learn how to interact with staking precompile in two ways: - -1. Call the staking precompile from another smart contract. -2. Use the staking precompile's ABI and your Metamask wallet to call the staking precompile on EVM localnet. You will use [Remix IDE](https://remix.ethereum.org/) for this. - -## Prerequisites - -1. You should also be comfortable using [Remix IDE](https://remix.ethereum.org/). -2. Read [EVM on Subtensor](./evm-on-subtensor.md) for a basic understanding of what an ABI is and how to use it. - -## Setup EVM localnet, subnet and delegate - -1. [Launch EVM localnet](./evm-localnet-with-metamask-wallet.md). Also, follow the instructions of running local chain all the way so that you have a Metamask address with some TAO balance. - -2. On this EVM localnet create one subnet and a delegate hotkey. The commands below will create a subnet, register a neuron and nominate your hotkey as a delegate, in that order: - - ```bash - btcli subnet create --subtensor.chain_endpoint ws://127.0.0.1:9944 - btcli subnet register --subtensor.chain_endpoint ws://127.0.0.1:9944 - btcli root nominate --subtensor.chain_endpoint ws://127.0.0.1:9944 - ``` - -3. Save the delegate hotkey address. You will use this in the staking pool use case below. - -4. Disable staking rate limits by setting `targetStakesPerInterval` to 1000. Follow these below steps: - - Open the Polkadot JS app using [this link with encoded transaction](https://polkadot.js.org/apps/?rpc=ws%3A%2F%2F127.0.0.1%3A9944#/extrinsics/decode/0x0c00132fe803000000000000). - - Click on **Submission** tab. - - From the **using the selected account** field, select **ALICE**. - - Click on **Submit Transaction** at the bottom right. This will open the **authorize transaction** window. - - On this **authorize transaction** window, make sure the **sign and submit** toggle is ON and click on the **Sign and Submit** on the bottom right. - -## Call the staking precompile from another smart contract (staking pool use case) - -In this interaction you will compile [`stake.sol`](https://github.com/opentensor/evm-bittensor/blob/main/solidity/stake.sol), a smart contract Solidity code and execute it on the subtensor EVM. This `stake.sol` will, in turn, call the staking precompile that is already deployed in the subtensor EVM. - -Before you proceed, familiarize yourself with the Solidity code of the [`stake.sol`](https://github.com/opentensor/evm-bittensor/blob/main/solidity/stake.sol) smart contract. - -1. Copy the text of [`stake.sol`](https://github.com/opentensor/evm-bittensor/blob/main/solidity/stake.sol) contract to Remix IDE. - -2. You will now convert your delegate hotkey ss58 from the above [Setup EVM localnet, subnet and delegate](#setup-evm-localnet-subnet-and-delegate) step into its corresponding public key. Use the [ss58.org](https://ss58.org/) site to obtain the public key for your delegate hotkey ss58. - -3. In the `stake.sol` text in Remix IDE, replace the `HOTKEY` constant on line 9, where it says `bytes32 constant HOTKEY = 0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d;`, with your delegate hotkey's public key. - -4. Compile it in Remix IDE. - -5. Connect Remix IDE to Injected Provider - Metamask and your Metamask address that has TAO balance. You will stake this TAO balance to the delegate hotkey's public key. - -6. Execute the Stake contract method `stake_from_this_contract_to_alice` and pass 1e^9 to it (1 TAO). - -7. Check the stake balance of your delegate hotkey and confirm that it has increased by 1 TAO. - -## Use the staking precompile's ABI from your user account (staking as an individual use case) - -In this tutorial, you will interact directly with the staking precompile by using its ABI, and use your Metamask wallet as the source of TAO to stake. - -1. Copy this below ABI of staking precompile contract into Remix IDE as a new file: - - ```json - [ - { - "inputs": [ - { - "internalType": "bytes32", - "name": "hotkey", - "type": "bytes32" - } - ], - "name": "addStake", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "hotkey", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "removeStake", - "outputs": [], - "stateMutability": "payable", - "type": "function" - } - ] - ``` - -2. Copy staking precompile address `0x0000000000000000000000000000000000000801` to the **At Address** field in Remix IDE, and click **At Address** button. - -3. Remix IDE will find the precompile at the precompile address on the subtensor EVM and show it in the list of deployed contracts. Expand the contract, then expand the `addStake` method, and paste the public key of your delegate hotkey into the `hotkey` field. Then click **transact** and wait for the transaction to be completed. - -4. Follow these steps to see that the stake record is updated in [Polkadot JS app](https://polkadot.js.org/apps/?rpc=ws%3A%2F%2F127.0.0.1%3A9944#/chainstate): - - 1. Select **subtensorModule** + **stake** in the drop-down list. - 2. Paste the delegate hotkey account ID in the first parameter. - 3. Toggle **include option** OFF for the second parameter. - 4. Click the **+** button and find the new stake record. - diff --git a/docs/evm-tutorials/subtensor-networks.md b/docs/evm-tutorials/subtensor-networks.md deleted file mode 100644 index b9947cb97c..0000000000 --- a/docs/evm-tutorials/subtensor-networks.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: "Subtensor Networks" ---- - -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Subtensor Networks - -| DESCRIPTION | MAINNET | TESTNET | LOCALNET | -|:---------------------|:------------------------------------|:-------------------------------------|:-------------------------| -| **RPC URL** | https://lite.chain.opentensor.ai | https://test.chain.opentensor.ai | http://localhost:9944 | -| **Chain ID** | 964 | 945 | _see below_ | -| **Test TAO** | None | Available on request | Use Alice account | - - -See section [EVM Localnet with Metamask Wallet](./evm-localnet-with-metamask-wallet.md) for setting up a Local net. diff --git a/docs/evm-tutorials/transfer-between-two-h160-accounts.md b/docs/evm-tutorials/transfer-between-two-h160-accounts.md deleted file mode 100644 index 9a1c3151ca..0000000000 --- a/docs/evm-tutorials/transfer-between-two-h160-accounts.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: "Transfer Between Two H160 Accounts" ---- - -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Transfer Between Two H160 Accounts - -The complete code for this example is located in file [`examples/transfer-h160-to-h160.js`](https://github.com/opentensor/evm-bittensor/blob/main/examples/transfer-h160-to-h160.js). - -## Prerequisite - -:::danger stop, did you set up your Metamask wallet for EVM? -You must run either [EVM Localnet with Metamask Wallet](./evm-localnet-with-metamask-wallet.md) tutorial or [EVM Testnet with Metamask Wallet](./evm-testnet-with-metamask-wallet.md) tutorial before you can run this tutorial. -::: - -## Steps - -1. Create additional address in Metamask - - You can just create a new account or add exising one using a private key. Copy the address (for example: `0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF`) - -2. Paste the address in `destinationEthereumAddress`: - - ```js - // Enter your destination address here: - const destinationEthereumAddress = '0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF'; - ``` - -3. Configure the amount to be sent. In this example we are using large numbers so that the result is visible in Metamask: Because Metamask doesn't respect decimals of 9 and always defaults to 18 decimals. In production environment 0.1 TAO will match to "100000000000" (10^8), while for this demonstration we have to use "100000000000000000" (10^17), which will appear as "0.1 TAO" in Metamask, but will actually be equal to 100000000 TAO (10^8 TAO). - - :::tip 1 TAO = 1e18 on subtensor EVM - While working with the subtensor EVM, 1 TAO should be written as 1 followed by 18 zeroes, i.e., 1e18. Also see this code example: [https://github.com/opentensor/evm-bittensor/blob/main/examples/withdraw.js#L58](https://github.com/opentensor/evm-bittensor/blob/main/examples/withdraw.js#L58). - ::: - - ```js - // Create a transfer transaction to send 0.1 TAO - const tx = { - to: destinationEthereumAddress, - value: "100000000000000000", - }; - ``` - -:::danger Stop. Did you install the dependencies? -Before you proceed, make sure you finished the [Install](./install.md) step. -::: - -4. Navigate to the `examples` directory of the EVM-Bittensor repo: - - ```bash - cd examples - ``` - -5. Run: - - ```bash - node transfer-h160-to-h160.js - ``` - -6. Observe the transaction receipt and the change of the recipient balance in logs. You can also look how the recipient balance changed in Metamask. \ No newline at end of file diff --git a/docs/evm-tutorials/transfer-from-metamask-to-ss58.md b/docs/evm-tutorials/transfer-from-metamask-to-ss58.md deleted file mode 100644 index 6ff2464db2..0000000000 --- a/docs/evm-tutorials/transfer-from-metamask-to-ss58.md +++ /dev/null @@ -1,135 +0,0 @@ ---- -title: "Transfer from Metamask to SS58 address" ---- -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Transfer from Metamask to SS58 address - -In this tutorial you will learn how to transfer TAO from your Metamask wallet to your Bittensor SS58 address for a coldkey (wallet) or a hotkey. You will learn how to do this via two different methods: - -- **Method 1:** Transfer using a precompiled contract. -- **Method 2:** Transfer using the `withdraw` extrinsic in the `evm` pallet in subtensor blockchain. - -## Prerequisite - -:::danger stop, did you set up your Metamask wallet for EVM? -You must run [EVM Testnet with Metamask Wallet](./evm-testnet-with-metamask-wallet.md) tutorial before you can run this tutorial. -::: - -## Method 1: Transfer using a precompiled contract - -The private key or the seed for your SS58 is **not required** for this method. - -This step will transfer 0.5 TAO to your `ss58` destination address specified in the [`withdraw.js`](https://github.com/opentensor/evm-bittensor/blob/main/examples/withdraw.js) file. Look for the following lines in this file: - -```javascript -// Destination address can be replaced with any ss58 address here: -const destinationAddress = account.address; -``` - -and provide your `ss58` destination address as shown below: - -```javascript -const destinationAddress = "5HgU7B3xfSfisR1A7wDMt7FHX5Uizj6xtWWHwhwJMZSrdN7y"; -``` - -:::danger Stop. Did you install the dependencies? -Before you proceed, make sure you finished the [Install](./install.md) step. -::: - -Next, navigate to the `examples` directory of the EVM-Bittensor repo: - - ```bash - cd examples - ``` -Run: - -```bash -node transfer.js -``` - -:::tip 1 TAO = 1e18 on subtensor EVM -While working with the subtensor EVM, 1 TAO should be written as 1 followed by 18 zeroes, i.e., 1e18. See this code example: [https://github.com/opentensor/evm-bittensor/blob/main/examples/withdraw.js#L58](https://github.com/opentensor/evm-bittensor/blob/main/examples/withdraw.js#L58). -::: - -Then, run: - -```bash -node withdraw.js -``` - -You will see the output similar to below, indicating a successful transfer of TAO from your Metamask account to your `ss58` destination address: - -```bash showLineNumbers -node withdraw.js -2024-10-07 15:34:58 REGISTRY: Unknown signed extensions SubtensorSignedExtension, CommitmentsSignedExtension found, treating them as no-effect -2024-10-07 15:34:58 API/INIT: RPC methods not decorated: chainHead_v1_body, chainHead_v1_call, chainHead_v1_continue, chainHead_v1_follow, chainHead_v1_header, chainHead_v1_stopOperation, chainHead_v1_storage, chainHead_v1_unfollow, chainHead_v1_unpin, chainSpec_v1_chainName, chainSpec_v1_genesisHash, chainSpec_v1_properties, debug_getBadBlocks, debug_getRawBlock, debug_getRawHeader, debug_getRawReceipts, debug_getRawTransaction, delegateInfo_getDelegate, delegateInfo_getDelegated, delegateInfo_getDelegates, eth_getBlockReceipts, neuronInfo_getNeuron, neuronInfo_getNeuronLite, neuronInfo_getNeurons, neuronInfo_getNeuronsLite, subnetInfo_getLockCost, subnetInfo_getSubnetHyperparams, subnetInfo_getSubnetInfo, subnetInfo_getSubnetInfo_v2, subnetInfo_getSubnetsInf_v2, subnetInfo_getSubnetsInfo, transactionWatch_v1_submitAndWatch, transactionWatch_v1_unwatch, transaction_v1_broadcast, transaction_v1_stop -2024-10-07 15:34:58 API/INIT: node-subtensor/302: Not decorating unknown runtime apis: 0x42e62be4a39e5b60/1, 0x806df4ccaa9ed485/1, 0x8375104b299b74c5/1, 0x5d1fbfbe852f2807/1, 0xc6886e2f8e598b0a/1 -Sending balance to ss58 address: 5HgU7B3xfSfisR1A7wDMt7FHX5Uizj6xtWWHwhwJMZSrdN7y -pubk = f873b72b75b9029397edceaa04cf08cc97909c8b6304f2ccc3593641bf92e97c -Transaction response: ContractTransactionResponse { - provider: JsonRpcProvider {}, - blockNumber: null, - blockHash: null, - index: undefined, - hash: '0x4f3bde9e678d7307f2c07dd3212d6920db8e2af8ade052a823b3ad1f28ddc221', - type: 2, - to: '0x0000000000000000000000000000000000000800', - from: '0x709615c655B24919F48B365D292521EFcC74467B', - nonce: 0, - gasLimit: 21576n, - gasPrice: undefined, - maxPriorityFeePerGas: 0n, - maxFeePerGas: 20000000000n, - maxFeePerBlobGas: null, - data: '0xcd6f4eb1f873b72b75b9029397edceaa04cf08cc97909c8b6304f2ccc3593641bf92e97c', - value: 500000000000000000n, - chainId: 945n, - signature: Signature { r: "0xc8cf1d54513eb26ee13ca8e001201e918d50593ce6efd4ceee6645ec1879f183", s: "0x6594fe686ecac6131b536b9ff5277f40da1d12ab6c2a269693029c58cef8417d", yParity: 0, networkV: null }, - accessList: [], - blobVersionedHashes: null -} -Transaction confirmed. -``` - -In the above example, a coldkey `ss58` address `5HgU7B3xfSfisR1A7wDMt7FHX5Uizj6xtWWHwhwJMZSrdN7y` (line 5 in the above log) is used as a destination address. The Metamask wallet address used is: `0x709615c655B24919F48B365D292521EFcC74467B` (line 15 in the above log). - -Finally, use the below `btcli` command to check the balance of your `ss58` address (the below `--ss58` option is supported in BTCLI 8.2.0 or later versions): - -```bash -btcli wallet balance --ss58 5HgU7B3xfSfisR1A7wDMt7FHX5Uizj6xtWWHwhwJMZSrdN7y -``` - -## Method 2: Transfer using `withdraw` extrinsic in subtensor `evm` pallet - -You will need the private key for your SS58 for this method. - -1. Copy your `ss58` address (for example: `5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty`). You need the private key for this address setup in Polkadot JS extension. -2. Paste it into `ss58Address` in main function in [`withdraw-address.js`](https://github.com/opentensor/evm-bittensor/blob/main/examples/withdraw-address.js) script. - -3. Next, navigate to the `examples` directory of the EVM-Bittensor repo: - - ```bash - cd examples - ``` - -4. Run: - - ```bash - node withdraw-address.js - ``` - -5. Copy the "Ethereum mirror:" output address. -6. Transfer the amount to this address that you wish to transfer using Metamask. Make sure to clear activity tab data if you restarted the network previously: **Settings** > **Advanced** > **Clear activity tab data**. -7. Make sure your destination address is funded to run a transaction. -8. Open the **Extrisics** section in Polkadot JS app: [https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Ftest.chain.opentensor.ai%3A443#/extrinsics](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Ftest.chain.opentensor.ai%3A443#/extrinsics). -9. Select `evm` pallet and `withdraw` extrinsic. -10. Paste the "Ethereum mirror" output address into address field. -11. Put the amount you are transferring into amount field. Note that Metamask balances are by 10^9 lower than Polkadot Apps UI balances because Metamask will not respect 10^9 decimals for native currency before we have a corresponding PR to https://github.com/ethereum-lists merged. -12. Submit the transaction. -13. Finally, use the below `btcli` command to check the balance of your `ss58` address (the below `--ss58` option is supported in BTCLI 8.2.0 or later versions): - - ```bash - btcli wallet balance --ss58 - ``` diff --git a/docs/evm-tutorials/troubleshooting.md b/docs/evm-tutorials/troubleshooting.md deleted file mode 100644 index 67e4c1bb81..0000000000 --- a/docs/evm-tutorials/troubleshooting.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: "Troubleshooting" ---- - -# Gas estimation failed - -Failure of `eth_estimateGas` may indicate a wide range of problems. To understand the root cause, it can help to understand the live cycle of EVM transaction first. When someone posts a transaction to the network, the first thing to happen is gas estimation. The signed transaction is sent to a chain node and the node checks the transaction for errors. In case of literally any error with the transaction (including inability to pay fees due to low sender balance or mis-formatted transaction, etc.) the gas estimation will fail. Failure may or may not indicate the issue with gas fees. If you get the gas estimation failure, please check the following (this list will be updated dynamically): - -1. Sender address has sufficient balance to pay gas fees -2. If you're using local chain, it is properly setup: Chain ID is set, deployment white list is disabled - - -# Gas estimation exceeds block limit (75000000) - -Select the correct Solidity/EVM version. It needs to be Cancun / 0.8.24 or below. - -# InvalidCode(Opcode(94)) when calling a precompile from another contract - -Select the correct Solidity/EVM version. It needs to be Cancun / 0.8.24 or below. - -# Transaction is pending for too long on localnet when posted through Metamask - -The issue may occur when Metamask is used to sign and post transactions onchain. The cause may be the nonce caching. Metamask caches address nonce, and doesn't revert it when the network is restarted. So, what may happen is Metamask will post the transaction with higher nonce, and it will get stuck in transaction pool, waiting for the address nonce to reach the expected value. To fix this, open Metamask setting, select "Advanced", and then click on "Clear activity tab data". - diff --git a/docs/getting-started/coldkey-hotkey-security.md b/docs/getting-started/coldkey-hotkey-security.md deleted file mode 100644 index 9144697eae..0000000000 --- a/docs/getting-started/coldkey-hotkey-security.md +++ /dev/null @@ -1,173 +0,0 @@ ---- -title: "Coldkey and Hotkey Workstation Security" ---- - -# Coldkey and Hotkey Workstation Security - -This page goes into detail of security concerns for working with coldkeys and hotkeys in Bittensor. - -See also: - -- [Intro to Wallets, Coldkeys and Hotkeys in Bittensor](./wallets) -- [Bittensor CLI: Permissions Guide](../btcli-permissions) -- [Handle your Seed Phrase/Mnemonic Securely](../keys/handle-seed-phrase) - -Interacting with Bittensor generally falls into one of three levels of security, depending on whether you need to use your coldkey private key, hotkey private key, or neither. - -The workstations you use to do this work can be referred to as a permissionless workstation (requiring neither private key), a coldkey workstation or a hotkey workstation, depending on which private key is provisioned. - -- [Permisionless workstation](#permissionless-workstation) -- [Coldkey workstation](#permissionless-workstation) -- [Hotkey workstation](#permissionless-workstation) - -## Permissionless workstation - -You can check public information about Bittensor wallets (including your TAO and alpha stake balances), subnets, validators, and more *without* using a (coldkey or hotkey) private key. This is because transaction information is public on the Bittensor blockchain, with parties being identified by their wallet's coldkey public key. - -When you use a website and apps with *only your public key*, this is considered "permissionless" work. Whenever possible, you should do permissionless work on a **permissionless workstation**, meaning a device (laptop or desktop computer, mobile phone, tablet, etc.) that does *not* have your coldkey private key loaded into it. - -In other words, don't use your coldkey private key when you don't have to, and avoiding loading it into devices unnecessarily. Every device that *does* have your coldkey private key loaded into it is a **coldkey workstation**, and should be used with security precautions. - -When you just want to read/check the state of the blockchain (balances, emissions, token prices, etc.) and you don't need to use your coldkey to *change* anything (for exmaple, to transfer TAO or move stake), it is preferable to use a permissionless workstation. - -To use the Bittensor CLI `btcli` as a permissionless workstation: - -1. Importing your coldkey ***public key*** (not private key) with: - ```shell - btcli w regen-coldkeypub --ss58 - ``` - -1. View your balances and stakes, as well as information about the Bittensor blockchain, subnets, miners, validators, etc., simply by running: - ```shell - btcli view dashboard - ``` - -Websites that offer permissionless browsing of Bittensor data include: - -- [bittensor.com/scan](https://bittensor.com/scan) -- [TAO.app (without using the browser extention to load private key)](https://tao.app) - -## Coldkey workstation - -Your coldkey private key, accessible with your recovery [seed phrase](./wallets#the-seed-phrase-aka-mnemonic), is the complete representation of your identity to Bittensor. In otherwords, holding the coldkey or seed phrase is the ultimate authority over your Bittensor wallet. If your coldkey key is leaked or stolen allows an attacker holder to transfer (steal) your TAO, redelegate your stakes, or take other actions that can’t be reversed. Conversely, without your coldkey private key or the seed phrase, there is no possible way to recover access to your wallet. - -Because of these high stakes, best practices should be diligently followed. Always prioritize confidentiality and integrity over convenience when handling coldkeys. - - -### Isolation of coldkey operations - -The first principle is to isolate coldkey operations from day-to-day or internet-exposed systems. This means using a dedicated machine that is minimally connected to the internet, protected with full disk encryption, and has only highly trusted software installed to minimize the risk of malware or keyloggers intercepting your coldkey. - -In short, you should approach all operations involving your coldkey management as high-value, mission-critical, and laden with inherent risk. - -Ensure a clear boundary between coldkey operations and the working environment you use to carry them out, and everything else. - -:::tip Coldkeys do not mine - -Miners will need coldkeys to manage their TAO and alpha currency, as well as hotkeys to serve requests. Ensure there is a clear boundary: The coldkey should **never** be on an environment with untrusted ML code from containers, frameworks, or libraries that might exfiltrate secrets. -::: - -### Coldkey mobile device - -You can use the Bittensor mobile wallet app: [bittensor.com/wallet](https://bittensor.com/wallet). If so, it is recommended to use a dedicated mobile phone for the purpose that you do not install other software on, to minimize the risk of the coldkey or seed phrase being leaked. - -This option is suitable for alpha staking and TAO balance management. - -### Coldkey laptop - -This is required for using `btcli` or the Bittensor Python SDK for advanced use cases such as hotkey management and scripting. - - - -### Operational Hygiene - -Even on a minimal or air-gapped machine, follow standard security hygiene: -- Always [Handle your Seed Phrase/Mnemonic Securely](../keys/handle-seed-phrase). -- Use strong passwords for your encryption passphrases. -- Do not reuse credentials across different environments. -- Keep your workstation’s operating system and critical software updated with the latest security patches. -- Disable all network services (SSH, RDP, or anything else) that are not strictly needed. -- Maintain logs of important oprations. - - - -### Rotating your coldkey - -If you suspect your coldkey may have been leaked, you can request to swap it out of your wallet, using an extrinsic blockchain transaction. This operation has a 5 day waiting period, during which your coldkey will be locked. The cost of this coldkey swap transaction is 0.1 TAO. - -See [Rotate/Swap your Coldkey](../subnets/schedule-coldkey-swap) - -Effectively, this transfers all of your TAO and alpha stake balances, as well as your `sudo` control over any subnets you have created: - -- For each hotkey owned by the old coldkey, its stake and block transfer to the new coldkey. -- For each subnet, if the old coldkey is the owner, ownership transfers to the new coldkey. -- For each hotkey staking for the old coldkey, transfer its stake to the new coldkey. -- Total stake transfers from the old coldkey to the new coldkey. -- The list of staking hotkeys transfers from the old coldkey to the new coldkey. -- For each hotkey owned by the old coldkey, ownership transfers to the new coldkey. The list of owned hotkeys for both old and new coldkeys updates. -- Any remaining balances transfer from the old coldkey to the new coldkey. - - -### Hardware Wallets and Hardware Security Modules (HSMs) - -Ledger can be integrated with the Bittensor Chrome Extension. This may be a good option for managing stake and TAO balances, but does not allow for advanced functions such as hotkey management, subnet configuration, and governance. - -See [Using Ledger Hardware Wallet](../staking-and-delegation/using-ledger-hw-wallet). - - - -### Signing Policy and Governance - -If you work within a team or DAO environment that collectively manages a coldkey, consider implementing measures such as a multisig to avoid a compromise of a single individuals's keys from compromising the protected key. - - - -### Periodic Security Assessments - -Maintain a secure software environment: -- Keep an eye on newly discovered OS or hardware vulnerabilities. -- Run vulnerability scans on any machine that touches your coldkey. -- Conduct red team exercises and penetration testing to identify weaknesses in your setup. - - - - - - - - -## Hotkey workstation - -Hotkeys in Bittensor serve as the operational keys for mining, validation, and weight commits, which require moderately high availability. Because these keys do not control direct movement of TAO balances, they pose a lower risk if compromised. Nonetheless, a malicious actor who gains control of your hotkey can damage your reputation, submit invalid weights (if you are a validator) or serve malicious responses to requests as a miner. - -Overall, a hotkey workstation can be considered an “operational” environment. Losing a hotkey is less of a direct financial loss than losing a coldkey, but the reputational and operational risks can be serious. Use general best practices for managing secrets when handling your hotkeys. Include continuous monitoring of activity associated with your hotkey and have a rapid mitigation strategy in place in case your hotkey is compromised. - -### Secrets managements - -Bittensor miners must handle hotkeys in MLOps workflows. Hotkeys must be created in coldkey workstation environments and then provisioned to the mining/hotkey workstation environment, i.e. a server that will handle requests from validators, for example by querying an AI model to generate a response (a generated image or text response) to a text prompt from a user. - -- Secure secrets management solution (like [HashiCorp Vault](https://www.vaultproject.io/), [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/), or [GCP Secret Manager](https://cloud.google.com/secret-manager)) to provision the hotkey private key or seedphrase to the mining server. -- Use ephemeral secret injection (CI/CD pipelines like GitLab or GitHub Actions allow storing secrets and injecting them at runtime). -- Never put keys in code repositories - -### Hotkey rotation - -If you suspect that a hotkey (but not a coldkey) has been leaked, rotate it as soon as possible using `btcli wallet swap-hotkey`. This moves the registration to a newly created hotkey owned by the same coldkey, including all of the stake delegated by other users. - -Note that this operation incurs a $1 \tau$ recycling fee. - - -### Minimize dependency risk - -Bittensor nodes often run complex software stacks with many dependencies. Take steps to reduce risk: -- Keep your Python environment or Docker images updated with the latest patches. -- Avoid installing unnecessary packages that might contain vulnerabilities. -- Consider sandboxing the ML library if possible, using solutions like [PyPy sandboxing](https://doc.pypy.org/en/latest/sandbox.html) or custom Docker seccomp profiles. diff --git a/docs/getting-started/install-btcli.md b/docs/getting-started/install-btcli.md deleted file mode 100644 index 4bd09abfcb..0000000000 --- a/docs/getting-started/install-btcli.md +++ /dev/null @@ -1,145 +0,0 @@ ---- -title: "Install BTCLI" ---- - -# Install BTCLI - -This page contains installation details for `btcli`, the Bittensor CLI. - -## Prerequisite - -To install `btcli`, you must have Python version 3.9-3.12 - -See: https://github.com/opentensor/btcli/blob/main/setup.py#L91-L94 - -## Developer reference - -For a full developer reference, see the [Bittensor CLI reference document](../btcli.md). - -## Install on macOS and Linux - -### Install from Python Package Indexer - -Check for the latest release at the Python Package Index: [https://pypi.org/project/bittensor-cli/](https://pypi.org/project/bittensor-cli/). - -Use pip to install the desired version: - -```shell -pip install bittensor-cli # Use latest or desired version -``` - -Verify your installation and its version by running: -```shell -btcli --version -``` -Example output: -```console -BTCLI version: 9.2.0 -``` -:::warning Update frequently! -Check frequently to make sure you are using the latest version of `btcli`. -::: - -### Install from source - - -1. Create and activate a virtual environment. - :::tip Create and activate a virtual environment - - - Create Python virtual environment. Follow [this guide on python.org](https://docs.python.org/3/library/venv.html#creating-virtual-environments). - - - Activate the new environment. Follow [this guide on python.org](https://docs.python.org/3/library/venv.html#how-venvs-work) - ::: - :::warning For Ubuntu-Linux users - If you are using Ubuntu-Linux, the script will prompt for `sudo` access to install all required apt-get packages. - ::: - - ```bash - python3 -m venv btcli_venv - source btcli_venv/bin/activate - ``` - -2. Clone the Bittensor CLI repo. - - ```bash - git clone https://github.com/opentensor/btcli.git - ``` - -3. `cd` into `btcli` directory. - - ```bash - cd btcli - ``` - -4. Install - - - ```bash - pip3 install . - ``` - -## Install on Windows - -To install and run Bittensor SDK on Windows you must install [**WSL 2** (Windows Subsystem for Linux)](https://learn.microsoft.com/en-us/windows/wsl/about) on Windows and select [Ubuntu Linux distribution](https://github.com/ubuntu/WSL/blob/main/docs/guides/install-ubuntu-wsl2.md). - -After you installed the above, follow the same installation steps described above in [Install on macOS and Linux](#install-on-macos-and-linux). - -:::danger Limited support on Windows -While wallet transactions like delegating, transfer, registering, staking can be performed on a Windows machine using WSL 2, the mining and validating operations are not recommended and are not supported on Windows machines. -::: - - -## Verify the installation - -```bash -btcli --version -``` -which will give you the below output: - -```bash -BTCLI version: -``` -You will see the version number you installed in place of ``. - -## Configuration - -You can set the commonly used values, such as your hotkey and coldkey names, the default chain URL or the network name you use, and more, in `config.yml`. You can override these values by explicitly passing them in the command line for any `btcli` command. - -### Example config file - -The default location of the config file is: `~/.bittensor/config.yml`. An example of a `config.yml` is shown below: - -```yaml -chain: ws://127.0.0.1:9945 -network: local -no_cache: False -wallet_hotkey: hotkey-user1 -wallet_name: coldkey-user1 -wallet_path: ~/.bittensor/wallets -metagraph_cols: - ACTIVE: true - AXON: true - COLDKEY: true - CONSENSUS: true - DIVIDENDS: true - EMISSION: true - HOTKEY: true - INCENTIVE: true - RANK: true - STAKE: true - TRUST: true - UID: true - UPDATED: true - VAL: true - VTRUST: true -``` - -:::caution alert -If both `chain` and `network` config values are present in the `config.yml`, then `chain` has the higher precedence. The the `btcli` command uses the `chain` value. -::: - -**For more help:** - -```bash -btcli config --help -``` diff --git a/docs/getting-started/install-wallet-sdk.md b/docs/getting-started/install-wallet-sdk.md deleted file mode 100644 index 41e4811415..0000000000 --- a/docs/getting-started/install-wallet-sdk.md +++ /dev/null @@ -1,162 +0,0 @@ ---- -title: "Install Wallet SDK" ---- - -# Install Wallet SDK - -The Bittensor Wallet SDK is a Python interface for a powerful Rust-based Bittensor wallet functionality. You do not need to know Rust to use this Wallet SDK. However, if you want to contribute to the Rust components of this Wallet SDK, the Rust source is located in the `src` directory of [btwallet](https://github.com/opentensor/btwallet) repo. - -## Supported Python versions - -- bittensor (SDK): Python 3.9-3.11 (reference: https://github.com/opentensor/bittensor/blob/master/setup.py#L86-L88) -- bittensor-cli: Python 3.9-3.12 (reference: https://github.com/opentensor/btcli/blob/main/setup.py#L91-L94 ) -- bittensor-wallet: Python 3.9-3.12 (reference: https://github.com/opentensor/btwallet/blob/main/pyproject.toml#L34-L37) - -## Developer reference - -For a full developer reference, see the [Bittensor Wallet SDK section](pathname:///btwallet-api/html/index.html). - ---- - -## Compatibility notes - -- If you installed either Bittensor SDK version `8.2.0` or BTCLI version `8.2.0` then the Wallet SDK `2.0.2` is already installed. The below installation steps are only for a standalone installation of the Wallet SDK `2.0.2` package. - -- The Bittensor SDK version `8.2.0` and later versions and BTCLI version `8.2.0` and later versions are compatible only with the Wallet SDK versions `>=2.0.2`. - -## Install - -Follow the below steps to install the Bittensor Wallet SDK: - -### From PyPI - -Use this option if you want to use the Wallet SDK. - -```bash -$ python3 -m venv btwallet-venv # create a virtual env -$ source btwallet-venv/bin/activate # activate the env -$ pip install bittensor-wallet # install bittensor-wallet -``` - -### From source - -Use this option if you want to develop your application using the Wallet SDK. - -```bash -python3 -m venv btwallet-venv # create a virtual env -source venv/bin/activate # activate the env -git clone https://github.com/opentensor/btwallet.git -cd btwallet -pip install maturin -maturin develop -``` - -After the `maturin develop` command completes, run the below command: - -```bash -pip list -``` - -You will see `bittensor-wallet` in the list on installed packages. This means the installation was successful. - ---- - -## Verify your installation - -In the `python3` interpreter, run the below code to verify that your installation was successful. See an example output below: - -```bash -python3 -Python 3.12.4 (v3.12.4:8e8a4baf65, Jun 6 2024, 17:33:18) [Clang 13.0.0 (clang-1300.0.29.30)] on darwin -Type "help", "copyright", "credits" or "license" for more information. ->>> import bittensor_wallet ->>> print(bittensor_wallet.__version__) -2.0.0 ->>> -``` - -The above will print the Wallet SDK version you just installed, i.e., `2.0.0`, confirming that the installation was successful. - ---- - -## Usage examples - -**1. Create a wallet** - -In the `python3` interpreter, run the below code: - -```python -from bittensor_wallet import Wallet - -# creates wallet with name `default` -wallet = Wallet() -wallet.create() -``` - -If a wallet with the name "default" already exists, then you will see a message. If it doesn't exist, then the above code will create both a coldkey and a hotkey and displays the following information, including your mnemonic **(mnemonics are replaced with `x` in the below example for security)**: - -``` -IMPORTANT: Store this mnemonic in a secure (preferable offline place), as anyone who has possession of this mnemonic can use it to regenerate the key and access your tokens. - -The mnemonic to the new coldkey is: - -forward xxxx xxx xxx xxxx xxxx xxxx xxx xx xx xx actress - -You can use the mnemonic to recreate the key in case it gets lost. The command to use to regenerate the key using this mnemonic is: -btcli w regen-coldkey --mnemonic "forward xxxx xxx xxx xxxx xxxx xxxx xxx xx xx xx actress" - -Specify password for key encryption: -Retype your password: - -IMPORTANT: Store this mnemonic in a secure (preferable offline place), as anyone who has possession of this mnemonic can use it to regenerate the key and access your tokens. - -The mnemonic to the new hotkey is: - -fuel xxxx xxx xxx xxxx xxxx xxxx xxx xx xx xxx bind - -You can use the mnemonic to recreate the key in case it gets lost. The command to use to regenerate the key using this mnemonic is: -btcli w regen-hotkey --mnemonic "fuel xxxx xxx xxx xxxx xxxx xxxx xxx xx xx xxx bind" - -name: 'default', hotkey: 'default', path: '~/.bittensor/wallets/' ->>> print(wallet) -Wallet (Name: 'default', Hotkey: 'default', Path: '~/.bittensor/wallets/') ->>> -``` - -**2. Pass arguments to a class other than the default** - -``` -name (str): The name of the wallet, used to identify it among possibly multiple wallets. -hotkey (str): String identifier for the hotkey. -path (str): File system path where wallet keys are stored. -config (Config): Bittensor configuration object. -``` - -In the `python3` interpreter, run the below code. See an example below (only partial is shown): - -```bash -python3 -Python 3.12.4 (v3.12.4:8e8a4baf65, Jun 6 2024, 17:33:18) [Clang 13.0.0 (clang-1300.0.29.30)] on darwin -Type "help", "copyright", "credits" or "license" for more information. ->>> from bittensor_wallet import Wallet ->>> my_name = "my_wallet_name" ->>> my_path = "path_to_my_wallet" ->>> my_hotkey = "name_of_my_hotkey" ->>> ->>> my_wallet = Wallet(name=my_name, path=my_path, hotkey=my_hotkey) ->>> my_wallet.create() - -IMPORTANT: Store this mnemonic in a secure (preferable offline place), as anyone who has possession of this mnemonic can use it to regenerate the key and access your tokens. - -``` - -The above will create a wallet with "my_wallet_name". - -**3. Use your own config** - -```python -from bittensor_wallet.config import Config -config = Config() -``` - ---- diff --git a/docs/getting-started/installation.md b/docs/getting-started/installation.md deleted file mode 100644 index 0731497987..0000000000 --- a/docs/getting-started/installation.md +++ /dev/null @@ -1,177 +0,0 @@ ---- -title: "Install Bittensor SDK" ---- - -# Install Bittensor SDK - -Before you can start developing, you must install Bittensor SDK and then create Bittensor wallet. - -## Supported Python versions - -- bittensor (SDK): Python 3.9-3.11 (reference: https://github.com/opentensor/bittensor/blob/master/setup.py#L86-L88) -- bittensor-cli: Python 3.9-3.12 (reference: https://github.com/opentensor/btcli/blob/main/setup.py#L91-L94 ) -- bittensor-wallet: Python 3.9-3.12 (reference: https://github.com/opentensor/btwallet/blob/main/pyproject.toml#L34-L37) - -## Upgrade - -If you already installed Bittensor SDK, make sure you upgrade to the latest version. Run the below command: - -```bash -python3 -m pip install --upgrade bittensor -``` - -## Developer reference - -For a full developer reference, see the [Bittensor SDK section](../bt-api-ref.md). - -## Install on macOS and Linux - -You can install Bittensor on your local machine in either of the following ways. **Make sure you verify your installation after you install**. -- [Install using a Bash command](#install-using-a-bash-command). -- [Install from source](#install-from-source) - -### Install using a Bash command - -This is the most straightforward method. It is recommended for a beginner as it will pre-install requirements like Python, if they are not already present on your machine. Copy and paste the following `bash` command into your terminal: - -```bash -/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/opentensor/bittensor/master/scripts/install.sh)" -``` - -:::warning For Ubuntu-Linux users -If you are using Ubuntu-Linux, the script will prompt for `sudo` access to install all required apt-get packages. -::: -:::tip Create and activate a virtual environment - - - Create Python virtual environment. Follow [this guide on python.org](https://docs.python.org/3/library/venv.html#creating-virtual-environments). - - - Activate the new environment. Follow [this guide on python.org](https://docs.python.org/3/library/venv.html#how-venvs-work) -::: - -### Install Python virtual environment - -```bash -python3 -m venv btsdk_venv -source btsdk_venv/bin/activate -``` - -### Install from source - -1. Clone the Bittensor repo - -```bash -git clone https://github.com/opentensor/bittensor.git -``` -2. Change to the Bittensor directory: - -```bash -cd bittensor -``` -3. Install - -- **Install SDK**: Run the below command to install Bittensor SDK in the above virtual environment. This will also install `btcli`. -```python -pip install . -``` - -- **Install SDK with `torch`**: Install Bittensor SDK with [`torch`](https://pytorch.org/docs/stable/torch.html). - - ```python - pip install bittensor[torch] - ``` - In some environments the above command may fail, in which case run the command with added quotes as shown below: - - ```python - pip install "bittensor[torch]" - ``` - -### Install from PyPi - -You can install Bittensor using any of the below options: - -- **Install SDK**: Run the below command to install Bittensor SDK in the above virtual environment. This will install `btcli` also. -```python -pip install bittensor -``` - -- **Install SDK with `torch`**: Install Bittensor SDK with [`torch`](https://pytorch.org/docs/stable/torch.html). - - ```python - pip install bittensor[torch] - ``` - In some environments the above command may fail, in which case run the command with added quotes as shown below: - - ```python - pip install "bittensor[torch]" - ``` - -- **Install SDK with `cubit`**: Install Bittensor SDK with [`cubit`](https://github.com/opentensor/cubit). - - 1. Install `cubit` first. See the [Install](https://github.com/opentensor/cubit?tab=readme-ov-file#install) section. **Only Python 3.9 and 3.10 versions are supported**. - 2. Then install SDK with `pip install bittensor`. - - -## Install on Windows - -To install and run Bittensor SDK on Windows you must install [**WSL 2** (Windows Subsystem for Linux)](https://learn.microsoft.com/en-us/windows/wsl/about) on Windows and select [Ubuntu Linux distribution](https://github.com/ubuntu/WSL/blob/main/docs/guides/install-ubuntu-wsl2.md). - -After you installed the above, follow the same installation steps described above in [Install on macOS and Linux](#install-on-macos-and-linux). - -:::danger Limited support on Windows -While wallet transactions like delegating, transfer, registering, staking can be performed on a Windows machine using WSL 2, the mining and validating operations are not recommended and are not supported on Windows machines. - ::: - - -## Verify the installation - -You can verify your installation in either of the two ways as shown below: - -### Verify using `btsdk` version - -```python -python3 -m bittensor -``` - -```bash -Bittensor SDK version: -``` - -The above command will show you the `` of the `btsdk` you just installed. - - -### Verify using Python interpreter - -1. Launch the Python interpreter on your terminal. - - ```bash - python3 - ``` -2. Enter the following two lines in the Python interpreter. - - ```python - import bittensor as bt - print( bt.__version__ ) - ``` - The Python interpreter output will look like below: - - ```python - >>> print( bt.__version__ ) - - ``` -You will see the version number you installed in place of ``. -### Verify by listing axon information - -You can also verify the Bittensor installation by listing the axon information for the neurons. Enter the following lines in the Python interpreter. - -```python -import bittensor as bt -metagraph = bt.metagraph(1) -metagraph.axons[:10] -``` -The Python interpreter output will look like below. - -```bash -[AxonInfo( /ipv4/3.139.80.241:11055, 5GqDsK6SAPyQtG243hbaKTsoeumjQQLhUu8GyrXikPTmxjn7, 5D7u5BTqF3j1XHnizp9oR67GFRr8fBEFhbdnuVQEx91vpfB5, 600 ), AxonInfo( /ipv4/8.222.132.190:5108, 5CwqDkDt1uk2Bngvf8avrapUshGmiUvYZjYa7bfA9Gv9kn1i, 5HQ9eTDorvovKTxBc9RUD22FZHZzpy1KRfaxCnRsT9QhuvR6, 600 ), AxonInfo( /ipv4/34.90.71.181:8091, 5HEo565WAy4Dbq3Sv271SAi7syBSofyfhhwRNjFNSM2gP9M2, 5ChuGqW2cxc5AZJ29z6vyTkTncg75L9ovfp8QN8eB8niSD75, 601 ), AxonInfo( /ipv4/64.247.206.79:8091, 5HK5tp6t2S59DywmHRWPBVJeJ86T61KjurYqeooqj8sREpeN, 5E7W9QXNoW7se7B11vWRMKRCSWkkAu9EYotG5Ci2f9cqV8jn, 601 ), AxonInfo( /ipv4/51.91.30.166:40203, 5EXYcaCdnvnMZbozeknFWbj6aKXojfBi9jUpJYHea68j4q1a, 5CsxoeDvWsQFZJnDCyzxaNKgA8pBJGUJyE1DThH8xU25qUMg, 601 ), AxonInfo( /ipv4/149.137.225.62:8091, 5F4tQyWrhfGVcNhoqeiNsR6KjD4wMZ2kfhLj4oHYuyHbZAc3, 5Ccmf1dJKzGtXX7h17eN72MVMRsFwvYjPVmkXPUaapczECf6, 600 ), AxonInfo( /ipv4/38.147.83.11:8091, 5Hddm3iBFD2GLT5ik7LZnT3XJUnRnN8PoeCFgGQgawUVKNm8, 5DCQw11aUW7bozAKkB8tB5bHqAjiu4F6mVLZBdgJnk8dzUoV, 610 ), AxonInfo( /ipv4/38.147.83.30:41422, 5HNQURvmjjYhTSksi8Wfsw676b4owGwfLR2BFAQzG7H3HhYf, 5EZUTdAbXyLmrs3oiPvfCM19nG6oRs4X7zpgxG5oL1iK4MAh, 610 ), AxonInfo( /ipv4/54.227.25.215:10022, 5DxrZuW8kmkZPKGKp1RBVovaP5zHtPLDHYc5Yu82Z1fWqK5u, 5FhXUSmSZ2ec7ozRSA8Bg3ywmGwrjoLLzsXjNcwmZme2GcSC, 601 ), AxonInfo( /ipv4/52.8.243.76:40033, 5EnZN591jjsKKbt3yBtfGKWHxhxRH9cJonqTKRT5yTRUyNon, 5ChzhHyGmWwEdHjuvAxoUifHEZ6xpUjR67fDd4a42UrPysyB, 601 )] ->>> -``` - diff --git a/docs/getting-started/wallets.md b/docs/getting-started/wallets.md deleted file mode 100644 index 87264299b8..0000000000 --- a/docs/getting-started/wallets.md +++ /dev/null @@ -1,189 +0,0 @@ ---- -title: "Wallets, Coldkeys and Hotkeys in Bittensor" ---- -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Wallets, Coldkeys and Hotkeys in Bittensor - -In Bittensor (like other cryptocurrency applications), a *wallet* is a tool for proving your identity, signing transactions, accessing your TAO, and managing your stake in subnets. -This page introduces the core concepts involved. - -For detailed procedures for handling wallets and keys, see: [Working with keys](../working-with-keys.md) - -For detailed security considerations, see: [Coldkey and Hotkey Workstation Security](./coldkey-hotkey-security.md) - -## What are wallets and keys? - -There are many different *wallet applications*, but the core of your wallet is one or more cryptographic key-pairs, referred to as **coldkey** and **hotkey**. -Each is actually a cryptographic [key-pair](https://en.wikipedia.org/wiki/Public-key_cryptography), a private and a public key. -The public key is mathematically derived from the private key. -The private key is a closely held secret: it allows the owner to sign transactions and decrypt secrets, essentially serving as a cryptographic authentication or identity. -This is a general feature of decentralized, trustless systems like distributed ledgers/blockchains: your private key *is* your identity, in that theft or loss of your key results in *unrecoverable* loss of access. - -In Bittensor, the coldkey and hotkey are used for different operations. In short, the hotkey is for mining and validation, and the coldkey for everything else; if you neither mine nor validate, you have no need for a hotkey, but you will identify validators and miners by their hotkey public keys. - -The coldkey private key is needed to authorize highly sensitive operations involved in transferring TAO balances and managing stake, operations related to subnet management and governance, and management of hotkeys. The hotkey private key is needed to authorize miners to serve requests in subnets, and by validators to send requests to miners and to submit weights to the blockchain. - -The coldkey public key identifies a wallet to the internet, serving as an address. To transfer ownership of TAO or alpha stake from one wallet to another, the sender needs only the public key of the recipient, and their own private key. - -## Wallets and wallet applications - -We must be careful to distinguish two senses of the term 'wallet' that can otherwise be confusing: - -- The **cryptographic wallet** is one or more cryptographic key pairs that comprise an identity, and allow a person to sign transactions or be referred to in transactions signed by others. In this sense, the wallet is more or less synonymous with the unique **coldkey** that controls access to your assets and serves as your public identity. - -- The **wallet application** is software that runs on your device and allows you to interact with the blockchain by entering your keys. There are several officially supported Bittensor wallet applications: - - - The Bittensor wallet app for mobile: [bittensor.com/wallet](https://bittensor.com/wallet) - - [The Polkadot browser extension](https://polkadot.js.org/extension/) which can be used with Polkadot Vault... - - - [The Bitensor wallet browser extension](https://chromewebstore.google.com/detail/bittensor-wallet/bdgmdoedahdcjmpmifafdhnffjinddgc), which is also compatible with use of a Ledger hardware wallet. See [Using Ledger Hardware Wallet](../staking-and-delegation/using-ledger-hw-wallet.md) - - Using the Bittensor wallet browser extension, you can [use TAO.app to manage stake](https://tao.app). - - - The Bittensor Python SDK, which includes the secure [Bittensor Wallet module](https://docs.bittensor.com/btwallet-api/html/autoapi/btwallet/wallet/index.html). - - The Bittensor CLI, `btcli`, which uses the Bittensor Wallet module under the hood. - -Every Bittensor user has one or more cryptographic wallets, i.e. one or more coldkey. Any cryptographic wallet can be loaded into any number of wallet applications. If every wallet application that has been initialized with your cryptographic wallet (i.e. signed into with your coldkey private key) is closed, logged out, etc., and the device incinerated, your cryptographic wallet exists on the blockchain, and can be recovered with your *seed phrase*. - -Different wallet applications have different levels of functionality: - -- The mobile app and Chrome extension allow for staking and transfer of TAO balalnces, but do not include any hotkey management or advanced functionality. - - - Note that the Chome extension is compatible with a hardware wallet, which can be a strong security option. This implies using a laptop as your [coldkey workstation](../getting-started/coldkey-hotkey-security). - - - The mobile app depends on using a secure phone as a [coldkey workstation](../getting-started/coldkey-hotkey-security). - -- `btcli` and the SDK allow for hotkey management and other advanced functionality. These require a laptop as a [coldkey workstation](../getting-started/coldkey-hotkey-security). - -:::tip -Note that you can also check balances on an unsecure device without entering your coldkey private key. For example, using [https://bittensor.com/scan](https://bittensor.com/scan). These website can be considered permissionless wallet applications. - -See [Coldkey and Hotkey Workstation Security: Permissionless workstation](../getting-started/coldkey-hotkey-security#permissionless-workstation) -::: - -## The seed phrase a.k.a. mnemonic - -The ***seed phrase*** (a.k.a. 'menemonic' or 'recovery phrase') is a series of (at least 12) words that is generated together with your wallet's cryptographic key pair, and which can be used to recover the coldkey private key. This seed phrase is therefore a human-usable way to save access to the cryptographic wallet offline, and to import the cryptographic wallet into a wallet application. - -Arguably the most important operational goal when handling Bittensor wallets is to avoid losing or leaking your seed phrase. Make sure you [Handle your Seed Phrase/Mnemonic Securely](../keys/handle-seed-phrase). - -## Wallet applications - -There are many different applications that can interact with your public and/or private keys in some way. - -### Permissionless wallet apps - -You can visit [bittensor.com/scan](https://bittensor.com/scan) and enter a coldkey public key to view public information about any wallet. -The browser in this case is able to act as a kind of permissionless wallet application to display public information about wallets. - -### Staking apps - -Several applications exist that can interact securely with your coldkey. This basically means that you can load your coldkey into the application without having to have the key stored in an unencrypted form on your disk. -In theory this means that without your encryption password, it is impossible to steal your key—even if someone accesses your device. - -However, still consider that using your coldkey on a device offers other ways for attackers to steal your key, even without decrypting it. -See [Coldkey workstation security](./coldkey-hotkey-security#coldkey-workstation). - -Secure wallet apps supported by Opentensor Foundation include: -- The Bittensor wallet app for mobile: [bittensor.com/wallet](https://bittensor.com/wallet) -- [The Chrome extension](https://chromewebstore.google.com/detail/bittensor-wallet/bdgmdoedahdcjmpmifafdhnffjinddgc), which is also compatible with use of a Ledger hardware wallet. See [Using Ledger Hardware Wallet](../staking-and-delegation/using-ledger-hw-wallet.md) - -### `btcli` and the Bittensor Python SDK - -The Bittensor Command Line Interface (BTCLI) and Bittensor Python SDK offer more extended functionality and are required for advanced functionality, including: - -- Scripting -- Managing hotkeys for mining and validating -- Creating and configuring subnets -- Participating in governance - -## Coldkey details - -In `btcli`, the coldkey is equivalent to the wallet name. For example, the `--wallet.name` option in a `btcli` command always accepts only `` as its value and the `--wallet.hotkey` option only accepts `` as its value. -This is because the coldkey holds the permissions and ownership over multiple hotkeys on-chain; hence, the wallet name is assigned to the coldkey. - -**Relationship to hotkey**: A coldkey can exist without a hotkey or have multiple hotkeys. For example, to create a subnet, delegate stake, or simply hold balance you only need a coldkey. However, if you want to validate or mine in a subnet, you need a hotkey paired with this coldkey. - -**Purpose**: A coldkey is required for all operations that affect balances, such as transfer of TAO, staking and unstaking. -It is also required for creating and registering hotkeys, and for subnet management and governance functions. - -**Encryption**: A coldkey is only stored on your disk in encrypted form, and requires an encryption password. - -See [Coldkey and Hotkey Workstation Security](../getting-started/coldkey-hotkey-security) for concrete security details about working with coldkeys. - - - - -### Existential deposit - -An existential deposit is the minumum required TAO in a wallet (i.e., in a coldkey). -If a wallet balance goes below the existential deposit, then this wallet account is deactivated and the remaining TAO in it is destroyed. -**This is set to 500 RAO for any Bittensor wallet**. - -See also [What is the Existential Deposit?](https://support.polkadot.network/support/solutions/articles/65000168651-what-is-the-existential-deposit-). - -## Hotkey details - -Hotkeys are used to register on a subnet as a miner or validator. - -[Hotkey workstation security](../getting-started/coldkey-hotkey-security#hotkey-workstation) - -**Relationship to coldkey**: You can create multiple hotkeys paired to your single coldkey. -However, when you are validating or mining in a subnet, you are identified by a hotkey in that subnet, so that your coldkey is not exposed. -Hence, you cannot use the same hotkey for two UIDs in a given subnet. -You can, however, use the same hotkey for multiple UIDs but with each UID in a separate subnet. - -**Purpose**: Hotkeys are used for regular operational tasks in the Bittensor network, such as those described below (**Also see in the diagram in [Operational uses of keys](#operational-uses-of-keys)**): - - Signing transactions - - Registering and running subnet miners and subnet validators - - Nominating your own hotkey (given you are a subnet validator) so that the TAO holders can send their TAO to the hotkey - - Delegating your TAO to the hotkey of the validator-delegate (given you are a TAO holder with a coldkey where your TAO is stored) (See item 10 in the diagram in [Operational uses of keys](#operational-uses-of-keys).) - -## Key usage FAQ - -### Can a coldkey be paired with multiple hotkeys? - -Yes. -A miner or validator may use a single coldkey to manage a number of hotkeys for mining or validation in different subnets. - -### Can I use the same hotkey for multiple UIDs in the same subnet? - -No. -In a given subnet, each hotkey can only be used for one UID. -However, you can reuse the same hotkey for UIDs in different subnets. - -### Can I transfer TAO to a hotkey? - -Technically yes, but you shouldn't. -This is contrary to the intended design, and if you try, you may irreversably lose your funds—transfer of TAO should always be *to a coldkey*; the coldkey public key serves as the public address of the wallet. - -### Is a coldkey associated with a subnet? - -Yes! -When a subnet is created, netuid is bound to the coldkey that pays the subnet registration fee. -This coldkey is required to change subnet configuration settings (hyperparameters), and 18% portion of the subnets emissions as allocated to this coldkey. - -### Where are subnet validator and subnet miner emissions deposited? - -Validator and miner emissions are received in the alpha token of the subnet in which they are validating/mining. -This is in the form of stake to their hotkey owned by their coldkey, which can then be unstaked back into a TAO balance for that coldkey. - -### How do I delegate my TAO to a validator’s hotkey? - -As a TAO holder, you can stake or delegate to a validator on a subnet by exchanging your TAO for a stake balance in the subnet's alpha $\alpha$ token, which is always tied to a hotkey in the subnet, i.e. that of a validator. - -See [Staking/Delegation Overview](../staking-and-delegation/delegation) for more on staking. - diff --git a/docs/glossary.md b/docs/glossary.md deleted file mode 100644 index 8ba3655f8f..0000000000 --- a/docs/glossary.md +++ /dev/null @@ -1,396 +0,0 @@ ---- -title: "Glossary" ---- - -# Glossary - -## A - -### Active UID - -A UID slot that is considered active within a specific subnet, allowing the associated hotkey to participate as a subnet validator or subnet miner. - -### Archive Node - -A type of public subtensor node that stores the entire blockchain history, allowing for full data access and querying capabilities. - -### Axon - -A module in the Bittensor API that uses the FastAPI library to create and run API servers. Axons receive incoming Synapse objects. Typically, an Axon is the entry point advertised by a subnet miner on the Bittensor blockchain, allowing subnet validators to communicate with the miner. - -## B - -### Bicameral Legislature - -A two-tier legislative system comprising the Triumvirate and the Senate for proposal approval. - -### Bittensor Wallet - -A digital wallet that holds the core ownership in the Bittensor network and serves as the user's identity technology underlying all operations. - -### Block - -A unit of data in the Bittensor blockchain, containing a collection of transactions and a unique identifier (block hash). A single block is processed every 12 seconds in the Bittensor blockchain. - -## C - -### Coldkey - -A component of a Bittensor wallet responsible for securely storing funds and performing high-risk operations such as transfers and staking. It is encrypted on the user's device. This is analogous to a private key. - -### Coldkey-hotkey pair - -A combination of two keys, a coldkey for secure storage and high-risk operations, and a hotkey for less secure operations and network interactions. - -### Commit Reveal - -The commit reveal feature is designed to solve the weight-copying problem by giving would-be weight-copiers access only to stale weights. Copying stale weights should result in validators departing from consensus. - -See [Commit Reveal](./subnets/commit-reveal.md) for details. - -### Consensus - -A measure of a subnet validator's agreement with other validators on the network, calculated based on their trust scores. This is a κ-centered sigmoid of trust, influencing the emission calculation. - -## D - -### Delegate - -A subnet validator that receives staked TAO tokens from delegators and performs validation tasks in one or more subnets. - -### Delegate Stake - -The amount of TAO staked by the delegate themselves. - -### Validator Take % - -The percentage of emissions a validator takes, of the portion that depends on delegated stake (not including their emissions in proportion to their own self-stake), before the remainder is extracted back to the stakers. - -See [Emissions](./emissions). - -### Delegation - -Also known as staking, delegating TAO to a validator (who is thereby the delegate), increases the validator's stake and secure a validator permit. - -### Dendrite - -A client instance used by subnet validators and subnet miners to transmit information to axons on subnet miners and subnet validators. Dendrites communicate with axons using the server-client (Axon-dendrite) protocol. - -### Deregistration - -The process of removing a subnet miner or a subnet validator from the subnet due to poor performance. - -## E - -### EdDSA Cryptographic Keypairs - -A cryptographic algorithm used to generate public and private key pairs for coldkeys and hotkeys in the Bittensor wallet. - -### Effective stake - -The total staked TAO amount of a delegate, including their own TAO tokens and those delegated by nominators. - -### Emission - -Every block, currency is injected into each subnet in Bittensor, and every tempo (or 360 blocks), it is extracted by participants (miners, validators, stakers, and subnet creators). - -Emission is this process of generating and allocating currency to participants. The amount allocated to a given participant over some duration of time is also often referred to as 'their emissions' for the period. - -See [emissions](./emissions). - -### Encrypting the Hotkey - -An optional security measure for the hotkey. - -### External Wallet - -A Bittensor wallet created through the Bittensor website or using a tool like [subkey](https://docs.substrate.io/reference/command-line-tools/subkey/), allowing users to use TAO without installing Bittensor. - -## H - -### Hotkey - -A component of a Bittensor wallet responsible for less secure operations such as signing messages into the network, secure a UID slot in a subnet, running subnet miners and subnet validators in a subnet. It can be encrypted or unencrypted, but is unencrypted by default. The terms "account" and "hotkey" are used synonymously. - -### Hotkey-Coldkey Pair - -Authentication mechanism for delegates and nominators and for delegates participating in the Senate. - -## I - -### Immunity Period - -A grace period granted to a newly registered subnet miner or subnet validator, during which they will not be deregistered due to performance. Allows a miner or validator new to the subnet to adapt and improve their performance, in order to avoid deregistration once the immunity period expires. - -### Incentives - -A portion of the TAO emission received by the subnet miners when they provide valuable services and compete for UID slots in a subnet. - -### Incentive Mechanism - -A system that drives the behavior of subnet miners and governs consensus among subnet validators in a Bittensor subnet. Each subnet has its own incentive mechanism, which should be designed carefully to promote desired behaviors and penalize undesired ones. - -## L - -### Lite Node - -A type of public subtensor node that stores limited blockchain data and relies on archive nodes for full historical data. - -### Local Blockchain - -A private blockchain used for developing and testing subnet incentive mechanisms. A local blockchain is not public and is isolated from any Bittensor network. - -### Local Wallet - -A Bittensor wallet created on the user's machine, requiring the installation of Bittensor. - -### Loss Function - -In the context of machine learning, a mathematical function that measures the difference between the predicted output and the ground truth. In Bittensor, incentive mechanisms act as loss functions that steer subnet miners towards desirable outcomes. - -## M - -### Mainchain - -The primary Bittensor blockchain network, used for production purposes and connected to lite or archive nodes. - -### Metagraph - -A data structure that contains comprehensive information about the current state of a subnet, including detailed information on all the nodes (neurons) such as subnet validator stakes and subnet weights in the subnet. Metagraph aids in calculating emissions. - -### Miner Deregistration - -The process of removing a poor-performing subnet miner from a UID slot, making room for a newly registered miner. - -See [Mining in Bittensor: Miner Deregistration](./miners/#miner-deregistration) - -### Mnemonic - -A sequence of words used to regenerate keys, in case of loss, and restore coldkeys and hotkeys in the Bittensor wallet. - -## N - -### NaCl Format - -A secure encryption format, using the [NaCl](https://nacl.cr.yp.to/) library, used for updating legacy Bittensor wallets to improve security. - -### Netuid - -A unique identifier assigned to a subnet within the Bittensor network. - -### Neuron - -The basic computing node in a Bittensor subnet, representing a node in a neural network. Neurons can be either subnet validators or subnet miners. - -### Nominate - -The process of a delegate registering themselves as a candidate for others to stake their $TAO to. - -### Nominator - -Another term for a delegator. A subnet validator who nominates their own hotkey as a delegate, allowing others to delegate their TAO to the nominator's hotkey. - -### Nominator (Delegator) - -A TAO holder who delegates their stake. - -## O - -### Objective Function - -In the context of machine learning and subnet operations, this refers to the goal that the subnet is continuously optimizing for, through its incentive mechanism. - -## P - -### Private Key - -A private component of the cryptographic key pair, crucial for securing and authorizing transactions and operations within the Bittensor network. - -### Proposal - -A suggestion or plan put forward by the Triumvirate for the Senate to vote on. - -### Proposal hash - -A unique identifier for a proposal used in the voting process. - -### Public Key - -A cryptographic key that is publicly available and used for verifying signatures, encrypting messages, and identifying accounts in the Bittensor network. This is the publicly shareable part of the cryptographic key pair associated with both the coldkey and hotkey, allowing others to securely interact with the wallet. - -### Public Subtensor - -A publicly accessible node in the Bittensor network that can be run as a lite node or an archive node and synchronized with either the mainchain or testchain. - -## R - -### RAO - -A denomination of TAO, representing one billionth (10-9) of a TAO. - -### Rank - -A measure of a subnet miner's performance relative to other subnet miners in the same subnet, calculated based on the subnet miner's trust and incentive scores. This is the sum of weighted stake, contributing to the emission process. - -### Recycling, burning, and locking - -"Recycling TAO" means that this TAO is put back into the Bittensor emissions system. Instead of minting new TAO this recycled TAO that is in the recycle bin will be used again in the new emissions. - -This happens in two cases: - -- When you register either as a subnet validator or a subnet miner and get a `UID` in return, the registration cost TAO you pay is recycled. -- Emissions are recycled for those subnets that have registration turned off or paused. - -When TAO is burned it is permanently removed from circulation, reducing total supply. - -Locked TAO is neither recycled nor burned, but held unspent, without the ability to move it until it is unlocked. The cost for subnet registration is locked and returned if the subnet is deregistered. - -### Regenerating a Key - -The process of recreating a lost or deleted coldkey or hotkey using the associated mnemonic. - -### Register - -The process of registering keys with a subnet and purchasing a UID slot. - - -## S - -### SS58 Encoded - -A compact representation of public keys corresponding to the wallet's coldkey and hotkey, used as wallet addresses for secure TAO transfers. - -### Senate - -A group of elected delegates formed from the top K delegate hotkeys, responsible for approving or disapproving proposals made by the Triumvirate. - -### Stake - -The amount of currency tokens delegated to a validator UID in a subnet. Includes both self-stake (from the validator's own cold-key) and stake delegated from others. - -Stake determines a validator's weight in consensus as well as their emissions. - -### Staking - -The process of attaching TAO to a hotkey, i.e., locking TAO to a hotkey, to participate as a subnet validator, and to secure a validator permit. - -### Subnet - -A Bittensor subnet is an incentive-based competition market that produces a specific kind of digital commodity. It consists of a community of miners that produce the commodity, and a community of validators that measures the miners' work to ensure its quality. - -### Subnet Incentive Mechanism - -The framework that governs the behavior of subnet miners and ensures consensus among subnet validators by promoting desirable actions and penalizing undesired ones. - -### Subnet Miner - -The task-performing entity within a Bittensor subnet. A subnet miner is a type of node in a Bittensor subnet that is connected only to subnet validators. Subnet miners are isolated from the external world and communicate bidirectionally with subnet validators. A subnet miner is responsible for performing tasks given to them by the subnet validators in that subnet. - -### Subnet Creator - -The individual or entity responsible for defining the specific digital task to be performed by subnet miners, implementing an incentive mechanism, and providing sufficient documentation for participation in the subnet. - -### Subnet Protocol - -A unique set of rules defining interactions between subnet validators and miners, including how tasks are queried and responses are provided. - -### Subnet scoring model - -A component of the incentive mechanism that defines how subnet miners' responses are evaluated, aiming to align subnet miner behavior with the subnet's goals and user preferences. It is a mathematical object that converts miner responses into numerical scores, enabling continuous improvement and competition among miners. - -### Subnet Task - -A key component of any incentive mechanism that defines the work the subnet miners will perform. The task should be chosen to maximize subnet miner effectiveness at the intended use case for the subnet. - -### Subnet Validator - -A type of node in a subnet that creates tasks, evaluates the performance of subnet miners and sets weights based on their output. A subnet validator is connected only to subnet miners and to the external world. Subnet validators receive inputs from the external world and communicate bidirectionally with subnet miners. - -### Subnet Weights - -The importance assigned to each subnet determined by relative price among subnets and used to determine the percentage emissions to subnets. - -### Subtensor - -[Subtensor](https://github.com/opentensor/subtensor) is Bittensor's layer 1 blockchain based on substrate (now PolkadotSDK). This serves Bittensor as a system of record for transactions and rankings, operates Yuma Consensus, and emits liquidity to participants to incentivize their participation in network activities. - -The Bittensor SDK offers the [`bittensor.core.subtensor`](pathname:///python-api/html/autoapi/bittensor/core/subtensor/index.html) and [`bittensor.core.async_subtensor`](pathname:///python-api/html/autoapi/bittensor/core/async_subtensor/index.html) modules to handle Subtensor blockchain interactions. - -### Sudo - -A privileged key for administrative actions, replaced by governance protocol for enhanced security. - -### Synapse - -A data object used by subnet validators and subnet miners as the main vehicle to exchange information. Synapse objects are based on the BaseModel of the Pydantic data validation library. - -## T - -### TAO (τ) - -The cryptocurrency of the Bittensor network, used to incentivize participation in network activities (mining, validation, subnet creation and management). A single TAO is newly created (i.e., minted) every 12 seconds on the Bittensor blockchain. - -### Tempo - -A 360-block period during which the Yuma Consensus calculates emissions to subnet participants based on the latest available ranking weight matrix. A single block is processed every 12 seconds, hence a 360-block tempo occurs every 4320 seconds or 72 minutes. - -### Transfer - -The process of sending TAO tokens from one wallet address to another in the Bittensor network. - -### Triumvirate - -A group of three Opentensor Foundation employees responsible for creating proposals. - -### Trust - -A measure of a subnet miner's reputation and reliability, calculated based on the consensus of subnet validators. - -### Trust (T) - -A measure of the confidence in a subnet based on the stakes that set non-zero weights. - -## U - -### UID Slot - -A position occupied by a subnet miner or subnet validator within a subnet, identified by a unique UID. The UID is assigned to a hotkey when it is registered in a subnet, allowing the hotkey to participate as a subnet validator or subnet miner. - -## V - -### VPermit - -Validator permits held by the delegate for specific subnets. - -### Validator Module - -The software component that subnet validators run to perform their subnet validation operations within a subnet. - - -## W - -### Wallet Address - -A unique identifier derived from the public key, used as a destination for sending and receiving TAO tokens in the Bittensor network. - -### Wallet Location - -The directory path where the generated Bittensor wallets are stored locally on the user's machine. - -### Weight Matrix - -A matrix formed from the ranking weight vectors of all subnet validators in a subnet, used as input for the Yuma Consensus module to calculate emissions to that subnet. - -### Weight Vector - -A vector maintained by each subnet validator, with each element representing the weight assigned to a subnet miner based on its performance. - -The ranking weight vectors for each subnet are transmitted to the blockchain, where they combine to form the [weight matrix](#weight-matrix) that is input for Yuma Consensus. - -## Y - -### Yuma Consensus - -The consensus mechanism in the Bittensor blockchain that computes emissions to participants. - -See [Yuma Consensus](./yuma-consensus.md) diff --git a/docs/governance.md b/docs/governance.md deleted file mode 100644 index 31104c694f..0000000000 --- a/docs/governance.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: "Governance Overview" ---- - -# Governance Overview - -Bittensor's governance protocol transitions the management of the network from centralization within the foundation to community ownership over time. - -The first stage of this transition to decentralized management is the creation of a bicameral legislature. In this stage, the [Triumvirate](./glossary.md#triumvirate) creates proposals for the [Senate](./senate.md) to approve. - -Triumvirate members are Opentensor Foundation employees, while the Senate is formed from the top K delegate hotkeys. - -## Proposals - -Proposals are encapsulations of other extrinsics and will be executed only after meeting both of the two conditions: - -1. The proposal has obtained (50% + 1) approvals from the Senate, and -2. A member of the Triumvirate has closed the proposal. - -The above guarantees that the Senate must reach a majority consensus to execute a proposal. - -:::tip Execution of a proposal -When a proposal is executed, the calldata passed to it during its creation are included in the same block as the close extrinsic. -::: - -## Security - -Before the governance protocol existed, all administrative actions within the network (e.g., changing hyperparameters, creating new subnetworks, chain upgrades) required permission via a single privileged key, known as `sudo`. If the `sudo` private key were somehow compromised, a malicious actor could take over the network and execute any privileged extrinsics. - -Under the governance protocol, a malicious actor would have to compromise a Triumvirate member and control a majority of Senate seats in order to approve a proposal. - -## Example - -Consider the following: - -- The Triumvirate contains three seats, with members `Alice`, `Bob`, and `Charlie`. -- The Senate has three members elected to participate: `Dave`, `Eve`, and `Ferdie`. - -**Triumvirate** - -`Bob` has a novel concept for a subnet and wishes to deploy it on the Bittensor network. `Bob` creates a proposal with the calldata: -```python -SubtensorModule.SudoAddNetwork(netuid, tempo, modality) -``` -and sends the transaction to the network in order to broadcast the proposal. - -**Senate** - -- `Dave`, `Eve`, and `Ferdie` all own the nominated delegate hotkeys, and they individually control more than two percent of the network's total stakes. -- Using `btcli`, they can view the proposal and the calldata, which it will execute upon approval. -- `Dave` and `Ferdie` decided they wanted to approve this new subnet, and they both approved the proposal. -- `Eve` disagrees with the concept and disapproves of the proposal. - -Even though the Senate may have twelve members at any time, it is not guaranteed that there will be twelve occupied seats. With a Senate size of three, the approval threshold will be two approvals. Since `Dave` and `Ferdie` both approved this proposal, a member of the Triumvirate can now execute it. - -**Closing** - -`Alice` sees Senate has passed the proposal and executes the `close` extrinsic to execute the calldata within the proposal. - -Bittensor now has a new subnet on which `Alice`, `Bob`, or `Charlie` can create further proposals to change hyperparameters, allow or disallow registration, and control any other configuration previously controlled by the `sudo` private key. diff --git a/docs/governance/senators-btcli-guide.md b/docs/governance/senators-btcli-guide.md deleted file mode 100644 index 00b2a24235..0000000000 --- a/docs/governance/senators-btcli-guide.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: "Senator's Guide to `BTCLI`" ---- - -# Senator's Guide to `BTCLI` - -Governance participants (senate members, sudo-level accounts) can propose changes, cast votes, or execute privileged commands that affect the entire network. They must have a **coldkey** with the relevant governance role (senate membership or sudo privileges). - -See [Requirements for Senate participation](../senate) - -This page discusses btcli considerations specifically for Senators. For general coverage of BTCLI and permissions stuff, see: [Bittensor CLI: Permissions Guide](../btcli-permissions) - -See also: [Coldkey and Hotkey Workstation Security](../getting-started/coldkey-hotkey-security). - - -See: [Senate](../senate). - -## **Commands most relevant to governance:** -**Senate / Proposals** (coldkey with senator role): - - `btcli sudo senate` - - `btcli sudo proposals` - - `btcli sudo senate-vote` - - `btcli sudo senate_vote` - -## Key rotation - -If you suspect your coldkey may have been leaked, you can request to swap it out of your wallet, using an extrinsic blockchain transaction. This operation has a 5 day waiting period, during which your coldkey will be locked. The cost of this coldkey swap transaction is 0.1 TAO. - -See [Rotate/Swap your Coldkey](../subnets/schedule-coldkey-swap) - diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index acd733296d..0000000000 --- a/docs/index.md +++ /dev/null @@ -1,178 +0,0 @@ ---- -title: "Docs Home" -slug: "/" -hidden: false -sidebar_position: 0 -hide_table_of_contents: false ---- - -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -import { HiAcademicCap } from "react-icons/hi2"; -import { MdInstallDesktop } from "react-icons/md"; -import { FaNetworkWired } from "react-icons/fa"; -import { GiMining } from "react-icons/gi"; -import { GrValidate } from "react-icons/gr"; -import { MdOutlineChecklistRtl } from "react-icons/md"; -import { GiArchiveRegister } from "react-icons/gi"; -import { BiMath } from "react-icons/bi"; -import { RiTeamLine } from "react-icons/ri"; -import { RiGovernmentLine } from "react-icons/ri"; -import { FaGalacticSenate } from "react-icons/fa"; -import { GiStarFormation } from "react-icons/gi"; -import { HiOutlineAcademicCap } from "react-icons/hi2"; -import { VscSymbolParameter } from "react-icons/vsc"; -import { GoCommandPalette } from "react-icons/go"; -import { FaPython } from "react-icons/fa"; -import { FaRegNewspaper } from "react-icons/fa"; -import { SiFuturelearn } from "react-icons/si"; -import { GoNumber } from "react-icons/go"; -import { VscFileMedia } from "react-icons/vsc"; - - -# Bittensor Documentation - -Bittensor is an open source platform where participants produce best-in-class digital commodities, including compute power, storage space, artificial intelligence (AI) inference and training, protein folding, financial markets prediction, and many more. - -Bittensor is composed of distinct **subnets**. Each subnet is an independent community of miners (who produce the commodity), and validators (who evaluate the miners' work). - -The Bittensor network constantly emits liquidity, in the form of its token, TAO ($\tau$), to participants in proportion to the value of their contributions. Participants include: - -- **Miners**—Work to produce digital commodities. See [mining in Bittensor](./miners/index.md). -- **Validators**—Evaluate the quality of miners' work. [See validating in Bittensor](./validators/index.md) -- **Subnet Creators**—Manage the incentive mechanisms that specify the work miners and validate must perform and evaluate, respectively. See [Create a Subnet](./subnets/create-a-subnet) -- **Stakers**—TAO holders can support specific validators by staking TAO to them. See [Staking](./staking-and-delegation/delegation). - -:::tip Browse the subnets -Browse the subnets and explore links to their code repositories on [TAO.app](https://www.tao.app)'s subnets listings. -::: - - - - - - - - - - -## Participate - - -You can participate in an existing subnet as either a subnet validator or a subnet miner, or by staking your TAO to running validators. - - - - - - - - - - - ---- - -## Running a subnet - -Ready to run your own subnet? Follow the below links. - - - - - - - - ---- - -## Bittensor CLI, SDK, Wallet SDK - -Use the Bittensor CLI and SDK and Wallet SDK to develop and participate in the Bittensor network. - -:::caution looking for legacy bittensor 7.4.0 docs? -See [Legacy Bittensor 7.4.0 Documentation](pathname:///legacy-python-api/html/index.html). -::: - - - - - - diff --git a/docs/keys/handle-seed-phrase.md b/docs/keys/handle-seed-phrase.md deleted file mode 100644 index c1b2bb19b5..0000000000 --- a/docs/keys/handle-seed-phrase.md +++ /dev/null @@ -1,139 +0,0 @@ ---- -title: "Handle your Seed Phrase/Mnemonic Securely" ---- - -# Handle your Seed Phrase/Mnemonic Securely - -The seed phrase (a.k.a. 'menemonic' or 'recovery phrase') is a series of (at least 12) words that is generated together with your wallet's cryptographic key pair, and which can be used to recover the coldkey private key. This seed phrase is therefore a human-usable way to save access to the cryptographic wallet offline, and to import the cryptographic wallet into a wallet application. - -Whoever holds the seed phrase has full control over the wallet, so you should treat it like the keys to your digital safe. If someone else gains access to it, they can steal your assets. If you lose it, your assets are lost forever. - -There are two categories of security failure with a secret like a seed phrase/mnemonic: - -- To *lose* the secret means no longer having access to it. This implies permanent, unrecoverable loss of the resources (TAO and alpha stake, subnet creator permissions on a subnet, etc.) controlled by a Bittensor coldkey private key. -- To *leak* the secret means accidentally giving someone else access to it. This may result in them stealing your resources, or further leaking it to others who may in turn act maliciously. If your secret is leaked, you can (and should) rotate it, i.e. perform a coldkey swap. - - See: [Rotating your coldkey](../getting-started/coldkey-hotkey-security#rotating-your-coldkey) - -## Do not leak your keys/seed phrase - -1. Do not keep paper/analog copies somewhere they can be accessed without your knowledge. -1. Do not expose your seed phrase to untrustworthy software by entering into applications: - - messaging - - email - - online word processors -1. Beware key-logging software if you enter your seed phrase. Never enter your seed phrase on a device that may be compromised with malware! -1. Beware screen capture software if you generate and export your seed phrase. Never enter your seed phrase on a device that may be compromised with malware! -1. Beware cameras and eye-balls (the "over the shoulder" attack) if you generate and export your seed phrase. Don’t write it down or display it on screen in public or semi-public places. - -## Do not lose your keys/seed phrase - -You must keep redundant backups of your coldkey. If you lose all access to your seed phrase/initialized wallets, you permanently and unrecoverably lose access to your account (TAO, stake, etc.). - -## Backup tactics - -Every option for backing up a seed phrase has pros and cons, and a full backup strategy relies on a combination of tactics that offers you a reasonable balance of security and accessbility. - -### Multiple-locations - -Keep redundant backups in separate, secure physical locations. - -Ensure that a single point of failure—like fire, flood, or theft—cannot destroy all copies. - -### Paper - -Tactics: - -- Write your seed phrase on acid-free, archival-quality paper. -- Store it in a tamper-evident envelope in a locked safe or safety deposit box. -- Avoid common paper degradation risks: humidity, fire, ink fade, etc. - -Pros: - -- No risk of digital leak (except cameras). -- Can be hard to lose if properly secured in a safe. - -Cons: -- Easy to leak if physical security is compromised (anyone can read or take a picture of it when the paper is exposed). -- Easy to lose to physical disaster (e.g. fire). - -### Metal - -Tactic: Etch or stamp your seed phrase onto a metal plate. - -Pros: Extremely resistant to loss by destruction (e.g. fire). - -Cons: Easy to leak if physical security is compromised (anyone can read or take a picture of it when the plate is exposed). - -### Encrypted drive - -Tactics: -- Save the seed phrase in an encrypted text file on a USB drive. -- Use strong, unique passphrases and encrypt using industry-standard tools (e.g., GPG, VeraCrypt). -- Store the USB in a secure physical location—never leave it connected to a device. -- Only connect the USB drive to secure coldkey workstations. - -### Hardware wallet - -A hardware wallet such as a Ledger device that has a coldkey loaded into it can act as a backup, in a sense. It cannot be used to exfiltrate the seed phrase, but it can be used to transfer out assets or even coldkey swap to a new coldkey. - -Pros: - -- Strong protection against leaks -- Tamper-resistant, PIN-protected - -Cons: - -- Signing device, *not* full backup; cannot export seed phrase -- If lost and not backed up elsewhere, access is lost -- High risk of loss due to mistaken factory reset (e.g. wrong PIN too many times) - -:::danger -Only to be used in addition to backups of the seed phrase. -::: - -Here’s a concise, on-brand section you can drop into your doc, matching the tone and structure of the others: - -### Mobile phone vault (e.g. Polkadot Vault) - -[Polkadot Vault](https://wiki.polkadot.network/general/polkadot-vault/) turns a smartphone into an air-gapped signing device. It holds your private keys securely offline and is used only to sign transactions via QR code. - -Pros: - -- Strong protection against remote compromise (air-gapped and network-disabled). -- No direct exposure of seed phrase during signing. -- Can be used to sign extrinsics without revealing keys to online devices. - -Cons: - -- Signing device, *not* full backup; cannot export seed phrase -- Physical access can compromise keys. -- Requires careful configuration for offline mode. -- App updates require full device reset and recovery from seed. - -:::tip -Use only a repurposed device kept permanently offline. -::: - -### Shamir's Secret Sharing - -[Shamir’s Secret Sharing (SSS)](https://en.wikipedia.org/wiki/Shamir%27s_secret_sharing) is a cryptographic method for securely splitting a secret—like your seed phrase—into multiple pieces or “shares.” A minimum number of these shares must be recombined to reconstruct the original secret. This offers strong protection against both loss and leak. - -For example, you might split a seed phrase into 5 shares, requiring any 3 to restore the secret. These can be stored separately or given to different custodians. - -Pros: - -- Extremely resistant to both single-point loss and leakage: - - The leak of any share does not compromise your wallet. - - The loss of any share does not result in loss of the wallet. -- Shares can be safely distributed across multiple locations or people. - -Cons: -- Imposes additional operational complexity. -- Stored secret is no longer human readable. Can be remedied with [slip39](https://github.com/satoshilabs/slips/blob/master/slip-0039.md). - -Tools: -- [`sssa-golang`](https://github.com/SSSaaS/sssa-golang): An implementation of Shamir's Secret Sharing Algorithm in Go. -- [Banana Split](https://github.com/paritytech/banana_split): Open source tool that uses a variation of SSS to split a seed phrase into QR codes. -- [PyCryptodome SSS](https://pycryptodome.readthedocs.io/en/latest/src/protocol/ss.html): A Python-based implementation of the Shamir scheme. - diff --git a/docs/keys/multisig.md b/docs/keys/multisig.md deleted file mode 100644 index da1bc86bcd..0000000000 --- a/docs/keys/multisig.md +++ /dev/null @@ -1,139 +0,0 @@ ---- -title: "Secure your Coldkey with a Multisig" ---- - -# Secure a Coldkey with a Multisig - -A multisig (multiple signatories) wallet is a way of distributing responsibility for a coldkey across a set of wallets, referred to as signatories. Any signatory can propose a transaction, but the action must be agreed by some threshold of others before it will execute. Conventionally, a multisig is described as "$M$ out of $N$", where $M$ is the threshold number of signatories required to sign a transaction and $N$ is the total number of signatories. The signatories on a multisig may be seperate people, or a set of keys controlled by a single individual. This gives multisigs great versatility in providing security against single points of failure, including the loss of a single key or the decision of a team-mate to act irresponsibly. - -A multisig account requires multiple signatories to approve a transaction before it is executed. This prevents a single point of failure, adding a strong layer of protection against malicious coldkey access. In Bittensor, this level of protection may be appropriate for very valuable wallets. This includes those with creator permissions over a subnet and those that control validator hotkeys with significant stake, but it can also include any individual wallet used for holding TAO and staking. - -This page will guide the user through an example practice workflow of creating a multisig wallet and transferring TAO to and from it. For ease of practice, this entire workflow will be executed on a single workstation. However, in a realistic scenario, one or more operators would need to perform the steps on independent secure coldkey workstations in order to reap the full security benefits of a multisig configuration. - -## Prerequisites - -- [Install the latest version of BTCLI](../getting-started/install-btcli) -- Acquire some Testnet TAO. -- Polkadot-JS: This tutorial will employ the Polkadot-JS browser app, which allows users to submit transactions to Polkadot-based chains, including Bittensor. To use your coldkey private keys with the Polkadot-JS app, you must install the wallet browser extension, which is available for Firefox or Chrome. - -## Provision and configure your workstation - -A multisig depends on a set of pre-existing coldkeys, which will serve as the signatories for the multisig. In a realistic scenario, these coldkeys would belong to separate people--team-mates collectively managing a subnet or validator, for example, or family members managing a shared investment. - -For this simple example, we will use a two of three multisig, meaning total number $N$ of signatories on the multisig is 3, and 2 signatures are required to authorize a transaction. - -### Keep security in mind - -Coldkeys private keys and seed phrases for wallets with real (mainnet) TAO are **critical secrets**. - -In a realistic scenario, using wallets with real (mainnet) TAO, it would be crucial to follow proper workstation security. This implies that each coldkey would be provisioned to its own secure coldkey workstation, as maintaining separate workstations for each coldkey is important for minimizing the risk that multiple of the keys are lost or leaked; storing or handling the keys together undermines the purpose of having multiple keys. - -See [Coldkey and Hotkey Workstation Security](../getting-started/coldkey-hotkey-security). - -In the current *practice* scenario, using testnet TAO, we will forego full workstation security for ease, and handle all three keys on a single workstation, which can be an ordinary laptop rather than a secure workstation. - -### Configure the target network in the Polkadot-JS web app. - -1. Visit the [Polkadot-JS explorer web app](https://polkadot.js.org/apps). -1. Click the blockchain selector tab in the upper lefthand corner of the web page, next to **Accounts**. This is set to **Polkadot** main chain by default. -1. Scroll down and open **Development** at the bottom of the Chains menu, and paste the address for the Bittensor test chain into **custom endpoint**: `wss://test.finney.opentensor.ai:443`. - - You should see the page update and display live information about Bittensor testnet. - -### Create and import 3 coldkey pairs ("accounts") in the Polkadot-JS browser extension - -Each of our 3 signatories needs a wallet. Either create them or re-use available test wallets. - -1. Use `btcli` to create three coldkeys/wallets, or use practice wallets you already have access to. Alternatively, you can create wallets in the Polkadot-JS browser extension. - - See [Creating/Importing a Bittensor Wallet](../working-with-keys). - -1. Load each key into the Polkadot-JS wallet browser extension: - 1. Click to open the browser extension. - 1. Click **+**, then select **Import account from pre-existing seed**. - 1. Provide your seed phrase to regenerate your wallet's coldkey private key. - -1. Configure your keys to use the custom network (Bittensor's test net). For each key/**account**: - 1. Click the menu (three dots) to configure the account. - 1. Open the network dropdown selector, and choose **Allow use on any chain**. - -1. You may need to allow the PolkadotJS webapp to use specific wallets by clicking **connect** in the extension. - -1. You may need to refresh the PolkadotJS webapp to show updated accounts information. - -1. Confirm success by visiting the [accounts page](https://polkadot.js.org/apps/#/accounts). You should see all three wallets/accounts listed as **accounts available via browser extensions**. - -## Create the multisig - -In this step, we'll create the multisig wallet, specifying the signatory wallets. - -1. Navigate to the [accounts page](https://polkadot.js.org/apps/#/accounts). - -1. Click **+ Multisig**. In the **add multisig** modal: - 1. Select from the available signatories, which must be in your address book (if they are not, add them from the Accounts/Address book tab). - 1. Set the **threshold**. - 1. Set a name. - 1. Click **create**. - -1. Use `btcli w regen_coldkeypub --wallet.name multisig` to add the wallet's public key to BTCLI. -1. View its balance information with `btcli view dashboard --wallet.name multisig`. - -## Transfer TAO to the multisig wallet. - -1. Find the multisig wallet's coldkey public key on the [accounts page](https://polkadot.js.org/apps/#/accounts), listed under **multisig**. Click on the wallet/account to open it's show modal, then click **Copy** by the account name and address/public key to copy it out. -1. Use BTCLI to transfer testnet TAO to the mutlisig wallet. - 1. Run `btcli wallet transfer`. - 1. Provide the multisig wallet's coldkey public key. - 1. Specify the amount. It's recommended to do a small transfer first to confirm the address, even with testnet TAO. -1. To confirm the transfer, view the multisig wallet in the accounts page or the BTCLI dashboard. It should show the TAO from the transfer almost immediately. - -## Transfer TAO from the multisig - -Let's try executing a sensitive operation with the multisig wallet: transferring TAO. Choose any destination wallet that you control. It can be one of the signatories. Note this wallet's balance, so you can confirm the transaction's ultimate success by seeing the increase in that balance. - -To transfer TAO out of the multisig wallet requires a multisig transaction, meaning it must be approved by threshold $M$ of the $N$ total signatories. First, one wallet must propose the transaction. This proposal will exist on the blockchain where it can be signed by other signatories, which will execute the proposed transaction. - -Note that the signatory that proposes a multisig action must make a deposit that will be returned upon approval or rejection of the transaction, the amount of which will be displayed in the multisig transaction modal. The wallet that will propose the multisig transaction must have a balance above this amount. - -### Propose the transfer - -1. In the Polkadot-JS web app, click the **Developer** tab and select Extrinsics, or navigate to the extrinsics page at [polkadot.js.org/apps/#/extrinsics](https://polkadot.js.org/apps/#/extrinsics). -1. Under **using the selected account**, select the multisig wallet. Note that the multisig wallet's TAO balance is displayed. -1. Under **submit the following extrinsic**: - 1. Select the `balances` module (from the lefthand dropdown menu). - 1. Select `transferKeepAlive`. -1. Under **Id: AccountId**, paste in the coldkey public key for the destination wallet. -1. Under **value**, put the amount of TAO to transfer. This amount must be available in the multisig wallet. -A wallet with a test TAO balance sufficient to pay the fee -1. Copy out the **encoded call data**, which other signatories will need to sign the transaction. -1. Copy out the **encoded call hash**, which other signatories will need to confirm the details of the transaction. -1. Copy out the **link** under **encoding details**, which will allow other signatories to view the details of the transaction and confirm it against the encoded call hash. -1. Click **Submit Transaction**. -1. In the **authorize transaction** modal, select the signatory. - - Note that this should be selected as a **multisig signatory**, not as a **proxy account**. You may need to toggle the **Use a proxy for this call** switch to **Don't use a proxy for this call**. - -1. Select **Multisig approval with hash (non-final approval)**, not **Multisig message with call (for final approval)**. -1. Click **Sign and Submit**. - -### Approve the transaction - -1. Return to the [accounts page](https://polkadot.js.org/apps/#/accounts). -1. Find the multisig wallet, noting that it should now display a clickable element for **view pending approvals**. You can also click on the wallets three dot menu and select **Multisig approvals**. -1. The approval modal will display the **encoded call hash**, allowing signatories to confirm the identity of the proposed transaction, but it does not display details about the call. - - To view details of the call, visit the link provided under **encoding details** when creating the transaction proposal. - - :::caution - Confirm that the **call hash** in the details link matches the **call hash** in the transaction you are approving. This is the only way to be certain you are approving the correct transaction. - ::: - -1. Select the approving signatory, which cannot be the signatory who proposed the transaction. -1. If you are the final approver, enter the **encoded call data**, which was provided when the transaction was created, and is displayed at the top of the page at the **encoding details** link. -1. Set the toggle to **Multisig message with call (for final approval)**. -1. Click **Approve**, which will open the signing modal. -1. Confirm the information and click **Sign and Submit**. - -### Confirm success - -Check the multisig wallet's balance, which should have decreased by the transfer amount, and the destination wallet, which should have increased. \ No newline at end of file diff --git a/docs/learn/anatomy-of-incentive-mechanism.md b/docs/learn/anatomy-of-incentive-mechanism.md deleted file mode 100644 index d2b92f63c3..0000000000 --- a/docs/learn/anatomy-of-incentive-mechanism.md +++ /dev/null @@ -1,97 +0,0 @@ ---- -title: "Understanding Incentive Mechanisms" ---- - -# Understanding Incentive Mechanisms - -This page explores the concept and usage of incentive mechanisms in Bittensor. - -See [Components of the Bittensor platform](../learn/bittensor-building-blocks) for an explanation of the basics, such as subnets, miners, validators, and the role of the blockchain. - -Each subnet has its own *incentive mechanism*, a scoring model that drives the behavior of its participants, and the production of the subnet's digital commodity, by defining **how validators are to evaluate miners’ work**. Miners are incentivized to optimize for this model so validators will score (or 'weight') their work highly, resulting in higher emissions. Validators are incentivized to accurately score miners' work according to the model because the algorithm penalizes departure from consensus in miner scores with lower emissions. - -Each validator on a subnet is responsible for periodically computing a vector of weights assigned to each miner, representing an aggregate ranking based on the miners' performance. Validators transmit these **weight vectors** to the blockchain. Typically, each subnet validator transmits an updated ranking weight vector to the blockchain every 100-200 blocks. - -The Bittensor blockchain waits for the latest ranking weight vectors from all the subnet validators of a given subnet, then forms a **weight matrix** from these ranking/weight vectors, which is then provided as input to the Yuma Consensus module on-chain. Yuma Consensus (YC) uses this weight matrix, along with the amount of stake associated with each UID on the subnet, to calculate emissions to each participant within each subnet. These emissions are finalized and debited to participants' hotkeys at the end of each *tempo* or 360 blocks. - -:::tip note -The tempo duration (360 blocks) is the same for all the user-created subnets. However, the timing of tempos can differ among subnets, depending on when they were created. -::: - -## Subnet creator responsibilities - -In order for a subnet to succeed, the creator must: - -- Design an incentive mechanism that guides miners' relentless tendency to opimize their scores (and hence emissions) toward the desired outcomes -- Facilitate miner and validator participation -- Prevent miner and validator exploits - -### Enable participation - -To attract high-performing subnet miners and subnet validators, make sure that you publish sufficient documentation on your subnet. - -:::tip Good docs are important! -Make sure that your subnet documentation helps developers successfully onboard to mining and validating. -::: - -After a subnet validator registers into your subnet, they will run the validator module to begin the validation operation. Similarly, a subnet miner will register and then run the miner module. For example, see the following documents in the text prompting subnet for a quick view of these steps: - -- [Running a validator](https://github.com/opentensor/prompting/blob/main/docs/SN1_validation.md). -- [Running a miner](https://github.com/opentensor/prompting/blob/main/docs/stream_miner_template.md). - -### Discourage exploits - -A well-designed incentive mechanism fosters a virtuous cycle, where competition drives continuous miner improvement. Conversely, a flawed mechanism encourages shortcuts and exploits that degrade the subnet’s integrity and undermine participation. - -Ensure that your IM is proofed against gaming or unintended shortcuts through thorough modeling, testing, and community vetting. As a subnet creator, expect to continuously monitor miner performance and update your IM to fine-tune it as needed. - -### Design incentive mechanism - -Research what other subnet creators are doing. - -Browse the subnets and explore links to their code repositories on [TAO.app's subnets listings](https://tao.app), and learn about the latest research on subnet design, which is an active area. - -## Components of an incentive mechanism - -A subnet incentive mechanism must provide the following: - -- A protocol for how validators query miners and how miners respond -- A task definition for the work miners are to perform -- A scoring mechanism for validators to use in evaluating miners' work - -### Miner-validator protocol - -A subnet creator must define a protocol for how validators are to query miners, and how miners should respond. Protocols are built using the Axon-Dendrite client-server model and Synapse data objects. - -See [Neuron to neuron communication](./bittensor-building-blocks.md#neuron-to-neuron-communication). - -### Subnet task - -The task is one of the key components of any incentive mechanism as it defines what miners will perform as work. Examples of tasks are responding to natural language prompts and storing encrypted files. The task should be designed to capture intended use case for commodity to be produced by the subnet. Generally, the task should realistically mimic an intended user interaction with a subnet. - -### Subnet scoring model - -Where the task describes **what** miners should do, the scoring model dictates **how** it should be done. Similarly, just as tasks should mimic user interactions, scoring models should mimic user preferences or desired outcomes. - -As with any machine learning model, a subnet has an objective function that it is continuously optimizing. The scoring model defines the quality of all miner behavior in the subnet (both intended and unintended). - -Operationally, it is the mathematical object that converts miner responses into numerical scores. A scoring model can in fact contain as many different scoring mechanisms as are necessary to align miners with the intended task. - -Miners will continuously compete to achieve the highest score possible, since it determines their emissions. If the score is capped at an upper limit, miners may not be motivated to improve further. Hence care should be taken to enable continuous improvement of the miner, rather than stagnation. - -:::tip The zen of incentive mechanisms -Subnets should be endlessly improving. -::: - -## Additional considerations for incentive mechanism design - -- Take miner hardware into account, where it may cause differences in output, or in judging performance. -- Set tight similarity thresholds if exact reproducibility is challenging. For example, compare embeddings (like CLIP) or apply perceptual hashing. -- Take steps to prevent miners from precomputing or caching results: - - Use validator-provided random seeds; avoid letting miners control all the randomness in the output. - - Introduce small input variations. - - Ensure your scoring logic prevents partial outputs from being judged as similar to complete results. -- Consider carefully how to balance speed, reliability, and quality. -- Consider incorporating organic queries into the validation process. -- Expect to frequently release updates that refine your incentive mechanism and address emergent exploits or other points of suboptimality. The best subnets update frequently, accomodating new hardware, new models, and new miner behaviors. -- Observe other subnets. Many solutions—like adopting multi-model strategies or partial randomization—can be adapted to your own. diff --git a/docs/learn/bittensor-building-blocks.md b/docs/learn/bittensor-building-blocks.md deleted file mode 100644 index 5e2c1b6ce3..0000000000 --- a/docs/learn/bittensor-building-blocks.md +++ /dev/null @@ -1,79 +0,0 @@ ---- -title: "Understanding Neurons" ---- - -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Understanding Neurons - -The design of Bittensor subnets is inspired by the structure of a simple neural network, with each **neuron** being either a miner or validator. - -:::tip Neuron requirements -See [minimum compute requirements](https://github.com/opentensor/bittensor-subnet-template/blob/main/min_compute.yml) for compute, memory, bandwidth and storage requirements for neurons. -::: - - -## Neuron Architecture Overview - -Neurons in a subnet operate within a server-client architecture: - -- Axon (Server): Miners deploy Axon servers to receive and process data from validators. -- Dendrite (Client): Validators use Dendrite clients to transmit data to miners. -- Synapse (Data Object): Encapsulates and structures data exchanged between neurons. - -Additionally, the [Metagraph serves as a global directory for managing subnet nodes, while the Subtensor connects neurons to the blockchain. - - -## Neuron-to-neuron communication - -Neurons exchange information by: -- Encapsulating the information in a Synapse object. -- Instantiating server (Axon) and client (dendrite) network elements and exchanging Synapse objects using this server-client (Axon-dendrite) protocol. See the below diagram. - -
- -
- -### Axon - -The `axon` module in Bittensor API uses FastAPI library to create and run API servers. For example, when a subnet miner calls, -```python -axon = bt.axon(wallet=self.wallet, config=self.config) -``` -then an API server with the name `axon` is spawned on the subnet miner node. This `axon` API server receives incoming Synapse objects from subnet validators, i.e., the `axon` starts to serve on behalf of the subnet miner. - -Similarly, in your subnet miner code you must use the `axon` API to spawn an API server to receive incoming Synapse objects from the subnet validators. - -### Dendrite - -Axon is a **server** instance. Hence, a subnet validator will instantiate a `dendrite` **client** on itself to transmit information to axons that are on the subnet miners. For example, when a subnet validator runs the below code fragment: - -```python - responses: List[bt.Synapse] = await self.dendrite( - axons=axons, - synapse=synapse, - timeout=timeout, - ) -``` - -then the subnet validator: -- Has instantiated a `dendrite` client on itself. -- Transmitted `synapse` objects to a set of `axons` (that are attached to subnet miners). -- Waits until `timeout` expires. - -### Synapse - -Synapse is a data object. Subnet validators and subnet miners use Synapse data objects as the main vehicle to exchange information. The Synapse class inherits from the `BaseModel` of the Pydantic data validation library. - -For example, in the [Text Prompting Subnet](https://github.com/macrocosm-os/prompting/blob/414abbb72835c46ccc5c652e1b1420c0c2be5c03/prompting/protocol.py#L27), the subnet validator creates a Synapse object, called PromptingSynapse, with three fields. The fields `roles` and `messages` are set by the subnet validator during the initialization of this Prompting data object, and they cannot be changed after that. A third field, `completion`, is mutable. When a subnet miner receives this Prompting object from the subnet validator, the subnet miner updates this `completion` field. The subnet validator then reads this updated `completion` field. - -## The Neuron Metagraph - -A metagraph is a data structure that contains comprehensive information about current state of the subnet. When you inspect the metagraph of a subnet, you will find detailed information on all the nodes (neurons) in the subnet. A subnet validator should first sync with a subnet's metagraph to know all the subnet miners that are in the subnet. The metagraph can be inspected without participating in a subnet. \ No newline at end of file diff --git a/docs/learn/introduction.md b/docs/learn/introduction.md deleted file mode 100644 index afe2ac9629..0000000000 --- a/docs/learn/introduction.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: "Introduction to Bittensor" ---- - -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Introduction to Bittensor - -This page will orient the reader with the major concepts and components of Bittensor, and provide the roadmap to developing in the ecosystem. - -## Components of the Bittensor platform - -The Bittensor platform consists of the following components: - -1. A pool of ***subnets***. Each subnet is an incentive-based competition marketplace that produces a specific kind of digital commodity related to artificial intelligence. It consists of a community of ***miners*** who produce the commodity, and a community of ***validators*** who measure the miners' work to ensure its quality, according to subnet-specific standards. - - Each subnet is its own community, with its own goal, operating according to its own standards. For example, the [text prompting subnet](https://github.com/opentensor/prompting), developed by the Open Tensor foundation, incentivizes subnet miners that produce the best prompt completions in response to the prompts sent by the subnet validators in that subnet. - - To explore existing subnets, check out [the listings on TAO.app](https://tao.app), or engage with [Bittensor subnet communities on Discord](https://discord.com/channels/799672011265015819/830068283314929684). - -2. The ***Bittensor blockchain*** serves as a system of record, and its token TAO (τ) serves as incentive for participation in subnet activities. Miners and validators harvest TAO based on both their performance within subnets, and on the performance of those subnets within Bittensor. Hence, emission of TAO incentivizes miners and validators to do their best, creating the perfect conditions for continuous improvement. The Bittensor blockchain records balances and transactions for miners, validators and subnet creators, and allows arbitrary parties to stake currency into subnets in order to support their work. - -3. The ***Bittensor SDK***, which supports interactions between miners and validators within subnets, and allows all parties to interact with the blockchain as necessary. - - Bittensor provides all the open source tools, codebase and the documentation, with step-by-step tutorials and guides, to enable you to participate in the Bittensor ecosystem. - - - - -## Bittensor personas - -The following roles define the ways to participate in Bittensor, and which are covered in the documentation on this website: - -- **Miners**—Work to produce digital commodities. See [mining in Bittensor](../miners/index.md). -- **Validators**—Evaluate the quality of miners' work. [See validating in Bittensor](../validators/index.md) -- **Subnet creators**—Manage the incentive mechanisms that specify the work miners and validate must perform and evaluate, respectively. See [Create a Subnet](../subnets/create-a-subnet) -- **Stakers**—TAO holders can support specific validators by staking TAO to them. See [Staking and Delegation](../staking-and-delegation/delegation). - - -The documentation also describes the role of **Blockchain operator**. This applies during offline testing only, when the user runs a local instance of Subtensor as its own independent chain, not connected to either the Bittensor main or test network. - -See [Running a Subnet Locally](https://github.com/opentensor/bittensor-subnet-template/blob/main/docs/running_on_staging.md) - -:::tip Browse the subnets -Browse the subnets and explore links to their code repositories on [TAO.app's subnets listings](https://tao.app). -::: - -## Subnet development - -Whether creating a new subnet or joining a pre-existing subnet, you should always start by first testing the subnet incentive mechanism **locally**, then on the Bittensor **testchain** and finally go live by connecting to the Bittensor **mainchain**. See the below conceptual deployment diagram showing the three stages. - -Testing the incentive mechanism means running one or more validators and miners to ensure that emissions are being harvested as understood and intended. - -:::tip Before you participate in a subnet -We recommend all subnet participants to become familiar with the incentive mechanism before joining a subnet or creating a new subnet. -::: - - - \ No newline at end of file diff --git a/docs/local-build/create-subnet.md b/docs/local-build/create-subnet.md deleted file mode 100644 index f6ed712a54..0000000000 --- a/docs/local-build/create-subnet.md +++ /dev/null @@ -1,173 +0,0 @@ ---- -title: "Create a Subnet (Locally)" ---- - -# Create a Subnet (Locally) - -This page covers creating a subnet on a locally deployed Subtensor blockchain, which is useful for local Bittensor development. - -For creating a subnet on Bittensor test and main network, see [Create a Subnet](../subnets/create-a-subnet). - -Prerequisites: -- [Deploy a Subtensor chain locally](./deploy) -- [Provision wallets for the sn-creator, miner, and validator users for this tutorial.](./provision-wallets) - - -## Create subnet - -To access the handy pre-provisioned development "Alice" account on your local chain, use: - -```shell -btcli subnet create \ ---subnet-name awesome-first-subnet \ ---wallet.name sn-creator \ ---subtensor.chain_endpoint ws://127.0.0.1:9945 -``` -### Trouble shoot -#### Insufficient funds - -If you are following this tutorial for the first time, the `subnet create` command will faill with an insufficient balance error. - -The coldkey signing the `subnet create` transaction must have a sufficient $\tau$ balance to cover the burn cost of subnet creation, so called because the funds cannot be recovered. - -```console -Subnet burn cost: τ 1,000.0000 -Your balance of: τ 0.0000 is not enough to burn τ 1,000.0000 to register a subnet. -``` - -Transfer funds from the Alice account to cover it and try again. Consult `btcli w list` and carefully check the ss58 address of the destination coldkey (in this case, the one with the name `sn-creator`). - -```shell -btcli wallet transfer \ ---amount 1001 \ ---wallet.name alice \ ---destination "5C9xw4..." \ ---subtensor.chain_endpoint ws://127.0.0.1:9945 -``` - - -#### Network Rate Limit Error - -If you see a network rate limit error, you may need to adjust the `SubtensorInitialNetworkRateLimit` chain state parameter. - -See [Clone and tweak the Subtensor source](./deploy#clone-and-tweak-the-subtensor-source) - -### Burn cost - -The burn cost for subnet creation is dynamic; it lowers gradually and doubles every time a subnet is created. - -:::tip try it live - -Check the burn cost to create a subnet on Bittensor main network and test network: - - - - - -```shell -btcli subnet burn-cost --network finney -``` - - - -```shell -btcli subnet burn-cost --network test -``` - - -::: - -## Fund your subnet - -To remedy your liquidity shortfall, transfer $\tau$ from the Alice account and try again. - -1. First, get the ss58 address for the destination wallet for the transfer: - ```shell - btcli w list - ``` - ```shell - ... - ── Coldkey sn-creator ss58_address 5C9xw4gDyu11ocdpWrmhT1sbi4xEHCpzEMsyMA4jGfAZQofQ - └── Hotkey default ss58_address 5GVsCAY6RuSuoAA1E77xsHJ9PjdZJjJrRkNFDxVtRKPnw7TR - ``` -1. Execute the transfer from alice to the sn-creator wallet - - ```console - btcli wallet transfer \ - --amount 1001 \ - --wallet.name alice \ - --destination "5GVsCAY6RuSuoAA1E77xsHJ9PjdZJjJrRkNFDxVtRKPnw7TR" \ - --subtensor.chain_endpoint ws://127.0.0.1:9945 - ``` - - ```shell - Do you want to transfer: - amount: τ 1,001.0000 - from: alice : 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY - to: 5GVsCAY6RuSuoAA1E77xsHJ9PjdZJjJrRkNFDxVtRKPnw7TR - for fee: τ 0.0001 [y/n]: y - 🌏 📡 Transferring... - ``` -## Success -Create some subnets. - -For example: - -```shell -btcli subnet create \ ---subnet-name awesome-first-subnet \ ---wallet.name sn-creator \ ---subtensor.chain_endpoint ws://127.0.0.1:9945 -``` -```console -Subnet burn cost: τ 1,000.0000 -Your balance is: τ 1,001.0000 -Do you want to burn τ 1,000.0000 to register a subnet? [y/n]:y -Enter your password: -Decrypting... -🌏 📡 Registering subnet.. -``` - - -```shell - btcli subnet create \ ---subnet-name awesome-second-subnet \ ---wallet.name sn-creator \ ---subtensor.chain_endpoint ws://127.0.0.1:9945 -``` - -```console -Subnet burn cost: τ 1,999.9405 -▰▱▱▱▱▱▱ 📡Retrieving lock cost from custom... -Your balance is: τ 2,003.0000 -Do you want to burn τ 1,999.9405 to register a subnet? [y/n]: Please enter Y or N -Do you want to burn τ 1,999.9405 to register a subnet? [y/n]: y -Enter your password: -Decrypting... -✅ Registered subnetwork with netuid: 3 -``` - -1. List your subnets - -```shell -btcli subnet list \ ---subtensor.chain_endpoint ws://127.0.0.1:9945 -``` -```console - Subnets - Network: custom - ┃ ┃ Price ┃ Market Cap ┃ ┃ P (τ_in, ┃ Stake ┃ ┃ - Netuid ┃ Name ┃ (τ_in/α_in) ┃ (α * Price) ┃ Emission (τ) ┃ α_in) ┃ (α_out) ┃ Supply (α) ┃ Tempo (k/n) -━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━ - 0 │ τ root │ 1.0000 τ/Τ │ τ 0.00 │ τ 0.0000 │ -, - │ Τ 0.00 │ 0.00 Τ /21M │ -/- - 2 │ β │ 1.0000 τ/β │ τ 1.00k │ τ 0.0000 │ τ 1.00k, │ 0.00 β │ 1.00k β │ 29/360 - │ awesome-fi… │ │ │ │ 1.00k β │ │ /21M │ - 3 │ γ │ 1.0000 τ/γ │ τ 1.00k │ τ 0.0000 │ τ 1.00k, │ 0.00 γ │ 1.00k γ │ 29/360 - │ awesome-se… │ │ │ │ 1.00k γ │ │ /21M │ - 1 │ α apex │ 1.0000 τ/α │ τ 11.00 │ τ 0.0000 │ τ 10.00, │ 1.00 α │ 11.00 α │ 29/100 - │ │ │ │ │ 10.00 α │ │ /21M │ -────────┼─────────────┼─────────────┼─────────────┼──────────────┼─────────────┼──────────────┼─────────────┼───────────── - 4 │ │ τ 3.0 │ │ τ 0.0 │ τ │ │ │ - │ │ │ │ │ 2.01k/29.00 │ │ │ - │ │ │ │ │ (6931.03%) │ │ │ -``` \ No newline at end of file diff --git a/docs/local-build/deploy.md b/docs/local-build/deploy.md deleted file mode 100644 index 3594d8b882..0000000000 --- a/docs/local-build/deploy.md +++ /dev/null @@ -1,135 +0,0 @@ ---- -title: "Build and Deploy the Blockchain" ---- - -# Deploy a Local Bittensor Blockchain Instance - -This tutorial will guide the user through deploying a local instance of Subtensor, Bittensor's L1 blockchain. This is useful in general Bittensor development, as it gives you more freedom over chain state than when working against mainnet or even testnet. For example, it is much easier to create subnets without having to wait for registration availability. - -Each local chain is provisioned with an `alice` account with one million $\tau$. - -In the following tutorial, we will also provision several wallets to serve as subnet creator, miner, and validator. - -## Prerequisites - -- Update your mac or linux workstation using your package manager -- Install [Bittensor SDK](../getting-started/installation) and [BTCLI](../getting-started/install-btcli) - - -## Build your local Subtensor -### Install Rust/Cargo - -To run locally, Substrate requires an up-to-date install of Cargo and Rust - -Install from Rust's website: -```shell -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -``` -Update your shell's source to include Cargo's path: - -```shell -source "$HOME/.cargo/env" -``` - -### Clone and tweak the Subtensor source - -We well clone the source and make a small modification to the state configuration with which the chain is deployed. - -Normally, the creation of new subnets is limited to one per day. This is inconvenient for local subnet development, so we will limit this restriction. - - - -1. Fetch the subtensor codebase to your local machine. - - ```bash - git clone https://github.com/opentensor/subtensor.git - ``` - -1. Open the source file `subtensor/runtime/src/lib.rs` in the your editor of choice, and find where the variable `SubtensorInitialNetworkRateLimit` is set. It is normally configured to 7200, which is the number of blocks per day written to the chain, i.e. the seconds in a day divided by 12, since a Subtensor block is written every twelve seconds. - -In otherwords, this setting limits the number of new subnets that can be created to one per day. Let's change the value to 1 (block), so we can create a new subnet every 12 seconds if we want to. - - -### Setup Rust - -This step ensures that you have the nightly toolchain and the WebAssembly (wasm) compilation target. Note that this step will run the Subtensor chain on your terminal directly, hence we advise that you run this as a background process using PM2 or other software. - -Update to the nightly version of Rust: - -```bash -./subtensor/scripts/init.sh -``` - -### Build - -These steps initialize your local subtensor chain in development mode. These commands will set up and run a local subtensor. - -Build the binary with the faucet feature enabled: - -```bash -cd subtensor -cargo build -p node-subtensor --profile release -``` - -### Run - -Next, run the localnet script and turn off the attempt to build the binary (as we have already done this above): - -```bash -BUILD_BINARY=0 ./scripts/localnet.sh -``` - -:::info troubleshooting -If you see errors to the effect that the release cannot be found in `targets/fast-blocks`, you may need to move the build artifacts from `targets/release` to `targets/fast-blocks/release`. -::: - - -## Validate - -Ensure your local chain is working by checking the list of subnets. - -Note the use of the `--chain_endpoint` flag to target the local chain, rather than, say, test network - -```shell - btcli subnet list --subtensor.chain_endpoint ws://127.0.0.1:9945 - btcli subnet list --network test -``` - -```console - Subnets - Network: custom - - - ┃ ┃ Price ┃ Market Cap ┃ ┃ ┃ ┃ ┃ - Netuid ┃ Name ┃ (τ_in/α_in) ┃ (α * Price) ┃ Emission (τ) ┃ P (τ_in, α_in) ┃ Stake (α_out) ┃ Supply (α) ┃ Tempo (k/n) -━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━ - 0 │ τ root │ 1.0000 τ/Τ │ τ 0.00 │ τ 0.0000 │ -, - │ Τ 0.00 │ 0.00 Τ /21M │ -/- - 1 │ α apex │ 1.0000 τ/α │ τ 11.00 │ τ 0.0000 │ τ 10.00, 10.00 α │ 1.00 α │ 11.00 α /21M │ 77/100 -────────┼────────┼─────────────┼─────────────┼──────────────┼────────────────────────┼───────────────┼──────────────┼───────────── - 2 │ │ τ 1.0 │ │ τ 0.0 │ τ 10.00/175.00 (5.71%) │ │ │ - -``` - - -```shell -``` - -```console - - Subnets - Network: test - - - ┃ ┃ Price ┃ Market Cap ┃ ┃ ┃ ┃ ┃ - Netuid ┃ Name ┃ (τ_in/α_in) ┃ (α * Price) ┃ Emission (τ) ┃ P (τ_in, α_in) ┃ Stake (α_out) ┃ Supply (α) ┃ Tempo (k/n) -━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━ - 0 │ τ root │ 1.0000 τ/Τ │ τ 5.01m │ τ 0.0000 │ -, - │ Τ 3.10m │ 5.01m Τ /21M │ -/- - 277 │ इ muv │ 0.4008 τ/इ │ τ 536.06k │ τ 0.4154 │ τ 199.85k, 498.63k इ │ 838.83k इ │ 1.34m इ /21M │ 39/99 - 3 │ γ templar │ 0.1534 τ/γ │ τ 219.03k │ τ 0.1690 │ τ 110.74k, 722.13k γ │ 706.14k γ │ 1.43m γ /21M │ 65/99 - 119 │ Ⲃ vida │ 0.0748 τ/Ⲃ │ τ 94.83k │ τ 0.1321 │ τ 44.77k, 598.65k Ⲃ │ 669.45k Ⲃ │ 1.27m Ⲃ /21M │ 81/99 - 1 │ α apex │ 0.0587 τ/α │ τ 70.03k │ τ 0.0405 │ τ 30.27k, 515.71k α │ 677.20k α │ 1.19m α /21M │ 63/99 - 13 │ ν dataverse │ 0.0467 τ/ν │ τ 63.12k │ τ 0.0645 │ τ 26.93k, 576.17k ν │ 774.11k ν │ 1.35m ν /21M │ 75/99 - 255 │ ዉ ethiopic_wu │ 0.0181 τ/ዉ │ τ 21.94k │ τ 0.0133 │ τ 10.72k, 592.40k ዉ │ 619.73k ዉ │ 1.21m ዉ /21M │ 17/99 - -... -``` diff --git a/docs/local-build/mine-validate.md b/docs/local-build/mine-validate.md deleted file mode 100644 index 9c0efd4435..0000000000 --- a/docs/local-build/mine-validate.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -title: "Mine and Validate (Locally)" ---- - -# Mine and Validate (Locally) - -This page continues the tutorial series on local Bittensor development. In this installment, we will deploy minimal, local servers for a miner and validators, serving requests, setting weights, and earning emissions. - - -## Prerequisites - -- [Deploy a Subtensor chain locally](./deploy) -- [Provision wallets for the sn-creator, miner, and validator users for this tutorial.](./provision-wallets) -- [Create a Subnet on your local chain](./create-subnet) - -## Register the Miner and Validator - -Register the subnet miner and validator with the following commands: - -```bash -btcli subnet register \ ---wallet.name validator \ ---wallet.hotkey default \ ---subtensor.chain_endpoint ws://127.0.0.1:9945 -``` -```bash -btcli subnet register \ ---netuid 2 \ ---wallet.name miner \ ---wallet.hotkey default \ ---subtensor.chain_endpoint ws://127.0.0.1:9945 -``` - - - -### Troubleshoot -#### Insufficient funds -If you have not added TAO to your validator wallet, you'll see an error like the following: - -```console -Insufficient balance τ 0.0000 to register neuron. Current recycle is τ 1.0000 TAO -``` -Transfer funds from the Alice account to cover it and try again. Consult `btcli w list` and carefully check the ss58 address of the destination coldkey (in this case, the one with the name `validator`). - -```shell -btcli wallet transfer \ ---amount 11 \ ---wallet.name alice \ ---destination "5EEy34..." \ ---subtensor.chain_endpoint ws://127.0.0.1:9945 -``` - - -### Successful registration - -Repeat the above steps to successfully register your miner and validator once they are funded -```console -netuid: 2 - - - Register to netuid: 2 - Network: custom - - Netu… ┃ Sym… ┃ Cost (… ┃ Hotkey ┃ Coldkey -━━━━━━━╇━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - 2 │ β │ τ 1.00… │ 5CffqSVhydFJHBSbbgfVLAVkoNBTsv3wLj2Tsh1cr2kfa… │ 5EEy34R4gfXe5SG62nz1nDuh3KAovRLpKLm4ccSv7qkNhn… -───────┼──────┼─────────┼────────────────────────────────────────────────┼───────────────────────────────────────────────── - │ │ │ │ -Your balance is: τ 11.0000 -The cost to register by recycle is τ 1.0000 -Do you want to continue? [y/n] (n): y -Enter your password: -Decrypting... -Balance: - τ 11.0000 ➡ τ 10.0000 -✅ Registered on netuid 2 with UID 1 -▰▱▱▱▱▱▱ 📡 Recycling TAO for Registration... -``` - -### Check your registration - -Confirm your registration on the subnet with the following command: - -```shell -btcli wallet overview --wallet.name validator --subtensor.chain_endpoint ws://127.0.0.1:9945 - -btcli wallet overview --wallet.name miner --subtensor.chain_endpoint ws://127.0.0.1:9945 - -``` - -```console - Wallet - - validator : 5EEy34R4gfXe5SG62nz1nDuh3KAovRLpKLm4ccSv7qkNhnqw - Network: custom -Subnet: 2: awesome-first-subnet β - - COLDKEY HOTKEY UID AC… STA… RANK TRU… CON… INC… DIV… EMI… VTR… … U… AXON HOTKE… - ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - valida… default 1 Tr… 0.00 0.00 0.00 0.00 0.00 0.00 0.0… 0.00 51 none 5Cffq… - ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - 1 0.0… 0.0… 0.0… 0.0… 0.0… 0.0… ρ0 0.0… - - - Wallet balance: τ10.0 - - Wallet - - miner : 5DA7UsaYbk1UnhhtTxqpwdqjuxhQ2rW7D6GTN1S1S5tC2NRV - Network: custom -Subnet: 2: awesome-first-subnet β - - COLDKEY HOTKEY UID AC… STA… RANK TRU… CON… INC… DIV… EMI… VTR… … U… AXON HOTKE… - ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - miner default 2 Tr… 0.00 0.00 0.00 0.00 0.00 0.00 0.0… 0.00 22 none 5Capz… - ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - 1 0.0… 0.0… 0.0… 0.0… 0.0… 0.0… ρ0 0.0… - - - Wallet balance: τ10.0 -``` - -```shell -python3 neurons/miner.py netuid=2 -chain_endpoint=ws://127.0.0.1:9945 wallet_name=miner wallet_hotkey=default -``` \ No newline at end of file diff --git a/docs/local-build/provision-wallets.md b/docs/local-build/provision-wallets.md deleted file mode 100644 index 89611deee8..0000000000 --- a/docs/local-build/provision-wallets.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -title: "Provision Wallets for Local Deploy" ---- - -This page continues the previous tutorial for local Bittensor development. - -Now that your local Subtensor chain is deployed, you can provision wallets to serve the roles of subnet creator, miner and validator, to populate your local Bittensor ecosystem. - -Every local blockchain is pre-provisioned with an "Alice" account, which is loaded with one million $\tau$. - -## Access the Alice account - -To access the handy pre-provisioned development "Alice" account on your local chain, use: -```shell -btcli wallet create --uri alice -``` - -Confirm Alice's massive $\tau$ bag. - -```shell - btcli w balance --wallet.name alice --subtensor.chain_endpoint ws://127.0.0.1:9945 -``` - -```console - Wallet Coldkey Balance - Network: custom - - Wallet Name Coldkey Address Free Balance Staked Value Staked (w/slippage) Total Balance Total (w/slippage) - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - alice 5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY τ 999,999.8999 τ 0.0000 τ 0.0000 τ 999,999.8999 τ 999,999.8999 - - - - Total Balance τ 999,999.8999 τ 0.0000 τ 0.0000 τ 999,999.8999 τ 999,999.8999 - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -``` - -## Provision wallets - -You will need wallets for the different personas, i.e., subnet owner, subnet validator and subnet miner, in the subnet. - -- The owner wallet creates and controls the subnet. -- The validator and miner will be registered to the subnet created by the owner. This ensures that the validator and miner can run the respective validator and miner scripts. - -### Create a coldkey-only wallet for the subnet creator role (they do not need a hotkey): - -```bash -btcli wallet new_coldkey \ ---wallet.name sn-creator -``` - -### Set up the miner's wallet with a coldkey and hotkey: - -```bash -btcli wallet new_coldkey \ ---wallet.name miner -``` - -```bash -btcli wallet new_hotkey \ ---wallet.name miner \ ---wallet.hotkey default - -``` - -### Set up the validator's wallet with a coldkey and hotkey: - -```bash -btcli wallet new_coldkey \ ---wallet.name validator -``` -```bash -btcli wallet new_hotkey \ ---wallet.name validator \ ---wallet.hotkey default -``` diff --git a/docs/media-assets.md b/docs/media-assets.md deleted file mode 100644 index 31e39f131b..0000000000 --- a/docs/media-assets.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: "Media Assets" ---- - -# Media Assets - -Download the Bittensor media assets from the below location: - -**Location**: https://github.com/opentensor/developer-docs/tree/main/static/bittensor-media-assets - -**Description**: A zip file (29 MB) containing Bittensor TAO symbol, monogram, logotype, supporting elements and a Opentensor brand guidelines PDF. \ No newline at end of file diff --git a/docs/migration_guide.md b/docs/migration_guide.md deleted file mode 100644 index a67ca2c2b8..0000000000 --- a/docs/migration_guide.md +++ /dev/null @@ -1,140 +0,0 @@ ---- -title: "Bittensor 9.0 Migration Guide" ---- -# Bittensor 9.0 Migration Guide - -This page notes breaking changes for the Bittensor Python SDK `v9.0`. This version supports Dynamic TAO, a major evolution of the Bittensor network's tokenomic architecture. - -See: [Dynamic TAO: What to expect](../dynamic-tao). - -**Contents:** -- [`Subtensor`: removed functions](#subtensor-removed-functions) -- [`Subtensor`: type changes](#subtensor-type-changes) -- [`AsyncSubtensor` parity with `Subtensor`](#asyncsubtensor) -- [`py-substrate-interface` replaced with `async-substrate-interface`](#py-substrate-interface-replaced-with-async-substrate-interface) - -See: [Concurrency with AyncIO and AsyncSubtensor](./subnets/asyncio) - -## Subtensor: removed functions - -### `get_account_next_index` - -This was only used for getting nonce, which can be achieved with `subtensor.substrate.get_account_next_index(hotkey.ss58_address)`. - -### `get_prometheus_info` - -We no longer use prometheus info. - -### `get_total_stake_for_coldkey` - -Not compatible with Dynamic TAO. - -Replaced with [`get_stake`](./dynamic-tao/sdk-cheat-sheet#get_stake), which returns a staked balance for a coldkey, hotkey pair on a specific subnet. - -### `get_total_stake_for_coldkeys` - -Not compatible with Dynamic TAO. - -Replaced with [`get_stake`](./dynamic-tao/sdk-cheat-sheet#get_stake), which returns a staked balance for a coldkey, hotkey pair on a specific subnet. - -### `get_total_stake_for_hotkey` - -Not compatible with Dynamic TAO. - -Replaced with [`get_stake`](./dynamic-tao/sdk-cheat-sheet#get_stake), which returns a staked balance for a coldkey, hotkey pair on a specific subnet. - -### `get_total_stake_for_hotkeys` - -Not compatible with Dynamic TAO. - -Replaced with [`get_stake`](./dynamic-tao/sdk-cheat-sheet#get_stake), which returns a staked balance for a coldkey, hotkey pair on a specific subnet. - -## Subtensor: type changes - -### `__init__` -No longer takes `connection_timeout` or `websocket` args. This is due to `py-substrate-interface` being re-written as `async-substrate-interface`. - -### `amount` - -All Subtensor methods that accept an `amount` arg now accept it only as a `Balance` object, rather than the previous `Union[Balance, int, float]`. - -New helper functions, `tao` and `rao` in `bittensor.utils.balance`, return a `balance` object from the given Tao or Rao amount. - -These methods include the following, and their associated extrinsics: - - `transfer` - - `unstake` - - `add_stake` - - `move_stake` - - `swap_stake` - - `transfer_stake` - - `get_transfer_fee` - - -For example, where `transfer` previously accepted float for the amount, it now takes a `Balance` object, which can be created on the fly: - -**Previously:** -```python -from bittensor.core.subtensor import Subtensor - -subtensor = Subtensor() -subtensor.transfer(wallet, destination, 1.0) -``` - -**Now written as:** - -```python -from bittensor.core.subtensor import Subtensor -from bittensor.utils.balance import tao, rao - -subtensor = Subtensor() -subtensor.transfer(wallet, destination, tao(1.0)) -# or -subtensor.transfer(wallet, destination, rao(1000000000)) -``` - -### consolidation of arg label: `block` -There were some cases where the block arg was called `block_number` or `block_id`. This is standardised, and now all block args are called `block`. - -### `get_block_hash` - -No longer requires `block` arg, will fetch the latest block if not specified. - -### `get_stake_for_coldkey_and_hotkey` - -Arg order has changed. It now takes `(coldkey, hotkey)` to align with the method name. - -In addition, to accomodate changes to staking in dynamic TAO, the function now also accepts an optional list of `netuids` to check for stake, and returns a `dict[int, StakeInfo]`, where `int` is the netuid. If `netuids` is left as `None`, all netuids are fetched. - -### `get_subnet_reveal_period_epochs` - -Type hint is updated to reflect it always returns an `int`, rather than an `Optional[int]`. - -### `query_runtime_api` - -Now accepts params as `Any`, returns `Any`. This is due to an update in `bt-decode` and `async-substrate-interface` that allows for arbitrary decoding of runtime calls. - -### `get_subnet_burn_cost` - -Now returns an `Optional[Balance]` object rather than `Optional[int]` (previously it gave rao `int`) - -### `get_children` - -Now returns `tuple[bool, list[tuple[float, str]], str]` instead of `tuple[bool, list[tuple[int, str]], str]`, as the proportions are now normalised floats. - -## `AsyncSubtensor` - -`AsyncSubtensor` and `Subtensor` now have all and only the same methods. - -Check out the wiki entry on [Concurrency in Bittensor](https://github.com/opentensor/bittensor/wiki/Concurrency-in-Bittensor) to learn more. - -## `py-substrate-interface` replaced with `async-substrate-interface` - -`py-substrate-interface` has been completely removed as a requirement, and has been rewritten as `async-substrate-interface`. - -While the main goal of this project was initially just providing an AsyncIO-compatible version of `py-substrate-interface` for our use in `btcli` and `AsyncSubtensor`, we noticed a lot of room for improvement, so we wrote not only the async part, but also a synchronous part. We aimed to be as API-compatible as possible, but there are a few differences (mainly in runtime calls). - -`async-substrate-interface` is its own standalone package, as is a requirement for `bittensor` and `btcli`, replacing `py-substrate-interface`. - -While we do practically all the decoding now through `bt-decode`, we still use `py-scale-codec` for a few `SCALE` encodings. This package will also eventually be replaced by an updated version of `bt-decode`. - -Check out the wiki entry on [Concurrency in Bittensor](https://github.com/opentensor/bittensor/wiki/Concurrency-in-Bittensor) to learn more. diff --git a/docs/miners/index.md b/docs/miners/index.md deleted file mode 100644 index 4840719d38..0000000000 --- a/docs/miners/index.md +++ /dev/null @@ -1,204 +0,0 @@ ---- -title: "Mining in Bittensor" ---- - -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Mining in Bittensor - -## Choosing a subnet - -All mining in Bittensor occurs within a subnet. Each subnet independently produces the digital commodities that are its purpose, each subnet creator defining a different _incentive mechanism_ for validators to use in judging miners' work. It is validators scores of miners' performance, according to this incentive mechanism, that determines the proportion of the subnet's emissions allocated to each miner. See [Emissions](../emissions.md). - -Mining in Bittensor is not like mining Bitcoin or many other blockchains, it is active, creative, and competitive. Preparing to be a subnet miner involves researching the right subnet(s) for _you_ to mine, given your own expertise and access to hardware. - -Browse the subnets and explore links to their code repositories on [TAO.app' subnets listings](https://tao.app). - -:::tip Typical compute requirements -Each subnet may have distinct hardware requirements, but this [minimum requirements template for subnet creators](https://github.com/opentensor/bittensor-subnet-template/blob/main/min_compute.yml) may give an idea of minimum memory, bandwidth and storage requirements for a typical subnet node. - -Mining is not supported on Windows. -::: - -## Miner registration - -To participate as a miner, you must first register a hotkey with the subnet in order to receive a UID on that subnet. - -:::tip No need to create a subnet to mine -You **do not** have to create a subnet to mine on the Bittensor network. Most miners work on established subnets. -::: - -Registration has a cost in TAO, which fluctuates dynamically based on time since last registration. When you secure a UID slot in a subnet on the main chain, this TAO is sunk cost. - -A subnet can have a maximum of 64 subnet validator UIDs and 192 subnet miner UIDs (256 total) in subnets other than Subnet 1. - -Upon registration, your hotkey, which is part of your wallet, becomes the holder of the UID slot. - -:::tip Ownership belongs to a hotkey -When you delegate your TAO to a subnet validator, you attach your delegated TAO to that validator’s hotkey. See [Delegation](../staking-and-delegation/delegation.md). - -A hotkey can hold multiple UIDs across **separate** subnets. However, within one subnet, each UID must have a unique hotkey. -::: - -Run the following command on your terminal, replacing ``, ``, ``. -`` is the `netuid` of your preferred subnet. - -```bash -btcli subnet register --netuid --wallet.name --wallet.hotkey -``` - -For example, for subnet 1 (netuid of 1): - -```bash -btcli subnet register --netuid 1 --wallet.name test-coldkey --wallet.hotkey test-hotkey -``` - -## Miner deregistration - -Miners as well as validators can be deregistered if their emissions are low. - -Typically, subnets have 256 UID slots, with a maximum of 64 slots capable of serving as validators by default. This leaves 192 UIDs for miners, though if there are fewer than 64 eligible validators on a subnet, miners can occupy available slots. - -:::info -Deregistration only occurs on subnets where all 256 UID slots are occupied. If a new registration occurs in a subnet with available UID slots, the registered neuron occupies one of the available UID slots. -::: - -Each tempo, the '[neuron](../learn/bittensor-building-blocks)' (miner _or_ validator node) with the lowest 'pruning score' (based solely on emissions), and that is no longer within its [immunity period](../subnets/subnet-hyperparameters.md#immunityperiod), risks being replaced by a newly registered neuron, who takes over that UID. - -:::info Deregistration is based on emissions -The subnet does not distinguish between miners and validators for the purpose of deregistration. The chain only looks at emissions (represented as 'pruning score'). Whenever a new registration occurs in the subnet, the neuron with the lowest emissions will get deregistered. -::: - -### Immunity period - -Every subnet has an `immunity_period` hyperparameter expressed in a number of blocks. A neuron's `immunity_period` starts when the miner or validator registers into the subnet. For more information, see [`immunity_period`](../subnets/subnet-hyperparameters.md#immunityperiod). - -A subnet neuron (miner or validator) at a UID (in that subnet) has `immunity_period` blocks to improve its performance. When `immunity_period` expires, that miner or validator can be deregistered if it has the lowest performance in the subnet and a new registration arrives. - -:::tip Special cases - -- In the unlikely event that all neurons are still immune, the one with the lowest "pruning score" will be deregistered by the next incoming registration. - -- In cases where two or more nodes have the lowest "pruning score", the older node gets deregistered first. - -- The subnet owner's hotkey has permanent immunity from deregistration. - ::: - -### Registration flow diagram - -Below is a diagram illustrating a subnet neuron's registration timeline: - - - -- Blocks are processed in subtensor (the Bittensor blockchain) every 12 seconds. -- A subnet miner registers a hotkey and receives a UID—and its `immunity_period` starts. -- The miner publishes its Axon’s `IP:PORT` for the subnet validators. -- The subnet validators refresh their metagraph and discover the new Axon. -- The subnet validators send requests to that Axon and evaluate its responses. This drives the subnet’s incentive mechanism, awarding emissions to the miner. -- While still in the `immunity_period`, the subnet miner builds up its emissions from zero. -- If the miner’s emissions rank among the lowest for nodes outside of their `immunity_period`, their UID gets transferred to the next new registrant. - -:::tip Subnet miner emission -Emissions may not always appear as a smooth curve. Emission might only update at the end of tempo periods, or subnet validators might do more frequent internal updates. For example, a validator might detect new miners and refresh every 100 blocks. -::: - -## Moving a subnet miner to a different machine - -Once your subnet miner has begun mining, you can move it to a different machine, but proceed with caution. - -To move a subnet miner from one machine to another, follow these steps in order: - -1. Start the subnet miner on the new machine. -2. Wait for the old miner to stop receiving requests from the subnet validators. -3. Stop the old miner. - -It can take subnet validators some time to recognize the updated IP of the Axon for your subnet miner. - -## Inspecting UIDs - -After you obtain a UID slot, you can view your wallet’s status by running: - -```bash -btcli wallet overview --netuid -``` - -After providing your wallet name when prompted, you will see output such as: - -| Parameter | Value | Description | -| :---------- | :----------------- | :-------------------------------------------------------------------------- | -| COLDKEY | my_coldkey | The name of the coldkey associated with your slot. | -| HOTKEY | my_first_hotkey | The name of the hotkey associated with your slot. | -| UID | 5 | The index of the uid out of available uids. | -| ACTIVE | True | The validator has set weights within the subnet's activity_cutoff | -| STAKE(τ) | 71.296 | The amount of stake in this wallet. | -| RANK | 0.0629 | This miner's absolute ranking according to validators on the network. | -| TRUST | 0.2629 | This miner's trust as a proportion of validators on the network. | -| CONSENSUS | 0.89 | This validator's aggregate consensus score. | -| INCENTIVE | 0.029 | This miner's incentive, TAO emission, is attained via mining. | -| DIVIDENDS | 0.001 | This validator's dividends, TAO emission, are attained via validating. | -| EMISSION | 29_340_153 | This miner's total emission in RAO (10^(-9) TAO) per block. | -| VTRUST | 0.96936 | This validator's trust score as a validator. | -| VPERMIT | \* | For validators: The uid is considered active for validating on this subnet. | -| UPDATED | 43 | Blocks since this miner set weights on the chain. | -| AXON | 131.186.56.85:8091 | The entrypoint advertised by this miner on the bittensor blockchain. | -| HOTKEY_SS58 | 5F4tQyWr... | The ss58-encoded address of the miner's hotkey. | - -## Checking miner registration status - -Use any of the Python snippets below: - -- **Using Python interpreter**: Type "python" or "python3" in your terminal, then paste a snippet. -- **Using a Python file**: Copy into, e.g., `check_reg.py`, then run `python3 check_reg.py`. - -### With SS58 hotkey - -```python -import bittensor as bt -# Replace below with your SS58 hotkey -hotkey = "5HEo565WAy4Dbq3Sv271SAi7syBSofyfhhwRNjFNSM2gP9M2" -network = "finney" -sub = bt.subtensor(network) -print(f"Registration status for hotkey {hotkey} is: {sub.is_hotkey_registered(hotkey)}") -``` - -### With SS58 hotkey and netuid - -```python -import bittensor as bt -# Replace below with your SS58 hotkey -hotkey = "5HEo565WAy4Dbq3Sv271SAi7syBSofyfhhwRNjFNSM2gP9M2" -network = "finney" -netuid = 1 # subnet uid -sub = bt.subtensor(network) -mg = sub.metagraph(netuid) -if hotkey not in mg.hotkeys: - print(f"Hotkey {hotkey} deregistered") -else: - print(f"Hotkey {hotkey} is registered") -``` - -### With UID and SS58 hotkey - -```python -import bittensor as bt -# Replace below with your SS58 hotkey -hotkey = "5HEo565WAy4Dbq3Sv271SAi7syBSofyfhhwRNjFNSM2gP9M2" -network = "finney" -netuid = 1 # subnet uid -sub = bt.subtensor(network) -mg = sub.metagraph(netuid) -uid = 2 # Your UID -registered = mg.hotkeys[uid] == hotkey -if not registered: - print(f"Miner at uid {uid} not registered") -else: - print(f"Miner at uid {uid} registered") -``` diff --git a/docs/miners/miners-btcli-guide.md b/docs/miners/miners-btcli-guide.md deleted file mode 100644 index f55f820400..0000000000 --- a/docs/miners/miners-btcli-guide.md +++ /dev/null @@ -1,73 +0,0 @@ ---- -title: "Miner's Guide to `BTCLI`" ---- - -# Miner's Guide to `BTCLI` - -This page discusses `btcli` security and usage considerations specifically for Bittensor miners. - -For general coverage of `btcli` security and usage considerations across persona, see: [Bittensor CLI: Permissions Guide](../btcli-permissions) - -See also: - -- [Wallets, Coldkeys and Hotkeys in Bittensor](../getting-started/wallets) for an introduction to the authentication technology used in Bittensor. -- [Coldkey and Hotkey Workstation Security](../getting-started/coldkey-hotkey-security) for contrete security details about managing keys material. - - -## Intro - -Miners in Bittensor work to produce digital commondities. To securely serve these commodities to validators, miners use their registered hotkey to sign requests. Therefore, miners primarily rely on **hotkeys** for daily operations. - -The **coldkey** is only needed when you need to create or fund that hotkey, or if you want to stake additional TAO or pay the burn for registrations. - - -Miners must also manage their own TAO and alpha stake (to exit the emissions that accure to them), and hence should familiarize themselves with staking operations. - -See: -- [Staking/Delegation Overview](../staking-and-delegation/delegation) -- [Staker's Guide to `BTCLI`](../staking-and-delegation/stakers-btcli-guide) - - -Creating hotkeys requires a coldkey private key, and should be done on a secure [coldkey workstation](../getting-started/coldkey-hotkey-security#coldkey-workstation). However, using hotkeys for signing requests when mining does not require a coldkey, which should never be present on a mining server, i.e. a hotkey workstation. The coldkey should not be placed on a machine used for mining because the software dependencies for mining should not be considered safe/trusted code to the standards of a coldkey workstation. - -See [Coldkey and Hotkey Workstation Security](../getting-started/coldkey-hotkey-security). - -## Requirements for mining functions - -### Unpermissioned workstation (public keys only): -- Check balances -- Monitor emissions and other metagraph info -- Check subnet alpha prices across Bittensor - -### Coldkey workstation: -- Create/import coldkey -- Create hotkeys -- Manage TAO and alpha stake -- Transfer/rotate TAO and alpha stake in case of key compromise -- Rotate hotkeys in case of compromise -- Register a hotkey to mine on a subnet - -### Mining node (Hotkey workstation): -- Import/provision hotkey -- Provide hotkey to subnet codebase for operations such as axon serving, commitment creation etc - -:::tip Coldkeys do not mine - -Miners will need coldkeys to manage their TAO and alpha currency, as well as hotkeys to serve requests. Ensure there is a clear boundary: The coldkey should **never** be on an environment with untrusted ML code from containers, frameworks, or libraries that might exfiltrate secrets. -::: - -## `btcli` commandsfor miners: - -### Hotkey Managementd - -`btcli wallet new-hotkey` , `btcli wallet regen-hotkey`, : Create and register a hotkey on a secure coldkey workstation then transfer the hotkey file or mnemonic to the mining workstation. - -`btcli subnets register`, `btcli subnets pow-register`: register a UID - - -## Key rotation - -If you suspect your coldkey may have been leaked, you can request to swap it out of your wallet, using an extrinsic blockchain transaction. This operation has a 5 day waiting period, during which your coldkey will be locked. The cost of this coldkey swap transaction is 0.1 TAO. - -See [Rotate/Swap your Coldkey](../subnets/schedule-coldkey-swap) - diff --git a/docs/reference/_bittensor-api-ref.md b/docs/reference/_bittensor-api-ref.md deleted file mode 100644 index b24194346c..0000000000 --- a/docs/reference/_bittensor-api-ref.md +++ /dev/null @@ -1,876 +0,0 @@ ---- -title: "Bittensor API Reference" ---- - -# Bittensor API Reference - -## bt.subtensor - -The `Subtensor` is utilized for managing interactions with the subtensor chain. It serves as an interface to communicate with "Finney", Bittensor's main blockchain network, or others, enabling operations like querying and transacting. - -### Examples - -```python dark -# Creating a default chain connection to remote finney instance. -sub = bt.subtensor() - -# Parsing --subtensor.network and --subtensor.chain_endpoint from the command line -sub = bt.subtensor( config = bt.subtensor.config() ) - -# Connecting subtensor's default local entrypoint "ws://127.0.0.1:9944" -sub = bt.subtensor( network = 'local' ) - -# Connecting to a specific endpoint -sub = bt.subtensor( chain_endpoint = "ws://127.0.0.1:9944" ) -``` - -### Methods - -#### nominate -```python -nominate(self, wallet: 'bittensor.Wallet', wait_for_finalization: bool = False, wait_for_inclusion: bool = True) -> bool -``` -Designates the wallet's hotkey as a delegate. - -#### delegate -```python -delegate(self, wallet: 'bittensor.wallet', delegate_ss58: Optional[str] = None, amount: Union[Balance, float] = None, wait_for_inclusion: bool = True, wait_for_finalization: bool = False, prompt: bool = False) -> bool -``` -Adds a specific amount of stake to a delegate using a wallet. - -#### undelegate -```python -undelegate(self, wallet: 'bittensor.wallet', delegate_ss58: Optional[str] = None, amount: Union[Balance, float] = None, wait_for_inclusion: bool = True, wait_for_finalization: bool = False, prompt: bool = False) -> bool -``` -Removes a specific amount of stake from a delegate using a wallet. - -#### set_weights -```python -set_weights(self, wallet: 'bittensor.wallet', netuid: int, uids: Union[torch.LongTensor, list], weights: Union[torch.FloatTensor, list], version_key: int = bittensor.__version_as_int__, wait_for_inclusion:bool = False, wait_for_finalization:bool = False, prompt:bool = False) -> bool -``` -Sets weights for a given netuid. - -#### register -```python -register(self, wallet: 'bittensor.Wallet', netuid: int, wait_for_inclusion: bool = False, wait_for_finalization: bool = True, prompt: bool = False, max_allowed_attempts: int = 3, output_in_place: bool = True, cuda: bool = False, dev_id: Union[List[int], int] = 0, TPB: int = 256, num_processes: Optional[int] = None, update_interval: Optional[int] = None, log_verbose: bool = False) -> bool -``` -Registers the wallet to the chain. - -#### burned_register -```python -burned_register(self, wallet: 'bittensor.Wallet', netuid: int, wait_for_inclusion: bool = False, wait_for_finalization: bool = True, prompt: bool = False) -> bool -``` -Registers the wallet to the chain by recycling TAO. - -#### transfer -```python -transfer(self, wallet: 'bittensor.wallet', dest: str, amount: Union[Balance, float], wait_for_inclusion: bool = True, wait_for_finalization: bool = False, prompt: bool = False) -> bool -``` -Transfers funds from the wallet to a destination public key address. - -#### get_existential_deposit -```python -get_existential_deposit(self, block: Optional[int] = None) -> Optional[Balance] -``` -Returns the existential deposit for the chain. - -#### serve -```python -serve(self, wallet: 'bittensor.wallet', ip: str, port: int, protocol: int, netuid: int, placeholder1: int = 0, placeholder2: int = 0, wait_for_inclusion: bool = False, wait_for_finalization = True, prompt: bool = False) -> bool -``` -Starts serving on a specific IP, port and protocol for a given netuid. - -#### serve_axon -```python -serve_axon(self, netuid: int, axon: 'bittensor.Axon', use_upnpc: bool = False, wait_for_inclusion: bool = False, wait_for_finalization: bool = True, prompt: bool - - = False) -> bool -``` -Starts serving an Axon for a given netuid. - -#### serve_prometheus -```python -serve_prometheus(self, wallet: 'bittensor.wallet', port: int, netuid: int, wait_for_inclusion: bool = False, wait_for_finalization: bool = True) -> bool -``` -Starts serving a Prometheus server on a specific port for a given netuid. - -#### add_stake -```python -add_stake(self, wallet: 'bittensor.wallet', hotkey_ss58: Optional[str] = None, amount: Union[Balance, float] = None, wait_for_inclusion: bool = True, wait_for_finalization: bool = False, prompt: bool = False) -> bool -``` -Adds a specific amount of stake to a hotkey uid. - -#### add_stake_multiple -```python -add_stake_multiple(self, wallet: 'bittensor.wallet', hotkey_ss58s: List[str], amounts: List[Union[Balance, float]] = None, wait_for_inclusion: bool = True, wait_for_finalization: bool = False, prompt: bool = False) -> bool -``` -Adds stake to each hotkey in the list from a common coldkey. - - -#### unstake -```python -unstake(self, wallet: 'bittensor.wallet', hotkey_ss58: Optional[str] = None, amount: Union[Balance, float] = None, wait_for_inclusion:bool = True, wait_for_finalization:bool = False, prompt: bool = False) -> bool -``` -Removes stake into the wallet coldkey from the specified hotkey uid. - - -#### unstake_multiple -```python -unstake_multiple(self, wallet: 'bittensor.wallet', hotkey_ss58s: List[str], amounts: List[Union[Balance, float]] = None, wait_for_inclusion: bool = True, wait_for_finalization: bool = False, prompt: bool = False) -> bool -``` -Removes stake from each hotkey in the list to a common coldkey. - -## Hyperparameters - -### rho -```python -rho (self, netuid: int, block: Optional[int] = None ) -> Optional[int] -``` -Returns the network Rho hyperparameter if the network exists. Accepts an integer `netuid` representing the unique network ID and an optional integer `block` representing the block number. - - -### kappa -```python -kappa (self, netuid: int, block: Optional[int] = None ) -> Optional[float] -``` -Returns the network Kappa hyperparameter if the network exists. Inputs are `netuid` and an optional `block` number. - - -### difficulty -```python -difficulty (self, netuid: int, block: Optional[int] = None ) -> Optional[int] -``` -Returns the network Difficulty hyperparameter if the network exists. Inputs are `netuid` and an optional `block` number. - - -### burn -```python -burn (self, netuid: int, block: Optional[int] = None ) -> Optional[bittensor.Balance] -``` -Returns the network Burn hyperparameter if the network exists. Inputs are `netuid` and an optional `block` number. - - -### immunity_period -```python -immunity_period (self, netuid: int, block: Optional[int] = None ) -> Optional[int] -``` -Returns the network ImmunityPeriod hyperparameter if the network exists. Inputs are `netuid` and an optional `block` number. - - -### validator_batch_size -```python -validator_batch_size (self, netuid: int, block: Optional[int] = None ) -> Optional[int] -``` -Returns the network ValidatorBatchSize hyperparameter if the network exists. Inputs are `netuid` and an optional `block` number. - - -### validator_prune_len -```python -validator_prune_len (self, netuid: int, block: Optional[int] = None ) -> int -``` -Returns the network ValidatorPruneLen hyperparameter if the network exists. Inputs are `netuid` and an optional `block` number. - -### validator_logits_divergence -```python -validator_logits_divergence (self, netuid: int, block: Optional[int] = None ) -> Optional[float] -``` -Returns the network ValidatorLogitsDivergence hyperparameter if the network exists. Inputs are `netuid` and an optional `block` number. - - -### validator_sequence_length -```python -validator_sequence_length (self, netuid: int, block: Optional[int] = None ) -> Optional[int] -``` -Returns the network ValidatorSequenceLength hyperparameter if the network exists. Inputs are `netuid` and an optional `block` number. - - -### validator_epochs_per_reset -```python -validator_epochs_per_reset (self, netuid: int, block: Optional[int] = None ) -> Optional[int] -``` -Returns the network ValidatorEpochsPerReset hyperparameter if the network exists. Inputs are `netuid` and an optional `block` number. - - -### validator_epoch_length -```python -validator_epoch_length (self, netuid: int, block: Optional[int] = None ) -> Optional[int] -``` -Returns the network ValidatorEpochLen hyperparameter if the network exists. Inputs are `netuid` and an optional `block` number. - - -### validator_exclude_quantile -```python -validator_exclude_quantile (self, netuid: int, block: Optional[int] = None ) -> Optional[float] -``` -Returns the network ValidatorExcludeQuantile hyperparameter if the network exists. Inputs are `netuid` and an optional `block` number. - - -### max_allowed_validators -```python -max_allowed_validators(self, netuid: int, block: Optional[int] = None) -> Optional[int] -``` -Returns the network MaxAllowedValidators hyperparameter if the network exists. Inputs are `netuid` and an optional `block` number. - - -### min_allowed_weights -```python -min_allowed_weights (self, netuid: int, block: Optional[int] = None ) -> Optional[int] -``` -Returns the network MinAllowedWeights hyperparameter if the network exists. Inputs are `netuid` and an optional `block` number. - - -### max_weight_limit -```python -max_weight_limit (self, netuid: int, block: Optional[int] = None ) -> Optional[float] -``` -Returns the network MaxWeightsLimit hyperparameter if the network exists. Inputs are `netuid` and an optional `block` number. - - -### scaling_law_power -```python -scaling_law_power (self, netuid: int, block: Optional[int] = None ) -> Optional[float] -``` -Returns the network ScalingLawPower hyperparameter if the network exists. Inputs are `netuid` and an optional `block` number. - - -### synergy_scaling_law_power -```python -synergy_scaling_law_power (self, netuid: int, block: Optional[int] = None ) -> Optional[float] -``` -Returns the network SynergyScalingLawPower hyperparameter if the network exists. Inputs are `netuid` and an optional `block` number. - - -### subnetwork_n -```python -subnetwork_n (self, netuid: int, block: Optional[int] = None ) -> int -``` -Returns the network SubnetworkN hyperparameter if the network exists. Inputs are `netuid` and an optional `block` number. - - -### max_n -```python -max_n (self, netuid: int, block: Optional[int] = None ) -> Optional[int] -``` -Returns the network MaxAllowedUids hyperparameter if the network exists. Inputs are `netuid` and an optional `block` number. - - -### blocks_since_epoch -```python -blocks_since_epoch (self, netuid: int, block: Optional[int] = None) -> int -``` -Returns the network BlocksSinceLastStep hyperparameter if the network exists. Inputs are `netuid` and an optional `block` number. - - -### tempo -```python -tempo (self, netuid: int, block: Optional[int] = None) -> int -``` -Returns the network Tempo hyperparameter if the network exists. Inputs are `netuid` and an optional `block` number. - -## Account functions - -### get_total_stake_for_hotkey -```python -get_total_stake_for_hotkey( self, ss58_address: str, block: Optional[int] = None ) -> Optional['bittensor.Balance'] -``` -Returns the total stake held on a hotkey including delegated. Inputs are `ss58_address` and an optional `block` number. - - -### get_total_stake_for_coldkey -```python -get_total_stake_for_coldkey( self, ss58_address: str, block: Optional[int] = None ) -> Optional['bittensor.Balance'] -``` -Returns the total stake held on a coldkey across all hotkeys including delegates. Inputs are `ss58_address` and an optional `block` number. - - -### get_stake_for_coldkey_and_hotkey -```python -get_stake_for_coldkey_and_hotkey( self, hotkey_ss58: str, coldkey_ss58: str, block: Optional[int] = None ) -> Optional['bittensor.Balance'] -``` -Returns the stake under a coldkey - hotkey pairing. Inputs are `hotkey_ss58`, `coldkey_ss58` and an optional `block` number. - -### get_stake -```python -get_stake( self, hotkey_ss58: str, block: Optional[int] = None ) -> List[Tuple[str,'bittensor.Balance']] -``` -Returns a list of stake tuples (coldkey, balance) for each delegating coldkey including the owner. Inputs are `hotkey_ss58` and an optional `block` number. - -### does_hotkey_exist -```python -does_hotkey_exist( self, hotkey_ss58: str, block: Optional[int] = None ) -> bool -``` -Returns true if the hotkey is known by the chain and there are accounts. Inputs are `hotkey_ss58` and an optional `block` number. - -### get_hotkey_owner -```python -get_hotkey_owner( self, hotkey_ss58: str, block: Optional[int] = None ) -> Optional[str] -``` -Returns the coldkey owner of the passed hotkey if it exists. Inputs are `hotkey_ss58` and an optional `block` number. - - -### get_axon_info -```python -get_axon_info( self, hotkey_ss58: str, block: Optional[int] = None ) -> Optional[axon_info] -``` -Returns the axon information for the specified hotkey account if it exists. Inputs are `hotkey_ss58` and an optional `block` number. - -### get_prometheus_info -```python -get_prometheus_info( self, hotkey_ss58: str, block: Optional[int] = None ) -> Optional[axon_info] -``` -Returns the prometheus information for the specified hotkey account if it exists. Inputs are `hotkey_ss58` and an optional `block` number. - -## Global state - -### block -```python -@property -def block (self) -> int: -``` -Property that returns the current chain block. - - -### total_issuance -```python -total_issuance (self, block: Optional[int] = None ) -> 'bittensor.Balance' -``` -Returns the total issuance of tokens as of a specified block. If no block is provided, the default is the current block. - - -### total_stake -```python -total_stake (self,block: Optional[int] = None ) -> 'bittensor.Balance' -``` -Returns the total amount of stake as of a specified block. If no block is provided, the default is the current block. - - -### serving_rate_limit -```python -serving_rate_limit (self, block: Optional[int] = None ) -> Optional[int] -``` -Returns the serving rate limit as of a specified block. If no block is provided, the default is the current block. - - -### tx_rate_limit -```python -tx_rate_limit (self, block: Optional[int] = None ) -> Optional[int] -``` -Returns the transaction rate limit as of a specified block. If no block is provided, the default is the current block. - -## Subnet stake - -### subnet_exists -```python -subnet_exists( self, netuid: int, block: Optional[int] = None ) -> bool -``` -Checks if a subnet with the given `netuid` exists as of a specified block. If no block is provided, the default is the current block. - - -### get_all_subnet_netuids -```python -get_all_subnet_netuids( self, block: Optional[int] = None ) -> List[int] -``` -Returns a list of `netuid`s of all subnets as of a specified block. If no block is provided, the default is the current block. - - -### get_total_subnets -```python -get_total_subnets( self, block: Optional[int] = None ) -> int -``` -Returns the total number of subnets as of a specified block. If no block is provided, the default is the current block. - - -### get_subnet_modality -```python -get_subnet_modality( self, netuid: int, block: Optional[int] = None ) -> Optional[int] -``` -Returns the modality of a subnet with a specified `netuid` as of a given block. If no block is provided, the default is the current block. - - -### get_subnet_connection_requirement -```python -get_subnet_connection_requirement( self, netuid_0: int, netuid_1: int, block: Optional[int] = None) -> Optional[int] -``` -Returns the connection requirement between two subnets with specified `netuid`s as of a given block. If no block is provided, the default is the current block. - - -### get_emission_value_by_subnet -```python -get_emission_value_by_subnet( self, netuid: int, block: Optional[int] = None ) -> Optional[float] -``` -Returns the emission value of a subnet with the given `netuid` as of a specified block. If no block is provided, the default is the current block. - - -### get_subnet_connection_requirements -```python -get_subnet_connection_requirements( self, netuid: int, block: Optional[int] = None) -> Dict[str, int] -``` -Returns a dictionary of the connection requirements of a subnet with the given `netuid` as of a specified block. If no block is provided, the default is the current block. - - -### get_subnets -```python -get_subnets( self, block: Optional[int] = None ) -> List[int] -``` -Returns a list of all subnets as of a specified block. If no block is provided, the default is the current block. - - -### get_all_subnets_info -```python -get_all_subnets_info( self, block: Optional[int] = None ) -> List[SubnetInfo] -``` -Returns a list of information about all subnets as of a specified block. If no block is provided, the default is the current block. - - -### get_subnet_info -```python -get_subnet_info( self, netuid: int, block: Optional[int] = None ) -> Optional[SubnetInfo] -``` -Returns information about a subnet with a given `netuid` as of a specified block. If no block is provided, the default is the current block. - -## Delegation - -### is_hotkey_delegate -```python -is_hotkey_delegate( self, hotkey_ss58: str ) -> bool -``` -Checks if a delegate with the specified hotkey exists. - - -### get_delegate_take -```python -get_delegate_take( self, hotkey_ss58: str, block: Optional[int] = None ) -> Optional[float] -``` -Returns the 'take' (portion of the reward a delegate receives from staking) of a delegate specified by a hotkey as of a given block. If no block is provided, the default is the current block. - - -### get_nominators_for_hotkey -```python -get_nominators_for_hotkey( self, hotkey_ss58: str, block: Optional[int] = None ) -> List[Tuple[str, Balance]] -``` -Returns a list of tuples, each containing a nominator's address and balance for the delegate specified by a hotkey as of a given block. If no block is provided, the default is the current block. - - -### get_delegate_by_hotkey -```python -get_delegate_by_hotkey( self, hotkey_ss58: str, block: Optional[int] = None ) -> Optional[DelegateInfo] -``` -Returns information about a delegate specified by a hotkey as of a given block. If no block is provided, the default is the current block. - - -### get_delegates -```python -get_delegates( self, block: Optional[int] = None ) -> List[DelegateInfo] -``` -Returns a list of all delegates as of a specified block. If no block is provided, the default is the current block. - - -### get_delegated -```python -get_delegated( self, coldkey_ss58: str, block: Optional[int] = None ) -> List[Tuple[DelegateInfo, Balance]] -``` -Returns a list of delegates that a given coldkey is staked to, as of a specified block. If no block is provided, the default is the current block. Each item in the list is a tuple containing the delegate's information and the staked balance. - -## Neuron information per subnet - -### is_hotkey_registered_any -```python -is_hotkey_registered_any( self, hotkey_ss58: str, block: Optional[int] = None) -> bool -``` -Returns True if the hotkey is registered on any subnet. If no block is specified, the current block is used. - - -### is_hotkey_registered_on_subnet -```python -is_hotkey_registered_on_subnet( self, hotkey_ss58: str, netuid: int, block: Optional[int] = None) -> bool -``` -Returns True if the hotkey is registered on a specified subnet. If no block is specified, the current block is used. - - -### is_hotkey_registered -```python -is_hotkey_registered( self, hotkey_ss58: str, netuid: int, block: Optional[int] = None) -> bool -``` -Returns True if the hotkey is registered on a specified subnet. If no block is specified, the current block is used. - - -### get_uid_for_hotkey_on_subnet -```python -get_uid_for_hotkey_on_subnet( self, hotkey_ss58: str, netuid: int, block: Optional[int] = None) -> int -``` -Returns the user id (uid) for the hotkey on a specified subnet. If no block is specified, the current block is used. - - -### get_all_uids_for_hotkey -```python -get_all_uids_for_hotkey( self, hotkey_ss58: str, block: Optional[int] = None) -> List[int] -``` -Returns a list of all user ids (uids) for the hotkey. If no block is specified, the current block is used. - - -### get_netuids_for_hotkey -```python -get_netuids_for_hotkey( self, hotkey_ss58: str, block: Optional[int] = None) -> List[int] -``` -Returns a list of all network user ids (netuids) for the hotkey. If no block is specified, the current block is used. - - -### get_neuron_for_pubkey_and_subnet -```python -get_neuron_for_pubkey_and_subnet( self, hotkey_ss58: str, netuid: int, block: Optional[int] = None ) -> Optional[NeuronInfo] -``` -Returns the neuron information for the hotkey on a specified subnet. If no block is specified, the current block is used. - - -### get_all_neurons_for_pubkey -```python -get_all_neurons_for_pubkey( self, hotkey_ss58: str, block: Optional[int] = None ) -> List[NeuronInfo] -``` -Returns a list of all neurons for the hotkey. If no block is specified, the current block is used. - - -### neuron_has_validator_permit -```python -neuron_has_validator_permit( self, uid: int, netuid: int, block: Optional[int] = None ) -> Optional[bool] -``` -Returns True if the neuron with the given uid has a validator permit for the specified subnet. If no block is specified, the current block is used. - - -### neuron_for_wallet -```python -neuron_for_wallet( self, wallet: 'bittensor.Wallet', netuid = int, block: Optional[int] = None ) -> Optional[NeuronInfo] -``` -Returns the neuron information for the given wallet on a specified subnet. If no block is specified, the current block is used. - -### neuron_for_uid -```python -neuron_for_uid( self, uid: int, netuid: int, block: Optional[int] = None ) -> Optional[NeuronInfo] -``` -Returns the neuron metadata associated with a given user id (uid) and network user id (netuid) at a specified block, or None if it does not exist. - - -### neurons -```python -neurons(self, netuid: int, block: Optional[int] = None ) -> List[NeuronInfo] -``` -Returns a list of neurons from the chain for a given network user id (netuid) at a specified block. - - -### neuron_for_uid_lite -```python -neuron_for_uid_lite( self, uid: int, netuid: int, block: Optional[int] = None ) -> Optional[NeuronInfoLite] -``` -Returns the lightweight neuron metadata (without weights and bonds) associated with a given user id (uid) and network user id (netuid) at a specified block, or None if it does not exist. - - -### neurons_lite -```python -neurons_lite(self, netuid: int, block: Optional[int] = None ) -> List[NeuronInfoLite] -``` -Returns a list of lightweight neurons (without weights and bonds) from the chain for a given network user id (netuid) at a specified block. - - -### metagraph -```python -metagraph( self, netuid: int, lite: bool = True ) -> 'bittensor.Metagraph' -``` -Returns the metagraph for the subnet associated with a given network user id (netuid). If 'lite' is True, it returns a metagraph using the lightweight sync (no weights, no bonds). - -## Legacy - -### get_balance -```python -get_balance(self, address: str, block: int = None) -> Balance -``` -Returns the token balance for the given Substrate address at a specified block. - - -### get_current_block -```python -get_current_block(self) -> int -``` -Returns the current block number on the chain. - - -### get_balances -```python -get_balances(self, block: int = None) -> Dict[str, Balance] -``` -Returns a dictionary of balances for all addresses at a specified block. The dictionary keys are addresses and values are their corresponding balances. - - -### `__str__()` -This method is used to provide a string representation of the instance. -```python dark -str(obj) -``` -If the `network` argument equals the `chain_endpoint` argument, it returns a string that denotes connecting to a chain endpoint without a known network. Otherwise, it represents connecting to a network with a known endpoint. - - -### `__repr__()` -This method is used to provide an official string representation of the instance. -```python dark -repr(obj) -``` -The string returned by this method is identical to the one provided by the `__str__()` method. - -## Initialization - -To initialize an instance of the `Subtensor` class, you'll need to provide three arguments: - -```python dark -import bittensor as bt -obj = bt.subtensor( config, network, chain_endpoint ) -``` - -### Arguments - -- `config (bt.Config, optional, defaults=bt.subtensor.config())`: - Subtensor config object containing arguments from bt.subtensor.config() which are automatically parsed from command line and ENV vars. -- `network (str, optional, default='finney')`: - The subtensor network flag. The likely choices are: - -- local (local running network) - -- finney (main network) - -- mock (mock network for testing.) - If this option is set it overloads subtensor.chain_endpoint with - an entry point node from that network. -- `chain_endpoint (str, default=None)`: - The subtensor endpoint flag. If set, overrides the network argument. - - -## Bt.metagraph - -### Chain state Torch interface - -The `Metagraph` class holds the chain state of a particular subnetwork at a specific block. - -#### Examples - -```python dark -import bittensor as bt - -# Creating metagraph and sync state from a netuid parameter, defaults to connecting to network `finney` -metagraph = bt.metagraph( netuid = 1 ) - -# Create metagraph and sync with lite = False to sync weights and bonds matrices. -metagraph = bt.metagraph( netuid = 1, lite = False) - -# Create metagraph and sync state from local entrypoint, assuming a subtensor chain is currently running. -metagraph = bt.metagraph( netuid = 1, network = 'local' ) - -# Create an empty metagraph object with no state syncing. -metagraph = bt.metagraph( netuid = 1, sync = False ) - -# Sync the metagraph at a particular block -metagraph.sync( block = 100000 ) - -# Save the metagraph to ~/.bittensor/metagraphs/network-$NETWORK_NAME/netuid-#NETUID/block-$BLOCK.pt -metagraph.save() - -# Load the latest metagraph by block. -metagraph.load() -``` - -### Methods - -#### S -```python -def S(self) -> torch.FloatTensor -``` -Returns the total stake. - - -#### R -```python -def R(self) -> torch.FloatTensor -``` -Returns the ranks. - - -#### I -```python -def I(self) -> torch.FloatTensor -``` -Returns the incentive. - - -#### E -```python -def E(self) -> torch.FloatTensor -``` -Returns the emission. - - -#### C -```python -def C(self) -> torch.FloatTensor -``` -Returns the consensus. - - -#### T -```python -def T(self) -> torch.FloatTensor -``` -Returns the trust. - - -#### Tv -```python -def Tv(self) -> torch.FloatTensor -``` -Returns the validator trust. - - -#### D -```python -def D(self) -> torch.FloatTensor -``` -Returns the dividends. - - -#### B -```python -def B(self) -> torch.FloatTensor -``` -Returns the bonds. - - -#### W -```python -def W(self) -> torch.FloatTensor -``` -Returns the weights. - - -#### hotkeys -```python -def hotkeys(self) -> List[str] -``` -Returns the list of hotkeys for the axons. - - -#### coldkeys -```python -def coldkeys(self) -> List[str] -``` -Returns the list of coldkeys for the axons. - - -#### addresses -```python -def addresses(self) -> List[str] -``` -Returns the list of IP addresses for the axons. - - -#### __str__ -```python -def __str__(self) -``` -Returns a string representation of the Metagraph. - - -#### __repr__ -```python -def __repr__(self) -``` -Returns the same string representation as `__str__`. - - -#### metadata -```python -def metadata(self) -> dict -``` -Returns a dictionary of Metagraph metadata. - - -#### __init__ -```python -def __init__(self, netuid: int, network: str = 'finney', lite: bool = True, sync: bool = True) -> 'metagraph' -``` -Initializes a new instance of the Metagraph. - - -#### sync -```python -def sync (self, block: Optional[int] = None, lite: bool = True) -> 'metagraph' -``` -Syncs the Metagraph state at the passed block. Optionally syncs the weights also. - - -#### save -```python -def save(self) -> 'metagraph' -``` -Saves the Metagraph object's state_dict under bittensor root directory. - - -#### load -```python -def load(self) -> 'metagraph' -``` -Loads the Metagraph object's state_dict from bittensor root directory. - - -#### load_from_path -```python -def load_from_path(self, dir_path:str) -> 'metagraph' -``` -Loads the Metagraph object's state_dict from the specified directory path. - -## Bt.logging - -The `Logging` interfaces with bittensor internal logging system. - -### Examples - -```python dark -import bittensor as bt - -# Turn on debug logs -bt.debug() - -# Turn on trace logs -bt.trace() - -# Turn off debug logs -bt.set_debug(False) - -# Turn off trace logs -bt.set_trace(False) - -# Turn on logging from class definition -bt.logging( set_debug = True ) - -# Instantiate logging from command line args -bt.logging( bt.logging.config() ) - -# Turn on logging to file -bt.logging( record_log = True, logging_dir = '/path/to/logs/' ) - -# Log -bt.logging.info(message) -bt.logging.debug(message) -bt.logging.trace(message) -bt.logging.success(message) -bt.logging.critical(message) -bt.logging.error(message) ->>> 2023-05-29 09:27:25.426 | INFO | message - -# Log using prefix suffix design -bt.logging.info(prefix, message) -bt.logging.debug(prefix, message) -bt.logging.trace(prefix, message) -bt.logging.success(prefix, message) -bt.logging.critical(prefix, message) -bt.logging.error(prefix, message) ->>> 2023-05-29 09:27:47.184 | INFO | cat dogs -``` - - - - - - - diff --git a/docs/reference/_difficulty.md b/docs/reference/_difficulty.md deleted file mode 100644 index 56ce3aabf6..0000000000 --- a/docs/reference/_difficulty.md +++ /dev/null @@ -1,35 +0,0 @@ - - - - - -# Difficulty Adjustment - -The POW and Recycle difficulties are adaptively adjusted every 100 blocks based on the following 4 cases. - - - 1. Registrations exceed the target and there were more recycle registrations than pow registrations? - `burn_cost = burn_cost * ( burn_regs_this_interval + target_regs ) / 2 * target_regs` - - 2. Registrations exceed the target and there were not more recycle registrations than pow registrations? - `pow_difficulty = pow_difficulty * ( pow_regs_this_interval + target_regs ) / 2 * target_regs` - - 3. Registrations do not exceed the target and there were more recycle registrations than pow registrations? - `burn_difficulty = pow_difficulty * ( regs_this_interval + target_regs ) / 2 * target_regs` - - 4. Registrations do not exceed the target and there were not more recycle registrations than pow registrations? - `pow_difficulty = pow_difficulty * ( regs_this_interval + target_regs ) / 2 * target_regs` - - -### Viewing current difficulty -Using the cli -```bash dark -btcli subnets list -NETUID NEURONS MAX_N DIFFICULTY TEMPO CON_REQ EMISSION BURN(τ) -1 691 1.02 K 198.08 T 99 None 28.44% τ4.75710 -3 4096 4.10 K 320.81 T 99 None 71.56% τ1.00000 - DIFFICULTY: Current proof of work difficulty - BURN: Current cost to register a key via recycle registration. -``` - - diff --git a/docs/questions-and-answers.md b/docs/resources/questions-and-answers.md similarity index 84% rename from docs/questions-and-answers.md rename to docs/resources/questions-and-answers.md index ff1772f9bd..8d9f9cf223 100644 --- a/docs/questions-and-answers.md +++ b/docs/resources/questions-and-answers.md @@ -1,7 +1,8 @@ --- title: "Frequently asked questions (FAQ)" -hide_table_of_contents: false +hide_table_of_contents: false --- + import ThemedImage from '@theme/ThemedImage'; import useBaseUrl from '@docusaurus/useBaseUrl'; @@ -32,7 +33,7 @@ import { VscFileMedia } from "react-icons/vsc"; ## Where can I get answers to my questions about Dynamic TAO? -This [Dynamic TAO FAQ](./dynamic-tao/dtao-faq). +This [Dynamic TAO FAQ](../dynamic-tao/dtao-faq). ### Is Bittensor a blockchain or an AI platform? @@ -50,17 +51,17 @@ Anyone with the funds and technical know-how can create a subnet, or participate ### How does competition work in a subnet? -The work to be performed by miners is set by the subnet creator in the form of the subnet's incentive mechanism. The miners compete to best perform the task, submitting their work to the validators. +The work to be performed by miners is set by the subnet creator in the form of the subnet's incentive mechanism. The miners compete to best perform the task, submitting their work to the validators. The validators then rank the quality of the work done by the miners within the subnet. The aggregated scores of the validators determine the quantity of TAO emitted to each miner. -At the same time, validators are also incentivized to do their best work, because their emissionsk depend on how well their miner scorings agree with the general consensus of other validators. +At the same time, validators are also incentivized to do their best work, because their emission depend on how well their miner scorings agree with the general consensus of other validators. ### What exactly is the task of a subnet miner? -The task of miners is different in each subnet. For example, subnet 1 produces LLM inference, and the miner task is to respond to a text prompt with a completion. Subnet 2 serves machine translation, and subnet 21 serves storage. +The task of miners is different in each subnet. Some subnets provide AI services like specialized inference, training, or prediction. Other provide infrastructure as a service, including storage or compute. -Browse the subnets on [TAO.app](https://tao.app) +Browse tokenomic information about the subnets on [TAO.app](https://tao.app), and learn more about the projects and services they support on the [Learnbittensor.org subnet listings](https://learnbittensor.org/subnets). ### So where does the blockchain come in? @@ -68,7 +69,7 @@ The blockchain records all the key activity of the subnets in its ledger. It als ### Do subnets talk to each other? -A new abstract base class, called `SubnetsAPI` is released in Bittensor `6.8.0` and your application can use this to enable cross subnet communication. Normally, however, if you are not using the `SubnetsAPI`, then the subtensor blockchain does not mix data from one subnet with another subnet data and a subnet does not communicate with another subnet. +A new abstract base class, called `SubnetsAPI` is released in Bittensor `6.8.0` and your application can use this to enable cross subnet communication. Normally, however, if you are not using the `SubnetsAPI`, then the subtensor blockchain does not mix data from one subnet with another subnet data and a subnet does not communicate with another subnet. :::tip See also See [Bittensor Subnets API](https://github.com/opentensor/bittensor/blob/master/README.md#bittensor-subnets-api). @@ -86,7 +87,7 @@ In Bittensor, "mining", within subnets, has nothing to do with adding blocks to Yes indeed. In Bittensor, the work of validating the blockchain is performed by the Opentensor Foundation on a Proof-of-Authority model. -### What is the incentive to be a miner or a validator, or create a subnet? +### What is the incentive to be a miner or a validator, or create a subnet? Bittensor incentivizes participation through emission of TAO. Each day, 7200 TAO are emitted into the network (one TAO every 12 seconds). @@ -96,20 +97,20 @@ The emission of TAO within each subnet is as follows: - 41% to validators - 41% to the miners -See [Emissions](./emissions.md). +See [Emissions](../learn/emissions.md). ### I don't want to create a subnet, can I just be a miner or a validator? Yes! Most participants will not create their own subnets, there are lots to choose from. -See: +See: -- [Validating in Bittensor](./validators/index.md) -- [Mining in Bittensor](./miners/index.md). +- [Validating in Bittensor](../validators/index.md) +- [Mining in Bittensor](../miners/index.md). ### Is there a central place where I can see compute requirements for mining and validating for all subnets? -Unfortunately no. Subnets are not run or managed by Opentensor Foundation, and the landscape of subnets is constantly evolving. +Unfortunately no. Subnets are not run or managed by Opentensor Foundation, and the landscape of subnets is constantly evolving. Browse the subnets at [TAO.app](https://tao.app), or on [Discord](https://discord.com/channels/799672011265015819/830068283314929684). @@ -117,4 +118,4 @@ Browse the subnets at [TAO.app](https://tao.app), or on [Discord](https://discor You can keep trying forever, but your success depends on your performance. Mining and validating in a subnet is competitive. If a miner or validator is one of the three lowest in the subnet, it may be de-registered at the end of the tempo, and have to register again. -See [miner deregistration](./miners/index.md#miner-deregistration). +See [miner deregistration](../miners/index.md#miner-deregistration). diff --git a/docs/root-network.md b/docs/root-network.md deleted file mode 100644 index aed1e399a5..0000000000 --- a/docs/root-network.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: "Root Network" ---- - -# Root Network - -:::tip - -The Root Network no longer is in operation, so this doc is a kind of historical artifact. The Root Network was decommisioned with the [Dynamic TAO](./dynamic-tao/dtao-guide.md) upgrade in February 2025 -::: - - -The root network was a special kind of subnet. The root network has the `netuid` of 0. - -**Root network validators**: The largest 64 subnet validators, in terms of their stake, from amongst all the subnet validators in all the active subnets in the Bittensor network, were, by default, the validators in the root network. - -**Root network miners**: There were no network miners in the root network. Instead, the subnets take their place. The 64 root network validators set the weights for all these subnets. - -:::tip Root network weights determined emissions -Prior to Dynamic TAO, these root network weights for the subnets determined emissions for the subnets. -::: \ No newline at end of file diff --git a/docs/sdk/env-vars.md b/docs/sdk/env-vars.md deleted file mode 100644 index cf187630b7..0000000000 --- a/docs/sdk/env-vars.md +++ /dev/null @@ -1,138 +0,0 @@ ---- -title: "Environment Variables" ---- - -This page documents the environment variables that provide configuration options to the Bittensor SDK. - -## General - -### `BT_SUBTENSOR_CHAIN_ENDPOINT` - -The Subtensor chain endpoint address used when launching a local network (LocalNet). -:::info -This variable will be renamed or deprecated in Bittensor SDK version 10. -::: - -### `NEST_ASYNCIO` - -If the variable is set to `1`, the `nest_asyncio` patch is applied to support nested asyncio event loops.
- -### `READ_ONLY` - -If set to `1`, Bittensor is run in in read-only mode, and write-required operations are disabled (e.g., `btlogging` and `bittensor-wallet`). - -Allows Bittensor to be run in read-only systems.
- -### `USE_TORCH` - -When set to `1`, forces the use of `PyTorch` instead of NumPy for certain operations.
-The SDK uses `False ` if the variable is not set. - -## Subtensor - -### `BT_CHAIN_ENDPOINT` - -The Subtensor node (RPC endpoint) URL to connect to Bittensor (overrides the default chain address). - -The SDK uses `bittensor.core.settings.DEFAULT_ENDPOINT ` if the variable is not set. - -See [Bittensor Networks](../bittensor-networks) - -### `BT_NETWORK` - -The default Subtensor network name. Allows selecting the network (e.g., `finney` or `testnet`) during Subtensor initialization without specifying an explicit endpoint.
-The SDK uses `bittensor.core.settings.DEFAULT_NETWORK ` if the variable is not set. - -## Axon - -### `BT_AXON_PORT` - -The port on which the local Axon server will listen for incoming connections. -The SDK uses `8091 ` if the variable is not set. - -### `BT_AXON_IP` - -The local IP address (interface) used to start Axon. -The SDK uses `"[::]"` if the variable is not set. - -### `BT_AXON_EXTERNAL_PORT` - -The external port of Axon advertised to other network peers. -The SDK uses `None` if the variable is not set. - -### `BT_AXON_EXTERNAL_IP` - -The external IP address that Axon will share with other network participants. -The SDK uses `None` if the variable is not set. - -### `BT_AXON_MAX_WORKERS` - -The maximum number of worker threads for the Axon server. -The SDK uses `10` if the variable is not set. - -## Logging - -### `BT_LOGGING_DEBUG` - -When set to `true` or `1`, enables DEBUG level message output.
- -### `BT_LOGGING_TRACE` - -When set to `true` or `1`, enables the most verbose TRACE logging level.
- -### `BT_LOGGING_INFO` - -When set to `true` or `1`, enables INFO level message output.
- -### `BT_LOGGING_RECORD_LOG` - -When set to `true` or `1`, enables log file recording.
-The SDK uses `False` if the variable is not set. - -### `BT_LOGGING_LOGGING_DIR` - -Specifies the directory path for storing log files. -The SDK uses `bittensor.core.settings.MINERS_DIR` if the variable is not set. - -## PriorityThreadPoolExecutor - -### `BT_PRIORITY_MAX_WORKERS` - -Maximum number of worker threads for the `PriorityThreadPoolExecutor`. -The SDK uses `5` if the variable is not set. - -### `BT_PRIORITY_MAXSIZE` - -Maximum task queue size for the `PriorityThreadPoolExecutor`. -The SDK uses `10` if the variable is not set. - -## Wallet - -### `BT_WALLET_NAME` - -Wallet name to use unless specified. -The SDK uses `default` if the variable is not set, - -### `BT_WALLET_HOTKEY` -Hotkey name to use unless specified. -The SDK uses `default` if the variable is not set, - -### `BT_WALLET_PATH` -The SDK uses `bittensor.core.settings.WALLETS_DIR` if the variable is not set. - -## Testing - -### `FAST_BLOCKS` - -The SDK runs e2e tests in fast-block mode if the variable is not set.
- -### `USE_DOCKER` - -If set to `1` or `true`, uses the Docker-based LocalNet image for launching e2e tests.
-The SDK uses `False` if the variable is not set. - -### `LOCALNET_SH_PATH` - -Full path to the `scripts/localnet.sh` file in the cloned `Subtensor` repository used to launch the local chain (including for e2e tests if the Docker image is not used).
-SDK skips running e2e tests if the variable is not set (used only together with the `USE_DOCKER` variable). - diff --git a/docs/sdk/managing-subtensor-connections.md b/docs/sdk/managing-subtensor-connections.md deleted file mode 100644 index acdd842a80..0000000000 --- a/docs/sdk/managing-subtensor-connections.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: "Managing Subtensor Connections" ---- - -# Managing Subtensor Connections - -Every time the Bittensor Python SDK's `Subtensor` or `AsyncSubtensor` class is instantiated, it creates a new websocket connection to Subtensor, Bittensor's Blockchain. Your code should ensure that these websocket connections are handled efficiently and closed when no longer in use by your code. - - -If not explicitly closed, connections *should* be terminated by Python's garbage collector, but threading can make this unreliable. (see [this comment](https://github.com/python-websockets/websockets/pull/1601#issuecomment-2705871026).) - -Therefore, the best solution is to always use one of the following techniques to close your instance's connection: - -1. Use the `close()` method to manually terminate the instance and connection. -1. **(Preferred)** Use the `with` keyword to instantiate the Subtensor object within a Python [context manager](https://docs.python.org/3/reference/datamodel.html#context-managers). This ensures the websocket connection within the Subtensor instance is terminated gracefully when the context ends. - -:::tip -You don't need to both a `with`-statement context manager and `.close()`, just one or the other. -::: - -## What not to do - - -```python -import bittensor as bt -sub = bt.subtensor("finney") -# calls to subtensor - -# no close -# potential resource leak: -# the connection is open until/unless garbage collected -``` - - -## With `close()` - -### Sync -```python -import bittensor as bt -sub = bt.subtensor("finney") -# subtensor calls -sub.close() -# instance and connection are terminated. -``` - -### Async -```python -import bittensor as bt -sub = bt.AsyncSubtensor() -await sub.initialize() -# calls to subtensor -await sub.close() -# instance and connection are terminated. -``` - - - -## With `with` - -### Sync -```python -import bittensor as bt -with bt.subtensor("finney") as sub: - # all calls to subtensor instance inside this block - - -# instance and connection are terminated at the end of the context scope -``` -### Async - -```python -import bittensor as bt -async with bt.AsyncSubtensor() as sub: - # calls to subtensor - -# instance and connection are terminated at the end of the context scope -``` -or -```python -import bittensor as bt -sub = bt.AsyncSubtensor() -async with sub: - # calls to subtensor - -# instance and connection are terminated at the end of the context scope -``` - diff --git a/docs/sdk/subtensor-api.md b/docs/sdk/subtensor-api.md deleted file mode 100644 index d81eea69b3..0000000000 --- a/docs/sdk/subtensor-api.md +++ /dev/null @@ -1,171 +0,0 @@ ---- -title: Subtensor API ---- - -# Subtensor API - - -## Overview - -The SubtensorApi is a unified interface for the Bittensor blockchain. It wraps both the synchronous and asynchronous Subtensor implementations, providing modular access to chain subsystems like wallets, delegates, neurons, and more. - - -### Modules - -All methods are grouped into logical modules for better organization and readability. Some methods may belong to more than one group if they span multiple functional areas. This does not compromise the internal logic — rather, it enhances discoverability and cohesion. Method equivalence between `SubtensorApi` and the original `Subtensor` is automatically verified by test coverage on every pull request (PR). - - -
- Subsystem modules - -| Property | Description | -|----------|-------------| -| chain | Blockchain interaction methods | -| commitments | Commitment and reveal logic | -| delegates | Delegate management tools | -| extrinsics | Transaction construction and signing | -| metagraphs | Metagraph data and operations | -| neurons | Neuron-level APIs | -| queries | General query endpoints | -| staking | Staking operations | -| subnets | Subnet access and management | -| wallets | Wallet creation, import/export | -
- -### Configuration - -The behavior of the `SubtensorApi` object is configured with the following parameters. -
- Parameters - -| Parameter | Type | Description | Default Value | -|-------------------|-------------------|----------------------------------------------------------------------------------------------------------|-------------------------------| -| `network` | `str` or `None` | The network to connect to. If not specified, defaults to `"finney"`. | `None` (interpreted as "finney")| -| `config` | `Config` or `None`| Pre-built Bittensor configuration object. | `None` | -| `async_subtensor` | `bool` | Whether to use the asynchronous version of the API. | `False` | -| `legacy_methods` | `bool` | If `True`, all methods from the legacy `Subtensor` class are added to this class. | `False` | -| `fallback_endpoints` | `list[str]` or `None`| List of fallback endpoints to use if default or provided network is not available. | `None` | -| `retry_forever` | `bool` | If `True`, continuously retries on connection errors until successful. | `False` | -| `log_verbose` | `bool` | Enables detailed logging output when set to `True`. | `False` | -| `mock` | `bool` | Enables mock mode for testing without connecting to the blockchain. | `False` | -
- - -Reference docs: [SubtensorApi](pathname:///python-api/html/autoapi/bittensor/core/subtensor_api/index.html) - -## Basic Usage - -:::tip -Upgrade to the [latest Bittensor release](https://pypi.org/project/bittensor/). -```shell -pip install bittensor -``` -::: - -### Synchronous (Default) - -```python -import bittensor as bt - -sub = bt.SubtensorApi() - -print(sub.block) # Get current block number -print(sub.delegates.get_delegate_identities()) -sub.chain.tx_rate_limit() -``` - -### Asynchronous - -```python -import bittensor as bt -import asyncio - -async def main(): - sub = bt.SubtensorApi(async_subtensor=True) - async with sub: - print(await sub.block) - print(await sub.delegates.get_delegate_identities()) - await sub.chain.tx_rate_limit() - -asyncio.run(main()) -``` -### Legacy Method Support - -You can enable all legacy methods from the original `Subtensor` class directly on this interface: - -```python -import bittensor as bt - -sub = bt.SubtensorApi(legacy_methods=True) -print(sub.bonds(0)) # Classic method usage -``` - -## Advanced Usage -### Retry and Fallback RPC Nodes - -Enable redundancy and resilience with fallback endpoints and retry logic: - -```python -import bittensor as bt - -sub = bt.SubtensorApi( - "local", - fallback_endpoints=[ - "wss://fallback1.taonetwork.com:9944", - "wss://lite.sub.latent.to:443", - ], - retry_forever=True, -) -print(sub.block) -``` - -### Mock Mode for Testing - -Use `mock=True` to simulate the interface without connecting to the blockchain: - -```python -import bittensor as bt - -sub = bt.SubtensorApi(mock=True) -print(sub) # Output: "" -``` - -### Custom Configuration - -You can pass a pre-built `Config` object: - -```python -import argparse -import bittensor as bt - -parser = argparse.ArgumentParser('Miner') -bt.SubtensorApi.add_args(parser) -config = bt.config(parser) -sub = bt.SubtensorApi(config=config) - -print(sub) -``` - -## Context Manager Usage - -### Synchronous Context Manager - -```python -import bittensor as bt - -with bt.SubtensorApi() as sub: - print(sub.block) -``` - -### Asynchronous Context Manager - -```python -import bittensor as bt -import asyncio - -async def main(): - async with bt.SubtensorApi(async_subtensor=True) as sub: - print(await sub.block) - -asyncio.run(main()) -``` \ No newline at end of file diff --git a/docs/senate.md b/docs/senate.md deleted file mode 100644 index 232be41196..0000000000 --- a/docs/senate.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: "Senate" ---- - -# Senate - -The Senate is a group of delegates who have elected to participate in proposals, and who control a significant portion of total network stake. - -All members of the network who have delegated stake to any of these Senate members are represented by the party that controls the delegate they've chosen to stake with. This allows any holder within the network to be represented, and to make their opinion known by delegating with organizations who represent their interests. - -## Requirements - -In order to participate in the Senate, a coldkey must: - -- Have registered with any subnetwork as a hotkey-coldkey pair. -- Have a hotkey stake value is greater than 2% of the network's total stake amount, through delegation or self-stake. -- Have elected to participate in the Senate. - - -Once all four of the requirements have been fulfilled by a coldkey-hotkey pair, they can vote on any proposal created by the [Triumvirate](glossary#triumvirate). - -In the case that the Senate has all twelve seats filled, and a delegate wishes to join, they will replace the lowest stake member as long as they have more stake in the network. - - - -## Viewing proposals - -Anyone can view proposals currently before the senate. This is an unpermissioned request. - -```shell -btcli sudo proposals -``` - -## Voting - -Senators can vote using the following command. You will be prompted for the proposal hash, which can be obtained in the proposals overview using `btcli sudo proposals`. - -After entering a proposal hash, you will then be prompted to either cast an approval or a disapproval. Once confirmed, the vote will be included in the next block and counted in the vote. - -``` -btcli sudo senate-vote -``` diff --git a/docs/staking-and-delegation/delegation.md b/docs/staking-and-delegation/delegation.md deleted file mode 100644 index b6c0b8c846..0000000000 --- a/docs/staking-and-delegation/delegation.md +++ /dev/null @@ -1,113 +0,0 @@ ---- -title: "Staking/Delegation Overview" ---- - -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Staking/delegation overview - -TAO holders can **stake** any amount of the liquidity they hold to a validator. Also known as **delegation**, staking supports validators, because their total stake in the subnet, including stake delegated to them by others, determines their consensus power and their share of emissions. After the validator/delegate extracts their **take** the remaining emissions are credited back to the stakers/delegators in proportion to their stake with that validator. - -See also: -- [Staking with Polkadot JS](./staking-polkadot-js.md). -- See also [Validators: Acquiring stake](../validators/index.md#acquiring-stake). - - -:::tip tips -Validators/delegates can configure their take. The default value is 18%. See [Setting your delegate take](#setting-your-delegate-take). - -Minimum required stake for nominators is 0.1 TAO. -::: - -Staking is always local to a subnet. - -Each subnet operates its own automated market-maker (AMM), meaning it mantains its own reserves of the two tokens being traded so that it can facilitate a trade of any desired quantity of liquidity (as long as its available), at a price that it automated calculates. - -Each subnet has a reserve of TAO and a reserve of its currency, referred to in general as its alpha ($\alpha$) currency. Stake is held in $\alpha$ token denominations. - -As a TAO holder you will stake to a validator’s hotkey on a specific subnet. Staking to a given validator's hotkeys on different subnets is independent. - -**When you stake:** - -1. First, your TAO stake goes into the subnet's TAO reserve of its AMM (automated market maker) pool. -1. Then, the subnet AMM pool algorithm uses the exchange rate and calculates the equivalent units of $\alpha$, for the TAO that was just added to the TAO reserve side. This amount of $\alpha$ is taken out of the alpha reserve of the pool and is sent to the validator’s hotkey. -1. The validator’s hotkey holds the $\alpha$. The sum of stake among all hotkeys is referred as **$\alpha$ outstanding** for that subnet. - -**When you unstake:** - -1. When you issue an unstake command, `btcli stake remove`, and specify the units of $\alpha$ token you want to unstake, this $\alpha$ is first taken out of the validator’s hotkey and added to the $\alpha$ reserves of the subnet pool. -2. The subnet AMM pool algorithm then applies the latest exchange rate and calculates the equivalent TAO units for the $\alpha$ token units that were just added to the $\alpha$ reserves of the pool. -3. These equivalent TAO units are then taken out of the TAO reserves of the subnet pool and are sent to the TAO holder’s coldkey. - -:::tip Stake is always expressed in alpha units -In Dynamic TAO, except for the stake held in [the Root Subnet](#root-subnet-subnet-zero), the stake held by a hotkey in a subnet is always expressed in the subnet-specific $\alpha$ units. Root Subnet stake is expressed in $\tau$. -::: - -:::tip Prereq -To follow along, install the [latest release of `btcli`](https://pypi.org/project/bittensor-cli/). -::: - -## Example - -Suppose a validator holds 800 TAO of their own. - -Then three nominators stake to the validator as follows: - - Nominator 1: 100 TAO. - - Nominator 2: 70 TAO. - - Nominator 3: 30 TAO. - -The validator's effective stake is the total sum of their own and all delegated stake. - - $$ - \text{delegated stake} = 100\tau + 70\tau + 30\tau = 200\tau - $$ - $$ - \text{total stake} = \text{self-stake} + \text{delegated stake} = 800\tau + 200\tau = 1000 \tau - $$ - -Emissions to stakers are proportional to their contribution to delegated stake: - - $$ - \text{emission for staker x from validator V} = - \frac - { stake_x } - { \sum_{i \in \text{V's stakers}} \bigl(stake_i) } - $$ -- Nominator 1 represents 50% of total delegated TAO: - - $$ - \text{emission for staker x from validator V} = - \frac - { 100\tau } - { 100\tau + 70\tau + 30\tau } = 50\% - $$ -- Nominator 2 contributes 35% of the total delegated TAO. - $$ - \text{emission for staker x from validator V} = - \frac - { 70\tau } - { 100\tau + 70\tau + 30\tau } = 35\% - $$ -- Nominator 3 contributes 15% of the total delegated TAO. - $$ - \text{emission for staker x from validator V} = - \frac - { 30\tau } - { 100\tau + 70\tau + 30\tau } = 15\% - $$ - -The delegate validator would keep 80% of the emissions, based on their 80% proportion of the total stake (0.8). In addition, the validator would keep their 18% take of the emissions earned on the delegated stake. - -As a result: - - Total emissions to the delegate are: $0.8 + 0.2*0.18= .836 = 83.6\%$ of the received emissions. - - Each nominator receives the following portions of the validator's total emissions, based on their contribution percentages: - - Nominator 1 emissions: $(1-0.8)*(1-0.18)*.5 = .082 = 8.2\%$ - - Nominator 2 emissions: $(1-0.8)*(1-0.18)*.35 = .0574 = 5.74\%$ - - Nominator 3 emissions: $(1-0.8)*(1-0.18)*.15 = .0246 = 2.46\%$ - - -:::info A nominator is a delegating authority -A nominator is the same as a delegating authority. Typically, a nominator is an owner of TAO funds who wants to invest in the Bittensor network without performing any validating tasks. -::: - diff --git a/docs/staking-and-delegation/managing-stake-btcli.md b/docs/staking-and-delegation/managing-stake-btcli.md deleted file mode 100644 index 8f093a7a14..0000000000 --- a/docs/staking-and-delegation/managing-stake-btcli.md +++ /dev/null @@ -1,311 +0,0 @@ ---- -title: "Managing Stake with BTCLI" ---- - -# Managing stake with `btcli` - -This pages demonstrates usage of `btcli`, the Bittensor CLI, for managing stake. - -TAO holders can **stake** any amount of the liquidity they hold to a validator. Also known as **delegation**, staking supports validators, because their total stake in the subnet, including stake delegated to them by others, determines their consensus power and their share of emissions. After the validator/delegate extracts their **take** the remaining emissions are credited back to the stakers/delegators in proportion to their stake with that validator. - -See also: - -- [Staking/delegation overview](./delegation) -- [Understanding pricing and anticipating slippage](../dynamic-tao/staking-unstaking-dtao) - -:::tip -Minimum transaction amount for stake/unstake/move/transfer: 500,000 RAO or 0.0005 TAO. -::: - -## Pre-requisite: Create a wallet - -To manage stake you will need a wallet. For practice, create one with `btcli`. - -```shell -btcli wallet create -``` - -:::danger -The funds in a crypto wallet are only as secure as your private key and/or seed phrase, and the devices that have access to these. - -Test network tokens have no real value. Before managing liquidity on Bittensor mainnet, carefully consider all aspects of secrets management and endpoint security! -::: - -## View TAO balance - -To stake, you'll first need some TAO. Inquire in [Discord](https://discord.com/channels/799672011265015819/1107738550373454028/threads/1331693251589312553) to obtain TAO on Bittensor test network. Alternatively, you can transfer some testnet TAO to your wallet address using the [BTCLI Live Coding Playground](../btcli/btcli-playground.md#transfer). - -After creating a wallet, ensure that you are targeting the test network by running the `btcli config set` command. Next, select network, and set it to `test`. - -View your testnet balance with: - -```shell -btcli wallet balance -``` - -```console - Network: test - Wallet Name Coldkey Address Free Balance Staked Balance Total Balance - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - PracticeKey! 5G4mxrN8msvc4jjwp7xoBrtAejTfAMLCMTFGCivY5inmySbq τ 54.6699 τ 4.3658 τ 59.0357 - - - - Total Balance τ 54.6699 τ 4.3658 τ 59.0357 - ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - -``` - -## View subnet currency reserves - -To see the list of subnets and their currencies, run: - -```shell -btcli subnet list -``` - -You should see something like the following output. Notice that next to the subnets Netuid and Name is the subnet's token `Price (τ_in/α_in)`, which, as indicated, is a ratio of the TAO in reserve `τ_in` to alpha in reserve `α_in`. - -```console - Subnets - Network: test - - - ┃ ┃ Price ┃ Market Cap ┃ ┃ ┃ ┃ ┃ - Netuid ┃ Name ┃ (τ_in/α_in) ┃ (α * Price) ┃ Emission (τ) ┃ P (τ_in, α_in) ┃ Stake (α_out) ┃ Supply (α) ┃ Tempo (k/n) -━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━ - 0 │ τ root │ 1.0000 τ/Τ │ τ 5.01m │ τ 0.0000 │ -, - │ Τ 2.77m │ 5.01m Τ /21M │ -/- - 277 │ इ muv │ 1.7300 τ/इ │ τ 696.47k │ τ 0.0110 │ τ 17.24k, 9.97k इ │ 392.63k इ │ 402.59k इ /21M │ 74/99 - 3 │ γ templar │ 0.3123 τ/γ │ τ 129.95k │ τ 0.3383 │ τ 30.47k, 97.58k γ │ 318.57k γ │ 416.15k γ /21M │ 0/99 - 1 │ α apex │ 0.1117 τ/α │ τ 49.00k │ τ 0.1512 │ τ 20.61k, 184.54k α │ 254.22k α │ 438.76k α /21M │ 98/99 - 255 │ ዉ ethiopic_wu │ 0.0394 τ/ዉ │ τ 17.31k │ τ 0.0498 │ τ 8.20k, 208.05k ዉ │ 230.94k ዉ │ 438.99k ዉ /21M │ 52/99 - 119 │ Ⲃ vida │ 0.0235 τ/Ⲃ │ τ 10.30k │ τ 0.0265 │ τ 4.42k, 188.50k Ⲃ │ 250.43k Ⲃ │ 438.93k Ⲃ /21M │ 16/99 - 117 │ Ⲁ alfa │ 0.0227 τ/Ⲁ │ τ 9.96k │ τ 0.0270 │ τ 4.53k, 199.77k Ⲁ │ 239.10k Ⲁ │ 438.87k Ⲁ /21M │ 14/99 - ... -``` - -## View a subnet's nodes - -```shell -btcli subnet show --netuid 119 -``` - -``` -Netuid: 119 -Using the specified network test from config - - Subnet 119: vida - Network: test - - UID ┃ Stake (Ⲃ) ┃ Alpha (Ⲃ) ┃ Tao (τ) ┃ Dividends ┃ Incentive ┃ Emissions (Ⲃ) ┃ Hotkey ┃ Coldkey ┃ Identity -━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━ - 101 │ 44.60k Ⲃ │ 44.60k Ⲃ │ τ 0.00 │ 0.00439 │ 0.0088 │ 0.35965 Ⲃ │ 5FRxKz │ 5FRxKz │ Owner119 (*Owner) - 45 │ 81.33k Ⲃ │ 72.55k Ⲃ │ τ 8.78k │ 0.00439 │ 0.0088 │ 0.35965 Ⲃ │ 5FCPTn │ 5D2d3Y │ muv - 21 │ 10.94k Ⲃ │ 10.94k Ⲃ │ τ 1.81 │ 0.00439 │ 0.0088 │ 0.35965 Ⲃ │ 5CFZ9x │ 5H13H4 │ Owner136 - 22 │ 9.32k Ⲃ │ 9.32k Ⲃ │ τ 1.81 │ 0.00439 │ 0.0088 │ 0.35965 Ⲃ │ 5HbYLL │ 5H13H4 │ Owner136 - 81 │ 8.19k Ⲃ │ 8.19k Ⲃ │ τ 1.81 │ 0.00439 │ 0.0088 │ 0.35965 Ⲃ │ 5HBK4F │ 5H13H4 │ Owner136 - 96 │ 6.52k Ⲃ │ 6.52k Ⲃ │ τ 0.16 │ 0.50000 │ 0.0000 │ 41.00023 Ⲃ │ 5EqPr3 │ 5EvXtY │ ~ - 97 │ 4.13k Ⲃ │ 4.00k Ⲃ │ τ 125.80 │ 0.00439 │ 0.0088 │ 0.35965 Ⲃ │ 5CorGT │ 5Cqiai │ ~ - 80 │ 3.98k Ⲃ │ 3.98k Ⲃ │ τ 0.00 │ 0.00439 │ 0.0088 │ 0.35965 Ⲃ │ 5CtaFa │ 5H13H4 │ Owner136 - 100 │ 2.54k Ⲃ │ 2.54k Ⲃ │ τ 0.00 │ 0.00439 │ 0.0088 │ 0.35965 Ⲃ │ 5FqJEi │ 5G3sVe │ ~ - 99 │ 951.73 Ⲃ │ 951.73 Ⲃ │ τ 0.00 │ 0.00439 │ 0.0088 │ 0.35965 Ⲃ │ 5GGmFp │ 5G3sVe │ ~ - 26 │ 940.77 Ⲃ │ 931.42 Ⲃ │ τ 9.35 │ 0.00439 │ 0.0088 │ 0.35965 Ⲃ │ 5Ct14B │ 5GEeMQ │ ~ - 78 │ 932.60 Ⲃ │ 932.60 Ⲃ │ τ 0.00 │ 0.00439 │ 0.0088 │ 0.35965 Ⲃ │ 5HgFYK │ 5DF8AP │ ~ - 20 │ 931.77 Ⲃ │ 931.77 Ⲃ │ τ 0.00 │ 0.00439 │ 0.0088 │ 0.35965 Ⲃ │ 5FnK5f │ 5DZPbo │ ~ - 76 │ 931.55 Ⲃ │ 931.55 Ⲃ │ τ 0.00 │ 0.00439 │ 0.0088 │ 0.35965 Ⲃ │ 5DCPu5 │ 5G6UQE │ ~ - 32 │ 931.13 Ⲃ │ 925.51 Ⲃ │ τ 5.62 │ 0.00439 │ 0.0088 │ 0.35965 Ⲃ │ 5EARqJ │ 5CtBA6 │ ~ - 18 │ 929.49 Ⲃ │ 928.96 Ⲃ │ τ 0.52 │ 0.00439 │ 0.0088 │ 0.35965 Ⲃ │ 5HNNws │ 5Hbazs │ ~ - 33 │ 929.22 Ⲃ │ 924.19 Ⲃ │ τ 5.03 │ 0.00439 │ 0.0088 │ 0.35965 Ⲃ │ 5CeoYQ │ 5GKVqx │ ~ - 46 │ 928.60 Ⲃ │ 928.23 Ⲃ │ τ 0.38 │ 0.00439 │ 0.0088 │ 0.35965 Ⲃ │ 5GuqX1 │ 5Ehuid │ ~ -``` - -## Stake into a node - -Use `btcli stake add` to stake to a validator on a subnet. You'll be prompted to choose a subnet and validator, as well as specify an amount of TAO to stake into the validator's hotkey as alpha. - -```shell - btcli stake add -``` - -```console -Enter the netuid to use. Leave blank for all netuids: 119 -Enter the wallet name (PracticeKey!): -Enter the wallet hotkey name or ss58 address to stake to (or Press Enter to view delegates): -Using the specified network test from config - - - - Subnet 119: vida - Network: test - - UID ┃ Stake (Ⲃ) ┃ Alpha (Ⲃ) ┃ Tao (τ) ┃ Dividends ┃ Incentive ┃ Emissions (Ⲃ) ┃ Hotkey ┃ Coldkey ┃ Identity -━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━ - 101 │ 44.60k Ⲃ │ 44.60k Ⲃ │ τ 0.00 │ 0.00439 │ 0.0088 │ 0.35965 Ⲃ │ 5FRxKz │ 5FRxKz │ Owner119 (*Owner) - 45 │ 81.33k Ⲃ │ 72.55k Ⲃ │ τ 8.78k │ 0.00439 │ 0.0088 │ 0.35965 Ⲃ │ 5FCPTn │ 5D2d3Y │ muv - 21 │ 10.94k Ⲃ │ 10.94k Ⲃ │ τ 1.81 │ 0.00439 │ 0.0088 │ 0.35965 Ⲃ │ 5CFZ9x │ 5H13H4 │ Owner136 - 22 │ 9.32k Ⲃ │ 9.32k Ⲃ │ τ 1.81 │ 0.00439 │ 0.0088 │ 0.35965 Ⲃ │ 5HbYLL │ 5H13H4 │ Owner136 - 81 │ 8.19k Ⲃ │ 8.19k Ⲃ │ τ 1.81 │ 0.00439 │ 0.0088 │ 0.35965 Ⲃ │ 5HBK4F │ 5H13H4 │ Owner136 - 96 │ 6.52k Ⲃ │ 6.52k Ⲃ │ τ 0.16 │ 0.50000 │ 0.0000 │ 41.00023 Ⲃ │ 5EqPr3 │ 5EvXtY │ ~ - 97 │ 4.13k Ⲃ │ 4.00k Ⲃ │ τ 125.80 │ 0.00439 │ 0.0088 │ 0.35965 Ⲃ │ 5CorGT │ 5Cqiai │ ~ - 80 │ 3.98k Ⲃ │ 3.98k Ⲃ │ τ 0.00 │ 0.00439 │ 0.0088 │ 0.35965 Ⲃ │ 5CtaFa │ 5H13H4 │ Owner136 - 100 │ 2.54k Ⲃ │ 2.54k Ⲃ │ τ 0.00 │ 0.00439 │ 0.0088 │ 0.35965 Ⲃ │ 5FqJEi │ 5G3sVe │ ~ - 99 │ 951.73 Ⲃ │ 951.73 Ⲃ │ τ 0.00 │ 0.00439 │ 0.0088 │ 0.35965 Ⲃ │ 5GGmFp │ 5G3sVe │ ~ - 26 │ 940.77 Ⲃ │ 931.42 Ⲃ │ τ 9.35 │ 0.00439 │ 0.0088 │ 0.35965 Ⲃ │ 5Ct14B │ 5GEeMQ │ ~ - 78 │ 932.60 Ⲃ │ 932.60 Ⲃ │ τ 0.00 │ 0.00439 │ 0.0088 │ 0.35965 Ⲃ │ 5HgFYK │ 5DF8AP │ ~ -─────┼───────────┼───────────┼──────────┼───────────┼───────────┼───────────────┼────────┼─────────┼─────────────────── - │ 260.19k Ⲃ │ 251.23k Ⲃ │ 8.96k Ⲃ │ 1.000 │ │ 82.0005 Ⲃ │ │ │ - - -``` - -After selecting a validator to delegate stake to, you'll see your wallet balance and be asked to specify the amount of TAO you wish to stake. - -```console -Amount to stake (TAO τ): 5 -``` - -You'll then see the details of the trade, including [slippage](../dynamic-tao/staking-unstaking-dtao), and be asked to confirm execution. - -```console - Staking to: - Wallet: PracticeKey!, Coldkey ss58: 5G4mxrN8msvc4jjwp7xoBrtAejTfAMLCMTFGCivY5inmySbq - Network: test - - Netuid ┃ Hotkey ┃ Amount (τ) ┃ Rate (per τ) ┃ Received ┃ Slippage -━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━ - 19 │ 5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT │ τ 5.0000 │ 991.3160712161465 t/τ │ 4,793.8697 t │ 3.2827 % -────────┼──────────────────────────────────────────────────┼────────────┼────────────────────────┼──────────────┼────────── - │ │ │ │ │ - -Description: -The table displays information about the stake operation you are about to perform. -The columns are as follows: - - Netuid: The netuid of the subnet you are staking to. - - Hotkey: The ss58 address of the hotkey you are staking to. - - Amount: The TAO you are staking into this subnet onto this hotkey. - - Rate: The rate of exchange between your TAO and the subnet's stake. - - Received: The amount of stake you will receive on this subnet after slippage. - - Slippage: The slippage percentage of the stake operation. (0% if the subnet is not dynamic i.e. root). - -Would you like to continue? [y/n]: -``` - -If you confirm, the staking operation will execute. After completion - -## View your current stakes - -Use `btcli stake list` to view your currently held stakes. For each validator you have staked, you'll see how much stake you currently hold on each subnet. - -Stake is held in alpha, but note that value at the current price is also displayed, along with the computed **Swap** value and slippage rate of the current holdings. - -```console - Hotkey: 5GEXJdUXxLVmrkaHBfkFmoodXrCSUMFSgPXULbnrRicEt1kK - Network: test - - See below for an explanation of the columns - - ┃ ┃ Value ┃ ┃ Price ┃ ┃ ┃ Emission - Netuid ┃ Name ┃ (α x τ/α) ┃ Stake (α) ┃ (τ_in/α_in) ┃ Swap (α -> τ) ┃ Registered ┃ (α/block) -━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━ - 250 │ ኤ unknown │ τ 18.38 │ 602.14 ኤ │ 0.0305 τ/ኤ │ τ 17.96 (2.287%) │ YES │ 0.0000 ኤ - 119 │ Ⲃ vidac │ τ 13.72 │ 98.73 Ⲃ │ 0.1390 τ/Ⲃ │ τ 13.61 (0.815%) │ YES │ 0.0000 Ⲃ -────────┼───────────┼───────────┼───────────┼─────────────┼──────────────────┼────────────┼─────────── - 2 │ │ τ 32.10 │ │ │ τ 31.57 │ │ - -Press Enter to continue to the next hotkey... -``` - -## Transferring stake - -The `btcli stake transfer` command is used to transfer ownership of stake from one wallet (coldkey) to another. - -:::tip -Don't confuse this with `btcli stake move`, which does not transfer ownership to another wallet/coldkey, but moves stake between validators or subnets, effectively unstaking and restaking it in a single operation. -::: - -This operation effectively comprises a series of operations, which occur as an atomic transaction: - -- first, the specified amount is unstaked from the subnet alpha token into TAO -- that amount of TAO is then transferred to the ownership of the recipient -- the recipient then automatically stakes the newly received TAO into the subnet, receiving the alpha tokens in return - -``` -btcli stake transfer - - -This command transfers stake from one coldkey to another while keeping the same hotkey. -Using the wallet name from config: PracticeKey! -Using the wallet hotkey from config: stakinkey1 -Enter the destination wallet name or coldkey SS58 address: zingo -Using the specified network test from config - - Available Stakes to Transfer - for wallet hotkey: - stakinkey1: 5GEXJdUXxLVmrkaHBfkFmoodXrCSUMFSgPXULbnrRicEt1kK - - Index ┃ Netuid ┃ Name ┃ Stake Amount ┃ Registered -━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━ - 0 │ 0 │ τ root │ τ 76.1340 │ NO - 1 │ 3 │ γ templar │ 0.0008 γ │ YES - 2 │ 119 │ Ⲃ vida │ 0.0009 Ⲃ │ YES - 3 │ 250 │ ኤ ethiopic_glottal_e │ 11.2528 ኤ │ YES - -Enter the index of the stake you want to transfer [0/1/2/3]: 3 - -Enter the amount to transfer ኤ (max: 11.2528 ኤ) or 'all' for entire balance: all - -Enter the netuid of the subnet you want to move stake to (0-308): 250 - - Moving stake from: ኤ(Netuid: 250) to: ኤ(Netuid: 250) - Network: test - - origin netuid ┃ origin hotkey ┃ dest netuid ┃ dest hotkey ┃ amount (ኤ) ┃ rate (ኤ/ኤ) ┃ received (ኤ) ┃ slippage -━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━ - ኤ(250) │ 5GE...1kK │ ኤ(250) │ 5GE...1kK │ 11.2528 ኤ │ 1.0ኤ/ኤ │ 11.2502 ኤ │ 0.0228% -───────────────┼───────────────┼─────────────┼─────────────┼────────────┼────────────┼──────────────┼────────── - │ │ │ │ │ │ │ -Would you like to continue? [y/n]: y -Enter your password: -Decrypting... -Origin Stake: - 11.2528 ኤ ➡ 0.0000 ኤ -Destination Stake: - 0.0000 ኤ ➡ 11.2502 ኤ -``` - -When the recipient check's their `stake list`, they'll now see the transferred stake: - -```console -btcli stake list --wallet_name zingo - - -Using the specified network test from config - - Hotkey: 5GEXJdUXxLVmrkaHBfkFmoodXrCSUMFSgPXULbnrRicEt1kK - Network: test - - - ┃ ┃ Value ┃ ┃ Price ┃ ┃ ┃ Emission - Netuid ┃ Name ┃ (α x τ/α) ┃ Stake (α) ┃ (τ_in/α_in) ┃ Swap (α -> τ) ┃ Registered ┃ (α/block) -━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━ - 0 │ τ root │ τ 2.34 │ τ 2.34 │ 1.0000 τ/τ │ N/A (0.000%) │ NO │ τ 0.0000 - 250 │ ኤ ethiopic_glottal_e │ τ 0.22 │ 11.25 ኤ │ 0.0195 τ/ኤ │ τ 0.22 (0.006%) │ YES │ 0.0000 ኤ -────────┼──────────────────────┼───────────┼───────────┼─────────────┼─────────────────┼────────────┼─────────── - 2 │ │ τ 2.56 │ │ │ τ 2.56 │ │ - - - -Wallet: - Coldkey SS58: 5F1TCdVcRWLYyKiS2kF2nBZ21EwQDDFr8hEqrDhRL6YvdtgQ - Free Balance: τ 0.0000 - Total TAO (τ): τ 2.51 - Total Value (τ): τ 2.56 -``` - -## Moving stake - -The `btcli stake move` command is used to moves stake between validators or subnets, effectively unstaking and restaking it in a single operation. It does not change ownership of the stake, which remains with the same wallet/coldkey. - -:::tip -Don't confuse this with `btcli stake transfer`, which is used to transfer ownership of stake from one wallet (coldkey) to another. -::: diff --git a/docs/staking-and-delegation/managing-stake-sdk.md b/docs/staking-and-delegation/managing-stake-sdk.md deleted file mode 100644 index 6bc7e6cbb7..0000000000 --- a/docs/staking-and-delegation/managing-stake-sdk.md +++ /dev/null @@ -1,484 +0,0 @@ ---- -title: "Managing stake with Bittensor Python SDK" ---- - -# Managing Stake with Bittensor Python SDK - -This pages demonstrates usage of the Bittensor SDK for Python for managing stake. - -TAO holders can **stake** any amount of the liquidity they hold to a validator. Also known as **delegation**, staking supports validators, because their total stake in the subnet, including stake delegated to them by others, determines their consensus power and their share of emissions. After the validator/delegate extracts their **take** the remaining emissions are credited back to the stakers/delegators in proportion to their stake with that validator. - -See also: - -- [Staking/delegation overview](./delegation) -- [Understanding pricing and anticipating slippage](../dynamic-tao/staking-unstaking-dtao) - -:::tip -Minimum transaction amount for stake/unstake/move/transfer: 500,000 RAO or 0.0005 TAO. -::: - -## Check your TAO balance - -To stake, you'll first need some TAO. Inquire in [Discord](https://discord.com/channels/799672011265015819/1107738550373454028/threads/1331693251589312553) to obtain TAO on Bittensor test network. Alternatively, you can transfer some testnet TAO to your wallet address using the [BTCLI Live Coding Playground](../btcli/btcli-playground.md#transfer). - -:::danger -The funds in a crypto wallet are only as secure as your private key and/or seed phrase, and the devices that have access to these. - -Test network tokens have no real value. Before managing liquidity on Bittensor mainnet, carefully consider all aspects of secrets management and endpoint security! -::: - -```python -import bittensor as bt -sub = bt.Subtensor(network="test") -wallet = bt.wallet( - name="PracticeKey!", - hotkey="stakinkey1", -) -wallet.unlock_coldkey() -balance = sub.get_balance(wallet.coldkey.ss58_address) -print(balance) -``` - -## View exchange rates - -The following script displays exchange rates for a subnet alpha token, with and without slippage. - -```python -import bittensor as bt - -sub = bt.Subtensor(network="test") -subnet = sub.subnet(netuid=1) - -print("alpha_to_tao_with_slippage", subnet.alpha_to_tao_with_slippage(100)) -print("alpha_to_tao_with_slippage percentage", subnet.alpha_to_tao_with_slippage(100, percentage=True)) - -print("tao_to_alpha_with_slippage", subnet.tao_to_alpha_with_slippage(100)) -print("tao_to_alpha_with_slippage percentage", subnet.tao_to_alpha_with_slippage(100, percentage=True)) - -print("tao_to_alpha", subnet.tao_to_alpha(100)) -print("alpha_to_tao", subnet.alpha_to_tao(100)) -``` - -## Register on a subnet - -You can register your hotkey on a subnet using the `burned_register` method. This is necessary for staking, mining or validating. - -```python -import bittensor as bt -logging = bt.logging -logging.set_info() -sub = bt.Subtensor(network="test") -wallet = bt.wallet( - name="ExampleWalletName", - hotkey="ExampleHotkey", -) -wallet.unlock_coldkey() -reg = sub.burned_register(wallet=wallet, netuid=3) -``` - -## View your registered subnets - -```python -import bittensor as bt -sub = bt.Subtensor(network="test") -wallet = bt.wallet( - name="ExampleWalletName", - hotkey="ExampleHotkey", -) -wallet.unlock_coldkey() -netuids = sub.get_netuids_for_hotkey(wallet.hotkey.ss58_address) -print(netuids) -``` - -## Asynchronously stake to top subnets/validators - -The following script incrementally stakes a user-defined amount of TAO in each of the user-defined number of the top subnets. - -Note that it uses asynchronous calls to the Bittensor blockchain via the `async_subtensor` module, employing the `await asyncio.gather(*tasks)` pattern. - -`AsyncSubtensor` methods like `add_stake()`, `unstake()`, `metagraph()`, and `move_stake()` are designed as asynchronous methods, meaning that, unlike their `Subtensor` module equivalents, they return coroutine objects that must be awaizted within an event loop. - -See [Working with Concurrency](/subnets/asyncio). - -```python -import os, sys, asyncio -import bittensor as bt -import time -from bittensor import tao - -# Load environmental variables -wallet_name=os.environ.get('WALLET') -total_to_stake=os.environ.get('TOTAL_TAO_TO_STAKE') -num_subnets= os.environ.get('NUM_SUBNETS_TO_STAKE_IN') -validators_per_subnet = os.environ.get('NUM_VALIDATORS_PER_SUBNET') - -# Validate inputs -if wallet_name is None: - sys.exit("❌ WALLET not specified. Usage: `WALLET=my-wallet TOTAL_TAO_TO_STAKE=1 NUM_SUBNETS_TO_STAKE_IN=3 NUM_VALIDATORS_PER_SUBNET=3 python script.py`") - -if total_to_stake is None: - print("⚠️ TOTAL_TAO_TO_STAKE not specified. Defaulting to 1 TAO.") - total_to_stake = 1.0 -else: - try: - total_to_stake = float(total_to_stake) - except: - sys.exit("❌ Invalid TOTAL_TAO_TO_STAKE amount.") - -if num_subnets is None: - num_subnets = 3 -else: - try: - num_subnets = int(num_subnets) - except: - sys.exit("❌ Invalid NUM_SUBNETS_TO_STAKE_IN.") - -if validators_per_subnet is None: - validators_per_subnet = 3 -else: - try: - validators_per_subnet = int(validators_per_subnet) - except: - sys.exit("❌ Invalid NUM_VALIDATORS_PER_SUBNET.") - -print(f"\n🔓 Using wallet: {wallet_name}") -print(f"📊 Dividing {total_to_stake} TAO across top {validators_per_subnet} validators in each of top {num_subnets} subnets.") - -wallet = bt.wallet(wallet_name) - -# Initialize the subtensor connection within a block scope to ensure it is garbage collected -async def stake_batch(subtensor, netuid, top_validators, amount_to_stake): - for hk in top_validators: - print(f"💰 Staking {amount_to_stake} to {hk} on subnet {netuid}...") - try: - results = await asyncio.gather(*[ subtensor.add_stake(wallet=wallet, netuid=netuid, hotkey_ss58=hk, amount=amount_to_stake) for hk in top_validators ] ) - print(results) - except Exception as e: - print(f"❌ Failed to stake to {hk} on subnet {netuid}: {e}") - -async def find_top_three_valis(subtensor,subnet): - netuid = subnet.netuid - print(f"\n🔍 Subnet {netuid} had {subnet.tao_in_emission} emissions!") - print(f"\n🔍 Fetching metagraph for subnet {netuid}...") - - start_time = time.time() - metagraph = await subtensor.metagraph(netuid) - - print(f"✅ Retrieved metagraph for subnet {netuid} in {time.time() - start_time:.2f} seconds.") - # Extract validators and their stake amounts - hk_stake_pairs = [(metagraph.hotkeys[index], metagraph.stake[index]) for index in range(len(metagraph.stake))] - - # Sort validators by stake in descending order - top_validators = sorted(hk_stake_pairs, key=lambda x: x[1], reverse=True)[0:3] - - # Print the top 3 validators for this subnet - print(f"\n🏆 Top 3 Validators for Subnet {netuid}:") - for rank, (index, stake) in enumerate(top_validators, start=1): - print(f" {rank}. Validator index {index} - Stake: {stake}") - - return { - "netuid": netuid, - "metagraph": metagraph, - "validators": top_validators - } - -async def main(): - async with bt.async_subtensor(network='test') as subtensor: - - print("Fetching information on top subnets by TAO emissions") - - # get subnets and sort by tao emissions - sorted_subnets = sorted(list(await subtensor.all_subnets()), key=lambda subnet: subnet.tao_in_emission, reverse=True) - top_subnets = sorted_subnets[0:3] - amount_to_stake = bt.Balance.from_tao(total_to_stake/9) - - # find the top 3 validators in each subnet - top_vali_dicts = await asyncio.gather(*[find_top_three_valis(subtensor, subnet) for subnet in top_subnets]) - top_validators_per_subnet = {} - for d in top_vali_dicts: - netuid = d['netuid'] - for v in d['validators']: - hk = v[0] - if netuid in top_validators_per_subnet: - top_validators_per_subnet[netuid].append(hk) - else: - top_validators_per_subnet[netuid] = [hk] - - # Stake to each top 3 validators in each top 3 subnets - start_time = time.time() - await asyncio.gather(*[stake_batch(subtensor, netuid,top_validators, amount_to_stake) for netuid, top_validators in top_validators_per_subnet.items()]) - print(f"Staking completed in {time.time() - start_time:.2f}s") - -asyncio.run(main()) -``` - -```console -🔍 Using wallet: PracticeKey! -Staking total not specified, dividing 1 TAO across top 3 validators in each of top 3 subnets by default. - Usage: `TOTAL_TAO_TO STAKE=1 WALLET=my-wallet-name ./stakerscript.py` -Fetching information on top subnets by TAO emissions - -🔍 Subnet 277 had τ0.415595173 emissions! - -🔍 Fetching metagraph for subnet 277... - -🔍 Subnet 3 had τ0.170148635 emissions! - -🔍 Fetching metagraph for subnet 3... - -🔍 Subnet 119 had τ0.137442127 emissions! - -🔍 Fetching metagraph for subnet 119... -✅ Retrieved metagraph for subnet 277 in 1.60 seconds. - -🏆 Top 3 Validators for Subnet 277: - 1. Validator index 5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT - Stake: 550446.75 - 2. Validator index 5EFtEvPcgZHheW36jGXMPMrDETzbngziR3DPPVVp5L5Gt7Wo - Stake: 123175.8515625 - 3. Validator index 5GNyf1SotvL34mEx86C2cvEGJ563hYiPZWazXUueJ5uu16EK - Stake: 54379.609375 -✅ Retrieved metagraph for subnet 119 in 1.97 seconds. - -🏆 Top 3 Validators for Subnet 119: - 1. Validator index 5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT - Stake: 231810.8125 - 2. Validator index 5FRxKzKrBDX3cCGqXFjYb6zCNC7GMTEaam1FWtsE8Nbr1EQJ - Stake: 118400.6328125 - 3. Validator index 5CFZ9xDaFQVLA9ERsTs9S3i6jp1VDydvjQH5RDsyWCCJkTM4 - Stake: 30794.974609375 -✅ Retrieved metagraph for subnet 3 in 2.00 seconds. - -🏆 Top 3 Validators for Subnet 3: - 1. Validator index 5EHammhTy9rV9FhDdYeFY98YTMvU8Vz9Zv2FuFQQQyMTptc6 - Stake: 285393.71875 - 2. Validator index 5FupG35rCCMghVEAzdYuxxb4SWHU7HtpKeveDmSoyCN8vHyb - Stake: 190750.453125 - 3. Validator index 5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT - Stake: 57048.80859375 -💰 Staking τ0.111111111 to 5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT on subnet 277... -💰 Staking τ0.111111111 to 5EFtEvPcgZHheW36jGXMPMrDETzbngziR3DPPVVp5L5Gt7Wo on subnet 277... -💰 Staking τ0.111111111 to 5GNyf1SotvL34mEx86C2cvEGJ563hYiPZWazXUueJ5uu16EK on subnet 277... -Enter your password: -Decrypting... -[True, True, True] -💰 Staking 0.111111111इ to 5EHammhTy9rV9FhDdYeFY98YTMvU8Vz9Zv2FuFQQQyMTptc6 on subnet 3... -💰 Staking 0.111111111इ to 5FupG35rCCMghVEAzdYuxxb4SWHU7HtpKeveDmSoyCN8vHyb on subnet 3... -💰 Staking 0.111111111इ to 5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT on subnet 3... -[True, True, True] -💰 Staking 0.111111111γ to 5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT on subnet 119... -💰 Staking 0.111111111γ to 5FRxKzKrBDX3cCGqXFjYb6zCNC7GMTEaam1FWtsE8Nbr1EQJ on subnet 119... -💰 Staking 0.111111111γ to 5CFZ9xDaFQVLA9ERsTs9S3i6jp1VDydvjQH5RDsyWCCJkTM4 on subnet 119... -[True, True, True] -``` - -## Asynchronously unstake from low-emissions validators - -The script below will unstake from the delegations (stakes) to validators on particular subnets that have yielded the least emissions in the last tempo. - -```python -import os, sys, asyncio, time -import bittensor as bt -import bittensor_wallet -from bittensor import tao - -async def perform_unstake(subtensor, stake, amount): - try: - print(f"⏳ Attempting to unstake {amount} from {stake.hotkey_ss58} on subnet {stake.netuid}") - start = time.time() - result = await subtensor.unstake( - wallet, hotkey_ss58=stake.hotkey_ss58, netuid=stake.netuid, amount=amount - ) - elapsed = time.time() - start - if result: - print(f"✅ Successfully unstaked {amount} from {stake.hotkey_ss58} on subnet {stake.netuid} in {elapsed:.2f}s") - return True - else: - print(f"❌ Failed to unstake from {stake.hotkey_ss58} on subnet {stake.netuid}") - return False - except Exception as e: - print(f"❌ Error during unstake from {stake.hotkey_ss58} on subnet {stake.netuid}: {e}") - return False - - -async def main(): - async with bt.async_subtensor(network='test') as subtensor: - try: - # Retrieve all active active stakes asscociated with the coldkey - stakes = await subtensor.get_stake_for_coldkey(wallet_ck) - except Exception as e: - sys.exit(f"❌ Failed to get stake info: {e}") - - # Filter and sort - # Remove small stakes that are under the minimum threshold - stakes = list(filter(lambda s: float(s.stake.tao) > unstake_minimum, stakes)) - # Sort by emission rate (lowest emission first) - stakes = sorted(stakes, key=lambda s: s.emission.tao) - # Limit to the N lowest emission validators - stakes = stakes[:max_stakes_to_unstake] - - if not stakes: - sys.exit("❌ No eligible stakes found to unstake.") - - print(f"\n📊 Preparing to unstake from {len(stakes)} validators:\n") - for s in stakes: - print(f"Validator: {s.hotkey_ss58}\n NetUID: {s.netuid}\n Stake: {s.stake.tao}\n Emission: {s.emission}\n-----------") - - # Determine how much TAO to unstake per validator - amount_per_stake = total_to_unstake / len(stakes) - - # Prepare concurrent unstake tasks, then execute as a batch - tasks = [ - perform_unstake(subtensor, stake, min(amount_per_stake, stake.stake)) - for stake in stakes - ] - results = await asyncio.gather(*tasks) - - # Count successes and print final report - success_count = sum(results) - print(f"\n🎯 Unstake complete. Success: {success_count}/{len(stakes)}") - -wallet_name = os.environ.get('WALLET') -total_to_unstake = os.environ.get('TOTAL_TAO_TO_UNSTAKE') -max_stakes_to_unstake = os.environ.get('MAX_STAKES_TO_UNSTAKE') - -if wallet_name is None: - sys.exit("wallet name not specified. Usage: `TOTAL_TAO_TO_UNSTAKE=1 MAX_STAKES_TO_UNSTAKE=10 WALLET=my-wallet-name ./unstakerscript.py`") - -if total_to_unstake is None: - print("Unstaking total not specified, defaulting to 1 TAO.") - total_to_unstake = 1 -else: - try: - total_to_unstake = float(total_to_unstake) - except: - sys.exit("invalid TAO amount!") - -if max_stakes_to_unstake is None: - max_stakes_to_unstake = 10 -else: - try: - max_stakes_to_unstake = int(max_stakes_to_unstake) - except: - sys.exit("invalid number for MAX_STAKES_TO_UNSTAKE") - -print(f"🔍 Using wallet: {wallet_name}") -print(f"🧮 Unstaking a total of {total_to_unstake} TAO across up to {max_stakes_to_unstake} lowest-emission validators") - -total_to_unstake = bt.Balance.from_tao(total_to_unstake) -wallet = bt.wallet(wallet_name) -wallet_ck = wallet.coldkeypub.ss58_address - -unstake_minimum = 0.0005 # TAO -asyncio.run(main()) - -``` - -```console -Unstaking total not specified, defaulting to 1 TAO. -🔍 Using wallet: PracticeKey! -🧮 Unstaking a total of 1 TAO across up to 10 lowest-emission validators - -📊 Preparing to unstake from 10 validators: - -Validator: 5GEXJdUXxLVmrkaHBfkFmoodXrCSUMFSgPXULbnrRicEt1kK - NetUID: 119 - Stake: 229.212349960Ⲃ - Emission: 0.000000000Ⲃ ------------ -Validator: 5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT - NetUID: 119 - Stake: 19.766958098Ⲃ - Emission: 0.000000000Ⲃ ------------ -Validator: 5FRxKzKrBDX3cCGqXFjYb6zCNC7GMTEaam1FWtsE8Nbr1EQJ - NetUID: 119 - Stake: 18.475227001Ⲃ - Emission: 0.000000000Ⲃ ------------ -Validator: 5Gwz1AQmkya4UkiiXc9HASKYLc5dsQ9qzrgqCfSvjtbrbQp6 - NetUID: 3 - Stake: 44.463571197γ - Emission: 0.005925040γ ------------ -Validator: 5EscZNs55FCTfbpgFFDTbiSE7GgwSwqmdivfPikdqTyDiegb - NetUID: 3 - Stake: 786.209456613γ - Emission: 0.102145233γ ------------ -Validator: 5GNyf1SotvL34mEx86C2cvEGJ563hYiPZWazXUueJ5uu16EK - NetUID: 277 - Stake: 5.058595339इ - Emission: 4.550549887इ ------------ -Validator: 5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT - NetUID: 3 - Stake: 11.654577962γ - Emission: 5.429011017γ ------------ -Validator: 5EFtEvPcgZHheW36jGXMPMrDETzbngziR3DPPVVp5L5Gt7Wo - NetUID: 277 - Stake: 5.258687558इ - Emission: 11.038508585इ ------------ -Validator: 5CFZ9xDaFQVLA9ERsTs9S3i6jp1VDydvjQH5RDsyWCCJkTM4 - NetUID: 119 - Stake: 20.942357630Ⲃ - Emission: 16.662837489Ⲃ ------------ -Validator: 5FupG35rCCMghVEAzdYuxxb4SWHU7HtpKeveDmSoyCN8vHyb - NetUID: 3 - Stake: 87.243220111γ - Emission: 22.063085545γ ------------ -⏳ Attempting to unstake τ0.100000000 from 5GEXJdUXxLVmrkaHBfkFmoodXrCSUMFSgPXULbnrRicEt1kK on subnet 119 -Enter your password: -Decrypting... -⏳ Attempting to unstake τ0.100000000 from 5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT on subnet 119 -⏳ Attempting to unstake τ0.100000000 from 5FRxKzKrBDX3cCGqXFjYb6zCNC7GMTEaam1FWtsE8Nbr1EQJ on subnet 119 -⏳ Attempting to unstake τ0.100000000 from 5Gwz1AQmkya4UkiiXc9HASKYLc5dsQ9qzrgqCfSvjtbrbQp6 on subnet 3 -⏳ Attempting to unstake τ0.100000000 from 5EscZNs55FCTfbpgFFDTbiSE7GgwSwqmdivfPikdqTyDiegb on subnet 3 -⏳ Attempting to unstake τ0.100000000 from 5GNyf1SotvL34mEx86C2cvEGJ563hYiPZWazXUueJ5uu16EK on subnet 277 -⏳ Attempting to unstake τ0.100000000 from 5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT on subnet 3 -⏳ Attempting to unstake τ0.100000000 from 5EFtEvPcgZHheW36jGXMPMrDETzbngziR3DPPVVp5L5Gt7Wo on subnet 277 -⏳ Attempting to unstake τ0.100000000 from 5CFZ9xDaFQVLA9ERsTs9S3i6jp1VDydvjQH5RDsyWCCJkTM4 on subnet 119 -⏳ Attempting to unstake τ0.100000000 from 5FupG35rCCMghVEAzdYuxxb4SWHU7HtpKeveDmSoyCN8vHyb on subnet 3 -✅ Successfully unstaked 0.100000000इ from 5Gwz1AQmkya4UkiiXc9HASKYLc5dsQ9qzrgqCfSvjtbrbQp6 on subnet 3 in 10.78s -✅ Successfully unstaked 0.100000000इ from 5FRxKzKrBDX3cCGqXFjYb6zCNC7GMTEaam1FWtsE8Nbr1EQJ on subnet 119 in 10.78s -✅ Successfully unstaked 0.100000000इ from 5GEXJdUXxLVmrkaHBfkFmoodXrCSUMFSgPXULbnrRicEt1kK on subnet 119 in 15.23s -✅ Successfully unstaked 0.100000000इ from 5FupG35rCCMghVEAzdYuxxb4SWHU7HtpKeveDmSoyCN8vHyb on subnet 3 in 10.78s -✅ Successfully unstaked 0.100000000इ from 5EFtEvPcgZHheW36jGXMPMrDETzbngziR3DPPVVp5L5Gt7Wo on subnet 277 in 10.79s -✅ Successfully unstaked 0.100000000इ from 5EscZNs55FCTfbpgFFDTbiSE7GgwSwqmdivfPikdqTyDiegb on subnet 3 in 10.79s -✅ Successfully unstaked 0.100000000इ from 5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT on subnet 3 in 10.83s -✅ Successfully unstaked 0.100000000इ from 5FCPTnjevGqAuTttetBy4a24Ej3pH9fiQ8fmvP1ZkrVsLUoT on subnet 119 in 10.83s -✅ Successfully unstaked 0.100000000इ from 5GNyf1SotvL34mEx86C2cvEGJ563hYiPZWazXUueJ5uu16EK on subnet 277 in 10.84s -✅ Successfully unstaked 0.100000000इ from 5CFZ9xDaFQVLA9ERsTs9S3i6jp1VDydvjQH5RDsyWCCJkTM4 on subnet 119 in 10.89s - -🎯 Unstake complete. Success: 10/10 -``` - -## Move stake - -This stake moves stake from one delegate to another. - -```python -import asyncio -from concurrent.futures import ThreadPoolExecutor -import bittensor as bt -from bittensor.core.subtensor import Subtensor -from bittensor.core.async_subtensor import AsyncSubtensor - -async def main(): - async with AsyncSubtensor("test") as subtensor: - wallet = bt.wallet( - name="PracticeKey!" - ) - wallet.unlock_coldkey() - result = await subtensor.move_stake(wallet = wallet, - origin_hotkey = "5DyHnV9Wz6cnefGfczeBkQCzHZ5fJcVgy7x1eKVh8otMEd31", - origin_netuid = 5, - destination_hotkey = "5HidY9Danh9NhNPHL2pfrf97Zboew3v7yz4abuibZszcKEMv", - destination_netuid = 18, - amount = bt.Balance.from_tao(1.0), - wait_for_inclusion = True, - wait_for_finalization = False, - ) - if result: - print("Stake was successfully moved!") - else: - print("Failed to move stake.") -# Because move_stake is asynchronous, we run it in an event loop: -asyncio.run(main()) - -``` diff --git a/docs/staking-and-delegation/managing-stake-tao-app.md b/docs/staking-and-delegation/managing-stake-tao-app.md deleted file mode 100644 index 4e8689683c..0000000000 --- a/docs/staking-and-delegation/managing-stake-tao-app.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: "Managing Stake with tao.app" ---- - -[TAO.app](https://tao.app) offers a portal to real-time tokenomic data about the Bittensor ecoystems and all its subnets, and allows users to securely manage their stake using the Bittensor wallet browser extension. - -## Subnets Explorer - -## Metrics/dTAO Market Overview - -The dTAO Market Overview panel gives ecosystem users and investors an overview into the many measurements for assessing various important aspects of the state of the overall TAO ecosystem. - -### Sum of Alpha Prices - -The Sum of Alpha Prices is the combined value of all active subnet token prices (Alpha tokens) relative to TAO. - -#### How it works - -When there's no trading activity, the AMM mechanism causes Alpha token prices to converge back toward 1, maintaining price equilibrium. -When trading is active, prices diverge &mdash often significantly &mdash based on supply/demand dynamics within each subnet's liquidity pool. -Because prices are AMM-driven, the sum can theoretically grow infinitely if there's significant buy pressure on multiple subnet at once. - -#### Why it matters - -The most useful aspect of this overview metric is that it can give you, as an ecosystem participant, insight into the level of speculation currently in the market overall over a given time period. - -When the sum is closer to around 1 for the time period specified, it suggest that there has been little market pressure, low activity, and/or natural decay back to equilibrium between TAO and Alpha tokens. -When the sum is greater than 1 for the time period specified, it suggests that at least some subnets are experiencing buying pressure, which is driving up prices. -When there is a high sum (e.g. 10+) in a relatively short time frame, it could indicate widespread speculation, possibly even signaling a bubble, or at least high usage/subnet demand. - -## Metrics/dTAO Market Overview - -The dTAO Market Overview panel gives ecosystem users and investors an overview into the many measurements for assessing various important aspects of the state of the overall TAO ecosystem. - -### Sum of Alpha Prices - -The Sum of Alpha Prices is the combined value of all active subnet token prices (Alpha tokens) relative to TAO. - -#### How it works - -When there's no trading activity, the AMM mechanism causes Alpha token prices to converge back toward 1, maintaining price equilibrium. -When trading is active, prices diverge &mdash often significantly &mdash based on supply/demand dynamics within each subnet's liquidity pool. -Because prices are AMM-driven, the sum can theoretically grow infinitely if there's significant buy pressure on multiple subnet at once. - -#### Why it matters - -The most useful aspect of this overview metric is that it can give you, as an ecosystem participant, insight into the level of speculation currently in the market overall over a given time period. - -When the sum is closer to around 1 for the time period specified, it suggest that there has been little market pressure, low activity, and/or natural decay back to equilibrium between TAO and Alpha tokens. -When the sum is greater than 1 for the time period specified, it suggests that at least some subnets are experiencing buying pressure, which is driving up prices. -When there is a high sum (e.g. 10+) in a relatively short time frame, it could indicate widespread speculation, possibly even signaling a bubble, or at least high usage/subnet demand. - -## Subnet details diff --git a/docs/staking-and-delegation/stakers-btcli-guide.md b/docs/staking-and-delegation/stakers-btcli-guide.md deleted file mode 100644 index 118a6508a0..0000000000 --- a/docs/staking-and-delegation/stakers-btcli-guide.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: "Staker's Guide to `BTCLI`" ---- - -# Staker's Guide to `BTCLI` - -This page prepares the reader for managing TAO and alpha stake using `btcli` in a secure manner. - -For general coverage of `btcli` security and usage considerations across persona, see: [Bittensor CLI: Permissions Guide](../btcli-permissions) - -## Intro - -Stakers enter value into the Bittensor network by acquiring TAO and staking or *delegating* it to validators to support their work. As validators extract emissions, a certain percentage goes back to stakers. - -Stakers must be familiar with operations related to managing the TAO and staked alpha tokens in their Bittensor wallet balances. - -Account balances are public information, and can be viewed *without* using a coldkey, even in an insecure environment. However, any account operation that **changes the state** of the Bittensor chain, such as a balance transfer or staking operation, must be signed with your wallet's coldkey private key. - -Performing these functions requires using a **coldkey**, and hence must be performed in a [**highly secure environment**](../getting-started/coldkey-hotkey-security) for any wallet connected to real (mainnet) TAO balance. A leak of your coldkey can lead to a catastrophic loss of funds. - -Any operation can be practiced against Bittensor testnet using throw-away keys *not* connected to your real TAO balances on mainnet. - -:::tip -Stakers only need a coldkey. Unless you plan to mine, validate, or participate in governance, you do not need a hotkey. -::: - -See: -- [Staking/Delegation Overview](./delegation.md) -- [Bittensor CLI: Permissions Guide](../btcli-permissions) -- [Wallets, Coldkeys and Hotkeys in Bittensor](../getting-started/wallets) -- [Coldkey and Hotkey Workstation Security](../getting-started/coldkey-hotkey-security) - -## Requirements for wallet, balance and staking functions - -### Wallets - - View balances and stake—only coldkey public key is required (permissionless) - - Create or generate a new coldkey. - - Transfer TAO from your coldkey to another address. Requires a coldkey signature (secure environment). - -### Subnet Discovery - - `btcli subnets list`, `btcli subnets show`, `btcli subnets metagraph`: See available subnets or node info. Permissionless read. - - `btcli subnets price`, `btcli subnets burn-cost`, `btcli subnets burn_cost`: Show the required burn to register in a particular subnet. Permissionless read. - -### Staking (All require **coldkey** except for list): - - Add, remove, or move stake to validators on specific subnets. - - Transfer ownership of stake to anoth - - `btcli stake child ...` / `btcli stake children ...` (get, set, revoke, take) - - Short aliases: `btcli st add`, `btcli st remove`, etc. - -### Workstation configuration - - `btcli config set`, `btcli config get`, etc. (Permissionless) to configure a `btcli` environment. - -## Key rotation - -If you suspect your coldkey may have been leaked, you can request to swap it out of your wallet, using an extrinsic blockchain transaction. This operation has a 5 day waiting period, during which your coldkey will be locked. The cost of this coldkey swap transaction is 0.1 TAO. - -See [Rotate/Swap your Coldkey](../subnets/schedule-coldkey-swap) - diff --git a/docs/staking-and-delegation/staking-polkadot-js.md b/docs/staking-and-delegation/staking-polkadot-js.md deleted file mode 100644 index 665af7f32c..0000000000 --- a/docs/staking-and-delegation/staking-polkadot-js.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: "Staking with Polkadot JS" ---- - -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Staking with Polkadot JS - -This document describes how you can stake to Opentensor Foundation using [Polkadot JS](https://polkadot.js.org/apps/?rpc=wss://entrypoint-finney.opentensor.ai:443#/accounts). - -:::tip -Also see [Delegation](./delegation.md). -::: - -In addition to running your own subnet miner or subnet validator, you can delegate your TAO to the Opentensor Foundation validation pool. Delegating TAO simply means you are staking to the Opentensor Foundation's validator, instead of running your own subnet validator. To take back your staked TAO from the pool at any time, you can simply undelegate your TAO. - -:::danger -Consider your endpoint security before following the procedure documented below! - -The following procedure involves adding a coldkey wallet seed phrase into a digital device (a computer capable of running the Polkdadot Extension for Chrome). - -Anyone who obtains your seed phrase in any way owns your TAO. - -Any time you enter a seed phrase onto a digital device, the wallet is *permanently* rendered no more secure than the device—anyone who obtains it in the future can attempt to scan it for any seed phrases that have ever been input into it. - -Consider [Using a Ledger Hardware Wallet](./using-ledger-hw-wallet) to manage your Bittensor coldkey and sign transactions. -::: - - -Follow the below steps: - - -1. Add your Bittensor wallet to the [Polkadot Extension](https://polkadot.js.org/extension/) wallet in your browser (you will need your mnemonic to do this). After you have done so, navigate to [Polkadot JS](https://polkadot.js.org/apps/?rpc=wss://entrypoint-finney.opentensor.ai:443#/accounts) and your account will be displayed there. - - -2. Navigate to [**Developer** > **Extrinsics**](https://polkadot.js.org/apps/?rpc=wss://entrypoint-finney.opentensor.ai:443#/extrinsics). - - ![Extrinsics](/img/docs/step2.png) - - -3. In the drop-down, select **subtensorModule**. - - ![SubtensorModule](/img/docs/step3.png) - - -4. In the drop-down menu for the **subtensorModule**, select **addStake**. - - ![AddStake](/img/docs/step4.png) - - -5. Paste the hotkey of the delegate in the box labeled **hotkey**. - - ![delegate hotkey](/img/docs/step5.png) - - -6. In the box labeled **amountStaked**, input, in units of Rao, the amount of TAO that you wish to stake to this delegate. - - Note that 1 TAO = 109 Rao. Therefore, if you wish to stake 1 TAO, then input 1000000000 (`1` followed by nine zeros). If you wish to stake 10 TAO, then input 10000000000 (`1` followed by ten zeros), and so on. - - ![amount staked](/img/docs/step6.png) - - -7. After you have verified the keys and amounts, click **Submit Transaction** to sign and submit this transaction to be included on the chain. - - ![sign and submit](/img/docs/step7.png) \ No newline at end of file diff --git a/docs/staking-and-delegation/using-ledger-hw-wallet.md b/docs/staking-and-delegation/using-ledger-hw-wallet.md deleted file mode 100644 index 0c8dc65c1e..0000000000 --- a/docs/staking-and-delegation/using-ledger-hw-wallet.md +++ /dev/null @@ -1,320 +0,0 @@ ---- -title: "Using Ledger Hardware Wallet" ---- - -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Using Ledger Hardware Wallet - -This guide describes how to set up your Ledger hardware wallet for managing your TAO on the Bittensor network. - -## Requirements - -Set up your Ledger hardware wallet as per Ledger instructions. - -- [Ledger device (Nano S/S+/X, Flex, Stax)](https://www.ledger.com/). -- [Ledger Live app](https://www.ledger.com/ledger-live). - -This guide assumes that you have a Ledger device and the Ledger Live app installed already. - -## Common Steps - -1. Connect Ledger device to your computer with Ledger Live installed. -2. Open **Ledger Live** app > **My Ledger** > **Unlock Ledger** > **Approve Ledger Live**. -3. Install the **Polkadot (DOT)** app from Ledger Live. -4. To manage your TAO from your Ledger hardware wallet, you must install a wallet app that supports TAO and also supports the Ledger hardware wallet. [Talisman](https://www.talisman.xyz/), [Nova Wallet](https://novawallet.io/), and [Subwallet](https://www.subwallet.app/) apps satisfy this condition. Install any of these wallet apps, and make sure you have configured these wallet apps to also use the Bittensor network. This is required for either transferring TAO using your Ledger, or finding the correct address to receive TAO on your Ledger device. - -:::danger Stop. Did you run the above steps? -Proceed only after you successfully ran the above steps. The rest of this guide is described using Talisman wallet app. -::: - -## Step 1. Connect Talisman app to Ledger device - - 1. Connect Ledger hardware wallet device to your computer. - 2. Open Talisman wallet app and select **Add Account**. - 3. Select **Connect** and choose **Connect Ledger**. - -
- -
-
- - 4. Select **Polkadot**. Then in the **Choose Network** drop-down select **Bittensor** as the network, and in the **Choose Ledger App** section select **Polkadot App**. - -
- -
-
- - :::tip Failed to connect? - If you see "Failed to connect to your Ledger" message, then unlock your Ledger device and open the Polkadot app, then click "Retry". - ::: - -
- -
-
- - 5. When the above steps are complete, then you have successfully connected your Ledger hardware wallet device to the Polkadot app. Next, choose the Ledger hardware wallet addresses you would like to import to the Talisman wallet. Your Ledger hardware wallet device is now ready to be used with the Talisman Wallet app. - - The below screenshot shows multiple addresses in the Ledger hardware wallet device. - -
- -
-
- - :::tip Failed to connect? - If you had transferred TAO to the Ledger device already, then select **Custom** and modify the **Account index** to **0**. This will then show you the Ledger hardware wallet address to which you had transferred your TAO previously. You may try other values if needed. - ::: - -
- -
-
- ---- - -## Step 2. Transfer TAO from Ledger hardware wallet - -To transfer TAO from your connected Ledger hardware wallet, execute the following steps: - -1. Select the Ledger account from the **All Accounts** dropdown. - -
- -
-
- - -2. Select **Send** to send from the TAO address to another wallet address. - -
- -
-
- - -3. Select **Bittensor** from the list of networks. - -4. Input the destination address. This destination address is any TAO wallet address that is configured with the Bittensor network. Paste the destination address into the **To** field, as shown in the below screenshot. - -
- -
-
- -5. Input the transaction amount and **Review** the transaction. In the below screenshot, an example transfer screen for sending 1.337 TAO from the connected Ledger hardware wallet device to a destination address that starts with `5EHVUN...` is shown. - -
- -
-
- -6. Review the transaction and press **Approve on Ledger**. - -
- -
-
- -:::tip Verify the transaction on the Ledger device -The below steps require you to verify on the Ledger device screen. -::: - -7. On your Ledger device screen, verify the transaction details are as expected. Then select **Approve** on the device (or **Reject** if you want to cancel). - -
- -
-
- -
- -
-
- -
- -
-
- -
- -
-
- -
- -
-
- -8. Finished! Your TAO has been sent. - -
- -
-
- -## Copying TAO address from Ledger device - -While using any crypto wallet, you might need to bring over your Ledger device's TAO address to this wallet. Follow the below steps. - -1. From your Talisman Wallet app, drop-down on **All Accounts** and select the Ledger account. - -
- -
-
- -2. Select **Copy**. - -
- -
-
- -3. Search for **Bittensor** network and click the **Copy to clipboard** button under **Bittensor**. - -
- -
-
- -You have successfully copied the TAO address on the Ledger hardware wallet to the clipboard. You can then paste this TAO address into any crypto wallet you use. - ---- diff --git a/docs/subnets/_legacy_hyperparams.md b/docs/subnets/_legacy_hyperparams.md deleted file mode 100644 index de302b54fb..0000000000 --- a/docs/subnets/_legacy_hyperparams.md +++ /dev/null @@ -1,340 +0,0 @@ -!!!Legacy!!! -!!!For reference, do not publish!!! - - -## serving_rate_limit - -**Description** -: Determines how often you can change your node's IP address on the blockchain. Expressed in number of blocks. Applies to both subnet validator and subnet miner nodes. Used when you move your node to a new machine. - -**Value** -: Usually this is set to `100` blocks. - -**Setting** -: This parameter can be changed by the subnet owner. The value of this parameter varies from subnet to subnet. - ---- - -## min_difficulty, max_difficulty - -**Description** -: For subnets that have enabled PoW registration using [`network_pow_registration_allowed`](#network_pow_registration_allowed), these parameters determine the minimum and maximum difficulty for the Proof of Work calculation, respectively, expressed in terahashes. The actual difficulty is dynamic, auto-adjusting based on the number of registrations per [adjustment interval](#adjustment_interval). When a new adjustment interval is reached and the number of registrations or registration attempts in the previous adjustment interval exceeds the target number of registrations value, the difficulty will double in the following adjustment interval. If the number of registrations or registration attempts was fewer than the target number of registrations value, the difficulty will halve. - -**Setting** -: This parameter can be changed by the subnet owner. - ---- - -## weights_version - -**Description** -: Indicates the required minimum version of the subnet validator code. - -**Value** -: Set to `2013` for Subnet-1. -: This means that every subnet validator in Subnet-1 must have at least version `2013` of the subnet validator code. - -**Setting** -: This parameter can be changed by the subnet owner. The value of this parameter varies from subnet to subnet. Setting this parameter to a version ensures that all the subnet validators use the same version of the code. - ---- - -## weights_rate_limit - -**Description** -: How often a subnet validator can set weights on the blockchain, expressed in number of blocks. - -**Value** -: Set to `100` for Subnet-1. -: This means that after a subnet validator in Subnet-1 sends the weights to the blockchain, this subnet validator must wait for at least 100 blocks before sending the weights again to the blockchain. - -**Setting** -: This parameter can be changed by the subnet owner. The value of this parameter varies from subnet to subnet. - ---- - -## max_weight_limit - -**Description** - -: This is the maximum weight that can be set by a subnet validator for a subnet miner, expressed as a value between `0` and `65535`. This is a u16 (unsigned integer) representation of the range from 0 and 1.0. The normalized weights of all miners in a subnet must always sum to 1. - -**Value** -: Set to `455` for Subnet-1. - -**Setting** -: This parameter can be changed by the subnet owner. The value of this parameter varies from subnet to subnet. - -### Example - -Consider Subnet-1 where `max_weight_limit` is set to 455 and `min_allowed_weights` is set to 8. This means that each subnet validator must set weights for at least 8 subnet miners, and each such weight must not exceed `455`. - ---- - - - -## commit_reveal_weights_enabled - -**Description** -: Enables the [Commit Reveal](./commit-reveal.md) feature. - -**Value** -: `True` or `False`. Enables or disables the feature, default: false. - -**Setting** -: This parameter can be changed by the subnet owner. - - -## commit_reveal_weights_interval - -**Description** -: The interval, measured as a number of blocks, that elapses before unencrypted weights are revealed. - -**Value** -: The commit reveal interval, as an integer count of blocks. - -**Setting** -: This parameter can be changed by the subnet owner, and must be tuned carefully for the subnet. It should always be greater than the [immunity period](#immunity_period) to avoid unintended miner deregistration—see [Commit Reveal and Immunity Period](./commit-reveal.md#commit-reveal-and-immunity-period). - -## immunity_period - -**Description** -: The [Immunity Period](../glossary.md#immunity-period) within a subnet. This is a grace period, measured in blocks, granted to a miner or a validator when registered at a UID on a given subnet, that elapses before they are considered for deregistration due to performance. - -If the UID still does not perform well even after the expiry of the `immunity_period`, the miner or validator at that UID can be removed from the subnet when a new miner or validator requests to join. - -When a subnet miner or a subnet validator is deregistered, they must register again to rejoin the subnet. - -In case all peers (miners or validators within a subnet) are in their immunity period, immunity is overriden, and the lowest scoring peer is de-registered. - -In case the lowest ranking position is held by multiple peers with a tied score, the one who was registered first is de-registered. This step applies first to peers outside of their immunity period unless all are immune, in which case it applies to immune peers. - -**Value** -: Default value: 5000 blocks. - -Varies between subnets, for example 7200 blocks for Subnet-1. - -**Setting** -: This parameter can be changed by the subnet owner, and must be tuned carefully for the subnet. - -If [Commit Reveal](./commit-reveal.md) is enabled for the subnet, the value of the commit reveal interval should always be greater than the immunity period within the subnet, to avoid unintended miner deregistration—see [Commit Reveal and Immunity Period](./commit-reveal.md#commit-reveal-and-immunity-period). - -:::tip immunity period for a subnet - -Immunity Period for miners and validators *within* a subnet is distinct from the immunity period *for* a newly created subnet, before it can be deregistered from the Bittensor network. For the latter, see [Immunity period for a subnet](./create-a-subnet.md#immunity-period-for-a-subnet). -::: - -### Example -Consider Subnet-1, that has its `immunity_period` set to 7200 blocks. The duration of a block is 12 seconds. Hence a subnet validator or a subnet miner at any UID in Subnet-1 has 24 hours (=7200 blocks) from the moment they have registered, before they will be considered for deregistration. - -:::tip Managing node deregistration during major updates -The subnet owner may modify the [`immunity_period`](#immunity_period) at any given time, as well as temporarily turn off [`network_registration_allowed`] to allow established nodes (miners and/or validators) to adjust to major codebase updates without being deregistered. -::: - ---- - -## min_allowed_weights - -**Description** -: The minimum number of UIDs a subnet validator must set weights on, before the subnet validator is allowed to set weights on the blockchain. - -**Value** -: Set to `8` for Subnet-1. -: This means that any subnet validator who is trying to set weights on the blockchain must set weights on a minimum of 8 subnet miners before this subnet validator is able to successfully set its weights on the blockchain. - -**Setting** -: This parameter can be changed by the subnet owner. The value of this parameter varies from subnet to subnet. - -The value of `min_allowed_weights` sets a lower bound for the consensus. A higher value of `min_allowed_weights` means that the subnet validators are forced to set weights for more subnet miners. This parameter is mainly for security reasons, to eliminate unreasonably low consensus amongst the subnet validators in the subnet. - -### Example - -A subnet validator can be considered as poorly performing if they set weights on only five subnet miners, when the `min_allowed_weights` is set to 8. This might occur due to a variety of reasons, for example: Maybe the subnet validator does not have enough stake to query the subnet miners, or maybe the subnet validator is part of a cabal engaged in cheating the system. - -In this case, none of the actual weight-setting extrinsics that the subnet validator sends to the chain will be accepted. Hence on the chain it will look like this subnet validator has not set any weights at all. The Yuma Consensus may conclude that this subnet validator is performing poorly and after the `immunity_period` expires, this subnet validator could be deregistered to make room for others waiting to be miners or validators. - -:::important Minimum 1000 TAO required to set weights -A validate function will blacklist set-weights transactions from keys with less than 1000 TAO. This is designed to reduce chain bloat and make it easier for validators to set weights on the chain. -::: - ---- - -## tempo - -**Description** -: A duration of a number of blocks. Several subnet events occur at the end of every tempo period. For example, Yuma Consensus runs for the subnet and emissions are transferred to the hotkeys (delegated or staked). - -:::tip See also -See also [Anatomy of Incentive Mechanism](../learn/anatomy-of-incentive-mechanism.md#tempo). -::: - -**Value** -: Set to `99` blocks for Subnet-1. All other subnets are set to `360` blocks. - -**Setting** -: Must not be changed. - ---- - -## adjustment_alpha - -**Description** - -A factor that controls the subnet registrations adjustment interval. This hyperparameter is now set to `0.97`, a change from an earlier value of `0`. A larger adjustment alpha will smooth the registration burn and POW cost for newly registered subnets, thus reducing the thrashing seen for registration costs. This parameter functions as a balance between registration burn and POW cost. - -For example: If the target registration was `2` and there was `1` burn registration in the interval, the registration cost halving would apply to POW. On the other hand, if there were 1 POW registration, it would decrease the registration burn costs by half. In this way the `adjustment_alpha` mechanism tries to balance out the registration burn and POW costs. - -:::important -By default this change from `0` to `0.97` does not affect already registered subnets. However, to take advantage of the new value, we strongly recommend that existing subnet owners update this value by setting it through the CLI, by running the below command. The `--value 17893341751498265066` corresponds to setting the `adjustment_alpha` to `0.97`. See [this line of code](https://github.com/opentensor/subtensor/pull/249/files#diff-731a2a37ce113771b45fd0a44bf63d71307465bcb1ce26353eed95c1f4d4c26cR728). -::: - -```bash -btcli sudo set --param adjustment_alpha --value 17893341751498265066 --netuid -``` - -**Setting** -: Must not be changed. - ---- - -## adjustment_interval - -**Description** -: Expressed in number of blocks. This is the number of blocks after which the recycle register cost and the `pow_register` difficulty are recalculated. - -If the number of actual registrations that occurred in the last [`adjustment_interval`](#adjustment_interval) is higher than the [`target_regs_per_interval`](#target_regs_per_interval), then the blockchain will raise the recycle register cost, by increasing the [`min_burn`](#min_burn-max_burn) value by a certain amount, in order to slow down the actual registrations and bring them back to `target_regs_per_interval` value. - -**Value** -: Set to `112` for Subnet-1. -: The blockchain uses this parameter together with the `target_regs_per_interval` and the [`min_burn`](#min_burn-max_burn) and [`max_burn`](#min_burn-max_burn) parameters. - -**Setting** -: Must not be changed. - -### Example - -The Subnet-1 has its `target_regs_per_interval` set to 2. Consider a scenario where, in a 112-block interval (`adjustment_interval`) this subnet had 6 registrations. This is higher than `target_regs_per_interval`. The blockchain will now raise the minimum cost to recycle register, by increasing the `min_burn` value by a certain amount, in order to slow down the actual registrations. - ---- - -## activity_cutoff - -**Description** -: Expressed in number of blocks. If a subnet validator has not set weights on the blockchain for `activity_cutoff` duration, then the Yuma Consensus will consider this subnet validator as offline, i.e., turned off. The weights of this subnet validator are considered too old to be useful. The weights of this subnet validator slowly lose their impact over time and eventually will no longer be considered for consensus calculation. - -:::tip This parameter is applicable to subnet validators only. -::: - -**Value** -: Set to `5000` (blocks) for Subnet-1. - -**Setting** -: This parameter can be changed by the subnet owner. The value of this parameter varies from subnet to subnet. - ---- - -## network_registration_allowed - -**Description** -: `True` or `False`. Indicates whether this subnet allows registrations. - -**Value** -: Set to `True` for Subnet-1. - -**Setting** -: This parameter can be changed by the subnet owner. The value of this parameter varies from subnet to subnet. - ---- - -## network_pow_registration_allowed - -**Description** -: `True` or `False`. Indicates whether this subnet allows POW (proof of work) registrations. - -**Setting** -: This parameter can be changed by the subnet owner. The value of this parameter varies from subnet to subnet. - ---- - -## target_regs_per_interval - -**Description** -: The target number of registrations desired in a `adjustment_interval` period. Expressed as an integer number. - -:::tip Maximum number of registrations -The maximum number of registrations that can occur in an `adjustment_interval` is (3 * `target_regs_per_interval`). -::: - -**Value** -: Set to `1` for Subnet-1. - -**Setting** -: Must not be changed. - ---- - -## min_burn, max_burn - -**Description** -: Minimum and maximum cost to register on this subnet. Expressed in Rao (10-9 TAO). - -**Setting** -: This parameter is automatically updated by the blockchain. - ---- - - - -## max_regs_per_block - -**Description** -: Maximum allowed registrations in this subnet per block. - -**Value** -: Set to `1` for Subnet-1. - -**Setting** -: Must not be changed. - ---- - -## max_validators - -**Description** -: Determines the maximum number of subnet validators you can have in the subnet. - -**Value** -: Default value is `64`. - -**Setting** -: Must not be changed. diff --git a/docs/subnets/asyncio.md b/docs/subnets/asyncio.md deleted file mode 100644 index d8c16602a6..0000000000 --- a/docs/subnets/asyncio.md +++ /dev/null @@ -1,255 +0,0 @@ ---- -title: "Working with Concurrency" ---- - -This page provides some tips for working with concurrent async functions in Bittensor. - -Calls to the blockchain can be slow, and routines that make many calls in series become very slow. For example, suppose we want to check a list of UIDS for subnets and see if they exist. In series, we could execute the following, but it will take longer in proportion to the list of netuids, since it makes a separate call for each. - -```python -from bittensor.core.subtensor import Subtensor - -subtensor = Subtensor("test") -for netuid in range(1, 8): - print("subnet " + str(netuid) + " exists: " + str(subtensor.subnet_exists(netuid=netuid))) -``` - -To avoid this, we could create a separate thread with a new `Subtensor` object on each thread, as below. This is faster, but can cause problems by hogging as many web sockets as UIDS in the list of subnets to check. - - -```python -import asyncio -from concurrent.futures import ThreadPoolExecutor -from bittensor.core.subtensor import Subtensor - -def subnet_exists(netuid: int): - subtensor = Subtensor("test") - result = subtensor.subnet_exists(netuid=netuid) - subtensor.close() - print("subnet " + str(netuid) + " exists: " + str(result) ) - -with ThreadPoolExecutor() as executor: - subnets = executor.map(subnet_exists, range(1, 8)) - -``` - -Using Python’s [asyncio](https://docs.python.org/3/library/asyncio.html) (Asynchronous Input/Output) module, the code below accomplishes concurrent requests with a single websocket connection: - -```python -from bittensor.core.async_subtensor import AsyncSubtensor -import asyncio - -async def main(): - async with AsyncSubtensor("test") as subtensor: - block_hash = await subtensor.get_block_hash() - subnets = await asyncio.gather(*[subtensor.subnet_exists(netuid, block_hash=block_hash) for netuid in range(1, 8)]) - for i, subnet in enumerate(subnets): - print("subnet " + str(1+i) + " exists: " + str(subnet)) - -asyncio.run(main()) - -``` -## Coroutine vs function - -The usage of `async def` creates an asyncio *coroutine* rather than a function. - -Coroutines differ from functions in that coroutines are run in event loops using `await`. - -:::caution Coroutines must always be awaited -Coroutines always need to be awaited, and generally speaking, “asyncio objects” are instantiated with `async with`. See [Python documentation on asyncio](https://docs.python.org/3/library/asyncio.html) for a comprehensive section with examples. -::: - -## AsyncSubstrateInterface - -[AsyncSubstrateInterface](pathname:///python-api/html/autoapi/bittensor/utils/async_substrate_interface/index.html) is an `asyncio` rewrite of Polkadot's original [`py-substrate-interface`](https://github.com/polkascan/py-substrate-interface) library, with a few added functionalities such as using the `bt_decode` for most SCALE decoding. - -While `AsyncSubstrateInterface` is about 90% API compatible with `py-substrate-interface`, it is its own library. Similar to how we initialize `aiohttp.ClientSession` as shown in line 21 of the above example, the `AsyncSubstrateInterface` is initialized in the same way, as shown below: - -```python -async with AsyncSubstrateInterface(chain_endpoint) as substrate: - block_hash = await substrate.get_chain_head() -``` - -:::tip -Generally speaking, you should use `AsyncSubstrateInterface` as a part of `AsyncSubtensor`, as the methods there are more specifically designed around using it within the Bittensor ecosystem. -::: - -## AsyncSubtensor - -`AsyncSubtensor` is the `asyncio` version of the Subtensor class. Under the hood, it utilises `AsyncSubstrateInterface`. - -### AsyncSubtensor vs Subtensor - -Major differences between `AsyncSubtensor` and `Subtensor` are: - -- `AsyncSubtensor` uses `block_hash` args rather than `block` args. -- `AsyncSubtensor` uses the `reuse_block` arg. -- The usage of `block_hash` is pretty obvious, i.e., you can specify the block hash (`str`) rather than the block number (`int`). -- The usage of `reuse_block` is a bit different. It allows you to reuse the same block hash that you have used for a previous call. -- Finally, the remaining major change is the use of args in the below `AsyncSubtensor` methods: - - `get_balance` - - `get_total_stake_for_coldkey` - - `get_total_stake_for_hotkey` - - These methods now accept multiple SS58 addresses as addresses, and return a dictionary mapping the addresses to their balances. - -### Initializing AsyncSubtensor - -Like `AsyncSubstrateInterface`, the `AsyncSubtensor` is initialized the same way (with an async context manager): - -```python -from bittensor.core.async_subtensor import AsyncSubtensor - -async def main(): - async with AsyncSubtensor("test") as subtensor: - neurons = await subtensor.neurons_lite(1) -``` - -And because `AsyncSubtensor` uses `AsyncSubstrateInterface` under the hood, we can use this to our advantage in `asyncio` gathering: - -```python -from bittensor.core.async_subtensor import AsyncSubtensor - -async def async_main(): - async with AsyncSubtensor("test") as subtensor: - start = time.time() - block_hash = await subtensor.get_block_hash() - total_subnets = await subtensor.get_total_subnets(block_hash=block_hash) - neurons = await asyncio.gather(*[subtensor.neurons(x, block_hash) for x in range(0, total_subnets+1)]) - print(time.time() - start) - -asyncio.run(main()) -``` - -The above code example pulls all the neurons from the testnet. Compare this to the below sync version of the same code: - -```python -from bittensor.core.subtensor import Subtensor - -def sync_main(): - subtensor = Subtensor("test") - start = time.time() - block = subtensor.block - total_subnets = subtensor.get_total_subnets(block) - neurons = [subtensor.neurons(x, block) for x in range(0, total_subnets+1)] - print(time.time() - start) -``` - -### Performance - -On a high-latency South African Internet connection: -- The `async` version runs in 13.02 seconds. -- The sync version runs in 1566.86 seconds. -Hence the `async` version runs a full 120X faster. Your results will vary depending on your connection latency. - -:::caution Some overhead with async -Note that there is a bit of overhead with the `async` instantiation over the sync version. Therefore, if you are writing a script to maybe retrieve one item, it will likely be faster and less complex using the sync version. However, if you are building anything more complex than this, the `async` version will likely be faster, as shown in the above example. -::: - -### Example - -Below is an example of how you can use the `AsyncSubtensor` module to retrieve balances from multiple coldkey SS58 addresses in various ways: - -:::tip Python reference -Also see the Bittensor SDK reference for [AsyncSubtensor](pathname:///python-api/html/autoapi/bittensor/core/async_subtensor/index.html). -::: - -```python -import asyncio - -from bittensor.core.subtensor import Subtensor # sync -from bittensor.core.async_subtensor import AsyncSubtensor # async - -from bittensor.utils.balance import Balance - -COLDKEY_PUB = "5EhCvSxpFRgXRCaN5LH2wRCD5su1vKsnVfYfjzkqfmPoCy2G" -COLDKEY_PUBS = [ - COLDKEY_PUB, - "5CZrQzo3W6LGEopMw2zVMugPcwFBmQDYne3TJc9XzZbTX2WR", - "5Dcmx3kNTKqExHoineVpBJ6HnD9JHApRs8y2GFBgPLCaYn8d", - "5DZaBZKKGZBGaevi42bYUK44tEuS3SYJ7GU3rQKYr7kjfa8v" -] - - -async def main(): # define a coroutine with `async def` - sync_sub = Subtensor("finney") # same as always - async with AsyncSubtensor("finney") as async_subtensor: # very important to initialise this with `async with` - sync_balance: Balance = sync_sub.get_balance(COLDKEY_PUB) - # returns τ0.000000000 - - async_balance: dict[str, Balance] = await async_subtensor.get_balance(COLDKEY_PUB) - # returns {'5EhCvSxpFRgXRCaN5LH2wRCD5su1vKsnVfYfjzkqfmPoCy2G': τ0.000000000} - # get_balance now takes multiple addresses, and returns them as a dict - # of {ss58: Balance} - # for example: - async_balances: dict[str, Balance] = await async_subtensor.get_balance(*COLDKEY_PUBS) - # returns: { - # '5EhCvSxpFRgXRCaN5LH2wRCD5su1vKsnVfYfjzkqfmPoCy2G': τ0.000000000, - # '5CZrQzo3W6LGEopMw2zVMugPcwFBmQDYne3TJc9XzZbTX2WR': τ0.000000000, - # '5Dcmx3kNTKqExHoineVpBJ6HnD9JHApRs8y2GFBgPLCaYn8d': τ0.000000000, - # '5DZaBZKKGZBGaevi42bYUK44tEuS3SYJ7GU3rQKYr7kjfa8v': τ0.000000000 - # } - # This works the same with .get_total_stake_for_coldkey, .get_total_stake_for_hotkey - # to do multiples with sync subtensor, we would do: - sync_balances: dict[str, Balance] = {} - for coldkey in COLDKEY_PUBS: - sync_balances[coldkey] = sync_sub.get_balance(coldkey) - - # let's say we want to make multiple calls at the same time. We can do this with asyncio.gather - async_delegated, async_balance = await asyncio.gather( - async_subtensor.get_delegated(COLDKEY_PUB), - async_subtensor.get_balance(COLDKEY_PUB) - ) - # This will make concurrent calls to retrieve the delegates and balance of this coldkey - # We can even chain these together quite dramatically, such as this example in btcli wallets: - """ - balances, all_neurons, all_delegates = await asyncio.gather( - subtensor.get_balance( - *[w.coldkeypub.ss58_address for w in wallets_with_ckp_file], - block_hash=block_hash, - ), - asyncio.gather( - *[ - subtensor.neurons_lite(netuid=netuid, block_hash=block_hash) - for netuid in all_netuids - ] - ), - asyncio.gather( - *[ - subtensor.get_delegated(w.coldkeypub.ss58_address) - for w in wallets_with_ckp_file - ] - ), - ) - """ - # There are also certain changes for the decoding of SCALE objects from the chain. - # As a rule of thumb, anything using `.value` from sync Subtensor just returns the value itself - # See the example of `Subtensor._get_hyperparameter` vs `AsyncSubtensor.get_hyperparameter`: - # Subtensor - """ - result = self.query_subtensor(param_name, block, [netuid]) - if result is None or not hasattr(result, "value"): - return None - - return result.value - """ - # AsyncSubtensor - """ - result = await self.substrate.query( - module="SubtensorModule", - storage_function=param_name, - params=[netuid], - block_hash=block_hash, - reuse_block_hash=reuse_block, - ) - - if result is None: - return None - - return result - """ - - -if __name__ == "__main__": - asyncio.run(main()) # coroutines need to have something to run them, usually `asyncio.run` -``` diff --git a/docs/subnets/bt-logging-levels.md b/docs/subnets/bt-logging-levels.md deleted file mode 100644 index d104457be4..0000000000 --- a/docs/subnets/bt-logging-levels.md +++ /dev/null @@ -1,162 +0,0 @@ ---- -title: "Logging" ---- - -# Logging - -The `logging` module in Bittensor uses several levels to categorize log messages by their severity. Each level has a numeric value and the verbosity decreases as the level increases. See the below table. - -## Logging levels - -| Level name | Numeric value | Description | -| ---------- | :------------- | ----------------------------------------------------------- | -| NOTSET | 0 | Not set level (default lowest level). | -| TRACE | 5 | Fine-grained informational events (most verbose). | -| DEBUG | 10 | Detailed information for diagnosing problems. | -| INFO | 20 | Usually confirmation of events. | -| SUCCESS | 21 | Indication that an operation completed successfully. | -| WARNING | 30 | An indication of potential issues or important events. | -| ERROR | 40 | Due to a more serious problem, the software might not work. | -| CRITICAL | 50 | A serious error, indicating that the program may abort. | - -:::tip Custom levels -TRACE (`5`) and SUCCESS (`21`) are custom levels added by Bittensor for more granular control. -::: - -## Changing the logging level - -You can control the verbosity of log output by changing the logging level. Messages at or above the set level will be logged. - -## Using state methods - -The `logging` module uses a state machine to manage logging levels. You can switch between different states using the provided methods. - -```python -from bittensor import logging - -# Enable TRACE level logging -logging.set_trace() - -# Enable DEBUG level logging -logging.set_debug() - -# Enable INFO level logging -# This is the default level of logging -logging.set_info() -logging.set_default() - -# Enable WARNING level logging -logging.set_warning() -``` - ---- - -## Using `prefix` and `suffix` in log messages - -You can add context to your log messages using `prefix` and `suffix` parameters. - - -```python -from bittensor.utils.btlogging import logging - -# Log a message with a prefix -logging.info("Process started.", prefix="START") - -# Log a message with a suffix -logging.info("Process completed.", suffix="END") - -# Log a message with both -logging.info("Step 1 executed.", prefix="STEP 1", suffix="OK") - -# Log messages without explicit args -logging.info("Step 1 is", "Starting prefix", "Ending suffix") -``` - ---- - -## Logging data - -You can log data along with different messages in different ways: - -```python -import torch -import numpy as np -from bittensor.utils.btlogging import logging - -raw_weights = torch.tensor([ - 0.0000, 0.0000, 0.0092, 0.0000, 0.0092, 0.0000, 0.0000, 0.0107, 0.0052, - 0.0092, 0.0000, 0.0052, 0.0107, 0.0107, 0.0175, 0.0000, 0.0052, 0.0092, - 0.0202, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0092, 0.0184, 0.0061, - 0.0107, 0.0052, 0.0092, 0.0092, 0.0107, 0.0107, 0.0000, 0.0107, 0.0092, - 0.0092, 0.0202, 0.0075, 0.0202, 0.0092, 0.0184, 0.0052, 0.0092, 0.0107, - 0.0092, 0.0000, 0.0052, 0.0052 -]) -test_weights = np.array([0, 0, 0, 0]) - -logging.set_debug() - -# Weights followed by string -logging.debug("Raw weights", raw_weights) -logging.debug("Test weights", test_weights) -logging.debug(f"{raw_weights} Raw weights") - -# String followed by weights -logging.debug("Raw weights", suffix=raw_weights) -logging.debug("Test weights", test_weights) -logging.debug(f"Raw weights {raw_weights}") - -# Using both prefix and suffix -# Raw weights is the prefix and test_weights is the suffix -logging.debug("Raw and test weights", raw_weights, test_weights) -``` - ---- - -## Color support - -The Bittensor logging module supports colorized output in the logging level printed in the console, which helps in distinguishing log messages quickly. - -|Level|Color| -|---|---| -|TRACE|Magenta| -|DEBUG|Blue| -|INFO|White| -|SUCCESS|Green| -|WARNING|Yellow| -|ERROR|Red| -|CRITICAL|Red Background| - -To add colors in the logged message itself, you can enclose your message in tags. These are the colors currently supported: - - -|Color|Starting tag|Ending tag| -|---|:---|---| -|Red|[red]|[/red]| -|Blue|[blue]|[/blue]| -|Green|[green]|[/green]| -|Magenta|[magenta]|[/magenta]| -|Yellow|[yellow]|[/yellow]| -|Orange|[orange]|[/orange]| - -### Example - -```python -from bittensor.utils.btlogging import logging - -logging.warning("[red]This will print red[/red] and [yellow]this will print yellow[/yellow]") -``` - ---- - -## Emoji support - -Emojis can be included in log messages for better visual cues. Certain text patterns are automatically replaced with emojis. - -|Text|Emoji| -|---|---| -|`:white_heavy_check_mark:`|✅| -|`:cross_mark:`|❌| -|`:satellite:`|🛰️| -|`:warning:`|⚠️| -|`:arrow_right:`|➡️| -|`:hourglass:`|⏳| diff --git a/docs/subnets/child-hotkeys.md b/docs/subnets/child-hotkeys.md deleted file mode 100644 index 9f2bf7d4bb..0000000000 --- a/docs/subnets/child-hotkeys.md +++ /dev/null @@ -1,278 +0,0 @@ ---- -title: "Child Hotkeys" ---- - -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Child Hotkeys - -This guide describes the **child hotkeys** feature and how to use it. With the child hotkeys, a subnet validator is no longer required to use the same delegate hotkey for every subnet they validate in. The subnet validator can use a separate **child hotkey** per subnet. The subnet validator does this by re-delegating a portion of their stake from their delegate hotkey to this separate child hotkey on a subnet. The originating delegate hotkey is called the **parent hotkey**. - -The owner of this child hotkey would then validate in the subnet on behalf of the parent hotkey. The child hotkey would receive a percentage `take` from the resulting dividends. - - - -
- -
- -
- -See the above diagram. Without the child hotkeys, a subnet validator's delegate hotkey would have to sign all the validation operations in all the subnets. This exposes the delegate hotkey in all the subnets. An attacker can get hold of the delegate hotkey from any one subnet in order to take over the validation operations with this hotkey, thereby crippling this subnet validator in all their subnets across the entire Bittensor network. - -
- -
- - -See the above diagram. With the child hotkeys, if an attacker steals a child hotkey, then only those subnets are at risk where this child hotkey is used as the delegate hotkey. - -## Benefits of child hotkeys - -- **Security for parent hotkeys**: Re-delegating stake to multiple child hotkeys enhances the security of the parent hotkey. Each child hotkey can validate on a specific subnet using a different machine. The child hotkey would sign the validation operations on behalf of the parent hotkey: There is no need to use the parent hotkey on any of these subnets. As a consequence, the exposure of the parent hotkey can be minimized. The parent hotkey can even be moved to a secure location until it is needed, for example, to revoke a child hotkey. -- **Validators can easily scale up**: As Bittensor scales up towards hundreds of subnets, it is not practical for a single delegate to validate in every single subnet. With child hotkeys, a validator can easily make this feasible by re-delegating and offloading the validating operations to multiple child hotkeys. -- **Increased bandwidth for a subnet owner**: A validator can also re-delegate to a subnet owner's hotkey. The subnet owner would then do the validation work on the subnet, in exchange for a percentage `take` from the resulting dividends. A subnet owner can increase their access bandwidth into their own subnet in this way. -- A child hotkey and a parent hotkey need not be owned by the same entity. -- A validator can re-delegate to a hotkey of any other validator on any subnet. After re-delegation, the hotkey that is the source of the stake is called **parent hotkey** and the hotkey that receives this re-delegated stake is called **child hotkey**. - :::tip "Child hotkey" and "parent hotkey" are terms of convenience - The terms "child hotkey" and "parent hotkey" are only terms of convenience. There is nothing inherently different about a "child hotkey" that separates it from a "parent hotkey". Neither have any special attributes compared to a normal hotkey. - ::: - ---- - -## Features - -The child hotkey features are as follows: - -- A hotkey must be registered on a subnet before it can be used as a parent hotkey. The hotkey can be registered on any subnet. -- A parent hotkey can have multiple child hotkeys. Similarly, a child hotkey can have more than one parent hotkey. -- A child hotkey can exist as a registered hotkey in multiple netuids simultaneously. -- **IMPORTANT**: For a given `netuid`, say, `netuid 5`, a single parent hotkey can have at most five (`5`) child hotkeys. Moreover, the same parent hotkey on a different `netuid 11` can have another set of `5` child hotkeys. Alternately, on this `netuid 11` the same parent hotkey can also have the same (`5`) child hotkeys that are in the netuid `5`. -- While setting the child hotkeys, the proportion field can have proportions that add to less than `1.0`. The proportion that was not assigned to the child hotkeys will remain with the parent hotkey. However, a proportion cannot be zero. A `0` proportion value will result in an error. Furthermore, in a given subnet, the sum of all proportions must not exceed `1.0`. - -## Rate limits - -The following rate limits apply for child hotkeys: - -- A child hotkey's take rate can only be adjusted once per 30 days. -- One successful execution of `set_children` or `revoke_children` is allowed for every 720 blocks. - -## Minimum stake - -The minimum stake you can redelegate to a child hotkey is as follows: -- **Testnet**: 100 testnet TAO. -- **Mainnet**: 1000 TAO. - ---- - -## Installing - -This feature is available in Bittensor 7.4.0 and later versions. See [Install Bittensor](../getting-started/installation.md). - -## Child hotkey commands - -Use the `btcli` command options described below to work with child hotkeys. - -## Setting a child hotkey - -This command assigns a proportion of the parent hotkey's stake weight to the child hotkeys. Specific proportion for each child hotkey can be set. The parent hotkey must be registered on at least one `netuid`. This `netuid` need not be the same `netuid` used in this command. Only the stake TAO of the parent hotkey can be assigned to the child hotkeys. - -### Usage - -```bash -btcli stake set_children --netuid --children --proportions --hotkey --wallet.name -``` - -### Parameters - -- `--netuid:` Integer. Should be a single integer value representing a current subnet's `netuid`. - - Must be greater than `0` (`netuid 0` is not allowed). - - Integer values greater than the value of current subnet limit, i.e., greater than the value of `subtensorModule.subnetLimit()`, will be rejected with an error message and the command will stop. - - All child hotkeys used in this command must be already registered on this `netuid`. -- `--children`: SS58. A comma-separated ordered list of SS58 hotkeys for child hotkeys. - - There should be a maximum of five, 5, SS58 hotkeys in this comma-separated list. If there are more than five hotkeys, the command will issue an error message and stop. - - The number of list elements should match the number of elements passed in the `--proportions` parameter. If the number of list elements do not match, the command will issue an error and stop. - - All hotkeys used here must be already registered on the `netuid` used in this command. - -- `--proportions`: Floating. A comma-separated ordered list of floating values. Each proportion value of the parent hotkey's stake weight will be assigned to the corresponding child hotkey in the `--children` parameter. - - Each floating value should be a number greater than zero and equal to or less than `1.0`. - - If a value is zero, the corresponding child hotkey will be revoked. - - If a value is greater than `1.0`, the command will issue an error message and stop. - - All the proportions for a given `netuid` must sum to less than or equal to `1.0`. If the proportions sum to greater than `1.0`, the command will issue an error message and stop. -- `--hotkey`: SS58. A single SS58 of the parent hotkey. This must be a delegate hotkey that is already registered in with any `netuid`. This `netuid` need not be the same `netuid` used in this command. - - If this parent hotkey has zero stake, then the command will issue an error message and stop. - - Note that this `--hotkey` parameter expects parent hotkey whereas the `--hotkey` parameter of the [Setting child hotkey take](#parameters-1) expects child hotkey. -- `--wallet.name`: String or SS58. Name of the wallet or the SS58 of the coldkey. This coldkey must be matched with the parent hotkey SS58 of the `--hotkey`. If the coldkey and the parent hotkey do not match, the command will issue an error message and stop. - -### Examples - -#### Setting a single child hotkey - -```bash -btcli stake set_children \ - --netuid 4 \ - --children 5HEXVAHY9gyavj5xnbov9Qoba4hPJYkkwwnq1MQFepLK7Gei \ - --proportions 0.5 \ - --hotkey 5DqJdDLU23m7yf6rZSmbLTshU7Bfn9eCTBkduhF4r9i73B9Y \ - --wallet.name Alice -``` - -#### Setting multiple child hotkeys - -```bash -btcli stake set_children \ - --netuid 4 \ - --children 5Gx1CZ9jviC6V2KynBAcTpES4yK76riCagv5o5SFFZFYXj4s,5HEXVAHY9gyavj5xnbov9Qoba4hPJYkkwwnq1MQFepLK7Gei \ - --proportions 0.3,0.7 \ - --hotkey 5DqJdDLU23m7yf6rZSmbLTshU7Bfn9eCTBkduhF4r9i73B9Y \ - --wallet.name Alice -``` - -## Adding a new child hotkey - -If a parent hotkey has, for example, three child hotkeys: child hotkey A, child hotkey B and child hotkey C, then to add a fourth child hotkey D, you must run `set_children` command again with the parent hotkey and all four child hotkeys A, B, C and D. - -## Changing the proportions - -If a parent hotkey has, for example, three child hotkeys: - - child hotkey A with `0.2` proportion. - - child hotkey B with `0.5` proportion. - - child hotkey C with `0.1` proportion. - -Then to change the proportion of, for example, the child hotkey B from `0.5` to `0.3`, you must run `set_children` command again with the parent hotkey and all three child hotkeys A, B, and C set to `0.2`, `0.3` and `0.1` proportions. - - -## Getting the child hotkeys - -This command displays all the child hotkeys for a given parent hotkey. - -### Usage - -```bash -btcli stake get_children --netuid --hotkey --all -``` - -### Example - -```bash -btcli stake get_children \ - --netuid 4 \ - --hotkey 5DqJdDLU23m7yf6rZSmbLTshU7Bfn9eCTBkduhF4r9i73B9Y \ - --wallet.name Alice \ - --all -``` - -or - -```bash -btcli stake get_children -``` -and follow the prompts. - -## Revoking the child hotkeys - -This command revokes **all** the child hotkeys for a given parent hotkey. - -:::danger Revoking a specific child hotkey is not allowed -Currently it is not possible to revoke a specific child hotkey. However, if a parent hotkey has, for example, three child hotkeys: child hotkey A, child hotkey B and child hotkey C, then setting the parent hotkey again with only child hotkeys A and B will result in revoking the child hotkey C. -::: - -### Usage - - -```bash -btcli stake revoke_children \ - --netuid \ - --hotkey \ - --wallet.name -``` - -### Example - -```bash -btcli stake revoke_children \ - --netuid 4 \ - --hotkey 5DqJdDLU23m7yf6rZSmbLTshU7Bfn9eCTBkduhF4r9i73B9Y \ - --wallet.name Alice -``` - -or - -```bash -btcli stake revoke_children -``` -and follow the prompts. - -## Setting child hotkey take - -This command sets the take percentage of the child hotkey for a given `netuid`. The `take` can be between `0` (0%) and `0.18` (18%). - -A child hotkey's `take` is subnet-specific, i.e., a child hotkey can have one `take` in one `netuid` and a different `take` in another `netuid`. - -The child hotkey take rate is an attribute of the child hotkey and this take rate applies to all the parent hotkeys for which this hotkey is the child hotkey. - -The child hotkey can also set its delegate take separately from the child hotkey take. That is, a child hotkey can carry two separate take rates: the child hotkey take rate and the delegate take rate. For the delegate take rate, see [Set delegate take](../btcli.md#set-delegate-take). - -### Usage - -```bash -btcli stake set_childkey_take \ - --netuid \ - --hotkey \ - --take \ - --wallet.name -``` - -### Parameters - -- `--hotkey`: SS58. A single SS58 of the child hotkey. Note that this `--hotkey` parameter expects child hotkey whereas the `--hotkey` parameter of the [Setting a child hotkey](#parameters) expects parent hotkey. -- `--take`: Floating. A value between `0` (0%) and `0.18` (18%). Default value is `0`. -- `--netuid`: Integer. The `netuid` in which this child hotkey's `take` is applicable. Note that a child hotkey's `take` is subnet-specific, i.e., a child hotkey can have one `take` in one `netuid` and a different `take` in another `netuid`. - -### Example - -```bash -btcli stake set_childkey_take \ - --netuid 4 \ - --hotkey 5DqJdDLU23m7yf6rZSmbLTshU7Bfn9eCTBkduhF4r9i73B9Y \ - --take 0.09 \ - --wallet.name Alice -``` - -## Getting child hotkey take - -This command displays the take percentage of a given child hotkey and `netuid`. - -### Usage - -```bash -btcli stake get_childkey_take \ - --netuid \ - --hotkey \ - --wallet.name -``` - - -### Example - -```bash -btcli stake get_childkey_take \ - --netuid 4 \ - --hotkey 5Gx1CZ9jviC6V2KynBAcTpES4yK76riCagv5o5SFFZFYXj4s \ - --wallet.name Bob -``` diff --git a/docs/subnets/commit-reveal.md b/docs/subnets/commit-reveal.md deleted file mode 100644 index 61158405bb..0000000000 --- a/docs/subnets/commit-reveal.md +++ /dev/null @@ -1,97 +0,0 @@ - -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Commit Reveal - -This page describes the **commit reveal** feature: a configurable waiting period that elapses between a) when consensus weights set by subnet validators are first committed, and b) when they are revealed publicly and included in Yuma Consensus. - -This feature was designed to address the issue of *weight copying* by validators. - -## Weight copying - -In each Bittensor subnet, each validator scores—or *'weights'*—each miner, producing what is referred to as a [weight vector](../glossary.md#weight-vector). The weight vectors for each validator in a subnet are combined into a weight matrix. This matrix determines emissions to miners in the subnet based on the consensus evaluation of their performance, according to [Yuma Consensus](../glossary.md#yuma-consensus). - -The weight matrix is public information, and must be, so that emissions in the Bittensor platform can be transparently fair. However, this transparency makes it possible for subnet validators to free-ride on the work of other validators by copying the latest consensus rather than independently evaluating subnet miners. This is unfair and potentially degrades the quality of validation work, undermining Bittensor's ability to incentivize the best miners and produce the best digital commodities overall. - -The commit reveal feature is designed to solve the weight copying problem by giving would-be weight copiers access only to stale weights. Copying stale weights should result in validators departing from consensus. However, it is critical to note that this only works if the consensus weight matrix changes sufficiently on the time scale of the commit reveal interval. If the demands on miners are too static, and miner performance is very stable, weight copying will still be successful. The only solution for this is to demand continuous improvement from miners, requiring them to continuously evolve to maintain their scoring. Combined with a properly tuned Commit Reveal interval, this will keep validators honest, as well as producing the best models. - -## Commit Reveal and Immunity Period - -The [Immunity Period](../glossary.md#immunity-period) is the interval (measured in blocks) during which a miner or validator newly registered on a subnet is 'immune' from deregistration due to performance. The duration of this period value should always be larger than the Commit Reveal interval, otherwise the immunity period will expire before a given miner's scores are available, and they may be deregistered without having their work counted. - -When creating a new subnet, ensure that the miner immunity period is larger than the commit reveal interval. When updating the immunity period or commit reveal interval hyperparameters for a subnet, use the following formula: - -``` -new_immunity_period = (new_commit_reveal_interval - old_commit_reveal_interval) + old_immunity_period -``` - -See [Subnet Hyperparameters](./subnet-hyperparameters.md). - -## Commit reveal in detail - -When commit reveal is enabled, it works as follows: - -1. A subnet validator sets the weights normally by using [`set_weights`](pathname:///python-api/html/autoapi/bittensor/core/extrinsics/set_weights/index.html). - -2. Instead of publishing weights openly, an encrypted copy of these weights is committed to the blockchain, using an internal method called [`commit_weights`](pathname:///python-api/html/autoapi/bittensor/core/extrinsics/commit_weights/index.html). - -3. A waiting interval, specified as a number of blocks, elapses. Subnet owners configure this interval with the subnet hyperparameter `commit_reveal_weights_interval`. - -4. After this interval has elapsed, the unencrypted weights are automatically revealed by the chain, using [Drand time-lock encryption](https://drand.love/docs/timelock-encryption/). - -5. The weights are now input to Yuma Consensus. - -
-:::tip Commit reveal works behind the scenes -After the subnet owner turns ON the commit reveal feature, everything happens behind the scenes. A subnet validator will continue to set weights normally by using [`set_weights`](pathname:///python-api/html/autoapi/bittensor/core/extrinsics/set_weights/index.html). -::: - -
- -
- - -## How to use the commit reveal feature - -As a subnet owner, set the below hyperparameters to use the commit reveal feature: - -1. `commit_reveal_weights_enabled` (boolean): Set this to `True` to activate the commit reveal feature for the subnet. Default value is `False`. -2. `commit_reveal_weights_interval` (int): Set this to an integer number. This is the number of subnet tempos to elapse before revealing the weights by submitting them again to the blockchain, but now openly for everyone to see. Default value is `1`. - -See [Setting subnet hyperparameters](subnet-hyperparameters#setting-the-hyperparameters). - -:::danger Ensure that the commit reveal interval is less than your immunity period to avoid unintended miner de-registration! -See [Commit Reveal and Immunity Period](#commit-reveal-and-immunity-period). -::: - - -Weights will be revealed immediately at the beginning of the tempo after the `commit_reveal_weights_interval`. For example, if `commit_reveal_weights_interval` value is set to `3`, then the reveal will occur at the beginning of the fourth tempo from the current tempo. The current tempo is counted as the first tempo. See the below diagram for this example: - -
- -
- -
- - -## Technical papers and blog - -- ACM CCS2024 Poster PDF [Solving the Free-rider Problem In Bittensor](pathname:///papers/ACM_CCS2024_Poster.pdf). -- See [Weight Copying in Bittensor, a technical paper (PDF)](pathname:///papers/BT_Weight_Copier-29May2024.pdf). -- Blog post, [Weight Copying in Bittensor](https://blog.bittensor.com/weight-copying-in-bittensor-422585ab8fa5). - diff --git a/docs/subnets/consensus-based-weights.md b/docs/subnets/consensus-based-weights.md deleted file mode 100644 index 3e1838df5c..0000000000 --- a/docs/subnets/consensus-based-weights.md +++ /dev/null @@ -1,251 +0,0 @@ ---- -title: "Consensus-based Weights/Liquid alpha" ---- - -# Consensus-based Weights - -This guide describes how to use the **consensus-based weights** feature (also called "liquid alpha"). - -With this feature, a subnet validator's dividends are better correlated to the performance of the subnet miner on which the subnet validator is setting the weights. In this context, see also the documentation for the [Commit Reveal](./commit-reveal.md) feature, as both these features help the subnet validators find new subnet miners that perform well and bond to them quickly. - -## Technical paper, blog - -- See [Amplifying the Weight-copying Penalty in Bittensor, a working paper (PDF)](pathname:///papers/BT-Consensus-based-Weights.pdf). -- Blog post: [Consensus-based Weights](https://blog.bittensor.com/consensus-based-weights-1c5bbb4e029b). -- Subtensor document section: [Validator bonding](https://github.com/opentensor/subtensor/blob/main/docs/consensus.md#validator-bonding). - -## Collab notebooks - -A subnet owner can run the `weight_copy/liquid_alpha_diagnostic.ipynb` in the Python notebook below to experiment and choose the right values for the hyperparameters `alpha_low`, `alpha_high`, and `commit_reveal_interval`. - -- For commit reveal diagnostic: https://colab.research.google.com/github/opentensor/developer-docs/blob/main/static/weight_copy/commit_reveal_diagnostic.ipynb?authuser=5 -- For liquid alpha diagnostic: https://colab.research.google.com/github/opentensor/developer-docs/blob/main/static/weight_copy/liquid_alpha_diagnostic.ipynb?authuser=5 -- [GitHub directory with Python notebooks](https://github.com/opentensor/developer-docs/tree/main/static/weight_copy/). - -## Description - -Currently, while calculating the dividends to a subnet validator, a quantity called $\Delta B_{ij}$, defined as an **instantaneous bond value** of a subnet validator $i$ with the subnet miner $j$, is used. - -A subnet validator maintains an instantaneous bond value on each subnet miner. However, while calculating a subnet validator's dividends, instead of directly using the instantaneous bond value $\Delta B_{ij}$, we use $B_{ij}^{(t)}$, an **exponential moving average (EMA)** of the bond value, weighted over the current epoch and the previous epoch. See the below equation for how this EMA is computed, where $t$ is the current epoch time and $t-1$ is the previous epoch time: - -$$ -B_{ij}^{(t)} = \alpha\cdot\Delta B_{ij}^{(t)} + (1-\alpha)\cdot B_{ij}^{(t-1)} -$$ - -This EMA, $B_{ij}^{(t)}$, helps in the early discovery of promising subnet miners and prevents abrupt changes to the bond value. Typically, any abrupt change in the bond value indicates exploitation. - -Finally, the **dividend $D_i$ to a subnet validator $i$** is calculated as: - -$$ -D_i = \sum_j B_{ij} \cdot I_j -$$ - -where $B_{ij}$ is the EMA bond value of the subnet validator $i$ with the subnet miner $j$, and $I_j$ is the subnet miner's incentive. See the subtensor document section, [Validator bonding](https://github.com/opentensor/subtensor/blob/main/docs/consensus.md#validator-bonding) for a rigorous mathematical treatment of this topic. - -### What changed with this feature - -Without the consensus-based weights feature, the $\alpha$ in the above equation is set to `0.9`. With the consensus-based weights feature, this $\alpha$ value is made into a variable. An optimum value for the variable $\alpha$ is determined based on the current consensus (YC-2) in a given subnet. Hence, this feature is called **consensus-based weights**. - -Using the new subnet hyperparameters that are described below, a subnet owner should experiment and discover the optimum $\alpha$ for their subnet. - -## Installing the consensus-based weights feature - -The consensus-based weights feature is available in Bittensor 7.3.0 and later versions. To use this feature, make sure you update to the `7.3.0` version. - ---- - -## Using test consensus-based weights feature - -### Summary steps - -Here are summary steps to use the consensus-based weights feature. A subnet owner typically executes these steps: - -1. To activate this feature, a subnet owner should set the `liquid_alpha_enabled` (bool) hyperparameter to `True`. -2. Next, the subnet owner should set the upper and lower bounds for $\alpha$ by using a single subnet hyperparameter, `alpha_values` (List[int]). - -:::danger Set alpha low and high together -You must set `alpha_low` and `alpha_high` together using `alpha_values`. See below. -::: - ---- - -## Default values, allowed ranges and value format - -### Default values - -- The default value for `alpha_low` is `0.7`. -- The default value for `alpha_high` is `0.9`. -- The default value for `liquid_alpha_enabled` is `False`. - -### Allowed ranges - -- The range for both `alpha_low` and `alpha_high` hyperparameters is `(0,1)`. -- However, **until further notice**, the `alpha_high` value must be greater than or equal to `0.8`. -- The value of `alpha_low` must not be greater than or equal to `alpha_high`. - -### Value format - -When you set the subnet hyperparameters `alpha_low` and `alpha_high`, you must pass their integer equivalents in `u16`. This applies whether you set these hyperparameters using the `btcli` command or in your Python code. These integer values are then converted by the subtensor into their corresponding decimal values in the `u16` format. - -Use the below conversion formula to determine the integer values for your desired decimal values for both `alpha_low` and `alpha_high` hyperparameters. - -$$ -\text{Integer value} = \text{(your-desired-decimal-value)} \times 65535 -$$ - -Hence, for example: -- If you want `alpha_low` to be `0.1`, then you would pass `6554`, which is the rounded up value of `0.1 * 65535`. -- If you want `alpha_high` to be `0.8`, then you would pass `52428`, which is the value of `0.8 * 65535`. - ---- - -## Detailed steps using Python code - -### Method signatures - -See below the Python definitions for the consensus-based weights feature: - -```python -import bittensor as bt - -wallet = bt.wallet(name=) -subtensor = bt.subtensor(network="127.0.0.1:9946") - -# Enable consensus-based weights (liquid alpha) feature -enabled_result = subtensor.set_hyperparameter( -wallet=wallet, -netuid=, -parameter="liquid_alpha_enabled", -value=value, -wait_for_inclusion=True, -wait_for_finalization=True, -) -print(enabled_result) - -# Set alpha_values as a list of integers passed to "value" parameter in this order: alpha_low, alpha_high -alpha_low_high_result = subtensor.set_hyperparameter( -wallet=wallet, -netuid=, -parameter="alpha_values", -value=[], # decimal 0.1 for alpha_low and 0.8 for alpha_high -wait_for_inclusion=True, -wait_for_finalization=True, -) -print(alpha_low_high_result) -``` - -### Example Python code - -Below is the example Python code showing how to use the above definitions for the commit reveal feature: - -```python -import bittensor as bt - -wallet = bt.wallet(name="test-coldkey") -subtensor = bt.subtensor(network="127.0.0.1:9946") - -# Enable consensus-based weights (liquid alpha) feature -enabled_result = subtensor.set_hyperparameter( -wallet=wallet, -netuid=1, -parameter="liquid_alpha_enabled", -value=True, -wait_for_inclusion=True, -wait_for_finalization=True, -) -print(enabled_result) - -# Set alpha low and high values -alpha_low_high_result = subtensor.set_hyperparameter( -wallet=wallet, -netuid=1, -parameter="alpha_values", -value=[6554, 52428], # decimal 0.1 for alpha_low and 0.8 for alpha_high -wait_for_inclusion=True, -wait_for_finalization=True, -) -print(alpha_low_high_result) -``` - -:::danger you must always set alpha_low and alpha_high together -You must set the values for both `alpha_low` and `alpha_high` together. Current functionality does not allow setting a value to only one of `alpha_low` or `alpha_high`. - -For example, if you want to set a new value to `alpha_low` but do not want to change the `alpha_high` value, you must pass the new value of `alpha_low`, and also the current, unchanging value of `alpha_high`, while setting the `alpha_values`. -::: - ---- - -## Detailed steps using `btcli` - -### Set the subnet hyperparameters - -#### 1. Enable the consensus-based weights feature - -**Syntax** - -```bash -btcli sudo set hyperparameters --netuid --param liquid_alpha_enabled --value or -``` - -**Example** - -For subnet 1 (`netuid` of `1`): - -```bash -btcli sudo set hyperparameters --netuid 1 --param liquid_alpha_enabled --value True -``` -or you can also use, - -```bash -btcli sudo set -``` -and follow the terminal prompts: - -```bash ->> Enter wallet name (default): # ->> Enter netuid [0/1/2/3] (0): # ->> Enter hyperparameter: # ->> Enter new value: # or ->> Enter password to unlock key: # -``` - -:::info tip -When you use `btcli sudo set` you can use `1` or `0` to enable or disable the `liquid_alpha_enabled` hyperparameter. You can also use `true` or `True`, or `false` or `False`. -::: - -#### 2. Use the `alpha_values` to set the `alpha_low` and `alpha_high` - -**Syntax** - -```bash -btcli sudo set hyperparameters --netuid --param alpha_values --value -``` - -**Example** - -Setting the value of `alpha_low` to the decimal `0.1` (integer `6554`) and `alpha_high` to the decimal `0.8` (integer `52428`) for subnet 1 (`netuid` of `1`): - -```bash -btcli sudo set hyperparameters --netuid 1 --param alpha_values --value 6554,52429 -``` - -Output: -```bash ->> Enter wallet name (default): # ->> Enter password to unlock key: # ->> ✅ Hyper parameter alpha_values changed to [6554.0, 55706.0] -``` - -Now, if you want to only change the `alpha_high` value from `0.8` to `0.85` (integer `55705`), then: - -First, execute the `btcli sudo set` command and provide the `netuid`. The terminal will display the current alpha_low` and `alpha_high` values. - -:::warning alert -When you use `btcli sudo set,` the display will not show the `alpha_values` parameter. It will only show the `alpha_low` and `alpha_high` parameters. -::: - -Use the current value of `alpha_low` from the above display and the new desired value of `alpha_high` and set both like below: - -```bash -btcli sudo set hyperparameters --netuid 1 --param alpha_values --value 6554,55706 -``` diff --git a/docs/subnets/create-a-subnet.md b/docs/subnets/create-a-subnet.md deleted file mode 100644 index 983ea28092..0000000000 --- a/docs/subnets/create-a-subnet.md +++ /dev/null @@ -1,130 +0,0 @@ ---- -title: "Create a Subnet" ---- - -# Create a Subnet - -This page describes the procedures for creating a new Bittensor subnet on test chain or main chain. - -You should first try [Creating a Subnet on a locally deployed chain](../local-build/create-subnet). - -Creating a subnet is a major undertaking. You should read up on [Understanding Subnets](understanding-subnets) and research existing subnets before planning to create one. - -## Considerations -### Research existing subnets - -Prospective subnet creators should familiarize themselves with the space of existing subnets. - -- Real-time subnet info on [tao.app](https://www.tao.app/explorer) -- LearnBittensor's [Subnet listings](https://learnbittensor.org/subnets) - -### Burn cost - -The burn cost for subnet creation is dynamic; it lowers gradually and doubles every time a subnet is created. - -:::tip try it live - -Check the burn cost to create a subnet on Bittensor main network and test network: - - - - - -```shell -btcli subnet burn-cost --network finney -``` - - - -```shell -btcli subnet burn-cost --network test -``` - - -::: - -### A new subnet is not automatically active - -To allow subnet owners to fully set up their subnets and to prevent extraction of emissions to subnet participants before the subnet is contributing to the network, new subnets are inactive and cannot be started for 7 * 7200 blocks (roughly one week) after they are registered. During this time, you can register and activate validators and invite miners into the subnet. - -:::info -The subnet and its participants will receive **no emissions** during the time that the subnet is inactive. -::: - -### Validating in your own subnet - -You must meet the same [requirements for validation](../validators#requirements-for-validation) as other validators in order to set weights in your own subnet. - -One option for subnet owners is to ask one of the root network (subnet 0) validators to parent your validator hotkey as a childkey of theirs. This will lend their stake to your validator, and can help you ensure that your validator maintains a sufficient stake to effectively participate in consensus as well as resist deregistration. See the [Child Hotkeys](./child-hotkeys) documentation for more detail. - -### Subnet creation rate limits - -Subnet creations are limited to **one subnet creation per 7200 blocks** (approximately one per day). The cost to register a new subnet is also dynamic. For these reason, picking the right time to create your subnet requires planning. - -## Prerequisites - -- [Install the most recent version of BTCLI](../getting-started/install-btcli). -- [Created a wallet](../getting-started/wallets.md#creating-a-local-wallet). -- To create a subnet on test chain, your wallet must have sufficient test net TAO. Inquire in [Discord](https://discord.com/channels/799672011265015819/1107738550373454028/threads/1331693251589312553) to obtain TAO on Bittensor test network. -- To create a subnet on main network (finney) requires a substantial investment of TAO, depending on current registration cost for new subnets. - -## Creating a subnet on testchain - -Create your new subnet on the testchain using the test TAO you received from the previous step. This will create a new subnet on the testchain and give you its owner permissions. - -Run the create subnet command on the testchain. - -```bash -btcli subnet create --network test -``` -Output: -```bash -# Enter the owner wallet name, which gives the coldkey permissions to define running hyperparameters later. ->> Enter wallet name (default): owner # Enter your owner wallet name ->> Enter password to unlock key: # Enter your wallet password. ->> Register subnet? [y/n]: # Select yes (y) ->> Registering subnet... -✅ Registered subnetwork with netuid: 1 # Your subnet netuid will show here, save this for later. -``` - -## Creating a subnet on mainchain - -:::caution Alert: Minimum required TAO -Creating a subnet on the mainnet is competitive, and the cost is determined by the rate at which new networks are registered onto the chain. -::: - -### Create the subnet - -Use the below command to create a new subnet on the mainchain. - -```bash -btcli subnet create -``` -Output: -```bash ->> Enter wallet name (default): owner # Enter your owner wallet name ->> Enter password to unlock key: # Enter your wallet password. ->> Register subnet? [y/n]: # Select yes (y) ->> Registering subnet... -✅ Registered subnetwork with netuid: 1 # Your subnet netuid will show here, save this for later. -``` - -### Check to see if you can start the subnet - -Use the below command to check whether the subnet can be started. - -```bash -btcli subnet check-start --netuid x -``` - -Where "x" is the subnet ID. - -The output will provide you with the block registered and the block at which the subnet can be started, with "blocks remaining" and an estimated time. When this time has passed, the `check-start` command will return `Emission schedule can be started.` - -### Start the subnet - -Use the below command to start the subnet once `check-start` returns `Emission schedule can be started.` - -```bash -btcli subnet start --netuid x -``` diff --git a/docs/subnets/index.md b/docs/subnets/index.md deleted file mode 100644 index 9b728cbe7d..0000000000 --- a/docs/subnets/index.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: "Managing Subnets" ---- - -Creating and managing a subnet is a significant undertaking diff --git a/docs/subnets/schedule-coldkey-swap.md b/docs/subnets/schedule-coldkey-swap.md deleted file mode 100644 index 7e4455001f..0000000000 --- a/docs/subnets/schedule-coldkey-swap.md +++ /dev/null @@ -1,101 +0,0 @@ ---- -title: "Rotate/Swap your Coldkey" ---- - -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Rotate/Swap your Coldkey - -This page describes how to *rotate* or *swap* the coldkey in your wallet. This is required if you suspect your coldkey has been leaked. Your coldkey secures your identity on Bittensor. - -See: - -- [Wallets, Coldkeys and Hotkeys in Bittensor](../getting-started/wallets) -- [Coldkey and Hotkey Workstation Security](../getting-started/coldkey-hotkey-security) - - -## Description - -The `btcli` command does not yet support this schedule coldkey swap feature. You must use the [Polkadot JS extension](https://polkadot.js.org/extension/). - -See [code for coldkey swap](https://github.com/opentensor/subtensor/blob/main/pallets/subtensor/src/swap/swap_coldkey.rs). - -The schedule coldkey swap feature works as follows: - -- The schedule coldkey swap feature enables you to schedule the swapping of source coldkey to a destination coldkey. If you feel your existing coldkey is potentially compromised, then use this feature to schedule a swap to a destination coldkey. -- When you use this feature, it will not immediately swap your coldkeys and swap your TAO funds from the source coldkey to the destination coldkey. It will only schedule the swap event. -- All scheduled coldkey swaps will be executed on-chain. **Your scheduled coldkey swap will execute on the mainnet exactly 5 days after you successfully scheduled the coldkey swap using the method described in this document.** -- The source coldkey you used in this method will be locked when you schedule the swap. After the 5-day period is elapsed your original coldkey will be unlocked entirely. -- **Cost**: The cost of this coldkey swap transaction is 0.1 TAO. This must be available in your source coldkey. -- Any subnet ownership from your source coldkey will move to the destination coldkey. -- The delegated stake will be transferred from your source coldkey to the destination coldkey. -- For those who were staking to a validator from their source coldkey, their staking TAO will transfer to the destination coldkey. - -:::danger Do not schedule coldkey swap more than once using the same coldkey -::: - -## Requirements - -1. To execute this operation, you must own the source coldkey. -1. The destination (new) coldkey public key must not already be assigned to a hotkey *or a coldkey that is associated with any hotkeys*. -1. Confirm the identity of the destination coldkey. A mistake here can result in loss of all of the source coldkey's assets and identity. - - If you are rotating the coldkey to maintain ownership, you must control the destination coldkey privatekey. Otherwise you will lose control over all of the source coldkey's assets and identity. - - If you are transferring ownership to someone else, confirm that they have secure control of the destination coldkey private key. -2. You must use the [Polkadot JS extension](https://polkadot.js.org/extension/). The `btcli` command does not yet support scheduling coldkey swap. -3. You must import your source and destination coldkeys into the Polkadot JS extension. -4. You must connect the source coldkey account to the [polkadot.js.org/apps](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fentrypoint-finney.opentensor.ai%3A443#/explorer) website. - - :::danger If you do not do this step, then you will not see **Developer** > **Extrinsics** option on the [polkadot.js.org/apps](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fentrypoint-finney.opentensor.ai%3A443#/extrinsics) website. - ::: - -## Steps - -Follow the steps shown below the screenshot: - -
- -
- -
- -### Step 1: Connect to the subtensor network on Polkadot.js - -Open your web browser and navigate to the Polkadot.js Apps website (https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fentrypoint-finney.opentensor.ai%3A443#/). - -### Step 2: Navigate to the Extrinsics page - -From the top navigation menu, proceed to **Developer** > **Extrinsics** to open the Extrinsics page. If you do not see this option, then make sure you successfully imported your source coldkey into the Polkadot JS extension, and connected this source coldkey account to the Polkadot.js Apps website. - -### Step 3: Select your source coldkey account - -Locate the drop-down section labeled **using the selected account** and select your connected account. This account should be your source coldkey account. - -### Step 4: Select the `subtensorModule` - -Locate the drop-down section labeled **submit the following extrinsic** and select `subtensorModule`. - -### Step 5: Choose the `scheduleSwapColdkey` function - -After selecting the `subtensorModule`, a second drop-down menu will appear on the right side of it. From this drop-down select the `scheduleSwapColdkey` option. - -### Step 6: Provide the destination coldkey - -Provide your destination coldkey in the `newColdkey: AccountId32` field. - -### Step 7: Submit the transaction - -Check again that you have provided the correct source and destination coldkeys. - -Scroll down to the bottom of the page and click on the **Submit Transaction** button. Polkadot.js will prompt you to sign the transaction using the selected account. After you sign the transaction, the signed transaction will be broadcast to the Subtensor. - -## Verify - -Your scheduled coldkey swap will execute on the mainnet 5 days after you successfully scheduled the coldkey swap using the above method. Check your destination coldkey after 5 days to verify. diff --git a/docs/subnets/subnet-creators-btcli-guide.md b/docs/subnets/subnet-creators-btcli-guide.md deleted file mode 100644 index 4a796cd44d..0000000000 --- a/docs/subnets/subnet-creators-btcli-guide.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: "Subnet Creator's Guide to `BTCLI`" ---- - -# Subnet Creator's Guide to `BTCLI` - -Subnet creators define and manage new subnets, specifying parameters like burn cost, hyperparameters, or other chain-level configurations. This role inherently requires a **coldkey** with sufficient balance/permissions to create or update subnets. - -This page discusses btcli stuff specifically for Subnet Creators. For general coverage of BTCLI and permissions stuff, see: [Bittensor CLI: Permissions Guide](../btcli-permissions) - -See also: [Coldkey and Hotkey Workstation Security](../getting-started/coldkey-hotkey-security). - -## Subnet Creator Requirements - -To create a new subnet, you need a coldkey with sufficient TAO to pay the burn cost for creating a subnet - -To modify a subnet, you need the coldkey associated with ownership of the subnet - -## `btcli` commands for subnet creators -### monitor subnet -Permissionless, use `btcli subnet show` or `btcli view dashboard`. - -### create subnet -Requires coldkey with sufficient TAO. -`btcli subnet create` - -### configure subnet - -Configure your subnet's hyperparameters with `btcli sudo set`. Requires the coldkey the created the subnet. - -## Key rotation - -If you suspect your coldkey may have been leaked, you can request to swap it out of your wallet, using an extrinsic blockchain transaction. This operation has a 5 day waiting period, during which your coldkey will be locked. The cost of this coldkey swap transaction is 0.1 TAO. - -See [Rotate/Swap your Coldkey](../subnets/schedule-coldkey-swap) - diff --git a/docs/subnets/subnet-hyperparameters.md b/docs/subnets/subnet-hyperparameters.md deleted file mode 100644 index ef1b8bbc99..0000000000 --- a/docs/subnets/subnet-hyperparameters.md +++ /dev/null @@ -1,746 +0,0 @@ ---- -title: "Subnet Configuration (Hyperparameters)" ---- - -# Subnet Configuration (Hyperparameters) - -Bittensor subnets are configured with a set of state variables (known as hyperparameters) that are recorded on the blockchain. Many of these can be accessed (viewed and set) using the Bittensor CLI `btcli`, but some of them must be checked or set using Subtensor extrinsics, as noted. - -Note that the names of the variables may be slightly different in various representations, e.g. in `btcli` and in the [chain codebase](https://github.com/opentensor/subtensor/blob/main/runtime/src/lib.rs#L1038). - -## Manage hyperparams with `btcli` - -:::note -Not all hyperparameters can be viewed and set with `btcli`. -::: - -### View the hyperparameters - -Anyone can view the parameters of any subnet. - -**Example** - -```bash -btcli subnet hyperparameters --netuid 19 -``` - -```console -Netuid: 19 -Using the specified network test from config - - Subnet Hyperparameters - NETUID: 19 (inference) - Network: test - - - HYPERPARAMETER VALUE NORMALIZED - ──────────────────────────────────────────────────────────────────────── - rho 10 10 - kappa 32767 0.4999923705 - immunity_period 5000 5000 - min_allowed_weights 1 1 - max_weights_limit 65535 65535 - tempo 99 99 - min_difficulty 10000000 5.421010862e-13 - max_difficulty 18446744073709551615 1 - weights_version 0 0 - weights_rate_limit 100 100 - adjustment_interval 360 360 - activity_cutoff 5000 5000 - registration_allowed True True - target_regs_per_interval 1 1 - min_burn 500000 τ 0.0005 - max_burn 100000000000 τ 100.0000 - bonds_moving_avg 900000 4.878909776e-14 - max_regs_per_block 1 1 - serving_rate_limit 50 50 - max_validators 64 64 - adjustment_alpha 58000 3.1441863e-15 - difficulty 10000000 5.421010862e-13 - commit_reveal_period 1 1 - commit_reveal_weights_enabled False False - alpha_high 58982 0.9000076295 - alpha_low 45875 0.7000076295 - liquid_alpha_enabled False False - ──────────────────────────────────────────────────────────────────────── - ``` - -:::tip - -`btcli` does not include all of the chain state variables, some of which can only be accessed through the Bittensor Python SDK or directly through extrinsic calls. -::: - -### Set hyperparameters - -Use the below command to set these hyperparameters. - -:::tip -Only the coldkey that created the subnet can set the hyperparameters. -::: - -```bash -btcli sudo set -``` - -## Subnet Hyperparameters - -The following variables are configurable by the subnet creator. - -**Permissions required to set**: Subnet Creator - -### ActivityCutoff - -**Type**: u16 - -**Default**: 5000 - -**`btcli` setter**: `btcli sudo set --param activity_cutoff` - -**Setter extrinsic**: `sudo_set_activity_cutoff` - -**Permissions required to set**: Subnet Creator - -**Description**: - -The number of blocks for the stake to become inactive for the purpose of epoch in Yuma Consensus. If a validator doesn't submit weights within the first `ActivityCutoff` blocks of the epoch, it will not be able to participate until the start of the next epoch. - -### AdjustmentAlpha - -**Type**: u64 - -**Default**: 0 - -**`btcli` setter**: `btcli sudo set --param adjustment_alpha` - -**Setter extrinsic**: `sudo_set_activity_cutoff` - -**Permissions required to set**: Subnet Creator - -**Description**: -`AdjustmentAlpha` is the rate at which difficulty and burn are adjusted up or down. - - -### AdjustmentInterval - -**Type**: u16 - -**Default**: 360 - -**`btcli` setter**: `btcli sudo set --param adjustment_interval` - -**Setter extrinsic**: `sudo_set_adjustment_interval` - -**Permissions required to set**: Subnet Creator - -**Description**: - -`AdjustmentInterval` is number of blocks that pass between difficulty and burn adjustments. So, I was wrong about "next block" when I said that if root sets difficulty outside of range, it will get back in range. Difficulty will get back in range at most after `AdjustmentInterval` blocks pass. - - -### BondsMovingAverage - -**Type**: - -**Default**: - -**`btcli` setter**: bonds_moving_avg - -**`btcli` setter**: `btcli sudo set --param sudo_set_bonds_moving_average` - -**Permissions required to set**: Subnet Creator - -**Description**: - -The moving average of bonds. The higher bonds yield to higher dividends for validators. - -See [Yuma Consensus: bonding mechanics](../yuma-consensus#bonding-mechanics). - - -### BondsPenalty - -**Type**: u16 - -**Default**: 0 - -**`btcli` setter**: none - -**Setter extrinsic**: `sudo_set_bonds_penalty` - -**Permissions required to set**: root - - -**Description**: -The magnitude of the penalty subtracted from weights for exceeding consensus, for a specific subnet. - -See [Yuma Consensus: Penalizing out-of-consensus bonds](../yuma-consensus#penalizing-out-of-consensus-bonds). - - -### CommitRevealPeriod - -**Type**: u16 - -**Default**: 1 - -**`btcli` setter**: `btcli sudo set --param commit_reveal_period` - -**Setter extrinsic**: `sudo_set_commit_reveal_weights_interval` - -**Permissions required to set**: Subnet Creator - -**Description**: - -How long, in blocks, the consensus weights for a subnet remain time-lock encrypted, preventing weight-copying. - -See [Commit Reveal](./commit-reveal) - -### CommitRevealWeightsEnabled - -**Type**: Boolean - -**Default**: false - -**`btcli` setter**: yes - -**Setter extrinsic**: `sudo_set_commit_reveal_weights_enabled` - -**Permissions required to set**: Subnet Creator - -**Description**: - - Enables [Commit Reveal](./commit-reveal) - - -### Difficulty - -**Type**: u64 - -**Default**: 10000000 - -**`btcli` setter**: none - -**Setter extrinsic**: `sudo_set_difficulty` - -**Permissions required to set**: Root - -**Description**: - -Current dynamically computed value for the proof-of-work (POW) requirement for POW hotkey registration. Decreases over time but increases after new registrations, between the min and the maximum set by the subnet creator. see [#max-difficulty]. - - - - -### ImmunityPeriod - - -**Type**: u16 - -**Default**: 5000 - -**`btcli` setter**: yes - -**Setter extrinsic**: `sudo_set_immunity_period` - -**Permissions required to set**: Subnet creator - -**Description**: - -The number of blocks after registration when a miner is protected from deregistration - - -### Kappa - - -**Type**: u16 - -**Default**: 32767 ( or approximately 0.5 normalized ) - -**`btcli` setter**: yes - -**Setter extrinsic**: `sudo_set_kappa` - -**Permissions required to set**: Subnet creator - -**Description**: - -The consensus majority ratio: The weights set by validators who have lower normalized stake than Kappa are not used in calculating consensus, which affects ranks, which affect incentives. - - - -the consensus threshold for bond-clipping during [Yuma Consensus](../yuma-consensus) - -### LiquidAlphaEnabled - -**Type**: Bool - -**Default**: False - -**`btcli` setter**: `btcli sudo set --param liquid_alpha_enabled` - -**Setter extrinsic**: `sudo_set_liquid_alpha_enabled` - -**Permissions required to set**: SN creator - -**Description**: - -Enables the [liquid alpha ](./consensus-based-weights) feature. - - - - -### MaxAllowedValidators - - -**Type**: u16 - -**Default**: 64 - -**`btcli` setter**: `btcli sudo set --param max_validators` - -**Setter extrinsic**: `sudo_set_max_allowed_validators` - -**Permissions required to set**: Root - -**Description**: - -Maximum validators on a subnet. - - -### MaxBurn - -**Type**: u64 - -**Default**: 100000000000 normalized to 100.0000(τ) - -**`btcli` setter**: `btcli sudo set --param max_burn` - -**Setter extrinsic**: `sudo_set_max_burn` - -**Permissions required to set**: Subnet creator - -**Description**: - -The maximum of the dynamic range for TAO cost of burn registration on the subnet. - - -### MaxDifficulty - -**Type**: u64 - -**Default**: 18446744073709551615 normalized to 1 - -**`btcli` setter**: `btcli sudo set --param min_difficulty` - -**Setter extrinsic**: - -**Permissions required to set**: Subnet creator - -**Description**: - -The maximum of the dynamic range for difficulty of proof-of-work registration on the subnet. - -### MaxRegistrationsPerBlock - -**Type**: u16 - -**Default**: 1 - -**`btcli` setter**: `btcli sudo set --param max_regs_per_block` - -**Setter extrinsic**: `sudo_set_max_registrations_per_block` - -**Permissions required to set**: Subnet creator - -**Description**: - -Maximum neuron registrations per block. Note: Actual limit may be lower, as there is also per interval limit `TargetRegistrationsPerInterval`. - - -### MaxWeightsLimit - - -**Type**: u16 - -**Default**: 65535 - -**`btcli` setter**: `btcli sudo set --param max_weights_limit` - -**Setter extrinsic**: `sudo_set_max_weight_limit` - -**Permissions required to set**: Subnet creator - -**Description**: The limit for the u16-normalized weights. If some weight is greater than this limit when all weights are normalized so that maximum weight is 65535, then it will not be used. - -### MinAllowedWeights - -**Type**: u16 - -**Default**: 1 - -**`btcli` setter**: `btcli sudo set --param min_allowed_weights` - -**Setter extrinsic**: `sudo_set_min_allowed_weights` - -**Permissions required to set**: Subnet creator - -**Description**: -Minimum number of weights for a validator to set when setting weights. - -### MinBurn - - -**Type**: u64 - -**Default**: 500000 normalized to 0.0005(τ) - -**`btcli` setter**: `btcli sudo set --param min_burn` - -**Setter extrinsic**: `sudo_set_min_burn` - -**Permissions required to set**: Subnet creator - -**Description**: - -The minimum of the range of the dynamic burn cost for registering on the subnet. - -### MinDifficulty - -**Type**: u64 - -**Default**: 10000000 normalized to 5.421010862e-13 - -**`btcli` setter**: `btcli sudo set --param min_difficulty` - -**Setter extrinsic**: `sudo_set_min_difficulty` - -**Permissions required to set**: Subnet creator - -**Description**: - -The minimum of the range of the proof-of-work for registering on the subnet - -### NetworkPowRegistrationAllowed - -**Type**: Boolean - -**Default**: False - -**`btcli` setter**: none - - - -**Setter extrinsic**: `sudo_set_network_pow_registration_allowed` - -**Permissions required to set**: Subnet creator - -**Description**: - -`NetworkPowRegistrationAllowed` is a flag that toggles PoW registrations on a subnet - - -### NetworkRateLimit - - -**Type**: u64 - -**Default**: 7200 - -**`btcli` setter**: none - -**Setter extrinsic**: - -**Permissions required to set**: root - -**Description**: - -Rate limit for network registrations expressed in blocks - - -### NetworkRegistrationAllowed - -**Type**: Boolean - -**Default**: True - -**`btcli` setter**: `btcli sudo set --param registration_allowed` - -**Setter extrinsic**: `sudo_set_network_registration_allowed` - -**Permissions required to set**: Subnet creator - -**Description**: - -`NetworkRegistrationAllowed` determines if burned registrations are allowed. If both burned and pow registrations are disabled, the subnet will not get emissions. - - - -### Rho - - -**Type**: u16 - -**Default**: 10 - -**`btcli` setter**: yes - -**Setter extrinsic**: `sudo_set_rho` - -**Permissions required to set**: Subnet creator - -**Description**: - -Deprecated. - - - -### ServingRateLimit - - -**Type**: u16 - -**Default**: 50 - -**`btcli` setter**: - -**Setter extrinsic**: `sudo_set_serving_rate_limit` - -**Permissions required to set**: Subnet creator - -**Description**: - -Rate limit for calling `serve_axon` and `serve_prometheus` extrinsics used by miners. - - -### TargetRegistrationsPerInterval - - -**Type**: u16 - -**Default**: 1 - -**`btcli` command**: `btcli sudo set --param target_regs_per_interval` - -**Setter extrinsic**: `sudo_set_target_registrations_per_interval` - -**Permissions required to set**: root - -**Description**: - -Maximum number of neuron registrations allowed per interval. Interval is `AdjustmentInterval` - - -### Tempo - -**Type**: u16 - -**Default**: 360 - -**`btcli` setter**: `btcli sudo set --param tempo` - -**Setter extrinsic**: `sudo_set_tempo` - -**Permissions required to set**: root - -**Description**: - -Length of subnet tempo in blocks. -See [Emission](../emissions.md) - -### ToggleTransfer - - -**Type**: Boolean - -**Default**: True - -**`btcli` setter**: none - -**Setter extrinsic**: `sudo_set_toggle_transfer` - -**Permissions required to set**: Subnet creator - -**Description**: - -Allows/disallows transfer of stake between coldkeys. - -### WeightsVersion - -**Type**: u16 - -**Default**: 0 - -**`btcli` setter**: `btcli sudo set --param weights_version` - -**Setter extrinsic**: `sudo_set_weights_version_key` - -**Permissions required to set**: Subnet Creator - -**Description**: - -If the version key specified in `set_weights` extrinsic is lower than this system-wide setting (WeightsVersionKey), the transaction will fail. This is a fool-proofing protection for validators to update, not a security feature. - - - -### WeightsRateLimit / CommitmentRateLimit - -**Type**: u12 - -**Default**: 100 - -**`btcli` setter**: `btcli sudo set --param weights_rate_limit` - -**Setter extrinsic**: - -**Permissions required to set**: Root - -**Description**: - -How long, in blocks, a validator must wait between weight commits on a subnet. - -## Global/Root State Variables - -The following variables are global and/or can only be configured with `root` permissions, which are held by a triumvirate of Opentensor Foundation employees. They are listed here for reference. - -### ColdkeySwapScheduleDuration - -**Type**: u12 - -**Default**: - -**`btcli` setter**: no - -**Setter extrinsic**: `sudo_set_coldkey_swap_schedule_duration` - -**Permissions required to set**: Root - -**Description**: - -The duration in blocks of the waiting period before a coldkey swap. - -See [Rotate/Swap your Coldkey](./schedule-coldkey-swap) - - -### Issuance - -**Type**: u64 - -**Description**: -Refers to total issuance, the amount of TAO in circulation. - - -### LockReductionInterval - - -**Type**: u64 - -**Default**: 14 * 7200 - -**`btcli` setter**: - -**Setter extrinsic**: - -**Permissions required to set**: root - -**Description**: - -The number of blocks that need to pass in order for the network lock cost to half. - -`sudo_set_lock_reduction_interval`| root - - - -### NetworkMinLockCost - -**`btcli` setter**: none - -**Setter extrinsic**: `sudo_set_network_min_lock_cost` - -**Permissions required to set**: root - -**Description**: - -`NetworkMinLockCost` is the minimum TAO to pay for subnet registration - -### StakeThreshold - - -**Type**: u12 - -**Default**: 1000 - -**`btcli` setter**: none - -**Setter extrinsic**: `sudo_set_stake_threshold` - -**Permissions required to set**: root - -**Description**: - -The minimum stake required for validating. Currently 1000 - -### TxDelegateTakeRateLimit - - -**Type**: u64 - -**Default**: 216000 - -**`btcli` setter**: - -**Setter extrinsic**: - -**Permissions required to set**: root - -**Description**: - -Rate limit of how frequently can a delegate take be increased - - - -### DissolveNetworkScheduleDuration - -Deprecated - -### EmissionValue - -**Description**: - -Deprecated. replaced with SubnetAlphaInEmission, SubnetAlphaOutEmission, and SubnetTaoInEmission. - -### EvmChainId - -**Permissions required to set**: root - -**Description**: - -The Chain ID. `945` for Bittensor mainnet, a.k.a. Finney. - - -### TxRateLimit - - -**Type**: u64 - -**Default**: 1000 - -**`btcli` setter**: none - -**Setter extrinsic**: `sudo_set_tx_rate_limit` - -**Permissions required to set**: root - -**Description**: - -Rate limit for `swap_hotkey` extrinsic. - - -### SubnetOwnerCut - -**`btcli` setter**: none - -**Setter extrinsic**: `sudo_set_subnet_owner_cut` - -**Permissions required to set**: root - -**Description**: - -The ratio of all subnet alpha emissions that is given to subnet owner as stake. (Global, fixed at 18%.) - diff --git a/docs/subnets/understanding-subnets.md b/docs/subnets/understanding-subnets.md deleted file mode 100644 index a7930a1e85..0000000000 --- a/docs/subnets/understanding-subnets.md +++ /dev/null @@ -1,135 +0,0 @@ ---- -title: "Understanding Subnets" ---- - -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Understanding Subnets - -In Bittensor, a subnet is an incentive-based competition marketplace that produces a specific kind of digital commodity related to artificial intelligence. It consists of a community of miners that produce the commodity, and a community of validators that measures the miners' work to ensure its quality. Often, parties that serve as validators do so in order to run applications that make use of the services provided by the miners. - -Emissions of TAO (τ) from Bittensor—are distributed among miners and validators based on their performance within subnets, and based on the relative performance of subnets within Bittensor. - -## Anatomy of a subnet - -The illustration below shows the main components of a subnet: -1. A subnet's [incentive mechanism](../learn/anatomy-of-incentive-mechanism) defines the work that miners must perform, and the work that validators must perform to evaluate the miners' work. The incentive mechanism is unique to the subnet, and maintained off-chain by the subnet creator in the form of a code-repository that defines the interface for miners and validators to participate. For example, see [Subnet 1](https://github.com/macrocosm-os/prompting). -2. **Miners** perform some useful work as defined in the subnet's incentive mechanism. For example, in Subnet 1, miners serve chat prompt completion. -3. **Validators** independently evaluate the task performed by the subnet miners, according to standards defined by the subnet's incentive mechanism. -4. Validators each score the performance of of each miner over the most recent time period. The matrix of these scores, by each validator for each miner, serves as input to **Yuma Consensus**. -5. The Yuma Consensus algorithm operates on-chain, and determines emissions to miners, validators, and subnet creators across the platform, based on performance. - -
- -
- -## Subnet liquidity reserves - -The key mechanism introduced with Dynamic TAO is that each subnet functions as its own automated market marker (AMM), with two liquidity reserves, one containing TAO($$\tau$$)—the currency of the Bittensor network, and one containing a subnet specific "dynamic" currency, referred to as that subnet's alpha ($$\alpha$$) token. The alpha token is purchased by staking TAO into the subnet's reserve, which is initialized with a negligible amount of liquidity (1e-9). - -A subnet's economy therefore consists of three pools of currency: -- **Tao reserves**: the amount of tao ($$\tau$$) that has been staked into the subnet -- **Alpha reserves**: the amount of alpha ($$\alpha$$) available for purchase -- **Alpha outstanding**: the amount of alpha ($$\alpha$$) held in the hotkeys of a subnet's participants, also referred to as the total *stake* in the subnet - -:::tip Terminology: alpha tokens -Each subnet has its own currency with its own name, but in the abstract a given subnet's token is referred to as its $\alpha$ token. With a set of subnets in mind, we refer to $\alpha$ as the token for subnet $\alpha$, $$\beta$$ as the token for subnet $$\beta$$, $$\gamma$$ as the token for subnet $$\gamma$$, and so on. - -These subnet tokens contrast with TAO ($$\tau$$), the token of the Bittensor network as a whole. A subnet pool's reserve ratio (tao/alpha) determines the price of its alpha token. -::: -The *price* of a subnet's alpha token is determined by the ratio of TAO in that subnet's reserve to its alpha in reserve. Alpha currency that is not held in reserve but is which is held in the hotkeys of subnet participants is referred to as *alpha outstanding*. - -Run `btcli subnet list` with the Dynamic TAO-enabled `btcli` to view information about the subnets and their currency reserves on Bittensor testnet. - -```txt - ┃ ┃ Price ┃ Market Cap ┃ ┃ ┃ ┃ ┃ - Netuid ┃ Name ┃ (τ_in/α_in) ┃ (α * Price) ┃ Emission (τ) ┃ P (τ_in, α_in) ┃ Stake (α_out) ┃ Supply (α) ┃ Tempo (k/n) -━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━ - 0 │ τ root │ 1.00 τ/Τ │ τ 5.93m │ τ 0.0000 │ -, - │ Τ 5.93m │ 5.93m Τ /21M │ -/- - 3 │ γ templar │ 0.02 τ/γ │ τ 57.32 │ τ 0.0197 │ τ 31.44, 1.43k γ │ 1.18k γ │ 2.61k γ /21M │ 67/99 - 9 │ ι pretrain │ 0.02 τ/ι │ τ 55.38 │ τ 0.0194 │ τ 30.91, 1.46k ι │ 1.16k ι │ 2.61k ι /21M │ 73/99 - 1 │ α apex │ 0.02 τ/α │ τ 54.45 │ τ 0.0192 │ τ 30.65, 1.47k α │ 1.14k α │ 2.61k α /21M │ 65/99 - 2 │ β omron │ 0.02 τ/β │ τ 54.45 │ τ 0.0192 │ τ 30.65, 1.47k β │ 1.14k β │ 2.61k β /21M │ 66/99 - 4 │ δ targon │ 0.02 τ/δ │ τ 54.45 │ τ 0.0192 │ τ 30.65, 1.47k δ │ 1.14k δ │ 2.61k δ /21M │ 68/99 - ... -``` -See: [Using Dynamic TAO](./index.md#using-dynamic-tao) - -## Price/rate of alpha tokens - -### Ideal price -For each subnet, you'll see that *Price* (listed in the third column) is a function of TAO in reserve `τ_in` over alpha in reserve `α_in` - -$$ -Price = \frac{\tau_{in}}{\alpha_{in}} -$$ - -For example, if for subnet $\varepsilon$, its subnet pool contains TAO reserves of 1000 TAO units and its alpha reserves of 16000 $\varepsilon$ units, then the relative price of the $\varepsilon$ token is: - -$$ -R = \frac{\tau_{in}}{\alpha_{in}} = \frac{1000}{16000} = 0.0625 -$$ - -Hence, -$$ -\text{1 } \varepsilon = 0.0625 \text{ TAO} -$$ - -This exchange rate can change every block when staking or unstaking or emissions occur on this subnet. - -## Emission in Dynamic TAO - -Liquidity is steadily emitted into the Bittensor token economy according to an algorithm intended to foster growth while stabilizing prices and protecting them from manipulation. - -Each block: -- the chain emits TAO and injects it into the TAO reserves of the subnets. - -- the chain emits alpha tokens at twice the base alpha emission rate (which starts at 1 α/block and follows the same halving schedule as TAO). These emitted alpha tokens are allocoated between: - - the subnet's alpha reserve (increasing available liquidity) - - alpha outstanding (incentives for miners, validators, and subnet creators) - -See the main article: [Emission in Dynamic TAO](../emissions.md) - -## Decentralized evaluation of subnets - -The relative value or *weight* of subnets within Bittensor is critically important as it determines emissions to different subnets and their participant miners and validators. Prior to Dynamic TAO, relative weight among subnets within the Bittensor network were determined by Yuma Consensus over the evaluations of the Root Network validators. This gives a fundamentally centralizing role to the holders of Root Network validator keys. - -In Dynamic TAO, the relative weight is determined organically according to the emergent market value of the subnet, as represented by its stabilized token price. TAO-holders can stake TAO into subnets in exchange for the subnet-specific dynamic currency, referred to as the subnet's alpha ($$\alpha$$) token. In this way, stakers 'vote with their TAO' for the value of the subnet, determining the emissions to the validators and miners working in it. In return, stakers extract a share of the subnet's emissions. - -## Subnet Zero - -In Dynamic TAO, Subnet Zero—or *Root Subnet*—is a special subnet. It is the only subnet that does not have its own $\alpha$ currency. No miners can register on subnet zero, and no validation work is performed. However validators can register, and $\tau$-holders can stake to those validators, as with any other subnet. This offers a mechanism for $\tau$-holders to stake $\tau$ into validators in a subnet-agnostic way. This works because the weight of a validator in a subnet includes both their share of that subnet's $\alpha$ and their share of TAO staked into the root subnet. in Subnet Zero. - -Over time, the emissions generated by TAO staked into Subnet Zero will decrease, relative to stake held in the alpha currency of active subnets. See [Note on evolution of Bittensor token economy](../emissions.md#note-on-evolution-of-bittensor-token-economy). - -## Validator stake weight - -A validator's stake weight in a subnet equals their alpha stake plus their TAO stake times the `tao_weight` parameter: - -$$ - -\text{Validator stake weight} = \text{Alpha stake} (\alpha) + \text{TAO stake} (\tau) \times \text{TAO weight} - -$$ -:::tip -A validator's stake weight in Subnet Zero is simply their staked TAO. -::: - -A validator's relative stake weight (their stake weight over the total stake weight) in a subnet determines their voting power when evaluating miners, and determines their share of emissions. - -$$ - -\text{Validator x's relative stake weight} -= \frac{\alpha_x + \tau_x \times w_{\tau}} - {\displaystyle \sum_{v \in \text{validators}} - \bigl(\alpha_v + \tau_v \times w_{\tau}\bigr)} - -$$ diff --git a/docs/subnets/walkthrough-prompting.md b/docs/subnets/walkthrough-prompting.md deleted file mode 100644 index c0e7ff8b2a..0000000000 --- a/docs/subnets/walkthrough-prompting.md +++ /dev/null @@ -1,147 +0,0 @@ ---- -title: "Walkthrough of Subnet 1" ---- - -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Walkthrough of Subnet 1 - -In this section we present a high-level walkthrough of the [Subnet 1: Prompting](https://github.com/opentensor/prompting/tree/main). This subnet contains multiple incentive mechanisms which produce an internet-scale conversational intelligence. Below are a few examples of the intelligence produced by this subnet: - -- Answering questions. -- Summarizing a given text. -- Debugging code. -- Translating languages. -- Solve mathematics problems, and more. - -This subnet is driven by large language models (LLMs). These LLMs search the internet and utilize specialized simulator modules to produce factually accurate and mathematically correct responses. - -:::tip Subnet 1 Explorer -You can see the prompting subnet in action on the [TAO.app explorer (select Subnet 01: Text Prompting from the top menu)](https://tao.app). -::: - -## Before you proceed - -If you are new to Bittensor subnets and building blocks, read the following sections before you proceed further: - -- [Bittensor Building Blocks](../learn/bittensor-building-blocks). -- [Anatomy of Incentive Mechanism](../learn/anatomy-of-incentive-mechanism). - -The below diagram shows a typical subnet with many subnet miners and subnet validators together executing the subnet incentive mechanism code. On the [TAO.app explorer (select Subnet 01: Text Prompting from the top menu)](https://tao.app) the **Metagraph** view for this Subnet 1: Prompting shows the performance details for each subnet miner and validator. - -For easier understanding, in this document we will focus on how a **single** subnet validator interacts with **multiple** subnet miners in this subnet. - -
- -
- -## Subnet 1 summary - -See the below diagram showing a high-level view of how this Prompting subnet works. - -
- -
- -The numbered items in the below description correspond to the numbered sections in the above diagram: - -1. The subnet validator sends a **challenge** simultaneously to multiple subnet miners. This step constitutes the **prompt** from the subnet validator to subnet miners. A challenge is a prompt sent to subnet miners in such a way that: - - This prompt is in a style and tone that is similar to humans. This is so that subnet miners become adept at handling "fuzzy" instructions with ambiguity. This is required in order to excel at understanding user needs. - - This prompt drives the conversation between the subnet validator and the subnet miners in order to reach a pre-defined goal. - - See the below [Challenge generation](#challenge-generation) section for how a challenge is generated. -2. The subnet miners respond to the subnet validator after performing the challenge **task**. Most tasks require subnet miners to make use of APIs or tools to perform well. -3. The subnet validator then **scores** each subnet miner by comparing the subnet miner's response with a locally generated **reference** answer. The subnet validator uses this reference as the ground truth for this step. The reference is generated using data from APIs and tools to ensure factual correctness and to provide citations. -4. Finally, the subnet validator **sets the weights** for the subnet miners by sending the weights to the blockchain. In the Bittensor blockchain the Yuma Consensus allocates emissions to the participating subnet miners and subnet validators. - -:::tip Use of large language models -In this subnet both the subnet validator and the subnet miners use large language models (LLMs) to create the challenges (subnet validator) and respond to the prompts (subnet miners). -::: - -## Challenge generation - -
- -
- -The challenge generation works like this (see the above diagram): - -- The subnet validator generates a **prompt** consisting of a clearly stated question or a task description, for a given task type. -- The subnet validator also generates one or more **reference** answers to the above prompt. The subnet validator also provides the context to generate this reference answer. -- A requirement for this prompting subnet is that the entire conversation should be human-like. To accomplish this, the subnet validator takes on a human persona and wraps the above prompt in the persona's style and tone. The introduction of such random persona's style and tone creates a lossy, corrupted, version of the original clear instruction. This corrupted prompt is called a **challenge**. -- The subnet validator prompts the subnet miners with this challenge. Note that the **reference** is not sent to the subnet miners. - -## Score the subnet miner responses - -The responses from the subnet miners are compared to the reference answers by the subnet validator. The closer a subnet miner's response is to the reference answer, the higher is the subnet miner's score. - -:::tip Measuring subnet miner's response -This Prompting Subnet 1 presently uses a combination of string literal similarity and semantic similarity as the basis for measuring the closeness of a subnet miner's response to the reference answer. -::: - -## Key innovations in this subnet - -This subnet has developed a few innovative techniques to get to a real human-like conversational AI that actually produces intelligence instead of copying from the internet. Refer to the diagram in the above [Challenge generation](#challenge-generation) section: - -### Achieving human-like conversation - -To deliver to a user of this subnet an experience of a human-like conversation: - -- Subnet validators perform a roleplay where they take on the persona of **random** human users before they prompt the subnet miners. There are several tangible benefits to this role playing flow, such as: - - Subnet validators can engage the subnet miners in a real, random, human-like conversation throughout the subnet operation. - - Subnet miners become adept at handling ambiguous instructions. - - This generates, as a byproduct, interesting synthetic datasets that can be used to finetune other LLMs. -- Subnet miners are required to produce completions that are as close as possible to the reference. To accomplish this a subnet miner must: - - Extract clear instruction from the lossy challenge. - - Find the appropriate context, for example, using Wikipedia. - - Generate a completion that matches the tone and style of the reference. -- This means that throughout the subnet validation process the subnet miners become better and better at handling ambiguous, "fuzzy" instructions. -- A subnet validator could increase the corruption of the instruction to increase the difficulty of the tasks. -- To change the subnet miner completions, a subnet validator may modify the style and tone of the reference answers or change the scoring function, or both. - - -:::tip Class HumanAgent -See [class HumanAgent](https://github.com/opentensor/prompting/blob/main/prompting/agent.py#L30). -::: - -### Prevent subnet miners from looking up the answers - -To prevent the subnet miners from simply looking up the answers on the internet, this subnet incorporates a novel approach—it introduces fuzziness into the prompt and requires that the subnet miners use semantic intelligence to understand the instructions contained in the prompt. - -### Evolve subnet as a mixture of experts (MoE) - -The subnet validator composes a challenge based on whether the task is answering questions, summarizing a given text, debugging code, solve mathematics problems, and so on. The motivation behind using multiple tasks is several fold: - -- Using multiple tasks in the prompts continuously benchmarks the capabilities of the subnet miners across a broad range of tasks that are challenging but are still common use-cases. -- Using multiple tasks, prompts can be routed to specialized subnet miners, thereby providing an effective mixture of experts system. -- This approach also serves as a precursor to Bittensor's inter-subnet bridging mechanism that will enable Subnet 1 to interact with other subnets and access the useful work provided by these subnets. -- Finally, the subnet miners in this subnet must become adept at using tools and APIs in order to fulfill validation tasks. We are building an API layer for inter-subnet communication, which is a natural extension of 'agentic' models. - -:::tip Continuously improving performance -One objective of this subnet is to achieve full coverage of the distributions across different personas (representing different users), and different tasks (representing different use-cases). See the arXiv paper [Super-Natural Instructions](https://arxiv.org/abs/2204.07705) [(PDF)](https://arxiv.org/pdf/2204.07705.pdf). - -::: - - diff --git a/docs/subnets/working-with-subnets.md b/docs/subnets/working-with-subnets.md deleted file mode 100644 index 761a6114b8..0000000000 --- a/docs/subnets/working-with-subnets.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: "Working with Subnets" ---- - -# Working with Subnets - -Subnets are composed of a discrete number of UIDs. The subnet validators and subnet miners are associated with these UIDs. Each UID in the subnet belongs to a unique [hotkey](../getting-started/wallets.md#coldkey-and-hotkey) which in turn is connected to a unique **coldkey** which was used during registration. The Yuma Consensus runs on these UIDs. This section presents a few examples showing how to work with subnets. - -Transfer is transfer from cold to cold -Registration takes tao from cold -Hotkey Tao movement is only stake add and remove and it’s loaded by emissions while mining -Root delegation/undelegation is hotkey Tao movement to a strangers hotkey and it’s loaded by the activities of the strangers emission validation activities - -## Viewing subnetworks - -Show all currently running subnets on Bittensor: - -```bash -btcli subnets list -``` - -## Viewing state - -To display fine-grained information about each subnetwork use [bt.metagraph](pathname:///python-api/html/autoapi/bittensor/core/metagraph/index.html): - -```python -import bittensor as bt -subnet = bt.metagraph( netuid = 1 ) # Get the current state. -assert subnet.netuid == 1 -subnet.sync( block = 101010 ) # Sync the state with a particular block. -assert subnet.block == 101010 -``` - -## Verifying UIDs - -```python -import bittensor as bt -subnet = bt.metagraph( netuid = 1 ) -assert subnet.uids.tolist() == [ 0, 1, 2, ... 1022, 1023 ] -``` - -## Extracting UID information - - -```python -import bittensor as bt -subnet = bt.metagraph( netuid = 1 ) -uid = 123 -print ('uid', uid, ' owned by hotkey:', subnet.hotkeys[ uid ], 'associated with coldkey': subnet.coldkey[ uid ] ) -``` - -## Viewing parameters - -The below code prints stake `S` on the subnet and the weights `W` set by the subnet validators in the subnet. - -```python numbered dark -import bittensor as bt -subnet = bt.metagraph( netuid = 1, lite = False) -print ('subnet 1 validator stake', subnet.S ) -print ('subnet 1 validator weights', subnet.W ) -``` - -## Viewing dividends - -The below code prints the subnet validator dividends, `D`. - -```python -import bittensor as bt -subnet = bt.metagraph( netuid = 1 ) -print ('subnet 1 validator dividends', subnet.D ) -``` diff --git a/docs/subtensor-nodes/index.md b/docs/subtensor-nodes/index.md deleted file mode 100644 index d8db06b965..0000000000 --- a/docs/subtensor-nodes/index.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: "Subtensor Node Basics" ---- -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Subtensor Node Basics - -You can run a public subtensor node and synchronize with the Bittensor network. This public subtensor node can be either a **lite node** or an **archive node**. You can connect and sync this public subtensor node with either the Bittensor mainchain or the testchain. This document describes how to run a public subtensor node either by compiling the subtensor source code into a binary and executing this binary, or by using a Docker container. - -## A public subtensor vs a local blockchain - -Note that running a public subtensor node is not the same as running a local blockchain. See the below diagram. When you run a local blockchain (section **A** of the below diagram), it is for the purposes of developing and testing your subnet incentive mechanism. This local blockchain is not public and hence it is isolated from any Bittensor network. For instructions on running a local blockchain see [Running on Staging](https://github.com/opentensor/bittensor-subnet-template/blob/main/docs/running_on_staging.md). - -:::tip Running a local blockchain is the same as running on staging -::: - -
- -
- -## Lite node vs archive node - -A public subtensor node refers to an internet-connected computer that is synchronized with the Bittensor blockchain database. A **lite node** or an **archive node** is a type of public subtensor node. - -:::tip a subtensor node is not a neuron -A subtensor node is different from a Bittensor neuron. A Bittensor neuron is either a subnet validator node or a subnet miner node—it exists in a subnet, and it does not contain blockchain database. -::: - -Normally, a node in Bittensor blockchain must always be synchronized to the latest blockchain ledger state. Such a blockchain node accomplishes this by holding a copy of the entire Bittensor blockchain database, from the genesis block all the way to the current block. However, holding an entire copy of blockchain ledger state, which is continuously increasing in size, can be expensive. Hence, two types of nodes, a lite node and an archive node, are defined for subtensor, as below: - -### Lite node - -A **lite node** is configured to perform warp synchronization, which primarily syncs with the blocks that have been finalized, and not the entire blockchain. - -:::tip flags for lite node -Use `--sync=warp` when starting a subtensor node. See [Using Source Code](./using-source.md#run-the-subtensor-node). -::: - -The lite node warps (jumps) directly to the latest finalized block, downloading the complete blockchain state at that point. The purpose of a lite node is to get up and running quickly and serve, with minimal storage requirements, as a local entry point into the Bittensor mainchain or testchain. - - **Verification of chain history**: To ensure blockchain validity, a lite node downloads and verifies finality proofs all the way back to the genesis block (the first block). These proofs confirm the legitimacy of the chain's history without processing every single block. - - **Background fill**: The lite node, while actively participating in the network, still downloads and processes historical blocks in the background to build the complete blockchain database. This download happens when the node is less busy. - - :::tip lite node for a subnet miner - A subnet miner should use a local lite node to communicate with the Bittensor blockchain. - ::: - -### Archive node - -On the other hand, an **archive node** downloads and validates all the Bittensor blockchain blocks from genesis up to the most recent block. - -:::tip flags for archive node -Use `--sync=full` and `--pruning archive` when starting a subtensor node. See [Using Source Code](./using-source.md#run-the-subtensor-node). -::: - -The full synchronization performed by an archive node can be significantly slower than warp sync (done by a lite node) as it involves processing every block. Also, archive nodes require substantially more storage space due to the complete historical data. - - :::tip archive node for a blockchain explorer - Applications such as Bittensor blockchain explorer, for example, [TAO.app](https://tao.app) that require access to historical blockchain data use an archive node. - ::: - - - -## Query archived data - -We recommend that you use archive public subtensor node to retrieve blockchain data older than the previous 300 blocks. See the below example: - -For example, to sync with a specific block number `12345` that is older than the 300 blocks: - -```python -import bittensor as bt -meta = bt.subtensor('archive').metagraph(netuid=18, block=12345) -print(meta) -``` - -:::tip See also -Also see the [`metagraph` API reference](https://docs.bittensor.com/python-api/html/autoapi/bittensor/metagraph/index.html#bittensor.metagraph.metagraph.sync). -::: - - diff --git a/docs/subtensor-nodes/subtensor-node-requirements.md b/docs/subtensor-nodes/subtensor-node-requirements.md deleted file mode 100644 index 22f9e5b0d0..0000000000 --- a/docs/subtensor-nodes/subtensor-node-requirements.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: "Subtensor Node Requirements" ---- -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Subtensor Node Requirements - -To run a public subtensor, make sure that your computer satisfies the following system requirements: - -- Currently only x86_64 Linux architecture and macOS arm64 (Apple Silicon) are supported. -- Subtensor requires 4 CPU cores and 16GB RAM to run. More resources may be required based on utilization. - -## Linux x86_64 - -Requirements: - -- Linux kernel 2.6.32+. -- glibc 2.11+. - -## macOS arm64 (Apple Silicon) - -Requirements: - -- macOS 11+ (Big Sur+) for Apple Silicon (M1, M2, and later) with arm64 architecture support. - -## Storage requirements - -- **Lite node**: 128 GB is sufficient. -- **Archive node**: Minimum 2 TB for the current size of the chain, as of block # 5029000 on 28 Feb 2025. - - -## Network requirements and port settings - -After you install the subtensor as per the below instructions, make sure that you open network ports on your subtensor node. This will allow other peer subtensor nodes to connect to your subtensor node. - -- Your subtensor node must have access to the public internet. -- Your subtensor node runs in an IPv4 network. - -### Port settings - -Make sure that your subtensor node listens on the following ports: - -- `9944` - Websocket. This port is used by Bittensor. This port only accepts connections from ``localhost``. Make sure this port is firewalled **off** from the public internet domain. -- `9933` - RPC. This port should be opened but it is not used. -- `30333` - p2p socket. This port should accept connections from other subtensor nodes on the internet. Make sure your firewall **allows** incoming traffic to this port. -- We assume that your default outgoing traffic policy is `ACCEPT`. If not, make sure that outbound traffic on port 30333 is allowed. - diff --git a/docs/subtensor-nodes/subtensor-rate-limits.md b/docs/subtensor-nodes/subtensor-rate-limits.md deleted file mode 100644 index e80734e3fb..0000000000 --- a/docs/subtensor-nodes/subtensor-rate-limits.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: "Subtensor Rate Limits" ---- - -# Subtensor Rate Limits - -We strongly encourage you to run your own local lite node. If you must query an OTF-provided lite node, then the following rate limits apply: - -- Any OTF-provided lite node will rate limit the requests to one request per second, per IP address. Note that this rate limit may change dynamically based on the network or application requirements. -- A request can be either WS/WSS or HTTP/HTTPS. -- If you exceed the rate limit, you will receive 429 error code. You will then have to wait until the rate limit window has expired. -- You can avoid OTF-lite node rate limits by running your own local lite node. You can run a lite node either [Using Docker](./using-docker.md#run-a-lite-node-on-mainchain) or [Using Source](./using-source.md#lite-node-on-mainchain). diff --git a/docs/subtensor-nodes/subtensor-storage-query-examples.md b/docs/subtensor-nodes/subtensor-storage-query-examples.md deleted file mode 100644 index cdb8985a80..0000000000 --- a/docs/subtensor-nodes/subtensor-storage-query-examples.md +++ /dev/null @@ -1,2364 +0,0 @@ ---- -title: "Subtensor Storage Query Examples" ---- - -# Subtensor Storage Query Examples - -## 1. ActivityCutoff - -- **Description**: Activity cutoff for networks. -- **Query Type**: `u16 -> u16` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `5000` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'ActivityCutoff', [netuid]) - print(result.value) - ``` - -## 2. AdjustmentAlpha - -- **Description**: Alpha adjustment value for the network. -- **Query Type**: `u16 -> u64` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'AdjustmentAlpha', [netuid]) - print(result.value) - ``` - -## 3. AdjustmentInterval - -- **Description**: Adjustment interval for networks. -- **Query Type**: `u16 -> u16` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `100` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'AdjustmentInterval', [netuid]) - print(result.value) - ``` - -## 4. AlphaDividendsPerSubnet - -- **Description**: Last total alpha dividend for a hotkey on a subnet. -- **Query Type**: `(u16, AccountId) -> u64` -- **Parameters**: - - `netuid`: `u16` - - `hotkey`: `AccountId` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface, Keypair - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - hotkey = Keypair.create_from_uri('//Alice').ss58_address - result = substrate.query('SubtensorModule', 'AlphaDividendsPerSubnet', [netuid, hotkey]) - print(result.value) - ``` - -## 5. AlphaValues - -- **Description**: Alpha values for the network (lower and upper alpha). -- **Query Type**: `u16 -> (u16, u16)` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `(45875, 58982)` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'AlphaValues', [netuid]) - print(result.value) - ``` - -## 6. AvgTempo - -- **Description**: Global average tempo. -- **Query Type**: `u16` -- **Default Value**: `30` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'AvgTempo') - print(result.value) - ``` - -## 7. Axons - -- **Description**: Axon information for a given hotkey within a network. -- **Query Type**: `(u16, AccountId) -> AxonInfoOf` -- **Parameters**: - - `netuid`: `u16` - - `hotkey`: `AccountId` -- **Default Value**: `None` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface, Keypair - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - hotkey = Keypair.create_from_uri('//Alice').ss58_address - result = substrate.query('SubtensorModule', 'Axons', [netuid, hotkey]) - print(result.value) - ``` - -## 8. BlockAtRegistration - -- **Description**: Block number at registration for a given UID. -- **Query Type**: `(u16, u16) -> u64` -- **Parameters**: - - `netuid`: `u16` - - `uid`: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - uid = 123 - result = substrate.query('SubtensorModule', 'BlockAtRegistration', [netuid, uid]) - print(result.value) - ``` - -## 9. BlockEmission - -- **Description**: The total block emission value. -- **Query Type**: `u64` -- **Default Value**: `1000000000` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'BlockEmission') - print(result.value) - ``` - -## 10. BlocksSinceLastStep - -- **Description**: Number of blocks since the last mechanism step. -- **Query Type**: `u16 -> u64` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'BlocksSinceLastStep', [netuid]) - print(result.value) - ``` - -## 11. Bonds - -- **Description**: Bond values of UIDs in a network. -- **Query Type**: `(u16, u16) -> Vec<(u16, u16)>` -- **Parameters**: - - `netuid`: `u16` - - `uid`: `u16` -- **Default Value**: `[]` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - uid = 123 - result = substrate.query('SubtensorModule', 'Bonds', [netuid, uid]) - print(result.value) - ``` - -## 12. BondsMovingAverage - -- **Description**: Moving average of bonds in the network. -- **Query Type**: `u16 -> u64` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `900000` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'BondsMovingAverage', [netuid]) - print(result.value) - ``` - -## 13. BondsPenalty - -- **Description**: Bonds penalty setting for a subnet. -- **Query Type**: `u16 -> u16` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'BondsPenalty', [netuid]) - print(result.value) - ``` - -## 14. Burn - -- **Description**: Burn value for a given network. -- **Query Type**: `u16 -> u64` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `1000000000` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'Burn', [netuid]) - print(result.value) - ``` - -## 15. BurnRegistrationsThisInterval - -- **Description**: Number of burn registrations in this interval. -- **Query Type**: `u16 -> u16` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'BurnRegistrationsThisInterval', [netuid]) - print(result.value) - ``` - -## 16. ChildkeyTake - -- **Description**: Returns the childkey take for a given hotkey on a specific subnet. -- **Query Type**: `(AccountId, u16) -> u16` -- **Parameters**: - - `hotkey`: `AccountId` - - `netuid`: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface, Keypair - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - hotkey = Keypair.create_from_uri('//Alice').ss58_address - netuid = 1 - result = substrate.query('SubtensorModule', 'ChildkeyTake', [hotkey, netuid]) - print(result.value) - ``` - -## 17. ChildKeys - -- **Description**: Maps parent keys to child keys with proportions. -- **Query Type**: `(AccountId, u16) -> Vec<(u64, AccountId)>` -- **Parameters**: - - `parent`: `AccountId` - - `netuid`: `u16` -- **Default Value**: `[]` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface, Keypair - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - parent = Keypair.create_from_uri('//Alice').ss58_address - netuid = 1 - result = substrate.query('SubtensorModule', 'ChildKeys', [parent, netuid]) - print(result.value) - ``` - -## 18. ColdkeySwapScheduleDuration - -- **Description**: The block duration for which a coldkey swap schedule must wait before execution. -- **Query Type**: `u32` -- **Default Value**: `36000` (approx. 5 days at 12s blocks) -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'ColdkeySwapScheduleDuration') - print(result.value) - ``` - -## 19. CommitRevealWeightsEnabled - -- **Description**: Indicates whether the commit-reveal process for weights is enabled for a given network. -- **Query Type**: `u16 -> bool` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `false` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'CommitRevealWeightsEnabled', [netuid]) - print(result.value) - ``` - -## 20. Consensus - -- **Description**: Consensus values of UIDs in a network. -- **Query Type**: `u16 -> Vec` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `[]` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'Consensus', [netuid]) - print(result.value) - ``` - -## 21. CRV3WeightCommits - -- **Description**: Stores a queue of v3 commits for an account on a given netuid and epoch. -- **Query Type**: `(u16, u64) -> VecDeque<(AccountId, Vec, u64)>` -- **Parameters**: - - `netuid`: `u16` - - `commit_epoch`: `u64` -- **Default Value**: `[]` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - commit_epoch = 100 - result = substrate.query('SubtensorModule', 'CRV3WeightCommits', [netuid, commit_epoch]) - print(result.value) - ``` - -## 22. Delegates - -- **Description**: Returns the hotkey delegation take, signaling that this key is open for delegation. -- **Query Type**: `AccountId -> u16` -- **Parameters**: - - `hotkey`: `AccountId` -- **Default Value**: `11796` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface, Keypair - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - hotkey = Keypair.create_from_uri('//Alice').ss58_address - result = substrate.query('SubtensorModule', 'Delegates', [hotkey]) - print(result.value) - ``` - -## 23. Difficulty - -- **Description**: Difficulty parameter for a given network. -- **Query Type**: `u16 -> u64` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `10000000` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'Difficulty', [netuid]) - print(result.value) - ``` - -## 24. DissolveNetworkScheduleDuration - -- **Description**: The block duration required before a network dissolve schedule executes. -- **Query Type**: `u32` -- **Default Value**: `36000` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'DissolveNetworkScheduleDuration') - print(result.value) - ``` - -## 25. Dividends - -- **Description**: Dividend values of UIDs in a network. -- **Query Type**: `u16 -> Vec` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `[]` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'Dividends', [netuid]) - print(result.value) - ``` - -## 26. DynamicBlock - -- **Description**: Block number when the dynamic logic was enabled. -- **Query Type**: `u64` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'DynamicBlock') - print(result.value) - ``` - -## 27. Emission - -- **Description**: Emission values of UIDs in a network. -- **Query Type**: `u16 -> Vec` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `[]` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'Emission', [netuid]) - print(result.value) - ``` - -## 28. EmissionValues - -- **Description**: Emission values of the network. -- **Query Type**: `u16 -> u64` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'EmissionValues', [netuid]) - print(result.value) - ``` - -## 29. HasMigrationRun - -- **Description**: Storage for migration run status. -- **Query Type**: `Vec -> bool` -- **Parameters**: - - `key`: `Vec` -- **Default Value**: `false` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - key = b"migrate_identities" - result = substrate.query('SubtensorModule', 'HasMigrationRun', [key]) - print(result.value) - ``` - -## 30. IdentitiesV2 - -- **Description**: Identity information for a given coldkey (v2 format). -- **Query Type**: `AccountId -> ChainIdentityOfV2` -- **Parameters**: - - `coldkey`: `AccountId` -- **Default Value**: `None` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface, Keypair - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - coldkey = Keypair.create_from_uri('//Charlie').ss58_address - result = substrate.query('SubtensorModule', 'IdentitiesV2', [coldkey]) - print(result.value) - ``` - -## 31. ImmunityPeriod - -- **Description**: Immunity period for networks. -- **Query Type**: `u16 -> u16` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `4096` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'ImmunityPeriod', [netuid]) - print(result.value) - ``` - -## 32. Incentive - -- **Description**: Incentive values of UIDs in a network. -- **Query Type**: `u16 -> Vec` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `[]` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'Incentive', [netuid]) - print(result.value) - ``` - -## 33. IsNetworkMember - -- **Description**: Whether a hotkey is a member of a network. -- **Query Type**: `(AccountId, u16) -> bool` -- **Parameters**: - - `hotkey`: `AccountId` - - `netuid`: `u16` -- **Default Value**: `false` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface, Keypair - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - hotkey = Keypair.create_from_uri('//Alice').ss58_address - netuid = 1 - result = substrate.query('SubtensorModule', 'IsNetworkMember', [hotkey, netuid]) - print(result.value) - ``` - -## 34. Kappa - -- **Description**: Kappa parameter of the network. -- **Query Type**: `u16 -> u16` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `32767` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'Kappa', [netuid]) - print(result.value) - ``` - -## 35. Keys - -- **Description**: Maps UID to hotkey within a network. -- **Query Type**: `(u16, u16) -> AccountId` -- **Parameters**: - - `netuid`: `u16` - - `uid`: `u16` -- **Default Value**: `AccountId` derived from trailing zeroes -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - uid = 123 - result = substrate.query('SubtensorModule', 'Keys', [netuid, uid]) - print(result.value) - ``` - -## 36. LastAddStakeIncrease - -- **Description**: Last block number when stake was increased for a hotkey-coldkey pair. -- **Query Type**: `(AccountId, AccountId) -> u64` -- **Parameters**: - - `hotkey`: `AccountId` - - `coldkey`: `AccountId` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface, Keypair - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - hotkey = Keypair.create_from_uri('//Alice').ss58_address - coldkey = Keypair.create_from_uri('//Bob').ss58_address - result = substrate.query('SubtensorModule', 'LastAddStakeIncrease', [hotkey, coldkey]) - print(result.value) - ``` - -## 37. LastAdjustmentBlock - -- **Description**: Block number of the last adjustment for a given network. -- **Query Type**: `u16 -> u64` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'LastAdjustmentBlock', [netuid]) - print(result.value) - ``` - -## 38. LastColdkeyHotkeyStakeBlock - -- **Description**: Last block at which stake was added/removed for a coldkey-hotkey pair. -- **Query Type**: `(AccountId, AccountId) -> u64` -- **Parameters**: - - `coldkey`: `AccountId` - - `hotkey`: `AccountId` -- **Default Value**: `None` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface, Keypair - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - coldkey = Keypair.create_from_uri('//Alice').ss58_address - hotkey = Keypair.create_from_uri('//Bob').ss58_address - result = substrate.query('SubtensorModule', 'LastColdkeyHotkeyStakeBlock', [coldkey, hotkey]) - print(result.value) - ``` - -## 39. LastHotkeyColdkeyEmissionOnNetuid - -- **Description**: Last emission block for a hotkey-coldkey pair on a given netuid. -- **Query Type**: `(AccountId, AccountId, u16) -> u64` -- **Parameters**: - - `hotkey`: `AccountId` - - `coldkey`: `AccountId` - - `netuid`: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface, Keypair - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - hotkey = Keypair.create_from_uri('//Alice').ss58_address - coldkey = Keypair.create_from_uri('//Bob').ss58_address - netuid = 1 - result = substrate.query('SubtensorModule', 'LastHotkeyColdkeyEmissionOnNetuid', [hotkey, coldkey, netuid]) - print(result.value) - ``` - -## 40. LastHotkeyEmissionDrain - -- **Description**: Last block we drained this hotkey's emission. -- **Query Type**: `AccountId -> u64` -- **Parameters**: - - `hotkey`: `AccountId` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface, Keypair - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - hotkey = Keypair.create_from_uri('//Alice').ss58_address - result = substrate.query('SubtensorModule', 'LastHotkeyEmissionDrain', [hotkey]) - print(result.value) - ``` - -## 41. LastHotkeyEmissionOnNetuid - -- **Description**: Last emission block for a hotkey on a given netuid. -- **Query Type**: `(AccountId, u16) -> u64` -- **Parameters**: - - `hotkey`: `AccountId` - - `netuid`: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface, Keypair - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - hotkey = Keypair.create_from_uri('//Alice').ss58_address - netuid = 1 - result = substrate.query('SubtensorModule', 'LastHotkeyEmissionOnNetuid', [hotkey, netuid]) - print(result.value) - ``` - -## 42. LastMechansimStepBlock - -- **Description**: Last block when the mechanism step was performed. -- **Query Type**: `u16 -> u64` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'LastMechansimStepBlock', [netuid]) - print(result.value) - ``` - -## 43. LastTxBlock - -- **Description**: Last block for a transaction key. -- **Query Type**: `AccountId -> u64` -- **Parameters**: - - `key`: `AccountId` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface, Keypair - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - key = Keypair.create_from_uri('//Alice').ss58_address - result = substrate.query('SubtensorModule', 'LastTxBlock', [key]) - print(result.value) - ``` - -## 44. LastTxBlockChildKeyTake - -- **Description**: Last block for a childkey take transaction. -- **Query Type**: `AccountId -> u64` -- **Parameters**: - - `key`: `AccountId` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface, Keypair - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - key = Keypair.create_from_uri('//Alice').ss58_address - result = substrate.query('SubtensorModule', 'LastTxBlockChildKeyTake', [key]) - print(result.value) - ``` - -## 45. LastTxBlockDelegateTake - -- **Description**: Last block for a delegate take transaction key. -- **Query Type**: `AccountId -> u64` -- **Parameters**: - - `key`: `AccountId` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface, Keypair - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - key = Keypair.create_from_uri('//Alice').ss58_address - result = substrate.query('SubtensorModule', 'LastTxBlockDelegateTake', [key]) - print(result.value) - ``` - -## 46. LastUpdate - -- **Description**: Last update values of UIDs in a network. -- **Query Type**: `u16 -> Vec` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `[]` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'LastUpdate', [netuid]) - print(result.value) - ``` - -## 47. LiquidAlphaOn - -- **Description**: Whether Liquid Alpha is enabled. -- **Query Type**: `u16 -> bool` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `false` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'LiquidAlphaOn', [netuid]) - print(result.value) - ``` - -## 48. LoadedEmission - -- **Description**: Emission data loaded for a network. -- **Query Type**: `u16 -> Vec<(AccountId, u64, u64)>` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `None` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'LoadedEmission', [netuid]) - print(result.value) - ``` - -## 49. MaxAllowedUids - -- **Description**: Maximum allowed UIDs for networks. -- **Query Type**: `u16 -> u16` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `4096` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'MaxAllowedUids', [netuid]) - print(result.value) - ``` - -## 50. MaxAllowedValidators - -- **Description**: Maximum allowed validators for networks. -- **Query Type**: `u16 -> u16` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `128` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'MaxAllowedValidators', [netuid]) - print(result.value) - ``` - -## 51. MaxBurn - -- **Description**: Maximum burn value for a given network. -- **Query Type**: `u16 -> u64` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `100000000000` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'MaxBurn', [netuid]) - print(result.value) - ``` - -## 52. MaxChildkeyTake - -- **Description**: Maximum childkey take (percentage * 65535) for child-keys. -- **Query Type**: `u16` -- **Default Value**: `11796` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'MaxChildkeyTake') - print(result.value) - ``` - -## 53. MaxDelegateTake - -- **Description**: Maximum delegate take (percentage * 65535) for delegations. -- **Query Type**: `u16` -- **Default Value**: `11796` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'MaxDelegateTake') - print(result.value) - ``` - -## 54. MaxDifficulty - -- **Description**: Maximum difficulty parameter for a given network. -- **Query Type**: `u16 -> u64` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `u64::MAX / 4` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'MaxDifficulty', [netuid]) - print(result.value) - ``` - -## 55. MaxRegistrationsPerBlock - -- **Description**: Maximum registrations allowed per block. -- **Query Type**: `u16 -> u16` -- **Parameters**: - - `block`: `u16` -- **Default Value**: `1` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - block = 100 - result = substrate.query('SubtensorModule', 'MaxRegistrationsPerBlock', [block]) - print(result.value) - ``` - -## 56. MaxTempo - -- **Description**: Global maximum tempo. -- **Query Type**: `u16` -- **Default Value**: `30` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'MaxTempo') - print(result.value) - ``` - -## 57. MaxWeightsLimit - -- **Description**: Maximum weight limit for networks. -- **Query Type**: `u16 -> u16` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `1000` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'MaxWeightsLimit', [netuid]) - print(result.value) - ``` - -## 58. MinAllowedWeights - -- **Description**: Minimum allowed weights for networks. -- **Query Type**: `u16 -> u16` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `1024` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'MinAllowedWeights', [netuid]) - print(result.value) - ``` - -## 59. MinBurn - -- **Description**: Minimum burn value for a given network. -- **Query Type**: `u16 -> u64` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `1000000000` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'MinBurn', [netuid]) - print(result.value) - ``` - -## 60. MinChildkeyTake - -- **Description**: Minimum childkey take (percentage * 65535) for child-keys. -- **Query Type**: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'MinChildkeyTake') - print(result.value) - ``` - -## 61. MinDelegateTake - -- **Description**: Minimum delegate take (percentage * 65535) for delegations. -- **Query Type**: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'MinDelegateTake') - print(result.value) - ``` - -## 62. MinDifficulty - -- **Description**: Minimum difficulty parameter for a given network. -- **Query Type**: `u16 -> u64` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `10000000` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'MinDifficulty', [netuid]) - print(result.value) - ``` - -## 63. MinStake - -- **Description**: Minimum stake requirement (global). -- **Query Type**: `u64` -- **Default Value**: `500000` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'MinStake') - print(result.value) - ``` - -## 64. NetworkImmunityPeriod - -- **Description**: Immunity period for networks (global). -- **Query Type**: `u64` -- **Default Value**: `50400` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'NetworkImmunityPeriod') - print(result.value) - ``` - -## 65. NetworkLastLockCost - -- **Description**: Last lock cost for networks. -- **Query Type**: `u64` -- **Default Value**: `1000000000000` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'NetworkLastLockCost') - print(result.value) - ``` - -## 66. NetworkLastRegistered - -- **Description**: Last registered block number for networks. -- **Query Type**: `u64` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'NetworkLastRegistered') - print(result.value) - ``` - -## 67. NetworkLockReductionInterval - -- **Description**: Lock reduction interval for networks. -- **Query Type**: `u64` -- **Default Value**: `100800` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'NetworkLockReductionInterval') - print(result.value) - ``` - -## 68. NetworkMaxStake - -- **Description**: Max stake allowed on a subnet. -- **Query Type**: `u16 -> u64` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `18446744073709551615` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'NetworkMaxStake', [netuid]) - print(result.value) - ``` - -## 69. NetworkMinAllowedUids - -- **Description**: Minimum allowed UIDs for networks (global). -- **Query Type**: `u16` -- **Default Value**: `128` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'NetworkMinAllowedUids') - print(result.value) - ``` - -## 70. NetworkMinLockCost - -- **Description**: Minimum lock cost for networks. -- **Query Type**: `u64` -- **Default Value**: `1000000000000` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'NetworkMinLockCost') - print(result.value) - ``` - -## 71. NetworkModality - -- **Description**: Modality of the network (0: TEXT, 1: IMAGE, 2: TENSOR). -- **Query Type**: `u16 -> u16` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'NetworkModality', [netuid]) - print(result.value) - ``` - -## 72. NetworkPowRegistrationAllowed - -- **Description**: Whether PoW registration is allowed in the network. -- **Query Type**: `u16 -> bool` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `false` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'NetworkPowRegistrationAllowed', [netuid]) - print(result.value) - ``` - -## 73. NetworkRateLimit - -- **Description**: Network rate limit. -- **Query Type**: `u64` -- **Default Value**: `7200` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'NetworkRateLimit') - print(result.value) - ``` - -## 74. NetworkRegisteredAt - -- **Description**: Block number when the network was registered. -- **Query Type**: `u16 -> u64` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'NetworkRegisteredAt', [netuid]) - print(result.value) - ``` - -## 75. NetworkRegistrationAllowed - -- **Description**: Whether registration is allowed in the network. -- **Query Type**: `u16 -> bool` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `false` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'NetworkRegistrationAllowed', [netuid]) - print(result.value) - ``` - -## 76. NetworksAdded - -- **Description**: Whether the network has been added. -- **Query Type**: `u16 -> bool` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `false` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'NetworksAdded', [netuid]) - print(result.value) - ``` - -## 77. NeuronsToPruneAtNextEpoch - -- **Description**: UIDs of neurons to be pruned at the next epoch. -- **Query Type**: `u16 -> u16` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'NeuronsToPruneAtNextEpoch', [netuid]) - print(result.value) - ``` - -## 78. NominatorMinRequiredStake - -- **Description**: Minimum required stake for nominators. -- **Query Type**: `u64` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'NominatorMinRequiredStake') - print(result.value) - ``` - -## 79. Owner - -- **Description**: Returns the controlling coldkey for a hotkey. -- **Query Type**: `AccountId -> AccountId` -- **Parameters**: - - `hotkey`: `AccountId` -- **Default Value**: `AccountId` derived from trailing zeroes -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface, Keypair - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - hotkey = Keypair.create_from_uri('//Alice').ss58_address - result = substrate.query('SubtensorModule', 'Owner', [hotkey]) - print(result.value) - ``` - -## 80. OwnedHotkeys - -- **Description**: Returns the vector of hotkeys controlled by this coldkey. -- **Query Type**: `AccountId -> Vec` -- **Parameters**: - - `coldkey`: `AccountId` -- **Default Value**: `[]` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface, Keypair - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - coldkey = Keypair.create_from_uri('//Bob').ss58_address - result = substrate.query('SubtensorModule', 'OwnedHotkeys', [coldkey]) - print(result.value) - ``` - -## 81. ParentKeys - -- **Description**: Maps child keys to parent keys with proportions. -- **Query Type**: `(AccountId, u16) -> Vec<(u64, AccountId)>` -- **Parameters**: - - `child`: `AccountId` - - `netuid`: `u16` -- **Default Value**: `[]` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface, Keypair - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - child = Keypair.create_from_uri('//Alice').ss58_address - netuid = 1 - result = substrate.query('SubtensorModule', 'ParentKeys', [child, netuid]) - print(result.value) - ``` - -## 82. PendingChildKeys - -- **Description**: Pending child keys to be applied after cooldown. -- **Query Type**: `(u16, AccountId) -> (Vec<(u64, AccountId)>, u64)` -- **Parameters**: - - `netuid`: `u16` - - `parent`: `AccountId` -- **Default Value**: `( [], 0 )` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface, Keypair - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - parent = Keypair.create_from_uri('//Alice').ss58_address - netuid = 1 - result = substrate.query('SubtensorModule', 'PendingChildKeys', [netuid, parent]) - print(result.value) - ``` - -## 83. PendingEmission - -- **Description**: Pending emission of the network. -- **Query Type**: `u16 -> u64` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'PendingEmission', [netuid]) - print(result.value) - ``` - -## 84. PendingdHotkeyEmission - -- **Description**: Accumulated hotkey emission. -- **Query Type**: `AccountId -> u64` -- **Parameters**: - - `hotkey`: `AccountId` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface, Keypair - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - hotkey = Keypair.create_from_uri('//Alice').ss58_address - result = substrate.query('SubtensorModule', 'PendingdHotkeyEmission', [hotkey]) - print(result.value) - ``` - -## 85. POWRegistrationsThisInterval - -- **Description**: Number of PoW registrations in this interval. -- **Query Type**: `u16 -> u16` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'POWRegistrationsThisInterval', [netuid]) - print(result.value) - ``` - -## 86. PruningScores - -- **Description**: Pruning scores of UIDs in a network. -- **Query Type**: `u16 -> Vec` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `[]` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'PruningScores', [netuid]) - print(result.value) - ``` - -## 87. RAORecycledForRegistration - -- **Description**: Global RAO recycled for registration. -- **Query Type**: `u16 -> u64` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'RAORecycledForRegistration', [netuid]) - print(result.value) - ``` - -## 88. Rank - -- **Description**: Rank values of UIDs in a network. -- **Query Type**: `u16 -> Vec` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `[]` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'Rank', [netuid]) - print(result.value) - ``` - -## 89. RegistrationsThisBlock - -- **Description**: Number of registrations in the current block for a given network. -- **Query Type**: `u16 -> u16` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'RegistrationsThisBlock', [netuid]) - print(result.value) - ``` - -## 90. RevealPeriodEpochs - -- **Description**: Number of epochs allowed for commit-reveal periods on a given netuid. -- **Query Type**: `u16 -> u64` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `1` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'RevealPeriodEpochs', [netuid]) - print(result.value) - ``` - -## 91. Rho - -- **Description**: Rho parameter of the network. -- **Query Type**: `u16 -> u16` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `10` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'Rho', [netuid]) - print(result.value) - ``` - -## 92. ScalingLawPower - -- **Description**: Scaling law power for the network. -- **Query Type**: `u16 -> u16` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `50` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'ScalingLawPower', [netuid]) - print(result.value) - ``` - -## 93. SenateRequiredStakePercentage - -- **Description**: The percentage of stake required by the Senate. -- **Query Type**: `u64` -- **Default Value**: `1` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'SenateRequiredStakePercentage') - print(result.value) - ``` - -## 94. ServingRateLimit - -- **Description**: Rate limit for serving in the network. -- **Query Type**: `u16 -> u64` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `50` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'ServingRateLimit', [netuid]) - print(result.value) - ``` - -## 95. StakingFee - -- **Description**: Staking fee (global). -- **Query Type**: `u64` -- **Default Value**: `50000` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'StakingFee') - print(result.value) - ``` - -## 96. StakingHotkeys - -- **Description**: Maps coldkey to hotkeys that stake to it. -- **Query Type**: `AccountId -> Vec` -- **Parameters**: - - `coldkey`: `AccountId` -- **Default Value**: `[]` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface, Keypair - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - coldkey = Keypair.create_from_uri('//Bob').ss58_address - result = substrate.query('SubtensorModule', 'StakingHotkeys', [coldkey]) - print(result.value) - ``` - -## 97. StakeWeight - -- **Description**: Weight for stake used in YC (consensus). -- **Query Type**: `u16 -> Vec` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `[]` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'StakeWeight', [netuid]) - print(result.value) - ``` - -## 98. SubnetAlphaEmissionSell - -- **Description**: Alpha sold per block in the subnet. -- **Query Type**: `(u16) -> u64` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'SubnetAlphaEmissionSell', [netuid]) - print(result.value) - ``` - -## 99. SubnetAlphaIn - -- **Description**: Amount of alpha in the subnet's liquidity pool. -- **Query Type**: `(u16) -> u64` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'SubnetAlphaIn', [netuid]) - print(result.value) - ``` - -## 100. SubnetAlphaInEmission - -- **Description**: Amount of alpha entering a subnet per block. -- **Query Type**: `(u16) -> u64` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'SubnetAlphaInEmission', [netuid]) - print(result.value) - ``` - -## 101. SubnetAlphaOut - -- **Description**: Amount of alpha in the subnet itself. -- **Query Type**: `(u16) -> u64` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'SubnetAlphaOut', [netuid]) - print(result.value) - ``` - -## 102. SubnetAlphaOutEmission - -- **Description**: Amount of alpha leaving a subnet per block. -- **Query Type**: `(u16) -> u64` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'SubnetAlphaOutEmission', [netuid]) - print(result.value) - ``` - -## 103. SubnetIdentitiesV2 - -- **Description**: Identity information for a subnet (v2 format). -- **Query Type**: `u16 -> SubnetIdentityOfV2` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `None` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'SubnetIdentitiesV2', [netuid]) - print(result.value) - ``` - -## 104. SubnetLimit - -- **Description**: Maximum number of networks. -- **Query Type**: `u16` -- **Default Value**: `12` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'SubnetLimit') - print(result.value) - ``` - -## 105. SubnetLocked - -- **Description**: Locked amount in the subnet. -- **Query Type**: `u16 -> u64` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'SubnetLocked', [netuid]) - print(result.value) - ``` - -## 106. SubnetMechanism - -- **Description**: Mechanism identifier for the subnet. -- **Query Type**: `u16 -> u16` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'SubnetMechanism', [netuid]) - print(result.value) - ``` - -## 107. SubnetMovingAlpha - -- **Description**: Moving alpha parameter for the dynamic subnet price. -- **Query Type**: `I96F32` -- **Default Value**: `0.000003` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'SubnetMovingAlpha') - print(result.value) - ``` - -## 108. SubnetMovingPrice - -- **Description**: The moving average price for a subnet. -- **Query Type**: `(u16) -> I96F32` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `0.0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'SubnetMovingPrice', [netuid]) - print(result.value) - ``` - -## 109. SubnetName - -- **Description**: The name of the subnet. -- **Query Type**: `u16 -> Vec` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `𝜏` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'SubnetName', [netuid]) - print(result.value) - ``` - -## 110. SubnetOwner - -- **Description**: Owner of the subnet. -- **Query Type**: `u16 -> AccountId` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `AccountId` derived from trailing zeroes -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'SubnetOwner', [netuid]) - print(result.value) - ``` - -## 111. SubnetOwnerCut - -- **Description**: Subnet owner cut percentage. -- **Query Type**: `u16` -- **Default Value**: `11796` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'SubnetOwnerCut') - print(result.value) - ``` - -## 112. SubnetTAO - -- **Description**: Amount of TAO in a given subnet's pool. -- **Query Type**: `(u16) -> u64` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'SubnetTAO', [netuid]) - print(result.value) - ``` - -## 113. SubnetVolume - -- **Description**: Total volume of TAO bought/sold for a subnet. -- **Query Type**: `(u16) -> u128` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'SubnetVolume', [netuid]) - print(result.value) - ``` - -## 114. SubnetworkN - -- **Description**: Number of UIDs in the network. -- **Query Type**: `u16 -> u16` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'SubnetworkN', [netuid]) - print(result.value) - ``` - -## 115. TaoDividendsPerSubnet - -- **Description**: Last total root dividend for a hotkey on a subnet. -- **Query Type**: `(u16, AccountId) -> u64` -- **Parameters**: - - `netuid`: `u16` - - `hotkey`: `AccountId` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface, Keypair - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - hotkey = Keypair.create_from_uri('//Alice').ss58_address - result = substrate.query('SubtensorModule', 'TaoDividendsPerSubnet', [netuid, hotkey]) - print(result.value) - ``` - -## 116. TaoWeight - -- **Description**: A global parameter representing "Tao weight" in the system. -- **Query Type**: `u64` -- **Default Value**: `971718665099567868` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'TaoWeight') - print(result.value) - ``` - -## 117. TargetRegistrationsPerInterval - -- **Description**: Target registrations per interval for the network. -- **Query Type**: `u16 -> u16` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `2` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'TargetRegistrationsPerInterval', [netuid]) - print(result.value) - ``` - -## 118. TargetStakesPerInterval - -- **Description**: Target stakes per interval. -- **Query Type**: `u64` -- **Default Value**: `1` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'TargetStakesPerInterval') - print(result.value) - ``` - -## 119. Tempo - -- **Description**: Tempo of the network. -- **Query Type**: `u16 -> u16` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `99` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'Tempo', [netuid]) - print(result.value) - ``` - -## 120. TokenSymbol - -- **Description**: The token symbol for a subnet. -- **Query Type**: `u16 -> Vec` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `"\xF0\x9D\x9C\x8F"` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'TokenSymbol', [netuid]) - print(result.value) - ``` - -## 121. TotalColdkeyStake - -- **Description**: Returns the total amount of stake under a coldkey. -- **Query Type**: `AccountId -> u64` -- **Parameters**: - - `coldkey`: `AccountId` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface, Keypair - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - coldkey = Keypair.create_from_uri('//Bob').ss58_address - result = substrate.query('SubtensorModule', 'TotalColdkeyStake', [coldkey]) - print(result.value) - ``` - -## 122. TotalHotkeyStake - -- **Description**: Returns the total amount of stake under a hotkey. -- **Query Type**: `AccountId -> u64` -- **Parameters**: - - `hotkey`: `AccountId` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface, Keypair - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - hotkey = Keypair.create_from_uri('//Alice').ss58_address - result = substrate.query('SubtensorModule', 'TotalHotkeyStake', [hotkey]) - print(result.value) - ``` - -## 123. TotalIssuance - -- **Description**: Represents the total issuance of tokens on the Bittensor network. -- **Query Type**: `u64` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'TotalIssuance') - print(result.value) - ``` - -## 124. TotalNetworks - -- **Description**: Total number of existing networks. -- **Query Type**: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'TotalNetworks') - print(result.value) - ``` - -## 125. TotalStake - -- **Description**: The total amount of tokens staked in the system. -- **Query Type**: `u64` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'TotalStake') - print(result.value) - ``` - -## 126. TotalStakeAtDynamic - -- **Description**: Total stake in the system at the moment of subnet registration under dynamic pricing. -- **Query Type**: `(u16) -> u64` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'TotalStakeAtDynamic', [netuid]) - print(result.value) - ``` - -## 127. TransactionKeyLastBlock - -- **Description**: Last block of a transaction for a given key, netuid, and name. -- **Query Type**: `(AccountId, u16, u16) -> u64` -- **Parameters**: - - `hotkey`: `AccountId` - - `netuid`: `u16` - - `name`: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface, Keypair - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - hotkey = Keypair.create_from_uri('//Alice').ss58_address - netuid = 1 - name = 1 - result = substrate.query('SubtensorModule', 'TransactionKeyLastBlock', [hotkey, netuid, name]) - print(result.value) - ``` - -## 128. Trust - -- **Description**: Trust values of UIDs in a network. -- **Query Type**: `u16 -> Vec` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `[]` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'Trust', [netuid]) - print(result.value) - ``` - -## 129. TxChildkeyTakeRateLimit - -- **Description**: Transaction childkey take rate limit. -- **Query Type**: `u64` -- **Default Value**: `0` or chain-defined -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'TxChildkeyTakeRateLimit') - print(result.value) - ``` - -## 130. TxDelegateTakeRateLimit - -- **Description**: Transaction delegate take rate limit. -- **Query Type**: `u64` -- **Default Value**: `216000` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'TxDelegateTakeRateLimit') - print(result.value) - ``` - -## 131. TxRateLimit - -- **Description**: Transaction rate limit. -- **Query Type**: `u64` -- **Default Value**: `1000` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'TxRateLimit') - print(result.value) - ``` - -## 132. Uids - -- **Description**: Maps hotkey to UID within a network. -- **Query Type**: `(u16, AccountId) -> u16` -- **Parameters**: - - `netuid`: `u16` - - `hotkey`: `AccountId` -- **Default Value**: `None` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface, Keypair - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - hotkey = Keypair.create_from_uri('//Alice').ss58_address - result = substrate.query('SubtensorModule', 'Uids', [netuid, hotkey]) - print(result.value) - ``` - -## 133. UsedWork - -- **Description**: Global used work storage. -- **Query Type**: `Vec -> u64` -- **Parameters**: - - `key`: `Vec` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - key = b"some_key" - result = substrate.query('SubtensorModule', 'UsedWork', [key]) - print(result.value) - ``` - -## 134. ValidatorPermit - -- **Description**: Validator permit values of UIDs in a network. -- **Query Type**: `u16 -> Vec` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `[]` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'ValidatorPermit', [netuid]) - print(result.value) - ``` - -## 135. ValidatorPruneLen - -- **Description**: Length of validator pruning. -- **Query Type**: `u16 -> u64` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `1` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'ValidatorPruneLen', [netuid]) - print(result.value) - ``` - -## 136. ValidatorTrust - -- **Description**: Validator trust values of UIDs in a network. -- **Query Type**: `u16 -> Vec` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `[]` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'ValidatorTrust', [netuid]) - print(result.value) - ``` - -## 137. WeightCommitRevealInterval - -- **Description**: Interval for the commit-reveal process of weights. -- **Query Type**: `u16 -> u64` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `1000` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'WeightCommitRevealInterval', [netuid]) - print(result.value) - ``` - -## 138. WeightCommits - -- **Description**: Returns the commit data for an account on a given netuid (commit-reveal). -- **Query Type**: `(u16, AccountId) -> VecDeque<(H256, u64, u64, u64)>` -- **Parameters**: - - `netuid`: `u16` - - `who`: `AccountId` -- **Default Value**: `None` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface, Keypair - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - who = Keypair.create_from_uri('//Alice').ss58_address - result = substrate.query('SubtensorModule', 'WeightCommits', [netuid, who]) - print(result.value) - ``` - -## 139. Weights - -- **Description**: Weight values of UIDs in a network. -- **Query Type**: `(u16, u16) -> Vec<(u16, u16)>` -- **Parameters**: - - `netuid`: `u16` - - `uid`: `u16` -- **Default Value**: `[]` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - uid = 123 - result = substrate.query('SubtensorModule', 'Weights', [netuid, uid]) - print(result.value) - ``` - -## 140. WeightsMinStake - -- **Description**: Minimum stake required for weights. -- **Query Type**: `u64` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - result = substrate.query('SubtensorModule', 'WeightsMinStake') - print(result.value) - ``` - -## 141. WeightsSetRateLimit - -- **Description**: Rate limit for setting weights in the network. -- **Query Type**: `u16 -> u64` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `100` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'WeightsSetRateLimit', [netuid]) - print(result.value) - ``` - -## 142. WeightsVersionKey - -- **Description**: Version key for weights in the network. -- **Query Type**: `u16 -> u64` -- **Parameters**: - - `netuid`: `u16` -- **Default Value**: `0` -- **Python Example**: - ```python - from substrateinterface import SubstrateInterface - substrate = SubstrateInterface(url="wss://test.finney.opentensor.ai:443") - - netuid = 1 - result = substrate.query('SubtensorModule', 'WeightsVersionKey', [netuid]) - print(result.value) - ``` diff --git a/docs/subtensor-nodes/using-docker.md b/docs/subtensor-nodes/using-docker.md deleted file mode 100644 index 09e2d04261..0000000000 --- a/docs/subtensor-nodes/using-docker.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: "Using Docker" ---- -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Using Docker - -To run a subtensor node with Docker, follow the below steps. - -:::danger Not tested on cloud -We have not tested subtensor node installation scripts on any cloud service. In addition, if you are using Runpod cloud service, then note that this service is already [containerized](https://docs.runpod.io/pods/overview). Hence, the only option available to you for Runpod is to install a subtensor node by [compiling from source](using-source.md). **Note that we have not tested any subtensor installation steps on Runpod.** -::: - -If you are already running a subtensor node using Docker, then go directly to [Step 5 Prepare to Run ](#step-5-prepare-to-run). The below steps 1 through 4 are for first time users only. - -## Step 1: Install git - -Ensure that `git` is installed on your machine. Refer to the [GitHub documentation](https://docs.github.com/en/get-started) for installation instructions. - -## Step 2: Install Docker - -Follow Docker's [official installation guides](https://docs.docker.com/engine/install/) and install Docker. - -:::tip Run Docker first -Before proceeding, make sure that Docker is running. -::: - -## Step 3: Clone the subtensor repo - -Clone the subtensor repository: - -```bash -git clone https://github.com/opentensor/subtensor.git -``` - -## Step 4: Go into subtensor directory - -Navigate into the Subtensor directory: - -```bash -cd subtensor -``` - -## Step 5: Switch to `main` branch - -Execute the below commands in this order: - -Switch to the `main` branch: - -```bash -git checkout main -``` - -Pull the latest `main` branch contents: - -```bash -git pull -``` - -## Step 6: Stop and clean Docker environment - -Stop any currently running Docker containers and clean up the Docker environment: - -```bash -docker compose down --volumes && docker system prune -a --volumes -f - -``` - -## Linux post-installation steps for Docker Engine - -Please follow Docker's [official documentation](https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user ) to perform standard Linux post-installation steps for Docker Engine - -:::tip -Adding a user to the `docker` group is only necessary on Linux, where `sudo` privileges are required to run Docker commands. It is unnecessary on macOS. -::: - - -## Run a Lite Node on Mainchain - -To run a lite node connected to the Bittensor mainchain, execute the below command. - -```bash -./scripts/run/subtensor.sh -e docker --network mainnet --node-type lite -``` - -## Run an Archive Node on Mainchain - -To run an archive node connected to the Bittensor mainchain, execute the below command. - -```bash -./scripts/run/subtensor.sh -e docker --network mainnet --node-type archive -``` - -## Run a Lite Node on Testchain - -To run a lite node connected to the Bittensor testchain, execute the below command. - -```bash -./scripts/run/subtensor.sh -e docker --network testnet --node-type lite -``` - -## Run an Archive Node on Testchain - -To run an archive node connected to the Bittensor testchain, execute the below command. - -```bash -./scripts/run/subtensor.sh -e docker --network testnet --node-type archive -``` diff --git a/docs/subtensor-nodes/using-source.md b/docs/subtensor-nodes/using-source.md deleted file mode 100644 index e521b5036d..0000000000 --- a/docs/subtensor-nodes/using-source.md +++ /dev/null @@ -1,116 +0,0 @@ ---- -title: "Using Source Code" ---- -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Using Source Code - -To install and run a subtensor node by compiling the source code, follow the below steps. - -:::danger Not tested on cloud -We have not tested subtensor node installation scripts on any cloud service. In addition, if you are using Runpod cloud service, then note that this service is already [containerized](https://docs.runpod.io/pods/overview). Hence, the only option available to you for Runpod is to install a subtensor node by compiling from source, as described below. **Note that we have not tested any subtensor installation steps on Runpod.** -::: - -## Install basic packages - -Install the basic requirements by running the below commands on a Linux terminal. - -```bash title="Linux" -sudo apt-get update -sudo apt install -y build-essential clang curl git make libssl-dev llvm libudev-dev protobuf-compiler pkg-config -``` - -Install the basic requirements by running the below command on macOS. - -```bash title="macOS" -brew install protobuf -``` - -## Install Rust - -Next, install Rust and update the environment by running the following commands: - -```bash -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -source ~/.cargo/env -``` - -Next, install Rust toolchain: - -```bash -rustup default stable -rustup update -rustup target add wasm32-unknown-unknown -rustup toolchain install nightly -rustup target add --toolchain nightly wasm32-unknown-unknown -``` - -## Compile subtensor code - -Next, to compile the subtensor source code, follow the below steps: - -1. Clone the Subtensor repository: - -```bash -git clone https://github.com/opentensor/subtensor.git -``` -2. Change to the Subtensor directory: - -```bash -cd subtensor -``` - -3. Switch to `main` branch: - -```bash -git checkout main -``` - -4. Remove any previous chain state: - -```bash -rm -rf /var/lib/subtensor -``` - -5. Install Subtensor by compiling with Cargo: - -```bash -cargo build -p node-subtensor --profile=production --features=metadata-hash -``` - -## Run the subtensor node - -You can now run the public subtensor node either as a lite node or as an archive node. See below: - -### Lite node on mainchain - -To run a lite node connected to the mainchain, execute the below command (note the `--sync=warp` flag which runs the subtensor node in lite mode): - -```bash title="With --sync=warp setting, for lite node" -./target/production/node-subtensor --chain ./chainspecs/raw_spec_finney.json --base-path /var/lib/subtensor --sync=warp --port 30333 --max-runtime-instances 32 --rpc-max-response-size 2048 --rpc-cors all --rpc-port 9944 --bootnodes /dns/bootnode.finney.chain.opentensor.ai/tcp/30333/ws/p2p/12D3KooWRwbMb85RWnT8DSXSYMWQtuDwh4LJzndoRrTDotTR5gDC --no-mdns --prometheus-external --rpc-external -``` - -### Archive node on mainchain - -To run an archive node connected to the mainchain, execute the below command (note the `--sync=full` which syncs the node to the full chain and `--pruning archive` flags, which disables the node's automatic pruning of older historical data): - -```bash title="With --sync=full and --pruning archive setting, for archive node" -./target/production/node-subtensor --chain ./chainspecs/raw_spec_finney.json --base-path /var/lib/subtensor --sync=full --pruning archive --port 30333 --max-runtime-instances 32 --rpc-max-response-size 2048 --rpc-cors all --rpc-port 9944 --bootnodes /dns/bootnode.finney.chain.opentensor.ai/tcp/30333/ws/p2p/12D3KooWRwbMb85RWnT8DSXSYMWQtuDwh4LJzndoRrTDotTR5gDC --no-mdns --prometheus-external --rpc-external -``` - -### Lite node on testchain - -To run a lite node connected to the testchain, execute the below command: - -```bash title="With bootnodes set to testnet and --sync=warp setting, for lite node." -./target/production/node-subtensor --chain ./chainspecs/raw_spec_testfinney.json --base-path /var/lib/subtensor --sync=warp --port 30333 --max-runtime-instances 32 --rpc-max-response-size 2048 --rpc-cors all --rpc-port 9944 --bootnodes /dns/bootnode.test.finney.opentensor.ai/tcp/30333/ws/p2p/12D3KooWPM4mLcKJGtyVtkggqdG84zWrd7Rij6PGQDoijh1X86Vr --no-mdns --prometheus-external --rpc-external -``` - -### Archive node on testchain - -To run an archive node connected to the testchain, execute the below command: - -```bash title="With bootnodes set to testnet and --sync=full and --pruning archive setting, for archive node" -./target/production/node-subtensor --chain ./chainspecs/raw_spec_testfinney.json --base-path /var/lib/subtensor --sync=full --pruning archive --port 30333 --max-runtime-instances 32 --rpc-max-response-size 2048 --rpc-cors all --rpc-port 9944 --bootnodes /dns/bootnode.test.finney.opentensor.ai/tcp/30333/ws/p2p/12D3KooWPM4mLcKJGtyVtkggqdG84zWrd7Rij6PGQDoijh1X86Vr --no-mdns --prometheus-external --rpc-external -``` diff --git a/docs/tools.md b/docs/tools.md deleted file mode 100644 index a83587fb09..0000000000 --- a/docs/tools.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: "Bittensor tools" ---- - -# Bittensor tools - -Bittensor provides several tools to help developers, miners, and validators interact with the network and its features. Below is a quick overview of the core Bittensor tools, followed by links for further reading. - ---- - -## Bittensor SDK - -The Bittensor SDK is a Python-based library that allows developers to interact programmatically with the Bittensor network. You can use the SDK to: -- Create and manage wallets -- Register miners and validators -- Query and monitor network activity -- Build applications on top of Bittensor’s decentralized AI infrastructure - -**Learn more in the [Bittensor SDK documentation](./bt-api-ref.md)** (link for illustration). - ---- - -## Bittensor CLI - -The Bittensor command-line interface (`btcli`) provides a straightforward way to: -- Create, manage, and encrypt wallet keys -- Transfer and stake TAO -- Perform subnet management operations (e.g., creating subnets, registering miners/validators) -- View wallet information and network status - -It is designed for users who prefer quick terminal commands or those managing multiple nodes and subnet interactions. -**See [Bittensor CLI reference](./btcli.md)** for detailed usage instructions. - ---- - -## Wallets and Keys - -In Bittensor (like other cryptocurrency applications), a *wallet* is a tool for managing the cryptographic key-pairs required to prove your identity, sign transactions, and access your currency - -Bittensor uses a dual-key wallet structure: -- **Coldkey** for secure storage of TAO and high-security operations -- **Hotkey** for operational tasks like validation, mining, and day-to-day transactions - -Both keys are crucial for safeguarding and participating in the network. -**For a complete guide, see [Wallets & Keys](./getting-started/wallets)** and [Working with Keys](./working-with-keys). - diff --git a/docs/tutorials/basic-subnet-tutorials.md b/docs/tutorials/basic-subnet-tutorials.md deleted file mode 100644 index 41c8ff8a94..0000000000 --- a/docs/tutorials/basic-subnet-tutorials.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: "Basic Subnet Tutorials" ---- - -# Basic Subnet Tutorials - -If you are new to subnets, start with these beginner tutorials with [Bittensor Subnet Template](https://github.com/opentensor/bittensor-subnet-template/blob/main/README.md): - -- **Running locally**: Follow the step-by-step instructions described in this tutorial: [Running Subnet Locally](https://github.com/opentensor/bittensor-subnet-template/blob/main/docs/running_on_staging.md). -- **Running on Bittensor testchain**: Follow the step-by-step instructions described in this tutorial: [Running on the Testchain](https://github.com/opentensor/bittensor-subnet-template/blob/main/docs/running_on_testnet.md). -- **Running on Bittensor mainchain**: Follow the step-by-step instructions described in this tutorial: [Running on the Mainchain](https://github.com/opentensor/bittensor-subnet-template/blob/main/docs/running_on_mainnet.md). - - diff --git a/docs/tutorials/ocr-subnet-tutorial.md b/docs/tutorials/ocr-subnet-tutorial.md deleted file mode 100644 index 5402367b9c..0000000000 --- a/docs/tutorials/ocr-subnet-tutorial.md +++ /dev/null @@ -1,393 +0,0 @@ ---- -title: "OCR Subnet Tutorial" ---- - -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# OCR Subnet Tutorial - -In this tutorial you will learn how to quickly convert your validated idea into a functional Bittensor subnet. This tutorial begins with a Python notebook that contains the already validated code for optical character recognition (OCR). We demonstrate how straightforward it is to start with such notebooks and produce a working subnet. - - -## Motivation - -Bittensor subnets are: -- Naturally suitable for continuous improvement of the subnet miners. -- High throughput environments to accomplish such improvements. - -This is the motivation for creating an OCR subnet for this tutorial. By using the OCR subnet, one can extract the text from an entire library of books in a matter of hours or days. Moreover, when we expose the subnet miners, during training, to examples of real-world use-cases, the OCR subnet can be fine-tuned to be maximally effective. - -## Takeaway lessons - -When you complete this tutorial, you will know the following: - -- How to convert your Python notebook containing the validated idea into a working Bittensor subnet. -- How to use the [Bittensor Subnet Template](https://github.com/opentensor/bittensor-subnet-template) to accomplish this goal. -- How to perform subnet validation and subnet mining. -- How to design your own subnet incentive mechanism. - -## Tutorial code - -### Python notebook - -The Python [notebook](https://colab.research.google.com/drive/1Z2KT11hyKwsmMib8C6lDsY93vnomJznz#scrollTo=M8Cf2XVUJnBh) we use in this tutorial contains all the three essential components of the OCR subnet: - -- [Validation flow](https://colab.research.google.com/drive/1Z2KT11hyKwsmMib8C6lDsY93vnomJznz#scrollTo=M8Cf2XVUJnBh). -- [Baseline miner implementation](https://colab.research.google.com/drive/1Z2KT11hyKwsmMib8C6lDsY93vnomJznz#scrollTo=hhKFy5U2EW7e). -- [Reward model (incentive mechanism)](https://colab.research.google.com/drive/1Z2KT11hyKwsmMib8C6lDsY93vnomJznz#scrollTo=jcwFaIjwJnBj). - - -### OCR subnet repository - -- We will use the [OCR subnet repository](https://github.com/steffencruz/ocr_subnet) as our starting point and then incorporate the notebook code to build the OCR subnet. - -## Tutorial method - -For the rest of this tutorial we will proceed by demonstrating which blocks of Python notebook code are copied into specific sections of the [OCR subnet repository](https://github.com/steffencruz/ocr_subnet). - -## Prerequisites - -### Required reading - -If you are new to Bittensor, read the following sections before you proceed: - -1. [Introduction](../learn/introduction.md) that describes how subnets form the heartbeat of the Bittensor network. -2. [Bittensor Building Blocks](../learn/bittensor-building-blocks.md) that presents the basic building blocks you use to develop your subnet incentive mechanism. -3. [Anatomy of Incentive Mechanism](../learn/anatomy-of-incentive-mechanism.md) that introduces the general concept of a subnet incentive mechanism. - -## OCR subnet summary - -This tutorial OCR subnet works like this. The below numbered items correspond to the numbers in the diagram: - - - -1. The subnet validator sends a challenge simultaneously to multiple subnet miners. In this tutorial the challenge consists of an image file of a synthetic invoice document. The serialized image file is attached to a synapse object called `OCRSynapse`. This step constitutes the **query** from the subnet validator to subnet miners. -2. The subnet miners respond after performing the challenge **task**. After receiving the synapse object containing the image data, each miner then performs the task of extracting, from the image data, its contents, including the text content, the positional information of the text, the fonts used in the text and the font size. -3. The subnet validator then **scores** each subnet miner based on the quality of the response and how quickly the miner completed the task. The subnet validator uses the original synthetic invoice document as the ground truth for this step. -4. Finally, the subnet validator **sets the weights** for the subnet miners by sending the weights to the blockchain. - - - -## Step 1: Generate challenge and query the miners - -### Step 1.1: Synthetic PDF as challenge - -In this tutorial, the subnet validator will generate synthetic data, which is a PDF document containing an invoice. The subnet validator will use this synthetic PDF as the basis for assessing the subnet miner performance. Synthetic data is an appropriate choice as it provides an **unlimited** source of **customizable** validation data. It also enables the subnet validators to gradually increase the **difficulty** of the task so that the miners are required to continuously improve. This is in contrast to using a pre-existing dataset from the web, where subnet miners can "lookup" the answers on the web. - -The contents of the PDF document are the ground truth labels. The subnet validator uses them to score the miner responses. The synthetic PDF document is corrupted with different types of noise to mimic poorly scanned documents. The amount of noise can also be gradually increased to make the task more challenging. - -To generate this challenge, the subnet validator applies the following steps: - -- Creates a synthetic invoice document using the [Python Faker library](https://github.com/joke2k/faker). -- Converts this synthetic data into PDF using [ReportLab Python library](https://docs.reportlab.com/install/open_source_installation/). -- Finally, the validator creates the challenge by converting this PDF into a corrupted image, called `noisy_image`. - -#### Code snapshot - -See below for a snapshot view of the code. - -```python -# Generates a PDF invoice from the raw data passed in as "invoice_data" dictionary -# and saves the PDF with "filename" -def create_invoice(invoice_data, filename): -... - -# Using Faker, generate sample data for the invoice -invoice_info = { - "company_name": fake.company(), - "company_address": fake.address(), - "company_city_zip": f'{fake.city()}, {fake.zipcode()}', -... -} -... - -# Pass the "invoice_info" containing the Faker-generated raw data -# to create_invoice() method and generate the synthetic invoice PDF -pdf_filename = "sample_invoice.pdf" -data = create_invoice(invoice_info, pdf_filename) -... - -# Loads PDF and converts it into usable PIL image using Pillow library -# Used by the corrupt_image() method -def load_image(pdf_path, page=0, zoom_x=1.0, zoom_y=1.0): - ... - -# Accepts a PDF, uses load_image() method to convert to image -# and adds noise, blur, spots, rotates the page, curls corners, darkens edges so -# that the overall result is noisy. Saves back in PDF format. -# This is our corrupted synthetic PDF document. -def corrupt_image(input_pdf_path, output_pdf_path, border=50, noise=0.1, spot=(100,100), scale=0.95, theta=0.2, blur=0.5): - ... -``` - -**Collab Notebook source:** The validated code for the above synthetic PDF generation logic is in [Validation flow cell](https://colab.research.google.com/drive/1Z2KT11hyKwsmMib8C6lDsY93vnomJznz#scrollTo=M8Cf2XVUJnBh). - -All we have to do is to copy the above Notebook code into a proper place in the OCR subnet repo. - -```bash {7,9} -... -├── ocr_subnet -│   ├── __init__.py -│  ... -│   └── validator -│   ├── __init__.py -│   ├── corrupt.py -│   ├── forward.py -│   ├── generate.py -│   ├── reward.py -│   └── utils.py -... -``` - -We copy the above Notebook code into the following code files. Click on the OCR repo file names to see the copied code: - -| Python Notebook source| OCR repo destination | -| :---------- | :-------------- | -| Methods: `create_invoice`, `random_items`, `load_image`, and lists `items_list` and `invoice_info` and all the `import` statements in cell 34. | [ocr_subnet/validator/generate.py](https://github.com/steffencruz/ocr_subnet/blob/main/ocr_subnet/validator/generate.py) | -| Method: `corrupt_image` | [ocr_subnet/validator/corrupt.py](https://github.com/steffencruz/ocr_subnet/blob/main/ocr_subnet/validator/corrupt.py) | - -### Step 1.2: Query miners - -Next, the subnet validator sends this `noisy_image` to the miners, tasking them to perform OCR and content extraction. - -**Collab Notebook source:** In the validated Collab Notebook code, this step is accomplished by **directly passing the path information** of the `noisy_image` from the Validator cell to the miner. - -:::tip -[See `noisy_image` from line 32 in Quick sanity check cell](https://colab.research.google.com/drive/1Z2KT11hyKwsmMib8C6lDsY93vnomJznz#scrollTo=_rHjuG6JD--P) being passed to [line 90 of the Miner cell](https://colab.research.google.com/drive/1Z2KT11hyKwsmMib8C6lDsY93vnomJznz#scrollTo=hhKFy5U2EW7e). -::: - -#### Define OCRSynapse class - -However, in a Bittensor subnet, any communication between a subnet validator and a subnet miner must use an object of the type `Synapse`. Hence, the subnet validator must attach the corrupted image to a `Synapse` object and send this object to the miners. The miners will then update the passed synapse by attaching their responses into this same object and send them back to the subnet validator. - -#### Code snapshot - -```python -# OCRSynapse class, using bt.Synapse as its base. -# This protocol enables communication between the miner and the validator. -# Attributes: -# - image: A pdf image to be processed by the miner. -# - response: List[dict] containing data extracted from the image. -class OCRSynapse(bt.Synapse): - """ - A simple OCR synapse protocol representation which uses bt.Synapse as its base. - This protocol enables communication between the miner and the validator. - - Attributes: - - image: A pdf image to be processed by the miner. - - response: List[dict] containing data extracted from the image. - """ - - # Required request input, filled by sending dendrite caller. It is a base64 encoded string. - base64_image: str - - # Optional request output, filled by receiving axon. - response: typing.Optional[typing.List[dict]] = None -``` - -:::tip important -The `OCRSynapse` object can only contain serializable objects. This is because both the subnet validators and the subnet miners must be able to deserialize after receiving the object. -::: - -See the `OCRSynapse` class definition in [**ocr_subnet/protocol.py**](https://github.com/steffencruz/ocr_subnet/blob/main/ocr_subnet/protocol.py). - -```bash {7} -... -├── ocr_subnet -│   ├── __init__.py -│   ├── base -│   │   ├── __init__.py -│   │   ... -│   ├── protocol.py -... -``` - -:::tip Study tip -See [Neuron-to-neuron communication](../learn/bittensor-building-blocks.md#neuron-to-neuron-communication). -::: - -#### Send OCRSynapse to miners - -With the `OCRSynapse` class defined, next we use the network client `dendrite` of the subnet validator to send queries to the `Axon` server of the subnet miners. - -#### Code snapshot - -```python -# Create synapse object to send to the miner and attach the image. -# convert PIL image into a json serializable format -synapse = OCRSynapse(base64_image = serialize_image(image)) -# The dendrite client of the validator queries the miners in the subnet -responses = self.dendrite.query( - # Send the query to selected miner axons in the network. - axons=[self.metagraph.axons[uid] for uid in miner_uids], - # Pass the synapse to the miner. - synapse=synapse, -... -) -``` - -See [**ocr_subnet/validator/forward.py**](https://github.com/steffencruz/ocr_subnet/blob/main/ocr_subnet/validator/forward.py) which contains all this communication logic. - -Also note that the [**scripts/**](https://github.com/steffencruz/ocr_subnet/tree/main/scripts) directory contains the sample invoice document and its noisy version. The subnet validator uses these as ground truth labels to score the miner responses. - -```bash {8,13} -... -├── ocr_subnet -│   ├── __init__.py -│  ... -│   └── validator -│   ├── __init__.py -│   ├── corrupt.py -│   ├── forward.py -│   ├── generate.py -│   ├── reward.py -│   └── utils.py -... -``` - -## Step 2: Miner response - -Having received the `OCRSynapse` object with the corrupted image data in it, the miners will next perform the data extraction. - -### Base miner - -The Python notebook contains an implementation of the base miner, which uses [`pytesseract`](https://github.com/madmaze/pytesseract), a popular open source OCR tool to extract data from the image sent by the subnet validator. - -**Collab Notebook source**: See the `miner` method in this [Miner cell of the Collab Notebook](https://colab.research.google.com/drive/1Z2KT11hyKwsmMib8C6lDsY93vnomJznz#scrollTo=hhKFy5U2EW7e). - -#### Code snapshot - -```python -import pytesseract -# Extracts text data from image using pytesseract. This is the baseline miner. -def miner(image, merge=True, sort=True) -... -response = miner(noisy_image, merge=True) -``` - -We copy the above miner code from the Notebook into the following code files. Click on the OCR repo file names to see the copied code: - -```bash {4} -... -├── neurons -│   ├── __init__.py -│   ├── miner.py -│   └── validator.py -... -``` - -| Python Notebook source| OCR repo destination | -| :---------- | :-------------- | -| Methods: `group_and_merge_boxes` and `miner` and all the `import` statements in this [Miner cell of the Collab Notebook](https://colab.research.google.com/drive/1Z2KT11hyKwsmMib8C6lDsY93vnomJznz#scrollTo=hhKFy5U2EW7e). | [neurons/miner.py](https://github.com/steffencruz/ocr_subnet/blob/main/neurons/miner.py) | - -:::tip Student exercise -[`pytesseract`](https://github.com/madmaze/pytesseract) is well-suited for this OCR problem. But it can be beaten by a subnet miner using more sophisticated approaches such as deep learning for OCR. -::: - -## Step 3: Scoring miner responses - -When a miner sends its response, the subnet validator scores the quality of the response in the following way: - -**Prediction reward** -: Compute the similarity between the ground truth and the prediction of the miner for the text content, text position and the font. This is conceptually equivalent to a loss function that is used in a machine learning setting, with the only difference being that rewards are a function to be **maximized** rather than **minimized**. The total prediction reward is calculated as below: - -- For each section of the synthetic invoice document, compute the **three** partial reward quantities: - - text reward. - - position reward. - - font reward. -- This is done by comparing a section in the miner response to the corresponding section in the ground truth synthetic invoice document. -- Add the above three partial reward quantities to compute the total loss for the particular section. -- Take the mean score of all such total rewards over all the sections of the invoice document. - -**Response time penalty** -: Calculate the response time penalty for the miner for these predictions. The goal here is to assign higher rewards to faster miners. - -#### Code snapshot -```python -# Calculate the edit distance between two strings. -def get_text_reward(text1: str, text2: str = None): - ... -# Calculate the intersection over union (IoU) of two bounding boxes. -def get_position_reward(boxA: List[float], boxB: List[float] = None): - ... -# Calculate the distance between two fonts, based on the font size and font family. -def get_font_reward(font1: dict, font2: dict = None, alpha_size=1.0, alpha_family=1.0): - ... -# Score a section of the image based on the section's correctness. -# Correctness is defined as: -# - the intersection over union of the bounding boxes, -# - the delta between the predicted font and the ground truth font, -# - and the edit distance between the predicted text and the ground truth text. -def section_reward(label: dict, pred: dict, alpha_p=1.0, alpha_f=1.0, alpha_t=1.0, verbose=False): - ... - reward = { - 'text': get_text_reward(label['text'], pred.get('text')), - 'position': get_position_reward(label['position'], pred.get('position')), - 'font': get_font_reward(label['font'], pred.get('font')), - } - - reward['total'] = (alpha_t * reward['text'] + alpha_p * reward['position'] + alpha_f * reward['font']) / (alpha_p + alpha_f + alpha_t) -... -# Reward the miner response. -def reward(image_data: List[dict], predictions: List[dict], time_elapsed: float) -> float: - time_reward = max(1 - time_elapsed / max_time, 0) - total_reward = (alpha_prediction * prediction_reward + alpha_time * time_reward) / (alpha_prediction + alpha_time) -... -``` - -:::tip Rewards are exponential moving averaged -The rewards attained by miners are averaged over many turns using an exponential moving average (EMA). This is done to obtain a more reliable estimate of the overall performance on the task. We often refer to these smoothed rewards as EMA scores. -::: - -**Collab Notebook source**: See the [Incentive mechanism cell](https://colab.research.google.com/drive/1Z2KT11hyKwsmMib8C6lDsY93vnomJznz#scrollTo=jcwFaIjwJnBj). - -We copy the above miner code from the Notebook into the following code files. Click on the OCR repo file names to see the copied code: - -```bash {10,11} -... -├── ocr_subnet -│   ├── __init__.py -│  ... -│   └── validator -│   ├── __init__.py -│   ├── corrupt.py -│   ├── forward.py -│   ├── generate.py -│   ├── reward.py -│   └── utils.py -... -``` - -| Python Notebook source| OCR repo destination | -| :---------- | :-------------- | -| Methods: `reward` and `miner` and all the `import` statements in this [Miner cell of the Collab Notebook](https://colab.research.google.com/drive/1Z2KT11hyKwsmMib8C6lDsY93vnomJznz#scrollTo=hhKFy5U2EW7e). | [ocr_subnet/validator/reward.py](https://github.com/steffencruz/ocr_subnet/blob/main/ocr_subnet/validator/reward.py) | -| Method `section_reward`. | Method `loss` in the `reward.py`. | -| Methods: `get_position_reward`, `get_text_reward` and `get_font_reward`. | Methods: `get_iou`, `get_edit_distance` and `get_font_distance`, respectively, in [ocr_subnet/validator/utils.py](https://github.com/steffencruz/ocr_subnet/blob/main/ocr_subnet/validator/utils.py) | - - -## Step 4: Set weights - -Finally, as shown in the above [OCR subnet summary](#ocr-subnet-summary), the subnet validator normalizes the EMA scores and sets the weights of the subnet miners to the blockchain. This step is not in the Python notebooks. This step is performed by the function `set_weights` in the [ocr_subnet/base/validator.py](https://github.com/steffencruz/ocr_subnet/blob/main/ocr_subnet/base/validator.py#L206) and it is already available fully implemented in the OCR subnet repo. - -## Next steps - -Congratulations, you have successfully transformed your Python Notebook into a working Bittensor subnet. See below tips for your next steps. - -Can you think of ways your incentive mechanism would lead to undesirable behavior? For example: -- The positional structure of the invoice, i.e., how sections are positioned in the invoice, is mostly static and thus easily predictable. Hence all subnet miners may predict the position correctly without doing much work. This will render the position reward as ineffective. How can you avoid this? -- Experiment with the $\alpha$ hyperparameters to make the subnet miners compete more effectively. See [Reward model (incentive mechanism)](https://colab.research.google.com/drive/1Z2KT11hyKwsmMib8C6lDsY93vnomJznz#scrollTo=jcwFaIjwJnBj). \ No newline at end of file diff --git a/docs/utilities.md b/docs/utilities.md deleted file mode 100644 index 2a0ee7900d..0000000000 --- a/docs/utilities.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: "Utilities" ---- - -# Utilities - -This section describes the available utility scripts. - -## bt-next-adjust-block.js - -**Location**: `https://github.com/opentensor/developer-docs/tree/main/src/scripts/` - -**Description**: This `bt-next-adjustment-block.js` script queries a Bittensor subnet to find out how many blocks to go before the recycle register cost is recalculated. See the script for how to install and use it. \ No newline at end of file diff --git a/docs/validators/index.md b/docs/validators/index.md deleted file mode 100644 index 2c39063479..0000000000 --- a/docs/validators/index.md +++ /dev/null @@ -1,227 +0,0 @@ ---- -title: "Validating in Bittensor" ---- - -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Validating in Bittensor - -All mining and validating in Bittensor occur within a subnet. Each subnet independently produces the digital commodities that are its purpose, each subnet creator defining a different _incentive mechanism_ for validators to use in judging miners' work. The validator's work is to apply this incentive mechanism to miners, using it to score their performance, and then to submit these weights to the Bittensor blockchain. It is validators scores of miners' performance that determines the proportion of the subnet's emissions allocated to each miner, according to the Yuma Consensus algorithm. See [Emissions](../emissions.md). - -Browse the subnets and explore links to their code repositories on [TAO.app' subnets listings](https://tao.app). - -:::tip Typical compute requirements -Each subnet may have distinct hardware requirements, but this [minimum requirements template for subnet creators](https://github.com/opentensor/bittensor-subnet-template/blob/main/min_compute.yml) may give an idea of minimum memory, bandwidth and storage requirements for a typical subnet node. - -Validating is not supported on Windows. -::: - -## How it works - -Each subnet on the Bittensor blockchain supports a maximum of 256 active nodes, with each node assigned a unique UID slot. Out of these, only the top 64 nodes by emissions are eligible to serve as validators by default. A subnet with 64 validators means that all 64 top-ranked nodes meet the necessary criteria and choose to participate as validators. - -To qualify as a validator, a node must have a validator permit. This permit is only granted to nodes within the top 64 and allows them to submit miner evaluations using `btcli weights commit` or the SDK's [`set_weights`](pathname:///python-api/html/autoapi/bittensor/core/extrinsics/set_weights/index.html#module-bittensor.core.extrinsics.set_weights) function. - -:::tip Dynamic Validator Threshold -The number of validators isn't hardcoded. The subnet governor has the authority to increase or decrease the maximum number of validators. Any change to this limit directly affects the number of nodes that can be issued a validator permit and, thus, act as validators. -::: - -## Requirements for validation - -To have a **validator permit** in a given subnet, you must meet the following requirements: - -- Your hotkey must be registered, granting you a UID on the subnet -- You must have a stake-weight on the subnet of least 1000, including stake delegated to your hotkey from other wallets' coldkeys. A validator's stake weight in a subnet equals their alpha stake plus their TAO stake times the `tao_weight` parameter (current value: 0.18): - - $$ - - \text{Validator stake weight} = \alpha + 0.18 \times \tau - - $$ - -- You must be one of the top 64 nodes in the subnet, ranked by emissions. - -## Hotkey Association & Staking (subnet 0, the root subnet, only) - -:::tip Root Subnet (Subnet 0) only -Skip this step if you are not registering a validator on the root subnet (subnet 0) -::: - -```bash -btcli wallet associate-hotkey --wallet.name --hotkey -``` - -Add stake to your validator before registering: - -```bash -# Stake funds to your hotkey account within the subnet. -btcli stake add --wallet.name --wallet.hotkey -``` - -## Validator registration - -To participate as a validator, you must first register a hotkey with the subnet in order to receive a UID on that subnet. - -By default, a subnet can have a maximum of 64 active subnet validator UIDs. Upon registration, your hotkey, which is part of your wallet, becomes the holder of the UID slot. - -To register: - -```bash -btcli subnet register --netuid --wallet.name --hotkey -``` - -## Validator deregistration - -Validators, like miners, can be deregistered if their emissions are low. However, validator deregistration involves additional steps compared to miner deregistration. This is because an active validator must be among the top 64 nodes in the subnet and, therefore, cannot be instantly "pruned" by a newly registered node. - -When a validator falls below the top 64 nodes by emissions, or has less than the required 1000 total stake weight, it loses its validation permit, but is not therefore automatically deregistered. If a validator loses its validation permit and has no means to gain emissions, it will eventually become the node with the lowest emission, making it eligible for deregistration. - -:::info -Deregistration only occurs on subnets where all 256 UID slots are occupied. If a new registration occurs in a subnet with available UID slots, the registered neuron occupies one of the available UID slots. -::: - -Each tempo, the '[neuron](../learn/bittensor-building-blocks)' (miner _or_ validator node) with the lowest 'pruning score' (based solely on emissions), and that is no longer within its [immunity period](../subnets/subnet-hyperparameters.md#immunityperiod), risks being replaced by a newly registered neuron, who takes over that UID. - -:::info Deregistration is based on emissions -The subnet does not distinguish between miners and validators for the purpose of deregistration. The chain only looks at emissions (represented as 'pruning score'). Whenever a new registration occurs in the subnet, the neuron with the lowest emissions will get deregistered. -::: - -### Immunity period - -Every subnet has an `immunity_period` hyperparameter expressed in a number of blocks. A neuron's `immunity_period` starts when the miner or validator registers into the subnet. For more information, see [`immunity_period`](../subnets/subnet-hyperparameters.md#immunityperiod). - -A subnet neuron (miner or validator) at a UID (in that subnet) has `immunity_period` blocks to improve its performance. When `immunity_period` expires, that miner or validator can be deregistered if it has the lowest performance in the subnet and a new registration arrives. - -:::tip Special cases - -- In the unlikely event that all neurons are still immune, the one with the lowest "pruning score" will be deregistered by the next incoming registration. - -- In cases where two or more nodes have the lowest "pruning score", the older node gets deregistered first. - -- The subnet owner's hotkey has permanent immunity from deregistration. - ::: - -## Acquiring stake - -A validator's consensus weight and emissions depend on their hotkey's stake weight. You can stake your own TAO to your validator hotkey, or advertise your hotkey to others and seek stake. Any wallet's coldkey can stake to any hotkey, subsequently receiving emissions from that stake. - -:::tip Delegation -See [StakingDelegation](../staking-and-delegation/delegation.md) -::: - -### Add stake - -```bash -# Stake funds to your hotkey account within the subnet. -btcli stake add --wallet.name --wallet.hotkey -``` - -### Calculate TAO required - -The amount of TAO needed to acquire a validator permit depends on how the other largest 64 wallets distribute TAO across themselves. You can calculate the minimum using [bt.metagraph](pathname:///python-api/html/autoapi/bittensor/core/metagraph/index.html): - -```python -import bittensor as bt -subnet = bt.metagraph(1) -top_64_stake = sorted(subnet.S)[-64:] -print (f'Current requirement for validator permits based on the top 64 stake stands at {min(top_64_stake)} tao') -``` - -### Check the permit status - -Replace the string values for the `name` (``) and `hotkey` (``) with your own. -This information can be obtained from the metagraph using your UID. - -```python -import bittensor as bt -subnet = bt.metagraph(1) -wallet = bt.wallet( name = 'my_coldkey', hotkey = 'my_validator_hotkey' ) -my_uid = subnet.hotkeys.index( wallet.hotkey.ss58_address ) -print(f'Validator permit: {subnet.validator_permit(my_uid)}') -``` - -## Inspecting UIDs - -After you obtain a UID slot, you can view the status of your registered wallet by running: - -```bash -btcli wallet overview --netuid -``` - -After providing your wallet name at the prompt, you will see output like: - -| Parameter | Value | Description | -| :---------- | :----------------- | :------------------------------------------------------------------------- | -| COLDKEY | my_coldkey | The name of the coldkey associated with your slot. | -| HOTKEY | my_first_hotkey | The name of the hotkey associated with your slot. | -| UID | 5 | The index of the uid out of available uids. | -| ACTIVE | True | Whether or not the uid is considered active. | -| STAKE(τ) | 71.296 | The amount of stake in this wallet. | -| RANK | 0.0629 | This miner's absolute ranking according to validators on the network. | -| TRUST | 0.2629 | This miner's trust as a proportion of validators on the network. | -| CONSENSUS | 0.89 | This validator's aggregate consensus score. | -| INCENTIVE | 0.029 | This miner's incentive, TAO emission, is attained via mining. | -| DIVIDENDS | 0.001 | This validator's dividends, TAO emission, are attained via validating. | -| EMISSION | 29_340_153 | This miner's total emission in RAO (10^(-9) TAO) per block. | -| VTRUST | 0.96936 | This validator's trust score as a validator. | -| VPERMIT | \* | Whether this miner is considered active for validating on this subnetwork. | -| UPDATED | 43 | Blocks since this miner set weights on the chain. | -| AXON | 131.186.56.85:8091 | The entrypoint advertised by this miner on the bittensor blockchain. | -| HOTKEY_SS58 | 5F4tQyWr... | The ss58-encoded address of the miner's hotkey. | - -### Meaning of ACTIVE - -In the above table, the `ACTIVE` row applies only to UIDs that are subnet validators. It shows whether the UID is actively setting weights within the [`activity_cutoff`](../subnets/subnet-hyperparameters#activity_cutoff) window. If the UID has not set weights on the blockchain for the `activity_cutoff` duration, then the Yuma Consensus will consider this subnet validator offline, i.e., turned off (`False`). - -## Checking the registration status - -Use any of the Python code fragments below: - -- **Using Python interpreter**: Type "python" or "python3" on your macOS or Linux terminal, then copy/paste one of these snippets. -- **Using a Python file**: Copy a code snippet into, for example, `check_reg.py`, then run `python3 check_reg.py`. - -### With SS58 hotkey - -```python -import bittensor as bt -# Replace below with your SS58 hotkey -hotkey = "5HEo565WAy4Dbq3Sv271SAi7syBSofyfhhwRNjFNSM2gP9M2" -network = "finney" -sub = bt.subtensor(network) -print(f"Registration status for hotkey {hotkey} is: {sub.is_hotkey_registered(hotkey)}") -``` - -### With SS58 hotkey and netuid - -```python -import bittensor as bt -# Replace below with your SS58 hotkey -hotkey = "5HEo565WAy4Dbq3Sv271SAi7syBSofyfhhwRNjFNSM2gP9M2" -network = "finney" -netuid = 1 # subnet uid -sub = bt.subtensor(network) -mg = sub.metagraph(netuid) -if hotkey not in mg.hotkeys: - print(f"Hotkey {hotkey} deregistered") -else: - print(f"Hotkey {hotkey} is registered") -``` - -### With UID and SS58 hotkey - -```python -import bittensor as bt -# Replace below with your SS58 hotkey -hotkey = "5HEo565WAy4Dbq3Sv271SAi7syBSofyfhhwRNjFNSM2gP9M2" -network = "finney" -netuid = 1 # subnet uid -sub = bt.subtensor(network) -mg = sub.metagraph(netuid) -uid = 2 # Your UID -registered = mg.hotkeys[uid] == hotkey -if not registered: - print(f"Miner at uid {uid} not registered") -else: - print(f"Miner at uid {uid} registered") -``` diff --git a/docs/validators/validators-btcli-guide.md b/docs/validators/validators-btcli-guide.md deleted file mode 100644 index 269ba0380b..0000000000 --- a/docs/validators/validators-btcli-guide.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: "Validator's Guide to `BTCLI`" ---- - -# Validator's Guide to `BTCLI` - -Validators evaluate miner performance, and post their evaluations to the blockchain. This page discusses considerations specific to validators when using `btcli`. - -For general coverage of `btcli` permissions and requirements, see: [Bittensor CLI: Permissions Guide](../btcli-permissions) - -See also: [Coldkey and Hotkey Workstation Security](../getting-started/coldkey-hotkey-security). - -:::tip tips -It is highly recommended to use a unique hotkey per subnet. - -Note that hotkeys are not encrypted by default, but can be password [optionally encrypted](../working-with-keys#encrypting-the-hotkey). -::: - -## Requirements for validator functions - -### Unpermissioned workstation (public keys only): -- Check balances -- Monitor emissions and other metagraph info -- Check subnet alpha prices across Bittensor - -### Coldkey workstation: -- Create/import coldkey -- Manage TAO and alpha stake -- Create and register a hotkey on a secure coldkey workstation then transfer the hotkey file or mnemonic to the validator workstation: `btcli wallet new-hotkey` , `btcli wallet regen-hotkey` -- Transfer/rotate TAO and alpha stake in case of key compromise -- Rotate hotkeys in case of compromise -- Register a hotkey on a subnet with `btcli subnets register`, `btcli subnets pow-register` -- Set validator take with `btcli sudo set-take` - -### Validator node (hotkey workstation) - -These require a hotkey with an active validator permit on the subnet. Run in a live environment (the validator node), which is a hotkey workstation. - -- `btcli weights reveal`, `btcli weights commit` -- `btcli wt reveal`, `btcli wt commit` -- `btcli weight reveal`, `btcli weight commit` - -### Weight-setting requirements - -To set weights, a validator must meet several requirements. See [Requirements for validation](./#requirements-for-validation). - -## Key rotation - -If you suspect your coldkey may have been leaked, you can request to swap it out of your wallet, using an extrinsic blockchain transaction. This operation has a 5 day waiting period, during which your coldkey will be locked. The cost of this coldkey swap transaction is 0.1 TAO. - -See [Rotate/Swap your Coldkey](../subnets/schedule-coldkey-swap) - diff --git a/docs/working-with-keys.md b/docs/working-with-keys.md deleted file mode 100644 index 7df20d6b34..0000000000 --- a/docs/working-with-keys.md +++ /dev/null @@ -1,254 +0,0 @@ ---- -title: "Creating/Importing a Bittensor Wallet" ---- - -import ThemedImage from '@theme/ThemedImage'; -import useBaseUrl from '@docusaurus/useBaseUrl'; - -# Creating/Importing a Bittensor Wallet - -In Bittensor (like other cryptocurrency applications), a *wallet* is a tool for proving your identity, signing transactions, accessing your TAO, and managing your stake in subnets. - -This page describes several different ways to instantiate your wallet keypairs into a wallet application, in order to interact with the Bittensor blockchain. - -Recommended background reading: -- For an introduction to the core concepts, see [wallets and keys in Bittensor](getting-started/wallets.md). - -- For discussion of security considerations about working with Bittensor wallets, see [Coldkey and Hotkey Workstation Security](./getting-started/coldkey-hotkey-security). - -:::tip -The most critical operational goal when handling Bittensor wallets is to avoid losing or leaking your seed phrase. Make sure you [Handle your Seed Phrase/Mnemonic Securely](../keys/handle-seed-phrase). -::: - -## Creating a wallet with `btcli` - -### Creating a coldkey-only wallet - -Users that will not mine, validate, manage subnets or participate in governance do not need a hotkey, and for simplicity's sake should use coldkey-only wallets. - -Run the following command to create a coldkey-only wallet. - -```bash -btcli wallet new_coldkey --wallet.name -``` - -For example, -```bash -btcli wallet new_coldkey --wallet.name test-coldkey -``` -You will see the terminal output like the following, which includes your all-important seed phrase, a.k.a. the *mnemonic* to the coldkey. - -```text -IMPORTANT: Store this mnemonic in a secure (preferable offline place), as anyone who has possession of this mnemonic can use it to regenerate the key and access your tokens. - -The mnemonic to the new coldkey is: paddle disagree swamp hill innocent enemy name shrug produce steak pupil joke -You can use the mnemonic to recreate the key with `btcli` in case it gets lost. -``` - -### Creating a hotkey - -If you plan to validate or mine in a subnet, you must create both a coldkey and a hotkey. - -First, create a coldkey as described above in the [Creating a coldkey using `btcli`](#creating-a-coldkey-using-btcli). Then, provide this coldkey as a parameter to generate a hotkey. This will pair the hotkey with the coldkey. See below. - -Use the below command to generate the hotkey. Replace `` with the coldkey generated above, and `` with a name for your hotkey. - -```bash -btcli wallet new_hotkey --wallet.name --wallet.hotkey -``` - -For example, -```bash -btcli wallet new_hotkey --wallet.name test-coldkey --wallet.hotkey test-hotkey -``` - -You will see the terminal log like below. The mnemonic is hidden for security reasons. -```text -IMPORTANT: Store this mnemonic in a secure (preferably offline place), as anyone who has possession of this mnemonic can use it to regenerate the key and access your tokens. -The mnemonic to the new hotkey is: -**** *** **** **** ***** **** *** **** **** **** ***** ***** -You can use the mnemonic to recreate the key in case it gets lost. The command to use to regenerate the key using this mnemonic is: -btcli w regen_hotkey --mnemonic **** *** **** **** ***** **** *** **** **** **** ***** ***** -``` -:::tip Regenerating the hotkey -Make a note of the above command option `regen_hotkey` showing how to regenerate your hotkey in case you lose it. -::: - -### Encrypting the hotkey - -By default, the hotkey is not encrypted on the device, whereas the coldkey is encrypted. To encrypt your hotkey, run this command: -```bash -btcli wallet new_hotkey --use-password -``` - -## Creating a wallet using Python - -Copy and paste the following three lines into your Python interpreter. Replace the string values for `name` (`my_coldkey`) and `hotkey` (`my_hotkey`) with your own. - -```python showLineNumbers -import bittensor as bt -wallet = bt.wallet(name = 'my_coldkey', hotkey = 'my_hotkey' ) -wallet.create_if_non_existent() -``` - -You will see a terminal output like this for an example wallet with `name` as `test-coldkey` and `hotkey` as `test-hotkey`. The mnemonic is hidden for security reasons. -```text ->>> import bittensor as bt ->>> wallet = bt.wallet(name = 'test-coldkey', hotkey = 'test-hotkey') ->>> wallet.create_if_non_existent() - -IMPORTANT: Store this mnemonic in a secure (preferable offline place), as anyone who has possession of this mnemonic can use it to regenerate the key and access your tokens. - -The mnemonic to the new coldkey is: - -**** **** **** **** **** **** **** **** **** **** **** **** - -You can use the mnemonic to recreate the key in case it gets lost. The command to use to regenerate the key using this mnemonic is: -btcli w regen_coldkey --mnemonic **** **** **** **** **** **** **** **** **** **** **** **** - -Specify password for key encryption: -Retype your password: - -IMPORTANT: Store this mnemonic in a secure (preferable offline place), as anyone who has possession of this mnemonic can use it to regenerate the key and access your tokens. - -The mnemonic to the new hotkey is: - -**** **** **** **** **** **** **** **** **** **** **** **** - -You can use the mnemonic to recreate the key in case it gets lost. The command to use to regenerate the key using this mnemonic is: -btcli w regen_hotkey --mnemonic **** **** **** **** **** **** **** **** **** **** **** **** - -wallet(test-coldkey, test-hotkey, ~/.bittensor/wallets/) -``` - -## Location and addresses of the local wallets - -Both `btcli` and the Bittensor Python SDK use a local wallet/key store. By default, this is located on your machine at `~/.bittensor/wallets`. Use the below command to list them: - -```bash -tree ~/.bittensor/ -``` - -You will see an output like this: - -```bash -tree ~/.bittensor/ -/Users/docwriter/.bittensor/ # The Bittensor root directory. -└── wallets # The folder contains all Bittensor wallets. - └── test-coldkey # The name of the wallet. -    ├── coldkey # The password-encrypted coldkey. -    ├── coldkeypub.txt # The unencrypted version of the coldkey. -    └── hotkeys # The folder contains all this coldkey's hotkeys. -    └── test-hotkey # The unencrypted hotkey information. -``` - -and listing out the contents of the `coldkeypub.txt` file: - -```bash -cd ~/.bittensor/wallets/test-coldkey -cat coldkeypub.txt | jq -{ - "accountId": "0x36e49805b105af2b5572cfc86426247df111df2f584767ca739d9fa085246c51", - "publicKey": "0x36e49805b105af2b5572cfc86426247df111df2f584767ca739d9fa085246c51", - "privateKey": null, - "secretPhrase": null, - "secretSeed": null, - "ss58Address": "5DJgMDvzC27QTBfmgGQaNWBQd8CKP9z5A12yjbG6TZ5bxNE1" -} -``` - -The contents of the `coldkeypub.txt` are to be interpreted as below: - -- The fields `accountId` and `publicKey` contain the same value. -- The `secretPhrase` and `secretSeed` are not included in the file due to the high-security nature of the coldkey. When you create your wallet, either using the Chrome extension or `btcli`, the mnemonic (`secretPhrase`) is shown only once, while `secretSeed` is not shown. -- The `ss58Address` is the SS58-version of the `accountId` or `publicKey`. **This is your coldkey's public address, and can be used to transfer TAO from another wallet.** - -:::tip Conversion between publicKey and ss58Address -Use this site [SS58.org](https://ss58.org/) to verify the conversions between `publicKey` and `ss58Address` fields. -::: - -Similarly, listing out the contents of the `hotkeys/test-hotkey` file: - -```bash -cat hotkeys/test-hotkey | jq -{ - "accountId": "0xc66695556006c79e278f487b01d44cf4bc611f195615a321bf3208f5e351621e", - "publicKey": "0xc66695556006c79e278f487b01d44cf4bc611f195615a321bf3208f5e351621e", - "privateKey": "0x38d3ae3b6e4b5df8415d15f44f * * * 0f975749f835fc221b * * * cbaac9f5ba6b1c90978e3858 * * * f0e0470be681c0b28fe2d64", - "secretPhrase": "pyramid xxx wide slush xxx hub xxx crew spin xxx easily xxx", - "secretSeed": "0x6c359cc52ff1256c9e5 * * * 5536c * * * 892e9ffe4e4066ad2a6e35561d6964e", - "ss58Address": "5GYqp3eKu6W7KxhCNrHrVaPjsJHHLuAs5jbYWfeNzVudH8DE" -} -``` - -The contents of the `hotkeys/test-hotkey` file are to be interpreted as below: - -- The fields `accountId` and `publicKey` contain the same value, just as seen in `coldkeypub.txt`. -- The `secretPhrase` and `secretSeed` are shown because the hotkey is, by default, not encrypted. -- The `ss58Address` is the SS58-version of the `accountId` or `publicKey`. **This is your hotkey's public address and can be used to stake/delegate to your hotkey from other wallets.** - -:::danger -Hotkeys are for staking. Do not *transfer* TAO to a hotkey! -::: - -## Listing all the local wallets - -You can list all the local wallets stored in Bittensor's root directly with: -```bash -btcli wallet list -``` -You will see a terminal output like this: -```text -Wallets -└─ - test-coldkey (5DJgMDvzC27QTBfmgGQaNWBQd8CKP9z5A12yjbG6TZ5bxNE1) - └── test-hotkey (5GYqp3eKu6W7KxhCNrHrVaPjsJHHLuAs5jbYWfeNzVudH8DE) -``` - -The output will show only the `ss58Address` field values from the `coldkeypub.txt` and `test-hotkey` files of the wallets. - -:::tip Use the ss58Address keys as destinations for TAO -Use the above shown `ss58Address` field values as your public wallet addresses, i.e., as destinations for TAO transfers from another wallet to your wallet. For example, when using a command: `btcli wallet transfer`. -::: - -## Store your mnemonics safely - -:::danger If someone has your mnemonic, they own your TAO -If you lose the password to your wallet, or if you have lost access to the machine where the wallet is stored, you can regenerate the coldkey using the mnemonic you saved during the wallet creation steps above. You can **not** retrieve the wallet with the password alone. Remember that if someone has your mnemonic, they own your TAO. -::: - -As a reminder, if you need to regenerate your wallets, you can use the `btcli` with your mnemonic, as shown below: - -```bash -btcli wallet regen_coldkey --mnemonic **** *** **** **** ***** **** *** **** **** **** ***** ***** -``` - -## Creating a Wallet with the Chrome Extension - -[The Chrome extension...](https://chromewebstore.google.com/detail/bittensor-wallet/bdgmdoedahdcjmpmifafdhnffjinddgc) - -:::tip Suitable for non-technical users -Use this option if your activities are limited to sending and receiving TAO and you are not creating a subnet or participating as a subnet validator or a subnet miner. -::: - -1. The Wallet will first create a wallet account address in the form of a 48-hexadecimal character string that usually starts with `5`. -2. Critically, the Wallet will display your [*seed phrase*](./getting-started/wallets#the-seed-phrase-aka-mnemonic), which you must carefully save. -3. The Wallet will then prompt you for specific mnemonic words as a way of authentication. -4. Next, you will assign a name and a password to your wallet account. -5. Finally, to receive TAO from another party, you will give them your wallet account address from Step 1 (the 48-hexadecimal character string) as the destination address. Similarly, to send (transfer) TAO to another party, you will first ask them for their wallet address and send TAO to their wallet address. This way, you can create multiple wallet accounts, each with a different name and even a different password for each wallet account. - -## Updating legacy wallet - -It is important that you update any legacy Bittensor wallets to the new NaCL format for security. You may accomplish this with the `btcli` using the `wallet update` subcommands. - -See the below example command and the terminal output: -```bash -btcli wallet update -``` -You will see an output like this: -```bash ->> Do you want to update all legacy wallets? [y/n]: y ->> ===== wallet(test-coldkey, default, ~/.bittensor/wallets/) ===== ->> ✅ Keyfile is updated. ->> 🔑 Keyfile (NaCl encrypted, /Users/docwriter/.bittensor/wallets/test-coldkey/coldkey)> -``` diff --git a/docs/yuma-consensus.md b/docs/yuma-consensus.md deleted file mode 100644 index c5e57c42e8..0000000000 --- a/docs/yuma-consensus.md +++ /dev/null @@ -1,103 +0,0 @@ ---- -title: "Yuma Consensus" ---- - -# Yuma Consensus - -## Introduction - -Yuma Consensus (YC) is a critical algorithmic process within Bittensor, which runs on-chain within Subtensor. Its responsibility is to compute validator and miner emissions from validators' rankings of miners. - -Each of a subnet's validators periodically submit a vector of weights ranking the value of the work of each miner they've evaluated. The YC algorithm resolves this matrix of rankings into two **emissions vectors** that allocate emissions over participants based on their performance: one each for **miners** and **validators**. - -The algorithm is designed to more heavily weight the inputs of more trusted validators, in order to ignore the portion of the validation signal that is less reliable. By disregarding unreliable weight-settings, YC incentivizes validators to be worthy of trust by working hard to give consistent, fast, honest evaluations of miners that predict the eventual convergence of other validators' evaluations. YC incentivizes miners to work hard for the highest combined evaluation by the community of validators. - -See: -- [Emissions](./emissions) -- [Subtensor Docs: Yuma Consensus](https://github.com/opentensor/subtensor/blob/main/docs/consensus.md) - -## Clipping - -Clipping is designed to punish innacurate miner evaluation, especially in patterns that could constitute collusion to manipulate the accuracy of consensus to favor certain miners. - -To achieve this, the judgment of the most trusted validators (as measured by stake) serves as a benchmark. Weights that exceed this benchmark are *clipped*, meaning neither the miner nor the validator receives emissions for them. - -This clipping protects against erroneous or collusive over-evaluation of miners by validators. - -To compute the benchmark $\overline{W_j}$ for miner $j$ and set $\mathbb{V}$ of the subnet's validators, we gather all validator weights $W_{ij}$ for any validator $i \in \mathbb{V}$, sort them by validator’s **stake** $S_i$, and then find the maximum weight level $w$ supported by at least a fraction $\kappa$ of total stake. - -$$ -\overline{W_j} = \arg \max_{w} -\Bigl(\, - \sum_{i \in \mathbb{V}} S_i \,\cdot\, \bigl\{\,W_{ij}\,\ge w \bigr\} \ge \kappa -\Bigr). -$$ - -Any validator’s original weight $W_{ij}$ above $\overline{W_j}$ is clipped to: - -$$ -\overline{W_{ij}} = \min( W_{ij}, \overline{W_j} ) -$$ - -:::tip note -Kappa is a configurable hyperparameter with default: $\kappa = 0.5$. - -This means that if *least* generous half (0.5) of the validators (with each validator measured by stake, not 1 per validator) set weights for a given miner to no more than x, then the weights of the other, more generous, half of the validators for that miner are going to be clipped down to x. 'Generous' here refers to giving a high weight to the miner in question. -::: - -## Miner emissions - -Miner emissions are based on an aggregate ranking which is the summed rankings of validators, weighted by validators' stake, where $\overline{W_{ij}}$ is the post-clip weight. - -$$ -R_j = \sum_{i \in \mathbb{V}} S_i \,\cdot\, \overline{W_{ij}} -$$ - -Each miner $j$’s share $M_j$ of the subnet's miner-emissions (41% of each subnet's overall emissions) is equal to their proportion of the total aggregate miner ranking. Where $\mathbb{M}$ is the subnet's miners: - -$$ -M_j = \frac{\,R_j\,}{\sum_{k \in \mathbb{M}} R_k} -$$ - -## Penalizing out-of-consensus bonds - -If a validator's evaluation of a miner is too high, it is penalized. If a submitted weight $W_{ij}$ by validator $i$ for miner $j$ exceeds the $j$'s consensus evaluation, $\overline{W_j}$, its bond value is penalized by factor $\beta$. - -Bond-weight $\widetilde{W_{ij}}$ is: - -$$ -\widetilde{W_{ij}} -= (1-\beta)\,W_{ij} +\beta\,\overline{W_{ij}} -$$ - -:::tip note -Penalty factor $\beta$ is a configurable hyperparameter. -::: - -## Bonding mechanics - -The **instant bond** $\Delta B_{ij}$ of validator $i$ to miner $j$ is equal to $i$’s stake, $\,S_i$ times $i$'s bond-weight for $j$ normalized by $j$'s total bond-weight for all $\mathbb{V}$ of the subnet's validators: - -$$ -\Delta B_{ij} = \frac{\,S_i \,\cdot\, \widetilde{W_{ij}}\,}{ - \sum_{k \in \mathbb{V}} S_k \,\cdot\, \widetilde{W_{kj}}} -$$ - -This then updates an **exponential moving average (EMA) bond**: - -$$ -B_{ij}^{(t)} = \alpha \,\Delta B_{ij} + (1-\alpha)\,B_{ij}^{(t-1)} -$$ - -Validators who stay near consensus build stronger EMA bonds and thus extract more emissions, while any attempt to overstate a particular miner’s performance is penalized. The EMA smooths out abrupt swings in validator behavior and incentivizes consistent alignment with the consensus. - -:::tip note -The $\alpha$ variable here is unrelated to the concept of subnet specific currencies, referred to as alpha $\alpha$ tokens. Here $\alpha$ refers to a factor used in this EMA smoothing function—see [consensus-based weights, a.k.a. liquid alpha](./subnets/consensus-based-weights.md). -::: - -## Validator emissions - -Each validator $i$’s share $V_i$ of validator emissions (41% of each subnet's total emissions) is the sum of all of its bonds to miners, weighted by the miner's total emissions: -$$ -V_i = \sum_{j \in \mathbb{M}} \Bigl(\,B_{ij} \,\times\, M_j\Bigr) -$$ \ No newline at end of file diff --git a/docusaurus.config.js b/docusaurus.config.js index 477c973ae2..f215f81a02 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -1,258 +1,45 @@ // @ts-check // Note: type annotations allow type checking and IDEs autocompletion -// const lightCodeTheme = require("prism-react-renderer/themes/github"); -// const darkCodeTheme = require("prism-react-renderer/themes/dracula"); -const { themes } = require("prism-react-renderer"); -const lightTheme = themes.github; -const darkTheme = themes.dracula; - -// KaTex stuff -// const math = require("remark-math"); -// const katex = require("rehype-katex"); -import remarkMath from 'remark-math'; -import rehypeKatex from 'rehype-katex'; - - /** @type {import('@docusaurus/types').Config} */ const config = { title: "Bittensor", tagline: "Developer Documentation", favicon: "img/favicon.ico", - // Set the production url of your site here url: "https://docs.bittensor.com", - // Set the // pathname under which your site is served - // For GitHub pages deployment, it is often '//' baseUrl: "/", - // GitHub pages deployment config. - // If you aren't using GitHub pages, you don't need these. - organizationName: "opentensor", // Usually your GitHub org/user name. - projectName: "developer-docs", // Usually your repo name. + organizationName: "opentensor", + projectName: "developer-docs", onBrokenLinks: "throw", onBrokenMarkdownLinks: "throw", - // Even if you don't use internalization, you can use this field to set useful - // metadata like html lang. For example, if your site is Chinese, you may want - // to replace "en" with "zh-Hans". - - customFields: { - enableIssueLinks: true, // Set to true to enable issue links - enableEditUrlLinks: true, // Set to true to enable edit url links - issueBaseUrl: "https://github.com/opentensor/developer-docs/issues", - enableFeedback: false, // Set to false to disable feedback - }, i18n: { defaultLocale: "en", locales: ["en"], }, + presets: [ [ "@docusaurus/preset-classic", /** @type {import('@docusaurus/preset-classic').Options} */ ({ - docs: { - routeBasePath: "/", - path: "docs", - remarkPlugins: [remarkMath], - rehypePlugins: [rehypeKatex], - sidebarPath: require.resolve("./sidebars.js"), - sidebarCollapsible: true, - showLastUpdateTime: true, - docItemComponent: "@theme/DocItem", - editUrl: "https://github.com/opentensor/developer-docs/blob/main/", - }, + docs: false, // Disable docs + blog: false, // Disable blog theme: { customCss: require.resolve("./src/css/custom.css"), }, }), ], ], - plugins: [ - // "@gracefullight/docusaurus-plugin-vercel-analytics", - [ - "@docusaurus/plugin-client-redirects", - { - redirects: [ - { - to: "/btcli", - from: "/reference/btcli", - }, - { - to: "/staking-and-delegation/delegation", - from: "/delegation", - }, - { - to: "/staking-and-delegation/staking-polkadot-js", - from: "/staking/staking-polkadot-js", - }, - { - to: "/staking-and-delegation/delegation", - from: "/staking", - }, - { - from: "/subnets/register-validate-mine", - to: "validators/index" - }, - { - from: "/recycled-tao", - to: "/glossary" - }, - { - to: "/subnets/walkthrough-prompting", - from: "/subnets/code-walkthrough-text-prompting", - }, - { - to: "/subtensor-nodes", - from: "/getting-started/running-a-public-subtensor", - }, - { - to: "/", - from: "/subnet-pages", - }, - { - to: "/subnets/schedule-coldkey-swap", - from: "/schedule-key-swap", - }, - { - to: "/subnets/schedule-coldkey-swap", - from: "/subnets/schedule-key-swap", - }, - { - to: "/bt-api-ref", - from: "/reference/bittensor-api-ref", - }, - { - to: "/errors", - from: "/subtensor-nodes/subtensor-error-messages", - }, - ], - }, - ], - ], - scripts: [ - { - src: "https://unpkg.com/@antonz/codapi@0.19.10/dist/settings.js", - defer: true, - }, - { - src: "https://unpkg.com/@antonz/codapi@0.19.10/dist/snippet.js", - defer: true, - }, - ], - // clientModules: ["/static/feedbug-widjet.js"], - - stylesheets: [ - { - href: "https://cdn.jsdelivr.net/npm/katex@0.13.24/dist/katex.min.css", - type: "text/css", - integrity: - "sha384-odtC+0UGzzFL/6PNoE8rX/SPcQDXBJ+uRepguP4QkPCm2LBxH3FA3y+fKSiJ+AmM", - crossorigin: "anonymous", - }, - { - href: "https://unpkg.com/@antonz/codapi@0.19.10/dist/snippet.css", - }, - ], themeConfig: /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ ({ - // Replace with your project's social card - image: "img/bittensor-dev-docs-social-card.png", - docs: { - sidebar: { - autoCollapseCategories: true, - hideable: false, - }, - }, - // announcementBar: { - // id: 'support_us', - // content: - // 'The dynamic TAO docs are preliminary. Check
this page for more.', - // backgroundColor: '#171717', - // textColor: '#f43228', - // isCloseable: false, - // }, - navbar: { - logo: { - alt: "Bittensor", - src: "img/logo.svg", - srcDark: "img/logo-dark-mode.svg", - href: "https://bittensor.com", - style: { - objectFit: "contain", - width: 21, - }, - }, - items: [ - { - position: "left", - label: "What is Bittensor?", - to: "learn/introduction", - }, - { - position: "left", - label: "SubtensorAPI", - to: "sdk/subtensor-api", - }, - { - position: "left", - label: "Bittensor SDK Reference", - to: "bt-api-ref", - }, - { - position: "left", - label: "BTCLI Live Coding Playground", - to: "btcli/btcli-playground", - }, - - { - position: "left", - label: "EVM on Bittensor", - to: "evm-tutorials", - }, - { - type: "search", - position: "left", - className: "custom_algolia", - }, - { - to: "bittensor-rel-notes", - label: "Releases", - position: "left", - }, - { - href: "https://github.com/opentensor/developer-docs", - label: "Docs GitHub", - position: "right", - }, - ], - }, - - prism: { - theme: lightTheme, - darkTheme: darkTheme, - additionalLanguages: ["bash", "python", "diff", "json", "yaml"], - }, - algolia: { - appId: "B07G29NY9F", - apiKey: "d23c920e8a9bdae899572be3c8494696", - indexName: "new--alpha", - contextualSearch: true, - insights: true, - debug: false, + items: [], // Remove all navbar items }, footer: { - copyright: ` -
- © ${new Date().getFullYear()} BittensorLatent Holdings, all rights reserved. - contact the docs team -
- - logo - - `, + copyright: `© ${new Date().getFullYear()} BittensorLatent Holdings`, }, }), }; diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 599ad73957..0000000000 --- a/package-lock.json +++ /dev/null @@ -1,17442 +0,0 @@ -{ - "name": "bittensor-docs", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "bittensor-docs", - "version": "0.0.0", - "dependencies": { - "@docusaurus/core": "^3.4.0", - "@docusaurus/plugin-client-redirects": "^3.4.0", - "@docusaurus/preset-classic": "^3.4.0", - "@gracefullight/docusaurus-plugin-vercel-analytics": "^1.0.0", - "@mdx-js/react": "^3.0.0", - "@vercel/analytics": "^1.1.2", - "clsx": "^1.2.1", - "hast-util-is-element": "1.1.0", - "prism-react-renderer": "^2.1.0", - "punycode": "^2.3.1", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-icons": "^4.12.0", - "rehype-katex": "^7.0.1", - "remark-definition-list": "^2.0.0", - "remark-math": "^6.0.0", - "zwitch": "^2.0.4" - }, - "devDependencies": { - "@docusaurus/module-type-aliases": "^3.3.2", - "@docusaurus/tsconfig": "^3.3.2", - "@docusaurus/types": "^3.3.2", - "typescript": "~5.2.2" - }, - "engines": { - "node": ">=18.0" - } - }, - "node_modules/@algolia/autocomplete-core": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", - "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", - "@algolia/autocomplete-shared": "1.9.3" - } - }, - "node_modules/@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", - "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-shared": "1.9.3" - }, - "peerDependencies": { - "search-insights": ">= 1 < 3" - } - }, - "node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", - "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-shared": "1.9.3" - }, - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/@algolia/autocomplete-shared": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", - "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", - "license": "MIT", - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.22.1.tgz", - "integrity": "sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g==", - "license": "MIT", - "dependencies": { - "@algolia/cache-common": "4.22.1" - } - }, - "node_modules/@algolia/cache-common": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.22.1.tgz", - "integrity": "sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==", - "license": "MIT" - }, - "node_modules/@algolia/cache-in-memory": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.22.1.tgz", - "integrity": "sha512-ve+6Ac2LhwpufuWavM/aHjLoNz/Z/sYSgNIXsinGofWOysPilQZPUetqLj8vbvi+DHZZaYSEP9H5SRVXnpsNNw==", - "license": "MIT", - "dependencies": { - "@algolia/cache-common": "4.22.1" - } - }, - "node_modules/@algolia/client-account": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.22.1.tgz", - "integrity": "sha512-k8m+oegM2zlns/TwZyi4YgCtyToackkOpE+xCaKCYfBfDtdGOaVZCM5YvGPtK+HGaJMIN/DoTL8asbM3NzHonw==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "4.22.1", - "@algolia/client-search": "4.22.1", - "@algolia/transporter": "4.22.1" - } - }, - "node_modules/@algolia/client-analytics": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.22.1.tgz", - "integrity": "sha512-1ssi9pyxyQNN4a7Ji9R50nSdISIumMFDwKNuwZipB6TkauJ8J7ha/uO60sPJFqQyqvvI+px7RSNRQT3Zrvzieg==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "4.22.1", - "@algolia/client-search": "4.22.1", - "@algolia/requester-common": "4.22.1", - "@algolia/transporter": "4.22.1" - } - }, - "node_modules/@algolia/client-common": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.22.1.tgz", - "integrity": "sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ==", - "license": "MIT", - "dependencies": { - "@algolia/requester-common": "4.22.1", - "@algolia/transporter": "4.22.1" - } - }, - "node_modules/@algolia/client-personalization": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.22.1.tgz", - "integrity": "sha512-sl+/klQJ93+4yaqZ7ezOttMQ/nczly/3GmgZXJ1xmoewP5jmdP/X/nV5U7EHHH3hCUEHeN7X1nsIhGPVt9E1cQ==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "4.22.1", - "@algolia/requester-common": "4.22.1", - "@algolia/transporter": "4.22.1" - } - }, - "node_modules/@algolia/client-search": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.22.1.tgz", - "integrity": "sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "4.22.1", - "@algolia/requester-common": "4.22.1", - "@algolia/transporter": "4.22.1" - } - }, - "node_modules/@algolia/events": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", - "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==", - "license": "MIT" - }, - "node_modules/@algolia/logger-common": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.22.1.tgz", - "integrity": "sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==", - "license": "MIT" - }, - "node_modules/@algolia/logger-console": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.22.1.tgz", - "integrity": "sha512-O99rcqpVPKN1RlpgD6H3khUWylU24OXlzkavUAMy6QZd1776QAcauE3oP8CmD43nbaTjBexZj2nGsBH9Tc0FVA==", - "license": "MIT", - "dependencies": { - "@algolia/logger-common": "4.22.1" - } - }, - "node_modules/@algolia/requester-browser-xhr": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.22.1.tgz", - "integrity": "sha512-dtQGYIg6MteqT1Uay3J/0NDqD+UciHy3QgRbk7bNddOJu+p3hzjTRYESqEnoX/DpEkaNYdRHUKNylsqMpgwaEw==", - "license": "MIT", - "dependencies": { - "@algolia/requester-common": "4.22.1" - } - }, - "node_modules/@algolia/requester-common": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.22.1.tgz", - "integrity": "sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==", - "license": "MIT" - }, - "node_modules/@algolia/requester-node-http": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.22.1.tgz", - "integrity": "sha512-JfmZ3MVFQkAU+zug8H3s8rZ6h0ahHZL/SpMaSasTCGYR5EEJsCc8SI5UZ6raPN2tjxa5bxS13BRpGSBUens7EA==", - "license": "MIT", - "dependencies": { - "@algolia/requester-common": "4.22.1" - } - }, - "node_modules/@algolia/transporter": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.22.1.tgz", - "integrity": "sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ==", - "license": "MIT", - "dependencies": { - "@algolia/cache-common": "4.22.1", - "@algolia/logger-common": "4.22.1", - "@algolia/requester-common": "4.22.1" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", - "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.0", - "@babel/generator": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.0", - "@babel/parser": "^7.26.0", - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.26.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.23.10", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.10.tgz", - "integrity": "sha512-2XpP2XhkXzgxecPNEEK8Vz8Asj9aRxt08oKOqtiZoqV2UGZ5T+EkyP9sXQ9nwMxBIG34a7jmasVqoMop7VdPUw==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", - "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", - "license": "MIT", - "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.26.3" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", - "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", - "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", - "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", - "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", - "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", - "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", - "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", - "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", - "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", - "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", - "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", - "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", - "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", - "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", - "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", - "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", - "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", - "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", - "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", - "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", - "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", - "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", - "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", - "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz", - "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==", - "license": "MIT", - "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", - "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", - "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", - "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", - "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", - "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", - "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", - "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", - "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", - "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.23.3.tgz", - "integrity": "sha512-zP0QKq/p6O42OL94udMgSfKXyse4RyJ0JqbQ34zDAONWjyrEsghYEyTSK5FIpmXmCpB55SHokL1cRRKHv8L2Qw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz", - "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", - "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/types": "^7.23.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", - "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", - "license": "MIT", - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz", - "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", - "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", - "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.9.tgz", - "integrity": "sha512-A7clW3a0aSjm3ONU9o2HAILSegJCYlEZmOhmBRReVtIpY/Z/p7yIZ+wR41Z+UipwdGuqwtID/V/dOdZXjwi9gQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.8", - "babel-plugin-polyfill-corejs3": "^0.9.0", - "babel-plugin-polyfill-regenerator": "^0.5.5", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", - "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", - "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", - "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", - "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", - "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz", - "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.23.6", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-typescript": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", - "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", - "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", - "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", - "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.9.tgz", - "integrity": "sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.23.3", - "@babel/plugin-syntax-import-attributes": "^7.23.3", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.9", - "@babel/plugin-transform-async-to-generator": "^7.23.3", - "@babel/plugin-transform-block-scoped-functions": "^7.23.3", - "@babel/plugin-transform-block-scoping": "^7.23.4", - "@babel/plugin-transform-class-properties": "^7.23.3", - "@babel/plugin-transform-class-static-block": "^7.23.4", - "@babel/plugin-transform-classes": "^7.23.8", - "@babel/plugin-transform-computed-properties": "^7.23.3", - "@babel/plugin-transform-destructuring": "^7.23.3", - "@babel/plugin-transform-dotall-regex": "^7.23.3", - "@babel/plugin-transform-duplicate-keys": "^7.23.3", - "@babel/plugin-transform-dynamic-import": "^7.23.4", - "@babel/plugin-transform-exponentiation-operator": "^7.23.3", - "@babel/plugin-transform-export-namespace-from": "^7.23.4", - "@babel/plugin-transform-for-of": "^7.23.6", - "@babel/plugin-transform-function-name": "^7.23.3", - "@babel/plugin-transform-json-strings": "^7.23.4", - "@babel/plugin-transform-literals": "^7.23.3", - "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", - "@babel/plugin-transform-member-expression-literals": "^7.23.3", - "@babel/plugin-transform-modules-amd": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.9", - "@babel/plugin-transform-modules-umd": "^7.23.3", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.23.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", - "@babel/plugin-transform-numeric-separator": "^7.23.4", - "@babel/plugin-transform-object-rest-spread": "^7.23.4", - "@babel/plugin-transform-object-super": "^7.23.3", - "@babel/plugin-transform-optional-catch-binding": "^7.23.4", - "@babel/plugin-transform-optional-chaining": "^7.23.4", - "@babel/plugin-transform-parameters": "^7.23.3", - "@babel/plugin-transform-private-methods": "^7.23.3", - "@babel/plugin-transform-private-property-in-object": "^7.23.4", - "@babel/plugin-transform-property-literals": "^7.23.3", - "@babel/plugin-transform-regenerator": "^7.23.3", - "@babel/plugin-transform-reserved-words": "^7.23.3", - "@babel/plugin-transform-shorthand-properties": "^7.23.3", - "@babel/plugin-transform-spread": "^7.23.3", - "@babel/plugin-transform-sticky-regex": "^7.23.3", - "@babel/plugin-transform-template-literals": "^7.23.3", - "@babel/plugin-transform-typeof-symbol": "^7.23.3", - "@babel/plugin-transform-unicode-escapes": "^7.23.3", - "@babel/plugin-transform-unicode-property-regex": "^7.23.3", - "@babel/plugin-transform-unicode-regex": "^7.23.3", - "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.8", - "babel-plugin-polyfill-corejs3": "^0.9.0", - "babel-plugin-polyfill-regenerator": "^0.5.5", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.23.3.tgz", - "integrity": "sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-transform-react-display-name": "^7.23.3", - "@babel/plugin-transform-react-jsx": "^7.22.15", - "@babel/plugin-transform-react-jsx-development": "^7.22.5", - "@babel/plugin-transform-react-pure-annotations": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", - "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-typescript": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "license": "MIT" - }, - "node_modules/@babel/runtime": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", - "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.23.9.tgz", - "integrity": "sha512-oeOFTrYWdWXCvXGB5orvMTJ6gCZ9I6FBjR+M38iKNXCsPxr4xT0RTdg5uz1H7QP8pp74IzPtwritEr+JscqHXQ==", - "license": "MIT", - "dependencies": { - "core-js-pure": "^3.30.2", - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@docsearch/css": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.5.2.tgz", - "integrity": "sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==", - "license": "MIT" - }, - "node_modules/@docsearch/react": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.5.2.tgz", - "integrity": "sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==", - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-core": "1.9.3", - "@algolia/autocomplete-preset-algolia": "1.9.3", - "@docsearch/css": "3.5.2", - "algoliasearch": "^4.19.1" - }, - "peerDependencies": { - "@types/react": ">= 16.8.0 < 19.0.0", - "react": ">= 16.8.0 < 19.0.0", - "react-dom": ">= 16.8.0 < 19.0.0", - "search-insights": ">= 1 < 3" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "search-insights": { - "optional": true - } - } - }, - "node_modules/@docusaurus/core": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.4.0.tgz", - "integrity": "sha512-g+0wwmN2UJsBqy2fQRQ6fhXruoEa62JDeEa5d8IdTJlMoaDaEDfHh7WjwGRn4opuTQWpjAwP/fbcgyHKlE+64w==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.23.3", - "@babel/generator": "^7.23.3", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.22.9", - "@babel/preset-env": "^7.22.9", - "@babel/preset-react": "^7.22.5", - "@babel/preset-typescript": "^7.22.5", - "@babel/runtime": "^7.22.6", - "@babel/runtime-corejs3": "^7.22.6", - "@babel/traverse": "^7.22.8", - "@docusaurus/cssnano-preset": "3.4.0", - "@docusaurus/logger": "3.4.0", - "@docusaurus/mdx-loader": "3.4.0", - "@docusaurus/utils": "3.4.0", - "@docusaurus/utils-common": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", - "autoprefixer": "^10.4.14", - "babel-loader": "^9.1.3", - "babel-plugin-dynamic-import-node": "^2.3.3", - "boxen": "^6.2.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "clean-css": "^5.3.2", - "cli-table3": "^0.6.3", - "combine-promises": "^1.1.0", - "commander": "^5.1.0", - "copy-webpack-plugin": "^11.0.0", - "core-js": "^3.31.1", - "css-loader": "^6.8.1", - "css-minimizer-webpack-plugin": "^5.0.1", - "cssnano": "^6.1.2", - "del": "^6.1.1", - "detect-port": "^1.5.1", - "escape-html": "^1.0.3", - "eta": "^2.2.0", - "eval": "^0.1.8", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "html-minifier-terser": "^7.2.0", - "html-tags": "^3.3.1", - "html-webpack-plugin": "^5.5.3", - "leven": "^3.1.0", - "lodash": "^4.17.21", - "mini-css-extract-plugin": "^2.7.6", - "p-map": "^4.0.0", - "postcss": "^8.4.26", - "postcss-loader": "^7.3.3", - "prompts": "^2.4.2", - "react-dev-utils": "^12.0.1", - "react-helmet-async": "^1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", - "react-loadable-ssr-addon-v5-slorber": "^1.0.1", - "react-router": "^5.3.4", - "react-router-config": "^5.1.1", - "react-router-dom": "^5.3.4", - "rtl-detect": "^1.0.4", - "semver": "^7.5.4", - "serve-handler": "^6.1.5", - "shelljs": "^0.8.5", - "terser-webpack-plugin": "^5.3.9", - "tslib": "^2.6.0", - "update-notifier": "^6.0.2", - "url-loader": "^4.1.1", - "webpack": "^5.88.1", - "webpack-bundle-analyzer": "^4.9.0", - "webpack-dev-server": "^4.15.1", - "webpack-merge": "^5.9.0", - "webpackbar": "^5.0.2" - }, - "bin": { - "docusaurus": "bin/docusaurus.mjs" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/core/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@docusaurus/core/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@docusaurus/core/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/@docusaurus/cssnano-preset": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.4.0.tgz", - "integrity": "sha512-qwLFSz6v/pZHy/UP32IrprmH5ORce86BGtN0eBtG75PpzQJAzp9gefspox+s8IEOr0oZKuQ/nhzZ3xwyc3jYJQ==", - "license": "MIT", - "dependencies": { - "cssnano-preset-advanced": "^6.1.2", - "postcss": "^8.4.38", - "postcss-sort-media-queries": "^5.2.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - } - }, - "node_modules/@docusaurus/cssnano-preset/node_modules/autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/@docusaurus/cssnano-preset/node_modules/cssnano-preset-advanced": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz", - "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==", - "license": "MIT", - "dependencies": { - "autoprefixer": "^10.4.19", - "browserslist": "^4.23.0", - "cssnano-preset-default": "^6.1.2", - "postcss-discard-unused": "^6.0.5", - "postcss-merge-idents": "^6.0.3", - "postcss-reduce-idents": "^6.0.3", - "postcss-zindex": "^6.0.2" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/@docusaurus/cssnano-preset/node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-discard-unused": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz", - "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==", - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-merge-idents": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", - "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==", - "license": "MIT", - "dependencies": { - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-reduce-idents": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz", - "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-sort-media-queries": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz", - "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==", - "license": "MIT", - "dependencies": { - "sort-css-media-queries": "2.2.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.4.23" - } - }, - "node_modules/@docusaurus/cssnano-preset/node_modules/postcss-zindex": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz", - "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==", - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/@docusaurus/logger": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.4.0.tgz", - "integrity": "sha512-bZwkX+9SJ8lB9kVRkXw+xvHYSMGG4bpYHKGXeXFvyVc79NMeeBSGgzd4TQLHH+DYeOJoCdl8flrFJVxlZ0wo/Q==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - } - }, - "node_modules/@docusaurus/mdx-loader": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.4.0.tgz", - "integrity": "sha512-kSSbrrk4nTjf4d+wtBA9H+FGauf2gCax89kV8SUSJu3qaTdSIKdWERlngsiHaCFgZ7laTJ8a67UFf+xlFPtuTw==", - "license": "MIT", - "dependencies": { - "@docusaurus/logger": "3.4.0", - "@docusaurus/utils": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", - "@mdx-js/mdx": "^3.0.0", - "@slorber/remark-comment": "^1.0.0", - "escape-html": "^1.0.3", - "estree-util-value-to-estree": "^3.0.1", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "image-size": "^1.0.2", - "mdast-util-mdx": "^3.0.0", - "mdast-util-to-string": "^4.0.0", - "rehype-raw": "^7.0.0", - "remark-directive": "^3.0.0", - "remark-emoji": "^4.0.0", - "remark-frontmatter": "^5.0.0", - "remark-gfm": "^4.0.0", - "stringify-object": "^3.3.0", - "tslib": "^2.6.0", - "unified": "^11.0.3", - "unist-util-visit": "^5.0.0", - "url-loader": "^4.1.1", - "vfile": "^6.0.1", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/module-type-aliases": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.3.2.tgz", - "integrity": "sha512-b/XB0TBJah5yKb4LYuJT4buFvL0MGAb0+vJDrJtlYMguRtsEBkf2nWl5xP7h4Dlw6ol0hsHrCYzJ50kNIOEclw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@docusaurus/types": "3.3.2", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "@types/react-router-dom": "*", - "react-helmet-async": "*", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/@docusaurus/module-type-aliases/node_modules/react-helmet-async": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-2.0.4.tgz", - "integrity": "sha512-yxjQMWposw+akRfvpl5+8xejl4JtUlHnEBcji6u8/e6oc7ozT+P9PNTWMhCbz2y9tc5zPegw2BvKjQA+NwdEjQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "invariant": "^2.2.4", - "react-fast-compare": "^3.2.2", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": "^16.6.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-client-redirects": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.4.0.tgz", - "integrity": "sha512-Pr8kyh/+OsmYCvdZhc60jy/FnrY6flD2TEAhl4rJxeVFxnvvRgEhoaIVX8q9MuJmaQoh6frPk94pjs7/6YgBDQ==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/logger": "3.4.0", - "@docusaurus/utils": "3.4.0", - "@docusaurus/utils-common": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", - "eta": "^2.2.0", - "fs-extra": "^11.1.1", - "lodash": "^4.17.21", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-blog": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.4.0.tgz", - "integrity": "sha512-vv6ZAj78ibR5Jh7XBUT4ndIjmlAxkijM3Sx5MAAzC1gyv0vupDQNhzuFg1USQmQVj3P5I6bquk12etPV3LJ+Xw==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/logger": "3.4.0", - "@docusaurus/mdx-loader": "3.4.0", - "@docusaurus/types": "3.4.0", - "@docusaurus/utils": "3.4.0", - "@docusaurus/utils-common": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", - "cheerio": "^1.0.0-rc.12", - "feed": "^4.2.2", - "fs-extra": "^11.1.1", - "lodash": "^4.17.21", - "reading-time": "^1.5.0", - "srcset": "^4.0.0", - "tslib": "^2.6.0", - "unist-util-visit": "^5.0.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-blog/node_modules/@docusaurus/types": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.4.0.tgz", - "integrity": "sha512-4jcDO8kXi5Cf9TcyikB/yKmz14f2RZ2qTRerbHAsS+5InE9ZgSLBNLsewtFTcTOXSVcbU3FoGOzcNWAmU1TR0A==", - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-docs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.4.0.tgz", - "integrity": "sha512-HkUCZffhBo7ocYheD9oZvMcDloRnGhBMOZRyVcAQRFmZPmNqSyISlXA1tQCIxW+r478fty97XXAGjNYzBjpCsg==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/logger": "3.4.0", - "@docusaurus/mdx-loader": "3.4.0", - "@docusaurus/module-type-aliases": "3.4.0", - "@docusaurus/types": "3.4.0", - "@docusaurus/utils": "3.4.0", - "@docusaurus/utils-common": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", - "@types/react-router-config": "^5.0.7", - "combine-promises": "^1.1.0", - "fs-extra": "^11.1.1", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "tslib": "^2.6.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-docs/node_modules/@docusaurus/module-type-aliases": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.4.0.tgz", - "integrity": "sha512-A1AyS8WF5Bkjnb8s+guTDuYmUiwJzNrtchebBHpc0gz0PyHJNMaybUlSrmJjHVcGrya0LKI4YcR3lBDQfXRYLw==", - "license": "MIT", - "dependencies": { - "@docusaurus/types": "3.4.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "@types/react-router-dom": "*", - "react-helmet-async": "*", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/@docusaurus/plugin-content-docs/node_modules/@docusaurus/types": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.4.0.tgz", - "integrity": "sha512-4jcDO8kXi5Cf9TcyikB/yKmz14f2RZ2qTRerbHAsS+5InE9ZgSLBNLsewtFTcTOXSVcbU3FoGOzcNWAmU1TR0A==", - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-docs/node_modules/@docusaurus/types/node_modules/react-helmet-async": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", - "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime": "^7.12.5", - "invariant": "^2.2.4", - "prop-types": "^15.7.2", - "react-fast-compare": "^3.2.0", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": "^16.6.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-docs/node_modules/react-helmet-async": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-2.0.4.tgz", - "integrity": "sha512-yxjQMWposw+akRfvpl5+8xejl4JtUlHnEBcji6u8/e6oc7ozT+P9PNTWMhCbz2y9tc5zPegw2BvKjQA+NwdEjQ==", - "license": "Apache-2.0", - "dependencies": { - "invariant": "^2.2.4", - "react-fast-compare": "^3.2.2", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": "^16.6.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-pages": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.4.0.tgz", - "integrity": "sha512-h2+VN/0JjpR8fIkDEAoadNjfR3oLzB+v1qSXbIAKjQ46JAHx3X22n9nqS+BWSQnTnp1AjkjSvZyJMekmcwxzxg==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/mdx-loader": "3.4.0", - "@docusaurus/types": "3.4.0", - "@docusaurus/utils": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", - "fs-extra": "^11.1.1", - "tslib": "^2.6.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-pages/node_modules/@docusaurus/types": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.4.0.tgz", - "integrity": "sha512-4jcDO8kXi5Cf9TcyikB/yKmz14f2RZ2qTRerbHAsS+5InE9ZgSLBNLsewtFTcTOXSVcbU3FoGOzcNWAmU1TR0A==", - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-debug": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.4.0.tgz", - "integrity": "sha512-uV7FDUNXGyDSD3PwUaf5YijX91T5/H9SX4ErEcshzwgzWwBtK37nUWPU3ZLJfeTavX3fycTOqk9TglpOLaWkCg==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/types": "3.4.0", - "@docusaurus/utils": "3.4.0", - "fs-extra": "^11.1.1", - "react-json-view-lite": "^1.2.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-debug/node_modules/@docusaurus/types": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.4.0.tgz", - "integrity": "sha512-4jcDO8kXi5Cf9TcyikB/yKmz14f2RZ2qTRerbHAsS+5InE9ZgSLBNLsewtFTcTOXSVcbU3FoGOzcNWAmU1TR0A==", - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-analytics": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.4.0.tgz", - "integrity": "sha512-mCArluxEGi3cmYHqsgpGGt3IyLCrFBxPsxNZ56Mpur0xSlInnIHoeLDH7FvVVcPJRPSQ9/MfRqLsainRw+BojA==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/types": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-analytics/node_modules/@docusaurus/types": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.4.0.tgz", - "integrity": "sha512-4jcDO8kXi5Cf9TcyikB/yKmz14f2RZ2qTRerbHAsS+5InE9ZgSLBNLsewtFTcTOXSVcbU3FoGOzcNWAmU1TR0A==", - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-gtag": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.4.0.tgz", - "integrity": "sha512-Dsgg6PLAqzZw5wZ4QjUYc8Z2KqJqXxHxq3vIoyoBWiLEEfigIs7wHR+oiWUQy3Zk9MIk6JTYj7tMoQU0Jm3nqA==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/types": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", - "@types/gtag.js": "^0.0.12", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-gtag/node_modules/@docusaurus/types": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.4.0.tgz", - "integrity": "sha512-4jcDO8kXi5Cf9TcyikB/yKmz14f2RZ2qTRerbHAsS+5InE9ZgSLBNLsewtFTcTOXSVcbU3FoGOzcNWAmU1TR0A==", - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-tag-manager": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.4.0.tgz", - "integrity": "sha512-O9tX1BTwxIhgXpOLpFDueYA9DWk69WCbDRrjYoMQtFHSkTyE7RhNgyjSPREUWJb9i+YUg3OrsvrBYRl64FCPCQ==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/types": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-tag-manager/node_modules/@docusaurus/types": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.4.0.tgz", - "integrity": "sha512-4jcDO8kXi5Cf9TcyikB/yKmz14f2RZ2qTRerbHAsS+5InE9ZgSLBNLsewtFTcTOXSVcbU3FoGOzcNWAmU1TR0A==", - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-sitemap": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.4.0.tgz", - "integrity": "sha512-+0VDvx9SmNrFNgwPoeoCha+tRoAjopwT0+pYO1xAbyLcewXSemq+eLxEa46Q1/aoOaJQ0qqHELuQM7iS2gp33Q==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/logger": "3.4.0", - "@docusaurus/types": "3.4.0", - "@docusaurus/utils": "3.4.0", - "@docusaurus/utils-common": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", - "fs-extra": "^11.1.1", - "sitemap": "^7.1.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/plugin-sitemap/node_modules/@docusaurus/types": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.4.0.tgz", - "integrity": "sha512-4jcDO8kXi5Cf9TcyikB/yKmz14f2RZ2qTRerbHAsS+5InE9ZgSLBNLsewtFTcTOXSVcbU3FoGOzcNWAmU1TR0A==", - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/preset-classic": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.4.0.tgz", - "integrity": "sha512-Ohj6KB7siKqZaQhNJVMBBUzT3Nnp6eTKqO+FXO3qu/n1hJl3YLwVKTWBg28LF7MWrKu46UuYavwMRxud0VyqHg==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/plugin-content-blog": "3.4.0", - "@docusaurus/plugin-content-docs": "3.4.0", - "@docusaurus/plugin-content-pages": "3.4.0", - "@docusaurus/plugin-debug": "3.4.0", - "@docusaurus/plugin-google-analytics": "3.4.0", - "@docusaurus/plugin-google-gtag": "3.4.0", - "@docusaurus/plugin-google-tag-manager": "3.4.0", - "@docusaurus/plugin-sitemap": "3.4.0", - "@docusaurus/theme-classic": "3.4.0", - "@docusaurus/theme-common": "3.4.0", - "@docusaurus/theme-search-algolia": "3.4.0", - "@docusaurus/types": "3.4.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/preset-classic/node_modules/@docusaurus/types": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.4.0.tgz", - "integrity": "sha512-4jcDO8kXi5Cf9TcyikB/yKmz14f2RZ2qTRerbHAsS+5InE9ZgSLBNLsewtFTcTOXSVcbU3FoGOzcNWAmU1TR0A==", - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/theme-classic": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.4.0.tgz", - "integrity": "sha512-0IPtmxsBYv2adr1GnZRdMkEQt1YW6tpzrUPj02YxNpvJ5+ju4E13J5tB4nfdaen/tfR1hmpSPlTFPvTf4kwy8Q==", - "license": "MIT", - "dependencies": { - "@docusaurus/core": "3.4.0", - "@docusaurus/mdx-loader": "3.4.0", - "@docusaurus/module-type-aliases": "3.4.0", - "@docusaurus/plugin-content-blog": "3.4.0", - "@docusaurus/plugin-content-docs": "3.4.0", - "@docusaurus/plugin-content-pages": "3.4.0", - "@docusaurus/theme-common": "3.4.0", - "@docusaurus/theme-translations": "3.4.0", - "@docusaurus/types": "3.4.0", - "@docusaurus/utils": "3.4.0", - "@docusaurus/utils-common": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", - "@mdx-js/react": "^3.0.0", - "clsx": "^2.0.0", - "copy-text-to-clipboard": "^3.2.0", - "infima": "0.2.0-alpha.43", - "lodash": "^4.17.21", - "nprogress": "^0.2.0", - "postcss": "^8.4.26", - "prism-react-renderer": "^2.3.0", - "prismjs": "^1.29.0", - "react-router-dom": "^5.3.4", - "rtlcss": "^4.1.0", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/module-type-aliases": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.4.0.tgz", - "integrity": "sha512-A1AyS8WF5Bkjnb8s+guTDuYmUiwJzNrtchebBHpc0gz0PyHJNMaybUlSrmJjHVcGrya0LKI4YcR3lBDQfXRYLw==", - "license": "MIT", - "dependencies": { - "@docusaurus/types": "3.4.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "@types/react-router-dom": "*", - "react-helmet-async": "*", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/types": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.4.0.tgz", - "integrity": "sha512-4jcDO8kXi5Cf9TcyikB/yKmz14f2RZ2qTRerbHAsS+5InE9ZgSLBNLsewtFTcTOXSVcbU3FoGOzcNWAmU1TR0A==", - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/types/node_modules/react-helmet-async": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", - "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime": "^7.12.5", - "invariant": "^2.2.4", - "prop-types": "^15.7.2", - "react-fast-compare": "^3.2.0", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": "^16.6.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@docusaurus/theme-classic/node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@docusaurus/theme-classic/node_modules/react-helmet-async": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-2.0.4.tgz", - "integrity": "sha512-yxjQMWposw+akRfvpl5+8xejl4JtUlHnEBcji6u8/e6oc7ozT+P9PNTWMhCbz2y9tc5zPegw2BvKjQA+NwdEjQ==", - "license": "Apache-2.0", - "dependencies": { - "invariant": "^2.2.4", - "react-fast-compare": "^3.2.2", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": "^16.6.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@docusaurus/theme-common": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.4.0.tgz", - "integrity": "sha512-0A27alXuv7ZdCg28oPE8nH/Iz73/IUejVaCazqu9elS4ypjiLhK3KfzdSQBnL/g7YfHSlymZKdiOHEo8fJ0qMA==", - "license": "MIT", - "dependencies": { - "@docusaurus/mdx-loader": "3.4.0", - "@docusaurus/module-type-aliases": "3.4.0", - "@docusaurus/plugin-content-blog": "3.4.0", - "@docusaurus/plugin-content-docs": "3.4.0", - "@docusaurus/plugin-content-pages": "3.4.0", - "@docusaurus/utils": "3.4.0", - "@docusaurus/utils-common": "3.4.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "clsx": "^2.0.0", - "parse-numeric-range": "^1.3.0", - "prism-react-renderer": "^2.3.0", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/theme-common/node_modules/@docusaurus/module-type-aliases": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.4.0.tgz", - "integrity": "sha512-A1AyS8WF5Bkjnb8s+guTDuYmUiwJzNrtchebBHpc0gz0PyHJNMaybUlSrmJjHVcGrya0LKI4YcR3lBDQfXRYLw==", - "license": "MIT", - "dependencies": { - "@docusaurus/types": "3.4.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "@types/react-router-dom": "*", - "react-helmet-async": "*", - "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, - "node_modules/@docusaurus/theme-common/node_modules/@docusaurus/types": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.4.0.tgz", - "integrity": "sha512-4jcDO8kXi5Cf9TcyikB/yKmz14f2RZ2qTRerbHAsS+5InE9ZgSLBNLsewtFTcTOXSVcbU3FoGOzcNWAmU1TR0A==", - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/theme-common/node_modules/@docusaurus/types/node_modules/react-helmet-async": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", - "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime": "^7.12.5", - "invariant": "^2.2.4", - "prop-types": "^15.7.2", - "react-fast-compare": "^3.2.0", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": "^16.6.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@docusaurus/theme-common/node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@docusaurus/theme-common/node_modules/react-helmet-async": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-2.0.4.tgz", - "integrity": "sha512-yxjQMWposw+akRfvpl5+8xejl4JtUlHnEBcji6u8/e6oc7ozT+P9PNTWMhCbz2y9tc5zPegw2BvKjQA+NwdEjQ==", - "license": "Apache-2.0", - "dependencies": { - "invariant": "^2.2.4", - "react-fast-compare": "^3.2.2", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": "^16.6.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@docusaurus/theme-search-algolia": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.4.0.tgz", - "integrity": "sha512-aiHFx7OCw4Wck1z6IoShVdUWIjntC8FHCw9c5dR8r3q4Ynh+zkS8y2eFFunN/DL6RXPzpnvKCg3vhLQYJDmT9Q==", - "license": "MIT", - "dependencies": { - "@docsearch/react": "^3.5.2", - "@docusaurus/core": "3.4.0", - "@docusaurus/logger": "3.4.0", - "@docusaurus/plugin-content-docs": "3.4.0", - "@docusaurus/theme-common": "3.4.0", - "@docusaurus/theme-translations": "3.4.0", - "@docusaurus/utils": "3.4.0", - "@docusaurus/utils-validation": "3.4.0", - "algoliasearch": "^4.18.0", - "algoliasearch-helper": "^3.13.3", - "clsx": "^2.0.0", - "eta": "^2.2.0", - "fs-extra": "^11.1.1", - "lodash": "^4.17.21", - "tslib": "^2.6.0", - "utility-types": "^3.10.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/theme-search-algolia/node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@docusaurus/theme-translations": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.4.0.tgz", - "integrity": "sha512-zSxCSpmQCCdQU5Q4CnX/ID8CSUUI3fvmq4hU/GNP/XoAWtXo9SAVnM3TzpU8Gb//H3WCsT8mJcTfyOk3d9ftNg==", - "license": "MIT", - "dependencies": { - "fs-extra": "^11.1.1", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - } - }, - "node_modules/@docusaurus/tsconfig": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@docusaurus/tsconfig/-/tsconfig-3.3.2.tgz", - "integrity": "sha512-2MQXkLoWqgOSiqFojNEq8iPtFBHGQqd1b/SQMoe+v3GgHmk/L6YTTO/hMcHhWb1hTFmbkei++IajSfD3RlZKvw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@docusaurus/types": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.3.2.tgz", - "integrity": "sha512-5p201S7AZhliRxTU7uMKtSsoC8mgPA9bs9b5NQg1IRdRxJfflursXNVsgc3PcMqiUTul/v1s3k3rXXFlRE890w==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@mdx-js/mdx": "^3.0.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.9.2", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.88.1", - "webpack-merge": "^5.9.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@docusaurus/utils": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.4.0.tgz", - "integrity": "sha512-fRwnu3L3nnWaXOgs88BVBmG1yGjcQqZNHG+vInhEa2Sz2oQB+ZjbEMO5Rh9ePFpZ0YDiDUhpaVjwmS+AU2F14g==", - "license": "MIT", - "dependencies": { - "@docusaurus/logger": "3.4.0", - "@docusaurus/utils-common": "3.4.0", - "@svgr/webpack": "^8.1.0", - "escape-string-regexp": "^4.0.0", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "github-slugger": "^1.5.0", - "globby": "^11.1.0", - "gray-matter": "^4.0.3", - "jiti": "^1.20.0", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "micromatch": "^4.0.5", - "prompts": "^2.4.2", - "resolve-pathname": "^3.0.0", - "shelljs": "^0.8.5", - "tslib": "^2.6.0", - "url-loader": "^4.1.1", - "utility-types": "^3.10.0", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "@docusaurus/types": "*" - }, - "peerDependenciesMeta": { - "@docusaurus/types": { - "optional": true - } - } - }, - "node_modules/@docusaurus/utils-common": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.4.0.tgz", - "integrity": "sha512-NVx54Wr4rCEKsjOH5QEVvxIqVvm+9kh7q8aYTU5WzUU9/Hctd6aTrcZ3G0Id4zYJ+AeaG5K5qHA4CY5Kcm2iyQ==", - "license": "MIT", - "dependencies": { - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "@docusaurus/types": "*" - }, - "peerDependenciesMeta": { - "@docusaurus/types": { - "optional": true - } - } - }, - "node_modules/@docusaurus/utils-validation": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.4.0.tgz", - "integrity": "sha512-hYQ9fM+AXYVTWxJOT1EuNaRnrR2WGpRdLDQG07O8UOpsvCPWUVOeo26Rbm0JWY2sGLfzAb+tvJ62yF+8F+TV0g==", - "license": "MIT", - "dependencies": { - "@docusaurus/logger": "3.4.0", - "@docusaurus/utils": "3.4.0", - "@docusaurus/utils-common": "3.4.0", - "fs-extra": "^11.2.0", - "joi": "^17.9.2", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - } - }, - "node_modules/@gracefullight/docusaurus-plugin-vercel-analytics": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@gracefullight/docusaurus-plugin-vercel-analytics/-/docusaurus-plugin-vercel-analytics-1.0.1.tgz", - "integrity": "sha512-6Xj63GIBadwLhoDVNpRXlEs3ieTetd8ZcNGKIJ8ADT0IjZIvcIW6CZFY5RgGtxuJ4PxFXVU2DDV14M2uXXTvGQ==", - "license": "MIT", - "dependencies": { - "@docusaurus/utils-validation": "^3" - } - }, - "node_modules/@gracefullight/docusaurus-plugin-vercel-analytics/node_modules/@docusaurus/logger": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.1.1.tgz", - "integrity": "sha512-BjkNDpQzewcTnST8trx4idSoAla6zZ3w22NqM/UMcFtvYJgmoE4layuTzlfql3VFPNuivvj7BOExa/+21y4X2Q==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - } - }, - "node_modules/@gracefullight/docusaurus-plugin-vercel-analytics/node_modules/@docusaurus/utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.1.1.tgz", - "integrity": "sha512-ZJfJa5cJQtRYtqijsPEnAZoduW6sjAQ7ZCWSZavLcV10Fw0Z3gSaPKA/B4micvj2afRZ4gZxT7KfYqe5H8Cetg==", - "license": "MIT", - "dependencies": { - "@docusaurus/logger": "3.1.1", - "@svgr/webpack": "^6.5.1", - "escape-string-regexp": "^4.0.0", - "file-loader": "^6.2.0", - "fs-extra": "^11.1.1", - "github-slugger": "^1.5.0", - "globby": "^11.1.0", - "gray-matter": "^4.0.3", - "jiti": "^1.20.0", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "micromatch": "^4.0.5", - "resolve-pathname": "^3.0.0", - "shelljs": "^0.8.5", - "tslib": "^2.6.0", - "url-loader": "^4.1.1", - "webpack": "^5.88.1" - }, - "engines": { - "node": ">=18.0" - }, - "peerDependencies": { - "@docusaurus/types": "*" - }, - "peerDependenciesMeta": { - "@docusaurus/types": { - "optional": true - } - } - }, - "node_modules/@gracefullight/docusaurus-plugin-vercel-analytics/node_modules/@docusaurus/utils-validation": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.1.1.tgz", - "integrity": "sha512-KlY4P9YVDnwL+nExvlIpu79abfEv6ZCHuOX4ZQ+gtip+Wxj0daccdReIWWtqxM/Fb5Cz1nQvUCc7VEtT8IBUAA==", - "license": "MIT", - "dependencies": { - "@docusaurus/logger": "3.1.1", - "@docusaurus/utils": "3.1.1", - "joi": "^17.9.2", - "js-yaml": "^4.1.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": ">=18.0" - } - }, - "node_modules/@gracefullight/docusaurus-plugin-vercel-analytics/node_modules/@svgr/plugin-svgo": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz", - "integrity": "sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==", - "license": "MIT", - "dependencies": { - "cosmiconfig": "^7.0.1", - "deepmerge": "^4.2.2", - "svgo": "^2.8.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" - } - }, - "node_modules/@gracefullight/docusaurus-plugin-vercel-analytics/node_modules/@svgr/webpack": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz", - "integrity": "sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.19.6", - "@babel/plugin-transform-react-constant-elements": "^7.18.12", - "@babel/preset-env": "^7.19.4", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.18.6", - "@svgr/core": "^6.5.1", - "@svgr/plugin-jsx": "^6.5.1", - "@svgr/plugin-svgo": "^6.5.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@gracefullight/docusaurus-plugin-vercel-analytics/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@gracefullight/docusaurus-plugin-vercel-analytics/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@gracefullight/docusaurus-plugin-vercel-analytics/node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "license": "MIT", - "dependencies": { - "css-tree": "^1.1.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@gracefullight/docusaurus-plugin-vercel-analytics/node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "license": "MIT", - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", - "license": "MIT" - }, - "node_modules/@mdx-js/mdx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz", - "integrity": "sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdx": "^2.0.0", - "collapse-white-space": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-build-jsx": "^3.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "estree-util-to-js": "^2.0.0", - "estree-walker": "^3.0.0", - "hast-util-to-estree": "^3.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "markdown-extensions": "^2.0.0", - "periscopic": "^3.0.0", - "remark-mdx": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "source-map": "^0.7.0", - "unified": "^11.0.0", - "unist-util-position-from-estree": "^2.0.0", - "unist-util-stringify-position": "^4.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@mdx-js/mdx/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@mdx-js/react": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.0.1.tgz", - "integrity": "sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==", - "license": "MIT", - "dependencies": { - "@types/mdx": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=16", - "react": ">=16" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "license": "MIT", - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "license": "MIT", - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "license": "ISC" - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", - "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", - "license": "MIT", - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.24", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.24.tgz", - "integrity": "sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==", - "license": "MIT" - }, - "node_modules/@sideway/address": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", - "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", - "license": "BSD-3-Clause" - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "license": "MIT" - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@slorber/remark-comment": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", - "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.1.0", - "micromark-util-symbol": "^1.0.1" - } - }, - "node_modules/@slorber/remark-comment/node_modules/micromark-factory-space": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@slorber/remark-comment/node_modules/micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@slorber/remark-comment/node_modules/micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/@slorber/remark-comment/node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz", - "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", - "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz", - "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz", - "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz", - "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz", - "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz", - "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-preset": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz", - "integrity": "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==", - "license": "MIT", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", - "@svgr/babel-plugin-remove-jsx-attribute": "*", - "@svgr/babel-plugin-remove-jsx-empty-expression": "*", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", - "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", - "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", - "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", - "@svgr/babel-plugin-transform-svg-component": "^6.5.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/core": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz", - "integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.19.6", - "@svgr/babel-preset": "^6.5.1", - "@svgr/plugin-jsx": "^6.5.1", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/core/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz", - "integrity": "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.0", - "entities": "^4.4.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-jsx": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz", - "integrity": "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.19.6", - "@svgr/babel-preset": "^6.5.1", - "@svgr/hast-util-to-babel-ast": "^6.5.1", - "svg-parser": "^2.0.4" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "^6.0.0" - } - }, - "node_modules/@svgr/plugin-svgo": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", - "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", - "license": "MIT", - "dependencies": { - "cosmiconfig": "^8.1.3", - "deepmerge": "^4.3.1", - "svgo": "^3.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" - } - }, - "node_modules/@svgr/webpack": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", - "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.21.3", - "@babel/plugin-transform-react-constant-elements": "^7.21.3", - "@babel/preset-env": "^7.20.2", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.21.0", - "@svgr/core": "8.1.0", - "@svgr/plugin-jsx": "8.1.0", - "@svgr/plugin-svgo": "8.1.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz", - "integrity": "sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.24.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.24.5", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz", - "integrity": "sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", - "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/helper-plugin-utils": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", - "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/helper-replace-supers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", - "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", - "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz", - "integrity": "sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==", - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", - "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", - "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.24.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", - "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", - "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", - "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", - "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", - "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", - "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", - "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", - "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", - "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz", - "integrity": "sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", - "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", - "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.4", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-classes": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz", - "integrity": "sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.24.5", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", - "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/template": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz", - "integrity": "sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", - "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", - "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", - "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", - "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", - "license": "MIT", - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", - "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", - "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", - "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", - "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", - "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", - "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", - "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", - "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", - "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-simple-access": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", - "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", - "license": "MIT", - "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", - "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", - "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", - "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", - "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz", - "integrity": "sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", - "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", - "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz", - "integrity": "sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz", - "integrity": "sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", - "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz", - "integrity": "sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.5", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", - "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.1.tgz", - "integrity": "sha512-QXp1U9x0R7tkiGB0FOk8o74jhnap0FlZ5gNkRIWdG3eP+SvMFg118e1zaWewDzgABb106QSKpVsD3Wgd8t6ifA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", - "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", - "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", - "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", - "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", - "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", - "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz", - "integrity": "sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-typescript": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.5.tgz", - "integrity": "sha512-E0VWu/hk83BIFUWnsKZ4D81KXjN5L3MobvevOHErASk9IPwKHOkTgvqzvNo1yP/ePJWqqK2SpUR5z+KQbl6NVw==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.5", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/plugin-syntax-typescript": "^7.24.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", - "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", - "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", - "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", - "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/preset-env": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.5.tgz", - "integrity": "sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.1", - "@babel/plugin-syntax-import-attributes": "^7.24.1", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.1", - "@babel/plugin-transform-async-generator-functions": "^7.24.3", - "@babel/plugin-transform-async-to-generator": "^7.24.1", - "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.5", - "@babel/plugin-transform-class-properties": "^7.24.1", - "@babel/plugin-transform-class-static-block": "^7.24.4", - "@babel/plugin-transform-classes": "^7.24.5", - "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.5", - "@babel/plugin-transform-dotall-regex": "^7.24.1", - "@babel/plugin-transform-duplicate-keys": "^7.24.1", - "@babel/plugin-transform-dynamic-import": "^7.24.1", - "@babel/plugin-transform-exponentiation-operator": "^7.24.1", - "@babel/plugin-transform-export-namespace-from": "^7.24.1", - "@babel/plugin-transform-for-of": "^7.24.1", - "@babel/plugin-transform-function-name": "^7.24.1", - "@babel/plugin-transform-json-strings": "^7.24.1", - "@babel/plugin-transform-literals": "^7.24.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", - "@babel/plugin-transform-member-expression-literals": "^7.24.1", - "@babel/plugin-transform-modules-amd": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-modules-systemjs": "^7.24.1", - "@babel/plugin-transform-modules-umd": "^7.24.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.24.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", - "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.5", - "@babel/plugin-transform-object-super": "^7.24.1", - "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.5", - "@babel/plugin-transform-parameters": "^7.24.5", - "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.5", - "@babel/plugin-transform-property-literals": "^7.24.1", - "@babel/plugin-transform-regenerator": "^7.24.1", - "@babel/plugin-transform-reserved-words": "^7.24.1", - "@babel/plugin-transform-shorthand-properties": "^7.24.1", - "@babel/plugin-transform-spread": "^7.24.1", - "@babel/plugin-transform-sticky-regex": "^7.24.1", - "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.5", - "@babel/plugin-transform-unicode-escapes": "^7.24.1", - "@babel/plugin-transform-unicode-property-regex": "^7.24.1", - "@babel/plugin-transform-unicode-regex": "^7.24.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@babel/preset-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz", - "integrity": "sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-syntax-jsx": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-typescript": "^7.24.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", - "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", - "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", - "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", - "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", - "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@svgr/babel-preset": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", - "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", - "license": "MIT", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", - "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", - "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", - "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", - "@svgr/babel-plugin-transform-svg-component": "8.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/webpack/node_modules/@svgr/core": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", - "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^8.1.3", - "snake-case": "^3.0.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/webpack/node_modules/@svgr/hast-util-to-babel-ast": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", - "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.21.3", - "entities": "^4.4.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/webpack/node_modules/@svgr/plugin-jsx": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", - "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "@svgr/hast-util-to-babel-ast": "8.0.0", - "svg-parser": "^2.0.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" - } - }, - "node_modules/@svgr/webpack/node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", - "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.2", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@svgr/webpack/node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", - "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.1", - "core-js-compat": "^3.36.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@svgr/webpack/node_modules/babel-plugin-polyfill-corejs3/node_modules/core-js-compat": { - "version": "3.37.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", - "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/@svgr/webpack/node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", - "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "license": "ISC", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@types/acorn": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", - "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", - "license": "MIT", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", - "license": "MIT", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/eslint": { - "version": "8.56.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz", - "integrity": "sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==", - "license": "MIT", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "license": "MIT", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "license": "MIT" - }, - "node_modules/@types/estree-jsx": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.4.tgz", - "integrity": "sha512-5idy3hvI9lAMqsyilBM+N+boaCf1MgoefbDxN6KEO5aK17TOHwFAYT9sjxzeKAiIWRUBgLxmZ9mPcnzZXtTcRQ==", - "license": "MIT", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.43", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", - "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/gtag.js": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", - "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==", - "license": "MIT" - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/history": { - "version": "4.7.11", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", - "license": "MIT" - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "license": "MIT" - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "license": "MIT" - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "license": "MIT" - }, - "node_modules/@types/http-proxy": { - "version": "1.17.14", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", - "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT" - }, - "node_modules/@types/katex": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz", - "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==", - "license": "MIT" - }, - "node_modules/@types/mdast": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", - "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/mdx": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.11.tgz", - "integrity": "sha512-HM5bwOaIQJIQbAYfax35HCKxx7a3KrK3nBtIqJgSOitivTD1y3oW9P3rxY9RkXYPUk7y/AjAohfHKmFpGE79zw==", - "license": "MIT" - }, - "node_modules/@types/mime": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.4.tgz", - "integrity": "sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==", - "license": "MIT" - }, - "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.11.20", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.20.tgz", - "integrity": "sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/node-forge": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "license": "MIT" - }, - "node_modules/@types/prismjs": { - "version": "1.26.3", - "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.3.tgz", - "integrity": "sha512-A0D0aTXvjlqJ5ZILMz3rNfDBOx9hHxLZYv2by47Sm/pqW35zzjusrZTryatjN/Rf8Us2gZrJD+KeHbUSTux1Cw==", - "license": "MIT" - }, - "node_modules/@types/prop-types": { - "version": "15.7.11", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", - "license": "MIT" - }, - "node_modules/@types/qs": { - "version": "6.9.11", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", - "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.2.57", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.57.tgz", - "integrity": "sha512-ZvQsktJgSYrQiMirAN60y4O/LRevIV8hUzSOSNB6gfR3/o3wCBFQx3sPwIYtuDMeiVgsSS3UzCV26tEzgnfvQw==", - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-router": { - "version": "5.1.20", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", - "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", - "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*" - } - }, - "node_modules/@types/react-router-config": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", - "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", - "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "^5.1.0" - } - }, - "node_modules/@types/react-router-dom": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", - "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", - "license": "MIT", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "*" - } - }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "license": "MIT" - }, - "node_modules/@types/sax": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", - "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", - "license": "MIT" - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/send/node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "license": "MIT" - }, - "node_modules/@types/serve-index": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/unist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", - "license": "MIT" - }, - "node_modules/@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "license": "MIT" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "license": "ISC" - }, - "node_modules/@vercel/analytics": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.2.2.tgz", - "integrity": "sha512-X0rctVWkQV1e5Y300ehVNqpOfSOufo7ieA5PIdna8yX/U7Vjz0GFsGf4qvAhxV02uQ2CVt7GYcrFfddXXK2Y4A==", - "license": "MPL-2.0", - "dependencies": { - "server-only": "^0.0.1" - }, - "peerDependencies": { - "next": ">= 13", - "react": "^18 || ^19" - }, - "peerDependenciesMeta": { - "next": { - "optional": true - }, - "react": { - "optional": true - } - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "license": "MIT", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "license": "Apache-2.0", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "license": "BSD-3-Clause" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "license": "Apache-2.0" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "license": "MIT", - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/algoliasearch": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.22.1.tgz", - "integrity": "sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg==", - "license": "MIT", - "dependencies": { - "@algolia/cache-browser-local-storage": "4.22.1", - "@algolia/cache-common": "4.22.1", - "@algolia/cache-in-memory": "4.22.1", - "@algolia/client-account": "4.22.1", - "@algolia/client-analytics": "4.22.1", - "@algolia/client-common": "4.22.1", - "@algolia/client-personalization": "4.22.1", - "@algolia/client-search": "4.22.1", - "@algolia/logger-common": "4.22.1", - "@algolia/logger-console": "4.22.1", - "@algolia/requester-browser-xhr": "4.22.1", - "@algolia/requester-common": "4.22.1", - "@algolia/requester-node-http": "4.22.1", - "@algolia/transporter": "4.22.1" - } - }, - "node_modules/algoliasearch-helper": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.16.2.tgz", - "integrity": "sha512-Yl/Gu5Cq4Z5s/AJ0jR37OPI1H3+z7PHz657ibyaXgMOaWvPlZ3OACN13N+7HCLPUlB0BN+8BtmrG/CqTilowBA==", - "license": "MIT", - "dependencies": { - "@algolia/events": "^4.0.1" - }, - "peerDependencies": { - "algoliasearch": ">= 3.1 < 6" - } - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "license": "ISC", - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-align/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/assert": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", - "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", - "license": "MIT", - "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" - } - }, - "node_modules/astring": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz", - "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==", - "license": "MIT", - "bin": { - "astring": "bin/astring" - } - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.17", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.17.tgz", - "integrity": "sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.22.2", - "caniuse-lite": "^1.0.30001578", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", - "license": "MIT", - "dependencies": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5" - } - }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "license": "MIT", - "dependencies": { - "object.assign": "^4.1.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", - "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.5.0", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", - "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.5.0", - "core-js-compat": "^3.34.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", - "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.5.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "license": "MIT" - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/bonjour-service": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", - "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" - }, - "node_modules/boxen": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", - "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", - "license": "MIT", - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^6.2.0", - "chalk": "^4.1.2", - "cli-boxes": "^3.0.0", - "string-width": "^5.0.1", - "type-fest": "^2.5.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.1" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "license": "MIT", - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request": { - "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "^4.0.2", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request/node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "license": "MIT", - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001687", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz", - "integrity": "sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "license": "MIT", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cheerio-select/node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "license": "MIT", - "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" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "license": "MIT", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/clean-css": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", - "license": "MIT", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "license": "MIT", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cli-table3/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/cli-table3/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/clone-deep/node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/collapse-white-space": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", - "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "license": "MIT" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "license": "MIT" - }, - "node_modules/combine-promises": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", - "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "license": "ISC" - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "license": "MIT", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "license": "MIT", - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/configstore": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", - "license": "BSD-2-Clause", - "dependencies": { - "dot-prop": "^6.0.1", - "graceful-fs": "^4.2.6", - "unique-string": "^3.0.0", - "write-file-atomic": "^3.0.3", - "xdg-basedir": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/yeoman/configstore?sponsor=1" - } - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", - "license": "MIT" - }, - "node_modules/content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "license": "MIT" - }, - "node_modules/copy-text-to-clipboard": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz", - "integrity": "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "license": "MIT", - "dependencies": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "license": "MIT", - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/core-js": { - "version": "3.36.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.0.tgz", - "integrity": "sha512-mt7+TUBbTFg5+GngsAxeKBTl5/VS0guFeJacYge9OmHb+m058UwwIm41SE9T4Den7ClatV57B6TYTuJ0CX1MAw==", - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat": { - "version": "3.36.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.0.tgz", - "integrity": "sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.22.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-pure": { - "version": "3.36.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.36.0.tgz", - "integrity": "sha512-cN28qmhRNgbMZZMc/RFu5w8pK9VJzpb2rJVR/lHuZJKwmXnoWOpXmMkxqBB514igkp1Hu8WGROsiOAzUcKdHOQ==", - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, - "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "license": "MIT", - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "license": "MIT", - "dependencies": { - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/css-declaration-sorter": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", - "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", - "license": "ISC", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-loader": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.10.0.tgz", - "integrity": "sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw==", - "license": "MIT", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.4", - "postcss-modules-scope": "^3.1.1", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/css-loader/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/css-loader/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/css-loader/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/css-minimizer-webpack-plugin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", - "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "cssnano": "^6.0.1", - "jest-worker": "^29.4.3", - "postcss": "^8.4.24", - "schema-utils": "^4.0.1", - "serialize-javascript": "^6.0.1" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@parcel/css": { - "optional": true - }, - "@swc/css": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "lightningcss": { - "optional": true - } - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-select/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/css-select/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/css-select/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/css-select/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", - "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", - "license": "MIT", - "dependencies": { - "cssnano-preset-default": "^6.1.2", - "lilconfig": "^3.1.1" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/cssnano-preset-default": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", - "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "css-declaration-sorter": "^7.2.0", - "cssnano-utils": "^4.0.2", - "postcss-calc": "^9.0.1", - "postcss-colormin": "^6.1.0", - "postcss-convert-values": "^6.1.0", - "postcss-discard-comments": "^6.0.2", - "postcss-discard-duplicates": "^6.0.3", - "postcss-discard-empty": "^6.0.3", - "postcss-discard-overridden": "^6.0.2", - "postcss-merge-longhand": "^6.0.5", - "postcss-merge-rules": "^6.1.1", - "postcss-minify-font-values": "^6.1.0", - "postcss-minify-gradients": "^6.0.3", - "postcss-minify-params": "^6.1.0", - "postcss-minify-selectors": "^6.0.4", - "postcss-normalize-charset": "^6.0.2", - "postcss-normalize-display-values": "^6.0.2", - "postcss-normalize-positions": "^6.0.2", - "postcss-normalize-repeat-style": "^6.0.2", - "postcss-normalize-string": "^6.0.2", - "postcss-normalize-timing-functions": "^6.0.2", - "postcss-normalize-unicode": "^6.1.0", - "postcss-normalize-url": "^6.0.2", - "postcss-normalize-whitespace": "^6.0.2", - "postcss-ordered-values": "^6.0.2", - "postcss-reduce-initial": "^6.1.0", - "postcss-reduce-transforms": "^6.0.2", - "postcss-svgo": "^6.0.3", - "postcss-unique-selectors": "^6.0.4" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/cssnano-utils": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", - "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", - "license": "MIT", - "dependencies": { - "css-tree": "~2.2.0" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", - "license": "CC0-1.0" - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" - }, - "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decode-named-character-reference": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", - "license": "MIT", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "license": "BSD-2-Clause", - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "license": "MIT", - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "license": "MIT" - }, - "node_modules/detect-port": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", - "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", - "license": "MIT", - "dependencies": { - "address": "^1.0.1", - "debug": "4" - }, - "bin": { - "detect": "bin/detect-port.js", - "detect-port": "bin/detect-port.js" - } - }, - "node_modules/detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "license": "MIT", - "dependencies": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "bin": { - "detect": "bin/detect-port", - "detect-port": "bin/detect-port" - }, - "engines": { - "node": ">= 4.2.1" - } - }, - "node_modules/detect-port-alt/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/detect-port-alt/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "license": "MIT", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "license": "MIT", - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "license": "MIT", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dot-prop/node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "license": "MIT" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.72", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.72.tgz", - "integrity": "sha512-ZpSAUOZ2Izby7qnZluSrAlGgGQzucmFbN0n64dYzocYxnxV5ufurpj3VgEe4cUp7ir9LmeLxNYo8bVnlM8bQHw==", - "license": "ISC" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/emojilib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", - "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", - "license": "MIT" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/emoticon": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.0.1.tgz", - "integrity": "sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", - "license": "MIT" - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-goat": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-util-attach-comments": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", - "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-build-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", - "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "estree-walker": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-is-identifier-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", - "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-to-js": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", - "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "astring": "^1.8.0", - "source-map": "^0.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-util-to-js/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">= 8" - } - }, - "node_modules/estree-util-value-to-estree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.0.1.tgz", - "integrity": "sha512-b2tdzTurEIbwRh+mKrEcaWfu1wgb8J1hVsgREg7FFiecWwK/PhO8X0kyc+0bIcKNtD4sqxIdNoRy6/p/TvECEA==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "is-plain-obj": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/remcohaszing" - } - }, - "node_modules/estree-util-visit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", - "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eta": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", - "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "url": "https://github.com/eta-dev/eta?sponsor=1" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eval": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", - "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", - "dependencies": { - "@types/node": "*", - "require-like": ">= 0.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "license": "MIT" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "license": "MIT" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" - }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "license": "MIT", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "license": "MIT", - "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" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "license": "MIT" - }, - "node_modules/fast-url-parser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", - "license": "MIT", - "dependencies": { - "punycode": "^1.3.2" - } - }, - "node_modules/fast-url-parser/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fault": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", - "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", - "license": "MIT", - "dependencies": { - "format": "^0.2.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "license": "Apache-2.0", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/feed": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", - "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", - "license": "MIT", - "dependencies": { - "xml-js": "^1.6.11" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/file-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/filesize": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", - "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", - "license": "MIT", - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", - "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=10", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "eslint": ">= 6", - "typescript": ">= 2.7", - "vue-template-compiler": "*", - "webpack": ">= 4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - } - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", - "license": "MIT", - "engines": { - "node": ">= 14.17" - } - }, - "node_modules/format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", - "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", - "license": "Unlicense" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "license": "MIT", - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "license": "ISC" - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/github-slugger": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", - "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", - "license": "ISC" - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "license": "BSD-2-Clause" - }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "license": "MIT", - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "license": "MIT", - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "license": "MIT", - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/got/node_modules/@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "license": "MIT", - "dependencies": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/gray-matter/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/gray-matter/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "license": "MIT", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "license": "MIT" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-yarn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", - "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hast-util-definition-list": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hast-util-definition-list/-/hast-util-definition-list-2.0.0.tgz", - "integrity": "sha512-EnkqD6a7R1fwyC9F5R6fu0ucpcwfkxjiga7/G8J7KU+uuUHVENzmgo/Da68fZBy9SZAkQOAC/8gK3m2BnuutUg==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.1", - "@types/mdast": "^4.0.1", - "@types/unist": "^3.0.0", - "hast-util-to-mdast": "^10.1.0", - "mdast-util-definition-list": "^2.0.0", - "mdast-util-phrasing": "^4.0.0" - } - }, - "node_modules/hast-util-embedded": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz", - "integrity": "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-is-element": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-embedded/node_modules/hast-util-is-element": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", - "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-dom": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/hast-util-from-dom/-/hast-util-from-dom-5.0.0.tgz", - "integrity": "sha512-d6235voAp/XR3Hh5uy7aGLbM3S4KamdW0WEgOaU1YoewnuYw4HXb5eRtv9g65m/RFGEfUY1Mw4UqCc5Y8L4Stg==", - "license": "ISC", - "dependencies": { - "@types/hast": "^3.0.0", - "hastscript": "^8.0.0", - "web-namespaces": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-html": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.1.tgz", - "integrity": "sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "devlop": "^1.1.0", - "hast-util-from-parse5": "^8.0.0", - "parse5": "^7.0.0", - "vfile": "^6.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-html-isomorphic": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-2.0.0.tgz", - "integrity": "sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-from-dom": "^5.0.0", - "hast-util-from-html": "^2.0.0", - "unist-util-remove-position": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-parse5": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", - "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "hastscript": "^8.0.0", - "property-information": "^6.0.0", - "vfile": "^6.0.0", - "vfile-location": "^5.0.0", - "web-namespaces": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-has-property": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", - "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-is-body-ok-link": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.0.tgz", - "integrity": "sha512-VFHY5bo2nY8HiV6nir2ynmEB1XkxzuUffhEGeVx7orbu/B1KaGyeGgMZldvMVx5xWrDlLLG/kQ6YkJAMkBEx0w==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-is-element": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz", - "integrity": "sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-parse-selector": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", - "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-phrasing": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz", - "integrity": "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-embedded": "^3.0.0", - "hast-util-has-property": "^3.0.0", - "hast-util-is-body-ok-link": "^3.0.0", - "hast-util-is-element": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-phrasing/node_modules/hast-util-is-element": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", - "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-raw": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.2.tgz", - "integrity": "sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", - "hast-util-from-parse5": "^8.0.0", - "hast-util-to-parse5": "^8.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "parse5": "^7.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-estree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz", - "integrity": "sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-attach-comments": "^3.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^0.4.0", - "unist-util-position": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-html": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.0.tgz", - "integrity": "sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-raw": "^9.0.0", - "hast-util-whitespace": "^3.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", - "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^1.0.0", - "unist-util-position": "^5.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-jsx-runtime/node_modules/inline-style-parser": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.2.tgz", - "integrity": "sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==", - "license": "MIT" - }, - "node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.5.tgz", - "integrity": "sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==", - "license": "MIT", - "dependencies": { - "inline-style-parser": "0.2.2" - } - }, - "node_modules/hast-util-to-mdast": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/hast-util-to-mdast/-/hast-util-to-mdast-10.1.0.tgz", - "integrity": "sha512-DsL/SvCK9V7+vfc6SLQ+vKIyBDXTk2KLSbfBYkH4zeF/uR1yBajHRhkzuaUSGOB1WJSTieJBdHwxlC+HLKvZZw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "hast-util-phrasing": "^3.0.0", - "hast-util-to-html": "^9.0.0", - "hast-util-to-text": "^4.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "mdast-util-to-string": "^4.0.0", - "rehype-minify-whitespace": "^6.0.0", - "trim-trailing-lines": "^2.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-parse5": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", - "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-text": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.0.tgz", - "integrity": "sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "hast-util-is-element": "^3.0.0", - "unist-util-find-after": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-text/node_modules/hast-util-is-element": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", - "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hastscript": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", - "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^4.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "node_modules/history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "license": "BSD-3-Clause", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/html-entities": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", - "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT" - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "license": "MIT" - }, - "node_modules/html-minifier-terser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", - "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "~5.3.2", - "commander": "^10.0.0", - "entities": "^4.4.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.15.1" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - } - }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/html-tags": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", - "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/html-void-elements": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/html-webpack-plugin": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", - "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", - "license": "MIT", - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.20.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/html-webpack-plugin/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "license": "MIT", - "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" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "license": "BSD-2-Clause" - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "license": "MIT" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "license": "MIT" - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "license": "MIT", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/http2-wrapper": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/image-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", - "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", - "license": "MIT", - "dependencies": { - "queue": "6.0.2" - }, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=16.x" - } - }, - "node_modules/immer": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", - "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/infima": { - "version": "0.2.0-alpha.43", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz", - "integrity": "sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, - "node_modules/inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", - "license": "MIT" - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/ipaddr.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "license": "MIT", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "license": "MIT", - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "license": "MIT", - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-npm": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", - "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-reference": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", - "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", - "license": "MIT", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "license": "MIT" - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-yarn-global": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", - "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/joi": { - "version": "17.12.2", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.2.tgz", - "integrity": "sha512-RonXAIzCiHLc8ss3Ibuz45u28GOsWE1UpfDXLbN/9NKbL4tCJf8TWYVKsoYuuh+sAUt7fsSNpA+r2+TBA6Wjmw==", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.3.0", - "@hapi/topo": "^5.1.0", - "@sideway/address": "^4.1.5", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/katex": { - "version": "0.16.9", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.9.tgz", - "integrity": "sha512-fsSYjWS0EEOwvy81j3vRA8TEAhQhKiqO+FQaKWp0m39qwOzHVBgAUBIXWj1pB+O2W3fIpNa6Y9KSKCVbfPhyAQ==", - "funding": [ - "https://opencollective.com/katex", - "https://github.com/sponsors/katex" - ], - "license": "MIT", - "dependencies": { - "commander": "^8.3.0" - }, - "bin": { - "katex": "cli.js" - } - }, - "node_modules/katex/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/latest-version": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", - "license": "MIT", - "dependencies": { - "package-json": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/launch-editor": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", - "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", - "license": "MIT", - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/lilconfig": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", - "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "license": "MIT", - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "license": "MIT" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "license": "MIT" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "license": "MIT" - }, - "node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/markdown-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", - "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/markdown-table": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", - "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/mdast-util-definition-list": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-definition-list/-/mdast-util-definition-list-2.0.0.tgz", - "integrity": "sha512-aFWuASQs77BJndNSDcNdvB1HRqWZBptcEjwv67mnPbaAZsfwMHxI8MwoQxAz4I2bHx41hft/HDRC57ZkhpayOQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.1", - "@types/unist": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-hast": "^13.0.2", - "mdast-util-to-markdown": "^2.1.0", - "micromark-extension-definition-list": "^2.0.0", - "unist-builder": "^4.0.0" - } - }, - "node_modules/mdast-util-directive": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz", - "integrity": "sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", - "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mdast-util-from-markdown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", - "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-frontmatter": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", - "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "escape-string-regexp": "^5.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-extension-frontmatter": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mdast-util-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", - "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-gfm-autolink-literal": "^2.0.0", - "mdast-util-gfm-footnote": "^2.0.0", - "mdast-util-gfm-strikethrough": "^2.0.0", - "mdast-util-gfm-table": "^2.0.0", - "mdast-util-gfm-task-list-item": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-autolink-literal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz", - "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-find-and-replace": "^3.0.0", - "micromark-util-character": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-footnote": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", - "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-strikethrough": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", - "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-task-list-item": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", - "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-math": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-math/-/mdast-util-math-3.0.0.tgz", - "integrity": "sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "longest-streak": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.1.0", - "unist-util-remove-position": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", - "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-expression": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", - "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-jsx": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.0.tgz", - "integrity": "sha512-A8AJHlR7/wPQ3+Jre1+1rq040fX9A4Q1jG8JxmSNp/PLPHg80A6475wxTp3KzHpApFH6yWxFotHrJQA3dXP6/w==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-remove-position": "^5.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdxjs-esm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", - "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-phrasing": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.1.0.tgz", - "integrity": "sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", - "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "license": "CC0-1.0" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.6.0.tgz", - "integrity": "sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ==", - "license": "Unlicense", - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "license": "MIT" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromark": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", - "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", - "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-definition-list": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-definition-list/-/micromark-extension-definition-list-2.0.0.tgz", - "integrity": "sha512-92SSfTdG7YIXiYj60sNDPoo3MTJXK94LRLfKsoDHgDqiE61p4w4pzdyCc9SuoQ74/bzb5SXPVK11kjlYnIjzKA==", - "license": "MIT", - "dependencies": { - "assert": "^2.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.1", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "ts-dedent": "^2.2.0" - } - }, - "node_modules/micromark-extension-directive": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.0.tgz", - "integrity": "sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "parse-entities": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-frontmatter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", - "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", - "license": "MIT", - "dependencies": { - "fault": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", - "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", - "license": "MIT", - "dependencies": { - "micromark-extension-gfm-autolink-literal": "^2.0.0", - "micromark-extension-gfm-footnote": "^2.0.0", - "micromark-extension-gfm-strikethrough": "^2.0.0", - "micromark-extension-gfm-table": "^2.0.0", - "micromark-extension-gfm-tagfilter": "^2.0.0", - "micromark-extension-gfm-task-list-item": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz", - "integrity": "sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==", - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz", - "integrity": "sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-strikethrough": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz", - "integrity": "sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-tagfilter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", - "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz", - "integrity": "sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-math": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz", - "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==", - "license": "MIT", - "dependencies": { - "@types/katex": "^0.16.0", - "devlop": "^1.0.0", - "katex": "^0.16.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdx-expression": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz", - "integrity": "sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-mdx-expression": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-mdx-jsx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz", - "integrity": "sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==", - "license": "MIT", - "dependencies": { - "@types/acorn": "^4.0.0", - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "micromark-factory-mdx-expression": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdx-md": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", - "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", - "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", - "license": "MIT", - "dependencies": { - "acorn": "^8.0.0", - "acorn-jsx": "^5.0.0", - "micromark-extension-mdx-expression": "^3.0.0", - "micromark-extension-mdx-jsx": "^3.0.0", - "micromark-extension-mdx-md": "^2.0.0", - "micromark-extension-mdxjs-esm": "^3.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-mdxjs-esm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", - "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", - "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", - "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-mdx-expression": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz", - "integrity": "sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-events-to-acorn": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-position-from-estree": "^2.0.0", - "vfile-message": "^4.0.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", - "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", - "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", - "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", - "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", - "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", - "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", - "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", - "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-events-to-acorn": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz", - "integrity": "sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/acorn": "^4.0.0", - "@types/estree": "^1.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "estree-util-visit": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "vfile-message": "^4.0.0" - } - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", - "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", - "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", - "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", - "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", - "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", - "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.0.tgz", - "integrity": "sha512-CxmUYPFcTgET1zImteG/LZOy/4T5rTojesQXkSNBiquhydn78tfbCE9sjIjnJ/UcjNjOC1bphTCCW5rrS7cXAg==", - "license": "MIT", - "dependencies": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "license": "ISC" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mrmime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "license": "MIT" - }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "license": "MIT", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "license": "MIT" - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-emoji": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", - "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^4.6.0", - "char-regex": "^1.0.2", - "emojilib": "^2.4.0", - "skin-tone": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nprogress": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", - "license": "MIT" - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "license": "MIT" - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "license": "MIT", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "license": "(WTFPL OR MIT)", - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "license": "MIT", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "license": "MIT", - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", - "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", - "license": "MIT", - "dependencies": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/package-json/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/package-json/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-entities": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", - "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", - "license": "MIT" - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-numeric-range": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", - "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==", - "license": "ISC" - }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "license": "MIT", - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", - "license": "MIT", - "dependencies": { - "domhandler": "^5.0.2", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", - "license": "(WTFPL OR MIT)" - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/path-to-regexp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", - "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==", - "license": "MIT" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/periscopic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", - "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^3.0.0", - "is-reference": "^3.0.0" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "license": "MIT", - "dependencies": { - "find-up": "^6.3.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "license": "MIT", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "license": "MIT", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "license": "MIT", - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/pkg-dir/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "license": "MIT", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-calc": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", - "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } - }, - "node_modules/postcss-colormin": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", - "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0", - "colord": "^2.9.3", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-convert-values": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", - "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-comments": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", - "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", - "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-empty": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", - "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", - "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-loader": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", - "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", - "license": "MIT", - "dependencies": { - "cosmiconfig": "^8.3.5", - "jiti": "^1.20.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" - } - }, - "node_modules/postcss-loader/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postcss-loader/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postcss-loader/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/postcss-merge-longhand": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", - "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^6.1.1" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-merge-rules": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", - "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^4.0.2", - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", - "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", - "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", - "license": "MIT", - "dependencies": { - "colord": "^2.9.3", - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-params": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", - "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", - "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", - "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", - "license": "MIT", - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", - "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "license": "ISC", - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", - "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", - "license": "MIT", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", - "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", - "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", - "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-string": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", - "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", - "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", - "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-url": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", - "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", - "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-ordered-values": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", - "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", - "license": "MIT", - "dependencies": { - "cssnano-utils": "^4.0.2", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", - "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", - "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", - "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-svgo": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", - "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^3.2.0" - }, - "engines": { - "node": "^14 || ^16 || >= 18" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", - "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" - }, - "node_modules/postcss/node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "node_modules/pretty-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", - "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/prism-react-renderer": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.3.1.tgz", - "integrity": "sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==", - "license": "MIT", - "dependencies": { - "@types/prismjs": "^1.26.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.0.0" - } - }, - "node_modules/prism-react-renderer/node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/property-information": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.1.tgz", - "integrity": "sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "license": "ISC" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pupa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", - "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", - "license": "MIT", - "dependencies": { - "escape-goat": "^4.0.0" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "license": "MIT", - "dependencies": { - "inherits": "~2.0.3" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dev-utils": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", - "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.16.0", - "address": "^1.1.2", - "browserslist": "^4.18.1", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "detect-port-alt": "^1.1.6", - "escape-string-regexp": "^4.0.0", - "filesize": "^8.0.6", - "find-up": "^5.0.0", - "fork-ts-checker-webpack-plugin": "^6.5.0", - "global-modules": "^2.0.0", - "globby": "^11.0.4", - "gzip-size": "^6.0.0", - "immer": "^9.0.7", - "is-root": "^2.1.0", - "loader-utils": "^3.2.0", - "open": "^8.4.0", - "pkg-up": "^3.1.0", - "prompts": "^2.4.2", - "react-error-overlay": "^6.0.11", - "recursive-readdir": "^2.2.2", - "shell-quote": "^1.7.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/react-dev-utils/node_modules/loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", - "license": "MIT", - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-error-overlay": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", - "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==", - "license": "MIT" - }, - "node_modules/react-fast-compare": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", - "license": "MIT" - }, - "node_modules/react-helmet-async": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", - "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime": "^7.12.5", - "invariant": "^2.2.4", - "prop-types": "^15.7.2", - "react-fast-compare": "^3.2.0", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": "^16.6.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-icons": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.12.0.tgz", - "integrity": "sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw==", - "license": "MIT", - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/react-json-view-lite": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.2.1.tgz", - "integrity": "sha512-Itc0g86fytOmKZoIoJyGgvNqohWSbh3NXIKNgH6W6FT9PC1ck4xas1tT3Rr/b3UlFXyA9Jjaw9QSXdZy2JwGMQ==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "react": "^16.13.1 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-loadable": { - "name": "@docusaurus/react-loadable", - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", - "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", - "license": "MIT", - "dependencies": { - "@types/react": "*" - }, - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-loadable-ssr-addon-v5-slorber": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", - "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.10.3" - }, - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "react-loadable": "*", - "webpack": ">=4.41.1 || 5.x" - } - }, - "node_modules/react-router": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", - "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-router-config": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", - "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.1.2" - }, - "peerDependencies": { - "react": ">=15", - "react-router": ">=5" - } - }, - "node_modules/react-router-dom": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", - "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.3.4", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-router/node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "license": "MIT", - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/reading-time": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", - "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==", - "license": "MIT" - }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", - "license": "MIT", - "dependencies": { - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "license": "MIT" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "license": "MIT" - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "license": "MIT", - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/registry-auth-token": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", - "license": "MIT", - "dependencies": { - "@pnpm/npm-conf": "^2.1.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/registry-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", - "license": "MIT", - "dependencies": { - "rc": "1.2.8" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "license": "BSD-2-Clause", - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/rehype-katex": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/rehype-katex/-/rehype-katex-7.0.1.tgz", - "integrity": "sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/katex": "^0.16.0", - "hast-util-from-html-isomorphic": "^2.0.0", - "hast-util-to-text": "^4.0.0", - "katex": "^0.16.0", - "unist-util-visit-parents": "^6.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-minify-whitespace": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/rehype-minify-whitespace/-/rehype-minify-whitespace-6.0.0.tgz", - "integrity": "sha512-i9It4YHR0Sf3GsnlR5jFUKXRr9oayvEk9GKQUkwZv6hs70OH9q3OCZrq9PpLvIGKt3W+JxBOxCidNVpH/6rWdA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-embedded": "^3.0.0", - "hast-util-is-element": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-minify-whitespace/node_modules/hast-util-is-element": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", - "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-raw": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", - "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-raw": "^9.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/remark-definition-list": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/remark-definition-list/-/remark-definition-list-2.0.0.tgz", - "integrity": "sha512-OOJ0zUrfUGITUNxOBnsipyFUjqq1m4AgYOqQk10jDXyz+RoODJL3qYvRn8qzYQDzRnz1wlCP3dbDEOpl05LlQw==", - "license": "MIT", - "dependencies": { - "hast-util-definition-list": "^2.0.0", - "mdast-util-definition-list": "^2.0.0", - "micromark-extension-definition-list": "^2.0.0" - } - }, - "node_modules/remark-directive": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.0.tgz", - "integrity": "sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-directive": "^3.0.0", - "micromark-extension-directive": "^3.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-emoji": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", - "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.2", - "emoticon": "^4.0.1", - "mdast-util-find-and-replace": "^3.0.1", - "node-emoji": "^2.1.0", - "unified": "^11.0.4" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/remark-frontmatter": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", - "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-frontmatter": "^2.0.0", - "micromark-extension-frontmatter": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-gfm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", - "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-gfm": "^3.0.0", - "micromark-extension-gfm": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-math": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/remark-math/-/remark-math-6.0.0.tgz", - "integrity": "sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-math": "^3.0.0", - "micromark-extension-math": "^3.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-mdx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.1.tgz", - "integrity": "sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==", - "license": "MIT", - "dependencies": { - "mdast-util-mdx": "^3.0.0", - "micromark-extension-mdxjs": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-rehype": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", - "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", - "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-to-markdown": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "license": "MIT", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "node_modules/renderkid/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-like": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", - "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", - "engines": { - "node": "*" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "license": "MIT" - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", - "license": "MIT" - }, - "node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "license": "MIT", - "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rtl-detect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.1.2.tgz", - "integrity": "sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==", - "license": "BSD-3-Clause" - }, - "node_modules/rtlcss": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.1.1.tgz", - "integrity": "sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ==", - "license": "MIT", - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0", - "postcss": "^8.4.21", - "strip-json-comments": "^3.1.1" - }, - "bin": { - "rtlcss": "bin/rtlcss.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", - "license": "ISC" - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/schema-utils/node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/search-insights": { - "version": "2.17.3", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", - "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", - "license": "MIT", - "peer": true - }, - "node_modules/section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "license": "MIT", - "dependencies": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "license": "MIT" - }, - "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", - "license": "MIT", - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semver-diff/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-handler": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", - "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", - "license": "MIT", - "dependencies": { - "bytes": "3.0.0", - "content-disposition": "0.5.2", - "fast-url-parser": "1.1.3", - "mime-types": "2.1.18", - "minimatch": "3.1.2", - "path-is-inside": "1.0.2", - "path-to-regexp": "2.2.1", - "range-parser": "1.2.0" - } - }, - "node_modules/serve-handler/node_modules/mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-handler/node_modules/mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "license": "MIT", - "dependencies": { - "mime-db": "~1.33.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-handler/node_modules/range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "license": "ISC" - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "license": "ISC" - }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "license": "MIT", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/server-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/server-only/-/server-only-0.0.1.tgz", - "integrity": "sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==", - "license": "MIT" - }, - "node_modules/set-function-length": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", - "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.2", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "license": "MIT", - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "license": "MIT" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "license": "BSD-3-Clause", - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/side-channel": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", - "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/sirv": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", - "license": "MIT", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "license": "MIT" - }, - "node_modules/sitemap": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz", - "integrity": "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==", - "license": "MIT", - "dependencies": { - "@types/node": "^17.0.5", - "@types/sax": "^1.2.1", - "arg": "^5.0.0", - "sax": "^1.2.4" - }, - "bin": { - "sitemap": "dist/cli.js" - }, - "engines": { - "node": ">=12.0.0", - "npm": ">=5.6.0" - } - }, - "node_modules/sitemap/node_modules/@types/node": { - "version": "17.0.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", - "license": "MIT" - }, - "node_modules/skin-tone": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", - "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", - "license": "MIT", - "dependencies": { - "unicode-emoji-modifier-base": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "license": "MIT", - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/sort-css-media-queries": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz", - "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==", - "license": "MIT", - "engines": { - "node": ">= 6.3.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" - }, - "node_modules/srcset": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", - "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "license": "MIT" - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/std-env": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", - "license": "MIT" - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/stringify-entities": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", - "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", - "license": "MIT", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "license": "BSD-2-Clause", - "dependencies": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-to-object": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", - "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", - "license": "MIT", - "dependencies": { - "inline-style-parser": "0.1.1" - } - }, - "node_modules/stylehacks": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", - "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.0", - "postcss-selector-parser": "^6.0.16" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", - "license": "MIT" - }, - "node_modules/svgo": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", - "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", - "license": "MIT", - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^5.1.0", - "css-tree": "^2.3.1", - "css-what": "^6.1.0", - "csso": "^5.0.5", - "picocolors": "^1.0.0" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/svgo" - } - }, - "node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/svgo/node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/svgo/node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/svgo/node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "license": "CC0-1.0" - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/terser": { - "version": "5.27.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.2.tgz", - "integrity": "sha512-sHXmLSkImesJ4p5apTeT63DsV4Obe1s37qT8qvwHRmVxKTBH7Rv9Wr26VcAMmLbmk9UliiwK8z+657NyJHHy/w==", - "license": "BSD-2-Clause", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT" - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "license": "MIT" - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "license": "MIT" - }, - "node_modules/tiny-invariant": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", - "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==", - "license": "MIT" - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", - "license": "MIT" - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trim-trailing-lines": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-2.1.0.tgz", - "integrity": "sha512-5UR5Biq4VlVOtzqkm2AZlgvSlDJtME46uV0br0gENbwN4l5+mMKT4b9gJKqWtuL2zAIqajGJGuvbCbcAJUZqBg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/ts-dedent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", - "license": "MIT", - "engines": { - "node": ">=6.10" - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "license": "0BSD" - }, - "node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "license": "MIT", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "license": "MIT" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-emoji-modifier-base": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", - "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "license": "MIT", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unified": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", - "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "license": "MIT", - "dependencies": { - "crypto-random-string": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unist-builder": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-4.0.0.tgz", - "integrity": "sha512-wmRFnH+BLpZnTKpc5L7O67Kac89s9HMrtELpnNaE6TAobq5DTZZs5YaTQfAZBA9bFPECx2uVAPO31c+GVug8mg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-find-after": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", - "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position-from-estree": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", - "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", - "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/update-notifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", - "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", - "license": "BSD-2-Clause", - "dependencies": { - "boxen": "^7.0.0", - "chalk": "^5.0.1", - "configstore": "^6.0.0", - "has-yarn": "^3.0.0", - "import-lazy": "^4.0.0", - "is-ci": "^3.0.1", - "is-installed-globally": "^0.4.0", - "is-npm": "^6.0.0", - "is-yarn-global": "^0.4.0", - "latest-version": "^7.0.0", - "pupa": "^3.1.0", - "semver": "^7.3.7", - "semver-diff": "^4.0.0", - "xdg-basedir": "^5.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/boxen": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", - "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", - "license": "MIT", - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.1", - "chalk": "^5.2.0", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/update-notifier/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/update-notifier/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", - "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "file-loader": "*", - "webpack": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "file-loader": { - "optional": true - } - } - }, - "node_modules/url-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "license": "MIT", - "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" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "license": "MIT" - }, - "node_modules/utility-types": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", - "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", - "license": "MIT" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", - "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-location": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.2.tgz", - "integrity": "sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", - "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "license": "MIT", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "license": "MIT", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/web-namespaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/webpack": { - "version": "5.90.3", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.3.tgz", - "integrity": "sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==", - "license": "MIT", - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-bundle-analyzer": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz", - "integrity": "sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==", - "license": "MIT", - "dependencies": { - "@discoveryjs/json-ext": "0.5.7", - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "commander": "^7.2.0", - "debounce": "^1.2.1", - "escape-string-regexp": "^4.0.0", - "gzip-size": "^6.0.0", - "html-escaper": "^2.0.2", - "is-plain-object": "^5.0.0", - "opener": "^1.5.2", - "picocolors": "^1.0.0", - "sirv": "^2.0.3", - "ws": "^7.3.1" - }, - "bin": { - "webpack-bundle-analyzer": "lib/bin/analyzer.js" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", - "license": "MIT", - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-server": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", - "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", - "license": "MIT", - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.5", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.13.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpackbar": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", - "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "consola": "^2.15.3", - "pretty-time": "^1.1.0", - "std-env": "^3.0.1" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "webpack": "3 || 4 || 5" - } - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "license": "Apache-2.0", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", - "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.6", - "call-bind": "^1.0.5", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "license": "MIT", - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "license": "MIT" - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xdg-basedir": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/xml-js": { - "version": "1.6.11", - "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", - "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", - "license": "MIT", - "dependencies": { - "sax": "^1.2.4" - }, - "bin": { - "xml-js": "bin/cli.js" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC" - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - } - } -} diff --git a/package.json b/package.json index 307355a71e..bb5abd36b6 100644 --- a/package.json +++ b/package.json @@ -6,31 +6,16 @@ "docusaurus": "docusaurus", "start": "docusaurus start", "build": "docusaurus build", - "swizzle": "docusaurus swizzle", - "deploy": "docusaurus deploy", - "clear": "docusaurus clear", "serve": "docusaurus serve", - "write-translations": "docusaurus write-translations", - "write-heading-ids": "docusaurus write-heading-ids" + "clear": "docusaurus clear" }, "dependencies": { "@docusaurus/core": "^3.4.0", - "@docusaurus/plugin-client-redirects": "^3.4.0", "@docusaurus/preset-classic": "^3.4.0", - "@gracefullight/docusaurus-plugin-vercel-analytics": "^1.0.0", "@mdx-js/react": "^3.0.0", - "@vercel/analytics": "^1.1.2", "clsx": "^1.2.1", - "hast-util-is-element": "1.1.0", - "prism-react-renderer": "^2.1.0", - "punycode": "^2.3.1", "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-icons": "^4.12.0", - "rehype-katex": "^7.0.1", - "remark-definition-list": "^2.0.0", - "remark-math": "^6.0.0", - "zwitch": "^2.0.4" + "react-dom": "^18.2.0" }, "devDependencies": { "@docusaurus/module-type-aliases": "^3.3.2", @@ -53,21 +38,5 @@ "engines": { "node": ">=18.0" }, - "Resources": { - "Layer": { - "Type": "AWS::Serverless::LayerVersion", - "Properties": { - "Description": { - "Fn::Sub": [ - "Stack ${AWS::StackName} Layer ${ResourceName}", - { - "ResourceName": "Layer" - } - ] - }, - "ContentUri": "src/Layer", - "RetentionPolicy": "Retain" - } - } - } + "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" } diff --git a/sidebars.js b/sidebars.js deleted file mode 100644 index 50671bc630..0000000000 --- a/sidebars.js +++ /dev/null @@ -1,254 +0,0 @@ -/** - * Creating a sidebar enables you to: - - create an ordered group of docs - - render a sidebar for each doc of that group - - provide next/previous navigation - The sidebars can be generated from the filesystem, or explicitly defined here. - Create as many sidebars as you want. - */ - -// @ts-check - -/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ -const sidebars = { - // By default, Docusaurus generates a sidebar from the docs folder structure - // tutorialSidebar: [{type: 'autogenerated', dirName: '.'}], - bittensorSidebar: [ - // { - // type: 'link', - // href: 'https://docs.bittensor.com', - // label: "Search", - // className: 'sidebarSearch', // based on Class name it will add search component - // }, - "index", - { - type: 'doc', - id: 'bittensor-rel-notes', - label: 'Releases', - }, - "btcli/btcli-playground", - { - type: "category", - label: "Understand Bittensor", - link: {type: "doc", id: "learn/introduction"}, - collapsible: true, - collapsed: true, - items: [ - "learn/introduction", - "questions-and-answers", - "subnets/understanding-subnets", - "learn/bittensor-building-blocks", - "learn/anatomy-of-incentive-mechanism", - "emissions", - "yuma-consensus", - ], - }, - { - type: "category", - label: "Staking/Delegation", - collapsible: true, - collapsed: true, - link: {type: "doc", id: "staking-and-delegation/delegation",}, - items: [ - "staking-and-delegation/delegation", - "staking-and-delegation/stakers-btcli-guide", - "dynamic-tao/staking-unstaking-dtao", - "staking-and-delegation/managing-stake-btcli", - "staking-and-delegation/managing-stake-sdk", - "staking-and-delegation/staking-polkadot-js", - "staking-and-delegation/using-ledger-hw-wallet"], - }, - { - type: "category", - label: "Mining", - collapsible: true, - collapsed: true, - link: {type: "doc", id: "miners/index",}, - items: [ - "miners/index", - "miners/miners-btcli-guide" - ], - }, - - { - type: "category", - label: "Validating", - collapsible: true, - collapsed: true, - link: {type: "doc", id: "validators/index",}, - items: [ - "validators/index", - "subnets/child-hotkeys", - "validators/validators-btcli-guide" - ], - }, - { - type: "category", - label: "Managing Subnets", - collapsible: true, - collapsed: true, - items: [ - "subnets/create-a-subnet", - "subnets/subnet-creators-btcli-guide", - "subnets/subnet-hyperparameters", - "subnets/working-with-subnets", - "subnets/walkthrough-prompting", - "tutorials/basic-subnet-tutorials", - "tutorials/ocr-subnet-tutorial", - ], - }, - { - type: "category", - label: "BTCLI: The Bittensor CLI", - collapsible: true, - collapsed: true, - link: {type: "doc", id: "btcli/overview",}, - items: [ - "getting-started/install-btcli", - "btcli/btcli-playground", - "btcli-permissions", - "btcli", - "staking-and-delegation/managing-stake-btcli", - ] - }, - { - type: "category", - label: "Bittensor Python SDK", - collapsible: true, - collapsed: true, - items: [ - "getting-started/installation", - "sdk/env-vars", - "bt-api-ref", - "sdk/subtensor-api", - "getting-started/install-wallet-sdk", - "migration_guide", - "subnets/asyncio", - "sdk/managing-subtensor-connections", - - ] - }, - - { - type: "category", - label: "Wallets and Keys", - collapsible: true, - collapsed: true, - items: [ - "getting-started/wallets", - "keys/handle-seed-phrase", - "getting-started/coldkey-hotkey-security", - "working-with-keys", - "keys/multisig", - "subnets/schedule-coldkey-swap", - ] - }, - { - type: "category", - label: "Tools and Special Features", - link: {type: "doc", id: "tools",}, - collapsible: true, - collapsed: true, - items: [ - "bittensor-networks", - "subnets/commit-reveal", - "subnets/consensus-based-weights", - "subnets/bt-logging-levels", - "utilities", - ], - }, - - { - type: "category", - label: "Local Development", - link: {type: "doc", id: "local-build/deploy",}, - collapsible: true, - collapsed: true, - items: [ - "local-build/deploy", - "local-build/provision-wallets", - "local-build/create-subnet", - // "local-build/mine-validate" - ], - }, - - -{ - type: "category", - label: "Subtensor Nodes", - link: {type: "doc", id: "subtensor-nodes/index",}, - collapsible: true, - collapsed: true, - items: [ - "subtensor-nodes/subtensor-node-requirements", - "subtensor-nodes/using-source", - "subtensor-nodes/using-docker", - "subtensor-nodes/subtensor-rate-limits", - "subtensor-nodes/subtensor-storage-query-examples", - ], - }, - - { - type: "category", - label: "EVM smart contracts on Bittensor", - link: {type: "doc", id: "evm-tutorials/index",}, - collapsible: true, - collapsed: true, - items: [ - "evm-tutorials/evm-on-subtensor", - "evm-tutorials/install", - "evm-tutorials/evm-testnet-with-metamask-wallet", - "evm-tutorials/evm-localnet-with-metamask-wallet", - "evm-tutorials/evm-mainnet-with-metamask-wallet", - "evm-tutorials/transfer-from-metamask-to-ss58", - "evm-tutorials/transfer-between-two-h160-accounts", - "evm-tutorials/hardhat-config-for-subtensor-evm", - "evm-tutorials/staking-precompile", - "evm-tutorials/ed25519-verify-precompile", - ], - }, - { - type: "category", - label: "Governance", - collapsible: true, - collapsed: true, - items: [ - "governance", - "senate", - "governance/senators-btcli-guide" - ], - }, { - type: "category", - label: "Dynamic TAO", - link: {type: "doc", id: "dynamic-tao/index",}, - collapsible: true, - collapsed: true, - items: [ - "dynamic-tao/dtao-guide", - "dynamic-tao/dtao-faq", - "dynamic-tao/sdk-cheat-sheet", - - ], - }, - - { - type: "category", - label: "Errors and Troubleshooting", - collapsible: true, - collapsed: true, - link: {type: "doc", id: "errors/index",}, - items: [ - "errors/index", - "errors/custom", - "errors/subtensor", - "errors-and-troubleshooting", - ], - }, - "media-assets", - "glossary", - - ], - -}; - -module.exports = sidebars; diff --git a/src/css/custom.css b/src/css/custom.css index 182cfa200a..0a68ef3bb0 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -1,19 +1,170 @@ -@import url("./style.css"); +/* Base styles */ +html, body { + margin: 0; + padding: 0; + min-height: 100vh; + background: linear-gradient(135deg, #1a1a1a 0%, #2d2d2d 100%); + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', sans-serif; + color: #ffffff; +} + +.redirect-page { + min-height: 100vh; + display: flex; + align-items: center; + justify-content: center; + padding: 20px; +} + +.container { + max-width: 600px; + text-align: center; + background: rgba(255, 255, 255, 0.05); + border-radius: 16px; + padding: 40px; + border: 1px solid rgba(255, 255, 255, 0.1); + backdrop-filter: blur(10px); +} +.logo { + width: 60px; + height: 60px; + margin: 0 auto 20px; + background: url('/img/logo-dark-mode.svg') no-repeat center; + background-size: contain; +} + +h1 { + font-size: 2rem; + margin-bottom: 16px; + color: #ffffff; +} + +.official-notice { + background: rgba(52, 152, 219, 0.15); + border: 1px solid #3498db; + border-radius: 12px; + padding: 24px; + margin: 24px 0; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); +} -/* You can override the default Infima variables here also you can overwrite the styles. you must have to use !important to overwrite style. */ +.official-notice h2 { + color: #3498db; + font-size: 1.2rem; + margin-bottom: 12px; + display: flex; + align-items: center; + gap: 8px; +} + +.link-container { + background: rgba(255, 255, 255, 0.05); + border-radius: 8px; + padding: 16px; + margin: 16px 0; + border: 1px solid rgba(255, 255, 255, 0.1); +} + +.link-container p { + margin-bottom: 8px; + color: #e0e0e0; +} + +.link-box { + display: flex; + align-items: center; + justify-content: center; + gap: 12px; + background: rgba(52, 152, 219, 0.1); + padding: 12px 16px; + border-radius: 6px; + margin-top: 8px; +} + +.link-box a { + color: #3498db; + text-decoration: none; + font-weight: 500; + transition: color 0.2s ease; +} + +.link-box a:hover { + color: #2980b9; + text-decoration: underline; +} + +.contribution-note { + background: rgba(46, 204, 113, 0.1); + border: 1px solid #2ecc71; + border-radius: 8px; + padding: 16px; + margin: 16px 0; + font-size: 0.95rem; + color: #e0e0e0; +} + +.contribution-note strong { + color: #2ecc71; +} + +.countdown-container { + margin: 30px 0; +} + +.countdown { + font-size: 3rem; + font-weight: bold; + color: #3498db; + margin: 16px 0; +} + +.redirect-button { + display: inline-block; + background: #3498db; + color: white; + padding: 14px 28px; + text-decoration: none; + border-radius: 8px; + font-weight: 600; + font-size: 1.1rem; + margin: 20px 0; + transition: background 0.3s ease; +} + +.redirect-button:hover { + background: #2980b9; +} + +.security-note { + background: rgba(241, 196, 15, 0.2); + border: 1px solid #f1c40f; + border-radius: 8px; + padding: 12px; + margin: 20px 0; + font-size: 0.95rem; +} + +.security-note strong { + color: #f1c40f; +} -/* Fix anchor link scrolling to account for fixed header */ -h1[id], -h2[id], -h3[id], -h4[id], -h5[id], -h6[id] { - scroll-margin-top: 100px !important; +.footer { + margin-top: 30px; + font-size: 0.9rem; + color: #999; } -/* Also add scroll margin to elements with anchor links */ -:target { - scroll-margin-top: 100px !important; +@media (max-width: 768px) { + .container { + padding: 20px; + } + + h1 { + font-size: 1.5rem; + } + + .countdown { + font-size: 2rem; + } } \ No newline at end of file diff --git a/src/css/style.css b/src/css/style.css deleted file mode 100644 index f020351b1d..0000000000 --- a/src/css/style.css +++ /dev/null @@ -1,1513 +0,0 @@ -/** - * Any CSS included here will be global. The classic template - * bundles Infima by default. Infima is a CSS framework designed to - * work well for content-centric websites. - */ - -/* You can override the default Infima variables here. */ -:root { - --ifm-color-primary: rgba(14, 16, 19, 1); - --ifm-color-primary-dark: #29784c; - --ifm-color-primary-darker: #277148; - --ifm-color-primary-darkest: #205d3b; - --ifm-color-primary-light: black; - --ifm-color-primary-lighter: #359962; - --ifm-color-primary-lightest: #3cad6e; - --ifm-code-font-size: 95%; - --ifm-h1-font-size: 1.8rem; - --ifm-h2-font-size: 1.5rem; - --ifm-h3-font-size: 1.2rem; - --ifm-h4-font-size: 1rem; - --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); - --text-primary: #5f6368; - --text-secondary: #5f6368; - --grey-100: #f8f9fa; /* --contrast-100 */ - --grey-900: #0e1013; /* --border-dashed-primary-hk */ - --ifm-menu-color-background-hover: var(--grey-100) -} - -/* For readability concerns, you should choose a lighter palette in dark mode. */ -[data-theme="dark"] { - --ifm-color-primary: white; - --ifm-color-primary-dark: white; - --ifm-color-primary-darker: #1fa588; - --ifm-color-primary-darkest: #1a8870; - --ifm-color-primary-light: #29d5b0; - --ifm-color-primary-lighter: #32d8b4; - --ifm-color-primary-lightest: #4fddbf; - --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); - --ifm-background-surface-color: #000000 !important; - --ifm-background-color: #000000 !important; - --ifm-navbar-active-color: white; - --ifm-navbar-item-color: #a5abaf; - --ifm-footer-div-color: black; - --ifm-table-of-contents-border: rgba(40, 42, 45, 1); - --ifm-table-of-contents-border-active: rgba(248, 249, 250, 1); - --ifm-table-of-contents-text: #a5abaf; - --ifm-table-of-contents-text-active: white; - --ifm-breadcrumbs__item--active: rgba(248, 249, 250, 1); - --ifm-menu__link--active: #5f6368; - --ifm-dropdown-background-color: #242526 !important; - --ifm-footer-bg: #0E1013; - --ifm-footer-company-name-color: white; - --ifm-algolia-bg: #242526; - --ifm-algolia-border: #7f8497; - --ifm-navbar-border: #282A2D; - --ifm-alert-secondary: rgba(235, 237, 240, 0.15); - --ifm-alert-success: rgba(0, 164, 0, 0.15); - --ifm-alert-info: rgba(84, 199, 236, 0.15); - --ifm-alert-warning: rgba(255, 186, 0, 0.15); - --ifm-alert-danger: rgba(250, 56, 62, 0.15); - --ifm-blockquote-border: #606770; - --ifm-tab-container-active-bg: white; - --ifm-tab-container-active-color: black; - --ifm-ul: #f5f6f7; - --ifm-hr: rgba(95, 99, 104, 1); - --ifm-search-icon-color: #a5abaf; - --ifm-doc-search-border-color: #000000; - --ifm-table-header-bg: #2B2B2D; - --ifm-table-header-color: white; - --ifm-table-body-color: #D7E3E3; - --ifm-table-tr-border: #3c3e42; - --ifm-doc-search-title-color: white; - --ifm-dock-search-active-a-bg: #000000; - --ifm-dock-search-active-a-color: white; - --ifm-dock-search-svg-color: white; - --ifm-doc-search-title-bg: #242526; -} - -[data-theme="light"] { - --ifm-color-primary: black; - --ifm-color-primary-dark: white; - --ifm-color-primary-darker: #1fa588; - --ifm-color-primary-darkest: #1a8870; - --ifm-color-primary-light: black; - --ifm-color-primary-lighter: #32d8b4; - --ifm-color-primary-lightest: #4fddbf; - --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); - --ifm-navbar-active-color: black; - --ifm-navbar-item-color: rgb(111, 112, 114); - --ifm-footer-div-color: white; - --ifm-table-of-contents-border: rgba(219, 221, 225, 1); - --ifm-table-of-contents-border-active: black; - --ifm-table-of-contents-text: #5F6368; - --ifm-table-of-contents-text-active: #0E1013; - --ifm-breadcrumbs__item--active: rgba(14, 16, 19, 1); - --ifm-menu__link--active: rgb(111, 112, 114); - --ifm-footer-bg: #0E1013; - --ifm-footer-company-name-color: white; - --ifm-algolia-bg: white; - --ifm-algolia-border: #0E1013; - --ifm-navbar-border: #DBDDE1; - --ifm-alert-secondary: #F8F9FA; - --ifm-alert-success: #E6F5E6; - --ifm-alert-info: #EEF9FC; - --ifm-alert-warning: #FFF8E6; - --ifm-alert-danger: #FFEBEC; - --ifm-blockquote-border: #DBDDE1; - --ifm-tab-container-active-bg: black; - --ifm-tab-container-active-color: white; - --ifm-ul: rgba(95, 99, 104, 1); - --ifm-hr: rgba(14, 16, 19, 1); - --ifm-search-icon-color: #1c1e21; - --ifm-doc-search-border-color: rgba(219, 221, 225, 1); - --ifm-table-header-bg: #F8F9FA; - --ifm-table-header-color: #5F6368; - --ifm-table-body-color: rgba(95, 99, 104, 1); - --ifm-table-tr-border: rgba(14, 16, 19, 1); - --ifm-doc-search-title-color: rgba(14, 16, 19, 1); - --ifm-dock-search-active-a-bg: white; - --ifm-dock-search-active-a-color: #000000; - --ifm-dock-search-svg-color: rgba(14, 16, 19, 1); - --ifm-doc-search-title-bg: white; -} - - -@font-face { - font-family: "Haffer"; - src: url(../../static/fonts/Haffer-Light.ttf); - font-weight: 200; - font-style: normal; -} - -@font-face { - font-family: "Haffer"; - src: url(../../static/fonts/Haffer-Medium.ttf); - font-weight: 400; - font-style: normal; -} - -@font-face { - font-family: "Haffer"; - src: url(../../static/fonts/Haffer-Regular.ttf); - font-weight: normal; - font-style: normal; -} - -@font-face { - font-family: "Haffer"; - src: url(../../static/fonts/Haffer-SemiBold.ttf); - font-weight: bold; - font-style: normal; -} - -@font-face { - font-family: "HafferSQ"; - src: url(../../static/fonts/HafferSQ-Light.ttf); - font-weight: 200; - font-style: normal; -} - -@font-face { - font-family: "HafferSQ"; - src: url(../../static/fonts/HafferSQ-Medium.ttf); - font-weight: 400; - font-style: normal; -} - -@font-face { - font-family: "HafferSQ"; - src: url(../../static/fonts/HafferSQ-Regular.ttf); - font-weight: normal; - font-style: normal; -} - -@font-face { - font-family: "HafferSQ"; - src: url(../../static/fonts/HafferSQ-SemiBold.ttf); - font-weight: bold; - font-style: normal; -} - -@font-face { - font-family: "TTCommonsPro"; - src: url(../../static/fonts/TTCommonsProMonoMedium.ttf); - font-weight: 200; - font-style: normal; -} - -@font-face { - font-family: "TTCommonsPro"; - src: url(../../static/fonts/TTCommonsProMonoRegular.ttf); - font-weight: 100; - font-style: normal; -} - -@font-face { - font-family: "FiraCode"; - src: url(../../static/fonts/FiraCode_VariableFont_wght.ttf); -} - -@font-face { - font-family: "DM Mono"; - src: url(../../static/fonts/DMMono-Regular.ttf); - font-weight: normal; - font-style: normal; -} - -@font-face { - font-family: "DM Mono"; - src: url(../../static/fonts/DMMono-Medium.ttf); - font-weight: 500; - font-style: normal; -} - -body { - font-family: "Haffer"; - font-size: 16px; - font-weight: 200; - letter-spacing: 0%; - line-height: 160%; -} - -.h1 { - font-family: "Haffer"; - font-size: 32px; - font-weight: 400; - letter-spacing: calc(-0.01 * 20px); - line-height: 120%; -} - -.h2 { - font-family: "Haffer"; - font-size: 24px; - font-weight: 400; - letter-spacing: calc(-0.01 * 20px); - line-height: 120%; -} - -.h3 { - font-family: "Haffer"; - font-size: 20px; - font-weight: 400; - letter-spacing: 0%; - line-height: 120%; -} - -.h4 { - font-family: "Haffer"; - font-size: 16px; - font-weight: bold; - letter-spacing: 0%; - line-height: 140%; -} - -a { - /* color: rgb(0, 49, 0); */ - color: none; - font-weight: 400; -} - - -h1 { - font-weight: 400 !important; - font-size: 32px !important; - padding-bottom: 22px !important; - margin-top: -16px !important; -} - -h1.anchor { - font-weight: 400 !important; - font-size: 32px !important; -} - -h2 { - font-weight: 400 !important; - font-size: 24px !important; -} - -h2.anchor { - font-weight: 400 !important; - font-size: 24px !important; -} - -h3 { - font-weight: 400 !important; - font-size: 20px !important; -} - -h3.anchor { - font-weight: 400 !important; - font-size: 20px !important; -} - -h4 { - font-size: 16px !important; - font-weight: bold !important; -} - -h4.anchor { - font-size: 16px !important; - font-weight: bold !important; -} - -p { - font-size: 16px !important; - font-weight: 400 !important; -} - -.menu__list { - list-style: none; - margin: 0 !important; - padding-left: 0 !important; - font-family: "FiraCode"; - font-size: 12px; - font-weight: 400; - letter-spacing: calc(0.05 * 12px); - line-height: 150%; - text-transform: uppercase; -} - -.theme-doc-sidebar-item-category > ul > li > a { - padding-left: 48px; -} - -.theme-doc-sidebar-container > div > div { - padding-top: 96px !important; - margin-top: -96px !important; -} - -.table-of-contents, -.table-of-contents ul { - font-family: "FiraCode"; -} -[class*="tableOfContents"] { - padding-top: 20px; -} - -.pagination-nav__link--prev .pagination-nav__label::before { - content: ""; -} - -.pagination-nav__link--next .pagination-nav__label::after { - content: ""; -} - -.pagination-nav__link { - border: none; -} - -.navbar__link { - font-size: 12px; - font-weight: 500; - font-family: 'DM Mono', monospace; - color: var(--text-secondary); - letter-spacing: 0.6px; -} -[data-theme="dark"] .navbar__link:hover { - color:#e3e3e3 !important; -} - -.navbar__link:hover { - color: #000 !important; -} - -.theme-last-updated { - font-style: normal; - font-weight: 400; - font-size: 9px; - text-transform: uppercase; - font-family: "FiraCode"; -} - -.parameter-label { - display: inline-block; - position: relative; - top: 3px; - color: #fff; - text-transform: uppercase; - font-size: 11px; - font-weight: 700; - padding: 1px 5px; -} - -.success { - background: #859900; -} - -.important { - background: #dc322f; -} - - -ul { - font-family: "Haffer"; - font-weight: 200; - text-transform: none; -} - -.navbar { - margin-bottom: 10px; -} - -.sidebar-title { - font-size: 1rem; - font-family: "Haffer"; - font-weight: 500; - letter-spacing: 0.05em; - margin: 0.7rem; - text-transform: uppercase; -} - -#bittensor-img { - width: 80%; - display: block; - margin-left: auto; - margin-right: auto; -} - -/* ALGOLIA SEARCH INPUT */ - -/* NAVBAR LINKS */ -.navbar__item.navbar__link { - font-family: 'DM Mono', monospace; - color: var(--text-secondary); - font-size: 12px !important; - align-items: center; - letter-spacing: 0.6px; - margin-left: 32px; -} -@media (min-width: 997) { - .navbar__item.navbar__link { - display: flex; - } -} - -.dropdown--right { - margin-right: auto; - margin-bottom: 0 !important; -} - -/* NAV TITLE */ -.navbar__title.text--truncate { - font-size: 16px !important; - line-height: 27.2px !important; - font-weight: 400 !important; - font-family: "Haffer"; - letter-spacing: 0.32px; -} - -/* Bread Crumb */ -.breadcrumbs__item .breadcrumbs__link { - color: var(--text-secondary); - line-height: 130%; - letter-spacing: 0.6px; -} - -.breadcrumbs__item.breadcrumbs__item--active .breadcrumbs__link { - background: initial !important; - color: var(--text-primary); - font-family: 'DM Mono', monospace; -} - -/* Footer */ - -.footer__copyright.footer__copyright__custom .container { - max-width: 100%; -} - -@media (min-width: 1440px) { - .footer .container { - max-width: 100% !important; - padding: 0; - } -} - -.theme-doc-sidebar-container>div>div { - width: 100% !important; -} - -.theme-doc-sidebar-container nav { - padding: 16px 16px 16px 16px !important; - margin-top: 80px; -} - -.menu__link { - padding: 15px; - font-size: 15px !important; -} -.menu__link--sublist-caret::after{ - background: url('data:image/svg+xml;utf8,'); - transform: rotate(90deg); -} -.menu__caret::before{ - background: url('data:image/svg+xml;utf8,'); -} -.menu__caret{ - transform: rotate(270deg); - margin-right: 2px; -} -.menu__list-item--collapsed .menu__link--sublist::after, .menu__list-item--collapsed.menu__caret::before{ - transform: rotateZ(0deg) !important; -} -.theme-doc-sidebar-menu.menu__list > li { - position: relative; -} -.theme-doc-sidebar-menu.menu__list > li::after { - content: ''; - background-position: 0 0; - background-image: linear-gradient(to right, var(--grey-900), 1.5px, transparent 1.5px); - background-repeat: repeat-x; - background-size: 6px; - display: block; - width: 100%; - height: 1.5px; - position: absolute; - bottom: 0px; - left: 0; -} - -.menu__list-item-collapsible { - position: relative; -} -.menu__list-item-collapsible::after { - content: ''; - background-position: 0 0; - background-image: linear-gradient(to right, var(--grey-900), 1.5px, transparent 1.5px); - background-repeat: repeat-x; - background-size: 6px; - display: block; - width: 100%; - height: 1.5px; - position: absolute; - bottom: 0px; - left: 0; -} - -.theme-doc-sidebar-item-link-level-2 { - position: relative; -} -.theme-doc-sidebar-item-link-level-2:not(:last-child)::after { - content: ''; - background-position: 0 0; - background-image: linear-gradient(to right, var(--grey-900), 1.5px, transparent 1.5px); - background-repeat: repeat-x; - background-size: 6px; - display: block; - width: 100%; - height: 1.5px; - position: absolute; - bottom: 0px; - left: 0; -} - -.theme-doc-sidebar-menu.menu__list li { - margin: 0 !important; -} - -.theme-doc-sidebar-menu.menu__list li > a { - height: 48px; -} - -.menu__link.menu__link--sublist.menu__link--sublist-caret { - height: 48px; -} - -.menu__link { - border-radius: 0 !important; - color: var(--ifm-navbar-item-color); - font-size: 12px !important; - font-family: 'DM Mono', monospace; - letter-spacing: 0.6px !important; -} - -[data-theme="dark"] .menu__link:hover { - color:var(--ifm-table-of-contents-text-active); - background-color: transparent; -} - -[data-theme="dark"] .menu__list-item-collapsible { - background-color: transparent !important; - color:var(--ifm-table-of-contents-text-active) !important; -} - -.menu__link--active { - background-color: transparent !important; - color: var(--ifm-navbar-active-color) !important; - font-weight: 600; -} - -/* custom style for navbar - Change the Class name if you want stick with it (custom_algolia) */ -.custom__algolia__search__container_xfkw>div>div { - width: 353px !important; - min-width: 353px !important; - max-width: 353px !important; - height: 50px; -} - -.custom__algolia__search__container_xfkw>div { - width: 353px !important; - min-width: 353px !important; - max-width: 353px !important; - height: 50px; -} - -@media screen and (min-width: 996px) { - .custom_algolia { - position: absolute; - left: 178px; - top: 200px; - } - .custom_algolia > div { - display: block !important; - } -} - - -.search_container > div { - width: 268px !important; - height: 50px; -} - -.navbar__inner { - align-content: center; -} - -.navbar__item { - padding: 0; -} - -.navbar__items--right { - gap: 0 32px !important; - height: 48px; -} - -/* right bar style */ -.table-of-contents__link { - color: #5F6368; - font-family: 'DM Mono', monospace; - font-size: 0.75rem; - line-height: 130%; - letter-spacing: 0.6px; -} - -.table-of-contents__link--active { - font-weight: bold; -} - -.table-of-contents.table-of-contents__left-border { - border: none !important; -} - -.table-of-contents.table-of-contents__left-border li { - margin: 0 !important; -} - -.table-of-contents.table-of-contents__left-border li a { - padding: 10px 0; - padding-left: 15px; -} - -.table-of-contents.table-of-contents__left-border ul { - padding: 0 !important; -} - -.table-of-contents>li>ul>li>a { - padding-left: 30px !important; - display: table !important; -} - -.table-of-contents>li>ul>li>ul>li>a { - margin-left: 45px !important; -} - -.table-of-contents .table-of-contents__link:hover { - color: var(--ifm-table-of-contents-text-active) !important; -} - -.container.padding-top--md { - position: relative; -} - -.container.padding-top--md>div>div:last-child { - padding-left: 1rem !important; -} - -.container.padding-top--md>div>div:first-child { - padding: 32px 32px 48px 56px !important; -} -/* */ -@media screen and (max-width: 550px) { - .container.padding-top--md>div>div:first-child { - padding: 32px 32px 48px 32px !important; - } -} - -.breadcrumbs:first-child svg { - top: 0px !important; - height: 1rem; - width: 1rem; -} - -.breadcrumbs__item--active span { - padding: 5px; -} - -/* dropdown */ -.dropdown { - z-index: 9999 !important; - padding-bottom: 10px; - margin-bottom: -10px !important; -} - -.dropdown_menu_container { - position: relative; -} - -.dropdown_menu_container li { - list-style: none; -} - -.dropdown_menu_container .dropdownNavbarItemNested { - position: absolute; - left: 100%; -} - -.dropdown__menu { - padding: 0; - min-width: 200px !important; - border: 1px solid var(--ifm-navbar-border); - box-shadow: 0px 0px 20px 0px rgba(0, 0, 0, 0.08); - border-radius: var(--border-radius-border-radius-base, 4px); -} -.dropdown--right .dropdown__menu{ - right: unset; -} - -.dropdown__menu .dropdown__link { - padding: 7px 20px !important; - border-radius: 0 !important; - margin: 0 !important; - cursor: pointer; - color: var(--text-secondary, #5F6368); - font-family: 'DM Mono', monospace; - font-size: 12px; - letter-spacing: 0.6px; - text-transform: uppercase; -} - -/* Custom bottom border mixin */ -.dropdown__menu > li { - position: relative; -} -.dropdown__menu > li:not(:last-child)::after { - content: ''; - background-position: 0 0; - background-image: linear-gradient(to right, var(--grey-900), 1.5px, transparent 1.5px); - background-repeat: repeat-x; - background-size: 6px; - display: block; - width: 100%; - height: 1.5px; - position: absolute; - bottom: 0; - left: 0; -} - -.dropdown__link:hover { - background-color: var(--grey-100); -} - -.dropdown__menu ul { - padding-left: 15px !important; - height: 0; - overflow: hidden; - transition: all ease 0.3s !important; -} - -@keyframes heightAnimation { - 0% { - height: 0px; - border-bottom: 1px dashed rgba(95, 99, 104, 1); - } - - 100% { - border-bottom: 1px dashed rgba(95, 99, 104, 1); - height: 100%; - } -} - -.dropdown__menu .active-nested-dropdown { - animation-name: heightAnimation; - animation-duration: 1s; - animation-fill-mode: both; -} - -.dropdown__menu_nested_items { - border-bottom: 1px dashed rgba(95, 99, 104, 1) !important; -} - -.dropdown__menu li:last-child a { - border-bottom: 0 !important; -} - -.dropdown__menu li:last-child ul { - border-bottom: 0 !important; -} - -.dropdown__menu li:last-child { - border-bottom: 0 !important; -} - -.dropdown__menu ul li { - list-style: none !important; -} - -.dropdown__menu .has-dropdown { - display: flex; - width: 100% !important; - position: relative; -} - -.dropdown__menu .has-dropdown a { - width: 100% !important; -} - -.dropdown__menu .has-dropdown .arrow { - position: absolute; - right: 15px; - top: 12px; -} - -.navbar__item.dropdown a { - /* margin-top: 6px; */ - display: block; -} - -.navbar__item.dropdown a::after { - margin-left: 8px !important; - margin-bottom: 2px !important; -} - -/* Dropdown caret */ -.dropdown > .navbar__link::after { - border-width: 0.3em 0.3em 0; - top: 1px; -} - -/* breadcrumbs styles */ -.breadcrumbs { - display: flex; - flex-wrap: wrap; -} - -.breadcrumbs .breadcrumbs__item::after { - background: url("../../static//img/slice.svg"); - height: 15px; - background-size: cover; - background-repeat: no-repeat; -} - -.breadcrumbs .breadcrumbs__item span { - padding: 0 !important; - display: table; -} - -.breadcrumbs .breadcrumbs__item { - display: flex; - align-items: center; -} - -.breadcrumbs .breadcrumbs__item:first-child { - display: flex !important; -} - -.breadcrumbs .breadcrumbs__item .breadcrumbs__link { - padding: 0 !important; - font-size: 0.75rem; -} - -.breadcrumbs__item--active span { - color: var(--ifm-breadcrumbs__item--active) !important; -} - -/* Feedback */ -.feedback { - display: flex !important; - align-items: center; - gap: 0 20px; -} - -.feedback span { - font-weight: 400 !important; - text-transform: uppercase; - font-size: 0.7rem; - font-family: 'DM Mono', monospace; - letter-spacing:0.6; -} - -.feedback .feelings { - display: flex; - align-items: center; - gap: 0 16px; -} - -.feeling { - width:32px; - height:32px; - border: 1px solid rgba(219,221,225,1); - border-radius:4px; - display: flex; - align-items: center; - justify-content: center; - cursor: pointer; -} - -.feedbackAndName { - display: flex; - align-items: center; - width: 100%; - justify-content: space-between; - margin-top: 80px; -} - -.feeling-symbol { - cursor: pointer !important; -} - -.footer-line div { - position: absolute; - left: 0; - right: 0; - width: 100% !important; - border-top: 2px solid var(--ifm-navbar-border); - margin-top: -10px; - height: 110px; - z-index: 9 !important; - background-color: var(--ifm-footer-div-color); -} - -/* pagination */ -.pagination-nav { - display: flex !important; - justify-content: space-between; - z-index: 99 !important; - position: relative; -} - -.pagination-nav .pagination-nav__link { - max-width: 30% !important; -} - -.pagination-nav:has(.pagination-nav__link:first-child.pagination-nav__link--next) { - justify-content: end; -} - - -.table-of-contents.table-of-contents__left-border li a { - border-left: 1px solid var(--ifm-table-of-contents-border); -} - -.table-of-contents.table-of-contents__left-border li a { - font-weight: 400; - color: var(--ifm-table-of-contents-text); -} - -.table-of-contents__link--active { - border-left: 1px solid var(--ifm-table-of-contents-border-active) !important; - color: var(--ifm-table-of-contents-text-active) !important; -} - -.menu__link--sublist-caret.menu__link--active { - color: var(--ifm-menu__link--active) !important -} - -.footer { - padding: 25px 30px !important; - background-color: var(--ifm-footer-bg) !important; -} - -.footer .footer__copyright { - font-family: TTCommonsPro !important; - font-size: 14px !important; - text-transform: uppercase !important; - display: flex; - align-items: center; - justify-content: space-between; -} - - -.footer .footer__copyright a { - color: var(--ifm-footer-company-name-color) !important; -} - - -/* Algolia Search */ -.DocSearch { - position: fixed !important; - left: 0; - top: 0; - width: 100%; - height: 100%; - display: flex; - align-items: center; - justify-content: center; -} - -.DocSearch .DocSearch-Modal { - background-color: var(--ifm-algolia-bg) !important; - border-radius: 10px !important; - min-width: 40% !important; -} - -.DocSearch .DocSearch-Footer { - display: none !important; -} - -.DocSearch .DocSearch-Form { - background-color: var(--ifm-algolia-bg) !important; - box-shadow: inset 0 0 0 1px var(--ifm-algolia-border) !important; -} - -.DocSearch .DocSearch-Form label { - color: var(--ifm-algolia-border) !important; -} - -.DocSearch .DocSearch-Form label svg { - width: 20px !important; - height: 20px !important; -} - -.DocSearch .DocSearch-Form input::placeholder { - font-size: 16px !important; -} - -.DocSearch .DocSearch-Form input { - font-size: 16px !important; -} - -.DocSearch-Modal .DocSearch-Hit-source { - font-size: 14px !important; - text-transform: uppercase !important; - font-family: TTCommonsPro !important; -} - -.DocSearch-Modal #docsearch-list li { - margin: 0 !important; -} - -.navbar { - border-bottom: none !important; - box-shadow: none !important; -} - -.navbar__logo { - margin-right: 13rem; -} - -/* Components design */ -.alert { - position: relative; - border-left-width: 3px !important; - border-radius: 0 !important; - font-family: Haffer !important; - box-shadow: 0 !important; -} - -.alert.alert--secondary { - background-color: var(--ifm-alert-secondary) !important; -} - -.alert.alert--success { - background-color: var(--ifm-alert-success) !important; -} - -.alert.alert--info { - background-color: var(--ifm-alert-info) !important; -} - -.alert.alert--warning { - background-color: var(--ifm-alert-warning) !important; -} - -.alert.alert--warning span svg { - width: 18px !important; -} - -.alert.alert--danger { - background-color: var(--ifm-alert-danger) !important; -} - -.alert.alert--success svg, -.alert.alert--info svg, -.alert.alert--secondary svg { - width: 1.1rem !important; - height: 1.1rem !important; -} - -blockquote { - border-left: 3px solid var(--ifm-blockquote-border) !important; -} - -.language-bash>div span>span.token.plain { - font-family: FiraCode !important; -} - -.theme-code-block div:first-child { - display: flex !important; - align-items: center; - gap: 0 10px !important; - font-family: FiraCode !important; -} - -.theme-code-block div:first-child svg { - margin-top: -1px !important; -} - -code { - font-family: FiraCode !important; -} - -.tabs-container>ul { - display: flex !important; - gap: 0 5px; -} - -.tabs-container>ul li { - border-radius: 5px !important; - font-weight: 400 !important; - letter-spacing: 2px; - font-size: 14px !important; - padding: 8px 10px !important; - padding-bottom: 5px !important; -} - -.tabs-container>ul li.tabs__item--active { - border-bottom: 0 !important; - background-color: var(--ifm-tab-container-active-bg) !important; - color: var(--ifm-tab-container-active-color) !important; -} - -table { - background-color: transparent !important; - border-color: transparent !important; - border-spacing: 0 !important; - border: 0 !important; - width: 100% !important; - min-width: 100% !important; - display: table !important; -} - -table thead { - background-color: var(--ifm-table-header-bg) !important; -} - - -table tr { - border-bottom: 1px dotted var(--ifm-table-tr-border) !important; - border: 0 !important; - border-spacing: 10px !important; - background-color: transparent !important; - background-image: linear-gradient(to right, var(--ifm-table-tr-border) 50%, transparent 50%); - background-size: 7px 1px; - background-repeat: repeat-x; - background-position: 0 bottom; -} - -table tbody tr:last-child { - border-bottom: 0 !important; - background-image: none !important; -} - -table tbody { - background-color: transparent !important; -} - -table tr td, -th { - border: 0 !important; - font-weight: 400 !important; -} - -table tr th { - color: var(--ifm-table-header-color) !important; - font-size: 15px !important; - /* text-align: center !important; */ - font-family: TTCommonsPro !important; - font-weight: 600 !important; -} - -table tr th:first-child { - text-align: start !important; -} - -table tr th:last-child { - text-align: start !important; -} - -table tr td { - color: var(--ifm-table-body-color) !important; - font-size: 14px !important; -} - -table tr td:first-child { - font-weight: 400 !important; -} - -hr { - background-color: transparent !important; - background-image: linear-gradient(to right, var(--ifm-hr) 10%, transparent 30%); - background-size: 5px 7px; - background-repeat: repeat-x; - background-position: 0 bottom; -} - -ol:not([class]) li { - font-size: 16px !important; - font-weight: 400 !important; - font-family: "Haffer"; -} - -ul.dashed_ul { - list-style-type: none !important; - padding: 0 !important; - padding-left: 25px !important; -} - -ul.dashed_ul>li { - font-size: 16px !important; - position: relative; - font-weight: 400 !important; -} - -ul.dashed_ul>li::before { - content: "" !important; - display: block; - width: 8px !important; - background-color: var(--ifm-ul) !important; - height: 1px !important; - margin-top: 12px !important; - margin-right: 10px !important; - position: absolute; - left: -15px; -} - - -p>a>img[loading="lazy"] { - width: 100% !important; -} - -.open_grepper_editor { - display: none !important; -} - - -.theme-doc-sidebar-menu.menu__list li:first-child>div { - display: none !important; -} - -.navbar .navbar__inner .navbar__items .navbar__brand { - display: flex; -} - -.lastEdit { - width: 100%; - text-align: right; - font-size: 12px !important; - font-family: TTCommonsPro !important; - color: #5f6368; - position: absolute !important; - top: -15px !important; -} - -.navbar.navbar--fixed-top { - margin-bottom: 0 !important; -} - -main article { - position: relative !important; -} - -main article a { - text-decoration: underline !important; -} - -footer .container.container-fluid { - margin: 0 !important; - max-width: 100% !important; -} - -#docsearch-list { - border: 2px solid var(--ifm-doc-search-border-color) !important; - border-radius: 5px !important; -} - -#docsearch-list li { - padding: 0 !important; -} - -#docsearch-list li a { - box-shadow: none !important; - border-bottom: 1px dashed var(--ifm-doc-search-border-color) !important; - background-color: transparent !important; -} - -#docsearch-list li:last-child a { - border-bottom: 0 !important; -} - -#docsearch-list li a .DocSearch-Hit-icon svg { - color: var(--ifm-dock-search-svg-color) !important; -} - -.DocSearch-Hits .DocSearch-Hit-source { - font-weight: 600 !important; - color: var(--ifm-doc-search-title-color) !important; - font-size: 13px !important; - letter-spacing: 1px !important; - background: var(--ifm-doc-search-title-bg) !important; -} - -.DocSearch-Hit[aria-selected=true] a { - background-color: var(--ifm-dock-search-active-a-bg) !important; - border-radius: 0 !important; -} - -.DocSearch-Hit[aria-selected=true] a .DocSearch-Hit-title { - font-weight: bold !important; - color: var(--ifm-dock-search-active-a-color) !important; -} - -.DocSearch-Hit[aria-selected=true] a .DocSearch-Hit-title mark { - font-weight: bold !important; - color: var(--ifm-dock-search-active-a-color) !important; - background-color: rgba(233, 244, 164, 1) !important; - color: #000000 !important; -} - -.DocSearch-Hit[aria-selected=true] a .DocSearch-Hit-path { - font-weight: 400 !important; - color: var(--ifm-dock-search-active-a-color) !important; -} - -.DocSearch-Hit[aria-selected=true] a .DocSearch-Hit-path mark { - font-weight: 600 !important; - color: var(--ifm-dock-search-active-a-color) !important; - background-color: rgba(233, 244, 164, 1) !important; - color: #000000 !important; -} - -.DocSearch-Hit[aria-selected=true] a .DocSearch-Hit-Tree { - color: var(--docsearch-muted-color) !important; -} - - -[data-theme="dark"] { - .theme-doc-sidebar-menu li:first-child>div>div { - border: 1px solid #282a2d !important; - } -} - -[data-theme="light"] { - .menu__link--sublist-caret.menu__link--active { - font-weight: 400; - } - - .footer__copyright.footer__copyright__custom { - color: var(--grey-100) !important; - } -} - -@media screen and (max-width: 1310px) { - .navbar__inner .navbar__items--right a:nth-child(3) { - margin-right: 20px !important; - } -} - -@media screen and (max-width: 996px) { - .navbar__inner .navbar__items:first-child div { - right: 0 !important; - } - - .navbar.navbar--fixed-top { - padding: 10px 15px !important; - } - - .navbar__inner .search_container div:last-child { - margin-right: 0px !important; - } - - .theme-doc-sidebar-menu.menu__list li:first-child>div { - display: block !important; - } - - .navbar__inner .search_container { - width: 100%; - } - - .navbar__toggle.clean-btn { - margin-bottom: 5px; - } - - .navbar__items.navbar__items--right { - display: none; - } -} - - -@media screen and (max-width: 600px) { - - .pagination-nav .pagination-nav__link { - max-width: 45% !important; - width: 100% !important; - padding: 0 !important; - } - - .footer-line div { - height: 2px !important; - } - - .footer { - padding: 20px 10px !important; - } - - .footer .footer__copyright { - gap: 0 20px !important; - } - - .navbar { - padding: 5px 20px !important; - } -} - -@media screen and (max-width: 550px) { - .pagination-nav.docusaurus-mt-lg { - margin-top: 80px !important; - } -} - -@media screen and (max-width: 500px) { - .navbar-sidebar { - width: 100% !important; - } - - .navbar-sidebar__item:last-child { - width: 100% !important; - } - - .pagination-nav .pagination-nav__link { - max-width: 489 !important; - } - - .navbar-sidebar__item menu{ - width: 100% !important; - } - -} - - -@media screen and (max-width: 420px) { - - .navbar { - padding: 5px 10px !important; - } - - .footer { - padding: 20px 0 !important; - } -} - -.pagination-nav__link--next > .pagination-nav__label{ - text-align: right; -} - -.pagination-nav__link--next > .pagination-nav__sublabel { - font-family: 'DM Mono', monospace; - position: relative; - padding-right: 12px; - text-align: right; -} - -.pagination-nav__link--next > .pagination-nav__sublabel::before { - content: ""; - position: absolute; - right: 0px; - top: 4.5px; - width: 0; - height: 0; - border-top: 4px solid transparent; /* Adjust the size of the arrow */ - border-bottom: 4px solid transparent; /* Adjust the size of the arrow */ - border-left: 6px solid rgb(82, 88, 96); /* Adjust the size and color of the arrow */ -} - -.pagination-nav__link--prev > .pagination-nav__sublabel { - font-family: 'DM Mono', monospace; - position: relative; - padding-left: 12px; -} - -.pagination-nav__link--prev > .pagination-nav__sublabel::before { - content: ""; - position: absolute; - left: 0px; - top: 4.5px; - width: 0; - height: 0; - border-top: 4px solid transparent; - border-bottom: 4px solid transparent; - border-right: 6px solid rgb(82, 88, 96); -} - -.important { - background: none; -} diff --git a/src/pages/index.js b/src/pages/index.js new file mode 100644 index 0000000000..26316748f0 --- /dev/null +++ b/src/pages/index.js @@ -0,0 +1,95 @@ +import React, { useEffect } from 'react'; + +export default function Home() { + useEffect(() => { + // Countdown functionality + let countdownElement = document.getElementById('countdown'); + let timeLeft = 30; + + function updateCountdown() { + countdownElement.textContent = timeLeft; + + if (timeLeft <= 0) { + countdownElement.textContent = 'Redirecting...'; + window.location.href = 'https://docs.learnbittensor.org'; + return; + } + + timeLeft--; + } + + // Update countdown every second + const countdownInterval = setInterval(updateCountdown, 1000); + + // Handle manual redirect + document.querySelector('.redirect-button').addEventListener('click', function() { + clearInterval(countdownInterval); + }); + + // Preload the new site + const link = document.createElement('link'); + link.rel = 'prefetch'; + link.href = 'https://docs.learnbittensor.org'; + document.head.appendChild(link); + + return () => { + clearInterval(countdownInterval); + }; + }, []); + + return ( +
+
+
+ +

Bittensor Documentation Site Migration Notice

+ +
+

🏛️ Official Notice from Opentensor Foundation

+

As of June 2025, Latent Holdings is officially taking over development of the official Bittensor Developer documentation, as part of the effort to thoroughly decentralize Bittensor development away from the Opentensor Foundation.

+ +
+ 📚 The documentation is now hosted at: + +
+
+ +
+ 🤝 Open Source & Community Driven +

The Bittensor documentation is open source, and we thrive on feedback and contributions from community members.

+
+

💻 The source code is now hosted at:

+ +
+
+ +
+

You will be automatically redirected in:

+
10
+

seconds

+
+ + + Take me to the new documentation site → + + +
+ ⚠️ Security Notice: Only trust documentation from official sources. The new site is the official home for Bittensor developer documentation. +
+ +
+

If you are not automatically redirected, please click the button above or visit:
+ https://docs.learnbittensor.org

+ +

+ © 2024 Bittensor • Latent Holdings +

+
+
+
+ ); +} \ No newline at end of file diff --git a/src/scripts/bt-next-adjustment-block.js b/src/scripts/bt-next-adjustment-block.js deleted file mode 100644 index 3180debf13..0000000000 --- a/src/scripts/bt-next-adjustment-block.js +++ /dev/null @@ -1,98 +0,0 @@ -/* -DESCRIPTION -=========== -This "bt-next-adjustment-block.js" script queries a Bittensor subnet to find out how many blocks to go before the recycle register cost is recalculated. In any subnet, the recycle register cost is recalculated after every "adjustment_interval" number of blocks. See "Subnet Hyperparameters" documentation section https://docs.bittensor.com/subnets/subnet-hyperparameters. This script works like this: It gets the "lastAdjustmentBlock", i.e., the block number when the recalculation was performed last, and adds the value of the subnet's "adjustment_interval" parameter to it. This gives the block number for the next recalculation. Finally, the script checks the current block number and outputs how many blocks to go for the next recalculation. - -INSTALLATION STEPS -================== -1. Install Node.js from https://nodejs.org/en/download/. This will install both "npm" and "node" on your Linux or macOS system. -2. Install the following packages: - npm install @polkadot/api - npm install prompt-sync -3. Download the raw version of this file, save it as `bt-next-adjustment-block.js` anywhere in your Bittensor environment. -4. Run the script using the command "node bt-next-adjustment-block.js". Follow the prompts to enter the network and subnet number. - -EXAMPLE -======= - -$ node bt-next-adjustment-block.js -Enter network (finney, subvortex, local): finney -Enter subnet netuid to query:2 -Information for subnet 2 --=-=-=-=-=-=-=-=-=-=-=-=-=- -Last Adjustment Block: 2773930 -Adjustment Interval: 360 -Next Adjustment Block: 2774290 -Current Block: 2774272 -Blocks to go: 18 in approximately 216 seconds ( 3.6 minutes). - -Written by @Jackalgirl starting with an initial barebones version by Watchmaker. -Version: 1.0.0 -*/ - - -const { ApiPromise, WsProvider } = require("@polkadot/api"); -const prompt = require("prompt-sync")(); - -// If you do not want to be prompted for network when running the script, -// change this variable to "finney" to default to the finney endpoint, -// or "local" if you want to default to your own subtensor endpoint. - -let network = ""; - -// If you have your own local subtensor and want to use its entry point, specify -// your entrypoint's wss address here (e.g., "wss://127.0.0.1:443") - -let localNetworkEntryPoint = ""; - -if (network === "") { - network = prompt("Enter network (finney, subvortex, local): "); -} - -if ((network === "local" || network === "l") && localNetworkEntryPoint != "") { - networkEntryPoint = localNetworkEntryPoint; -} else { - networkEntryPoint = "wss://entrypoint-finney.opentensor.ai:443"; -} - -let subnet = prompt("Enter subnet netuid to query:"); - -if (!(Number.isInteger(subnet)) || subnet < 1 || subnet > 32) { - subnet == 1; -} else { - subnet == subnet; -} - -async function queryBittensorData() { - const wsProvider = new WsProvider( - networkEntryPoint ); - const api = await ApiPromise.create({ provider: wsProvider }); - - const [ - lastAdjustmentBlock, - adjustmentInterval, - currentBlock, - ] = await Promise.all([ - api.query.subtensorModule.lastAdjustmentBlock(subnet), - api.query.subtensorModule.adjustmentInterval(subnet), - api.query.system.number(), - ]); - - let nextAdjustmentBlock = lastAdjustmentBlock.toNumber() + adjustmentInterval.toNumber(); - let currentBlockNumber = currentBlock.toNumber(); - let blocksToGo = nextAdjustmentBlock - currentBlockNumber; - - console.log(`Information for subnet`,subnet); - console.log(`-=-=-=-=-=-=-=-=-=-=-=-=-=-`); - console.log(`Last Adjustment Block: ${lastAdjustmentBlock.toNumber()}`); - console.log(`Adjustment Interval: ${adjustmentInterval.toNumber()}`); - console.log(`Next Adjustment Block: `, nextAdjustmentBlock); - console.log(`Current Block: `, currentBlockNumber); - console.log(`Blocks to go:`,blocksToGo,`in approximately`,blocksToGo*12,`seconds (`,blocksToGo*12/60,`minutes).`); -} - -queryBittensorData() - .catch(console.error) - .finally(() => process.exit()); - -console.warn = () => {}; diff --git a/src/theme/Admonition/Icon/Danger.js b/src/theme/Admonition/Icon/Danger.js deleted file mode 100644 index 1b91af5cfd..0000000000 --- a/src/theme/Admonition/Icon/Danger.js +++ /dev/null @@ -1,16 +0,0 @@ -import React from "react"; -export default function AdmonitionIconDanger(props) { - // - // - // - return ( - - - - ); -} diff --git a/src/theme/Admonition/Icon/Info.js b/src/theme/Admonition/Icon/Info.js deleted file mode 100644 index b7eee7b6fb..0000000000 --- a/src/theme/Admonition/Icon/Info.js +++ /dev/null @@ -1,11 +0,0 @@ -import React from "react"; -export default function AdmonitionIconInfo(props) { - return ( - - - - ); -} diff --git a/src/theme/Admonition/Icon/Note.js b/src/theme/Admonition/Icon/Note.js deleted file mode 100644 index 030d07caf1..0000000000 --- a/src/theme/Admonition/Icon/Note.js +++ /dev/null @@ -1,11 +0,0 @@ -import React from "react"; -export default function AdmonitionIconNote(props) { - return ( - - - - ); -} diff --git a/src/theme/Admonition/Icon/Tip.js b/src/theme/Admonition/Icon/Tip.js deleted file mode 100644 index 2abd3f3dfe..0000000000 --- a/src/theme/Admonition/Icon/Tip.js +++ /dev/null @@ -1,11 +0,0 @@ -import React from "react"; -import { SlQuestion } from "react-icons/sl"; - -export default function AdmonitionIconTip(props) { - return - - -} diff --git a/src/theme/Admonition/Icon/Warning.js b/src/theme/Admonition/Icon/Warning.js deleted file mode 100644 index 89adad517d..0000000000 --- a/src/theme/Admonition/Icon/Warning.js +++ /dev/null @@ -1,6 +0,0 @@ -import React from "react"; -import { MdWarning } from "react-icons/md"; - -export default function AdmonitionIconCaution(props) { - return ; -} diff --git a/src/theme/Admonition/Layout/index.js b/src/theme/Admonition/Layout/index.js deleted file mode 100644 index d2bb0d059a..0000000000 --- a/src/theme/Admonition/Layout/index.js +++ /dev/null @@ -1,45 +0,0 @@ -import React from 'react'; -import clsx from 'clsx'; -import {ThemeClassNames} from '@docusaurus/theme-common'; -import styles from './styles.module.css'; -function AdmonitionContainer({type, className, children}) { - return ( -
- {children} -
- ); -} -function AdmonitionHeading({ icon, title, hasChildren }) { - // console.log(hasChildren, 'hasChildren'); - return ( -
- {icon} - - {title} - - -
- ); -} -function AdmonitionContent({children}) { - return children ? ( -
{children}
- ) : null; -} -export default function AdmonitionLayout(props) { - const { type, icon, title, children, className } = props; - return ( - - - {children} - - ); -} diff --git a/src/theme/Admonition/Layout/styles.module.css b/src/theme/Admonition/Layout/styles.module.css deleted file mode 100644 index 88df7e639b..0000000000 --- a/src/theme/Admonition/Layout/styles.module.css +++ /dev/null @@ -1,35 +0,0 @@ -.admonition { - margin-bottom: 1em; -} - -.admonitionHeading { - font: var(--ifm-heading-font-weight) var(--ifm-h5-font-size) / - var(--ifm-heading-line-height) var(--ifm-heading-font-family); - text-transform: uppercase; -} - -/* Heading alone without content (does not handle fragment content) */ -.admonitionHeading:not(:last-child) { - margin-bottom: 0.3rem; -} - -.admonitionHeading code { - text-transform: none; -} - -.admonitionIcon { - display: inline-block; - vertical-align: middle; - margin-right: 0.4em; -} - -.admonitionIcon svg { - display: inline-block; - height: 1.6em; - width: 1.6em; - fill: var(--ifm-alert-foreground-color); -} - -.admonitionContent > :last-child { - margin-bottom: 0; -} diff --git a/src/theme/CodeBlock/Content/Element.js b/src/theme/CodeBlock/Content/Element.js deleted file mode 100644 index dbe5604970..0000000000 --- a/src/theme/CodeBlock/Content/Element.js +++ /dev/null @@ -1,17 +0,0 @@ -import React from 'react'; -import clsx from 'clsx'; -import Container from '@theme/CodeBlock/Container'; -import styles from './styles.module.css'; -//
 tags in markdown map to CodeBlocks. They may contain JSX children. When
-// the children is not a simple string, we just return a styled block without
-// actually highlighting.
-export default function CodeBlockJSX({children, className}) {
-  return (
-    
-      {children}
-    
-  );
-}
diff --git a/src/theme/CodeBlock/Content/String.js b/src/theme/CodeBlock/Content/String.js
deleted file mode 100644
index bbb1b30467..0000000000
--- a/src/theme/CodeBlock/Content/String.js
+++ /dev/null
@@ -1,122 +0,0 @@
-import React from 'react';
-import clsx from 'clsx';
-import { useThemeConfig, usePrismTheme } from '@docusaurus/theme-common';
-import {
-	parseCodeBlockTitle,
-	parseLanguage,
-	parseLines,
-	containsLineNumbers,
-	useCodeWordWrap,
-} from '@docusaurus/theme-common/internal';
-import { Highlight } from 'prism-react-renderer';
-import Line from '@theme/CodeBlock/Line';
-import CopyButton from '@theme/CodeBlock/CopyButton';
-import WordWrapButton from '@theme/CodeBlock/WordWrapButton';
-import Container from '@theme/CodeBlock/Container';
-import { CiFileOn } from "react-icons/ci";
-
-import styles from './styles.module.css';
-import Link from '@docusaurus/Link';
-// Prism languages are always lowercase
-// We want to fail-safe and allow both "php" and "PHP"
-// See https://github.com/facebook/docusaurus/issues/9012
-function normalizeLanguage(language) {
-	return language?.toLowerCase();
-}
-export default function CodeBlockString({
-	children,
-	className: blockClassName = '',
-	metastring,
-	title: titleProp,
-	showLineNumbers: showLineNumbersProp,
-	language: languageProp,
-}) {
-	const {
-		prism: { defaultLanguage, magicComments },
-	} = useThemeConfig();
-	const language = normalizeLanguage(
-		languageProp ?? parseLanguage(blockClassName) ?? defaultLanguage,
-	);
-	const prismTheme = usePrismTheme();
-	const wordWrap = useCodeWordWrap();
-	// console.log(metastring,"metastring");
-	// We still parse the metastring in case we want to support more syntax in the
-	// future. Note that MDX doesn't strip quotes when parsing metastring:
-	// "title=\"xyz\"" => title: "\"xyz\""
-	let title = parseCodeBlockTitle(metastring) || titleProp;
-	const fileRegex = //;
-	let isFileIconEnabled = false;
-	if (fileRegex.test(title)) {
-		isFileIconEnabled = true;
-		title = title.replace(fileRegex, '')
-	} const { lineClassNames, code } = parseLines(children, {
-		metastring,
-		language,
-		magicComments,
-	});
-	const showLineNumbers =
-		showLineNumbersProp ?? containsLineNumbers(metastring);
-	const regexExtractLink = /link="([^"]+)"/;
-	const match = `${metastring}`.match(regexExtractLink);
-	// console.log(match);
-	if (match) {
-		const linkValue = match[1];
-		title =  {title}
-	} else {
-		// console.log('Link not found in the input string.');
-	}
-	return (
-		
-			{title && 
- {isFileIconEnabled ? : null} - {title} -
} -
- - {({ className, style, tokens, getLineProps, getTokenProps }) => ( -
-							
-								{tokens.map((line, i) => (
-									
-								))}
-							
-						
- )} -
-
- {(wordWrap.isEnabled || wordWrap.isCodeScrollable) && ( - wordWrap.toggle()} - isEnabled={wordWrap.isEnabled} - /> - )} - -
-
-
- ); -} diff --git a/src/theme/CodeBlock/Content/styles.module.css b/src/theme/CodeBlock/Content/styles.module.css deleted file mode 100644 index c2103cd7ea..0000000000 --- a/src/theme/CodeBlock/Content/styles.module.css +++ /dev/null @@ -1,80 +0,0 @@ -.codeBlockContent { - position: relative; - /* rtl:ignore */ - direction: ltr; - border-radius: inherit; -} - -.codeBlockTitle { - border-bottom: 1px solid var(--ifm-color-emphasis-300); - font-size: var(--ifm-code-font-size); - font-weight: 500; - padding: 0.75rem var(--ifm-pre-padding); - border-top-left-radius: inherit; - border-top-right-radius: inherit; -} - -.codeBlock { - --ifm-pre-background: var(--prism-background-color); - margin: 0; - padding: 0; -} - -.codeBlockTitle + .codeBlockContent .codeBlock { - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -.codeBlockStandalone { - padding: 0; -} - -.codeBlockLines { - font: inherit; - /* rtl:ignore */ - float: left; - min-width: 100%; - padding: var(--ifm-pre-padding); -} - -.codeBlockLinesWithNumbering { - display: table; - padding: var(--ifm-pre-padding) 0; -} - -@media print { - .codeBlockLines { - white-space: pre-wrap; - } -} - -.buttonGroup { - display: flex; - column-gap: 0.2rem; - position: absolute; - /* rtl:ignore */ - right: calc(var(--ifm-pre-padding) / 2); - top: calc(var(--ifm-pre-padding) / 2); -} - -.buttonGroup button { - display: flex; - align-items: center; - background: var(--prism-background-color); - color: var(--prism-color); - border: 1px solid var(--ifm-color-emphasis-300); - border-radius: var(--ifm-global-radius); - padding: 0.4rem; - line-height: 0; - transition: opacity var(--ifm-transition-fast) ease-in-out; - opacity: 0; -} - -.buttonGroup button:focus-visible, -.buttonGroup button:hover { - opacity: 1 !important; -} - -:global(.theme-code-block:hover) .buttonGroup button { - opacity: 0.4; -} diff --git a/src/theme/DocBreadcrumbs/Items/Home/index.js b/src/theme/DocBreadcrumbs/Items/Home/index.js deleted file mode 100644 index d0d7c7a3ac..0000000000 --- a/src/theme/DocBreadcrumbs/Items/Home/index.js +++ /dev/null @@ -1,23 +0,0 @@ -import React from 'react'; -import Link from '@docusaurus/Link'; -import useBaseUrl from '@docusaurus/useBaseUrl'; -import {translate} from '@docusaurus/Translate'; -import IconHome from '@theme/Icon/Home'; -import styles from './styles.module.css'; -export default function HomeBreadcrumbItem() { - const homeHref = useBaseUrl('/'); - return ( -
  • - - - -
  • - ); -} diff --git a/src/theme/DocBreadcrumbs/Items/Home/styles.module.css b/src/theme/DocBreadcrumbs/Items/Home/styles.module.css deleted file mode 100644 index 533d764872..0000000000 --- a/src/theme/DocBreadcrumbs/Items/Home/styles.module.css +++ /dev/null @@ -1,7 +0,0 @@ -.breadcrumbHomeIcon { - position: relative; - top: 1px; - vertical-align: top; - height: 1.1rem; - width: 1.1rem; -} diff --git a/src/theme/DocBreadcrumbs/index.js b/src/theme/DocBreadcrumbs/index.js deleted file mode 100644 index 747304797e..0000000000 --- a/src/theme/DocBreadcrumbs/index.js +++ /dev/null @@ -1,104 +0,0 @@ -import React from 'react'; -import clsx from 'clsx'; -import {ThemeClassNames} from '@docusaurus/theme-common'; -import { - useSidebarBreadcrumbs, - useHomePageRoute, -} from '@docusaurus/theme-common/internal'; -import { useDoc } from "@docusaurus/theme-common/internal"; -import Link from '@docusaurus/Link'; -import {translate} from '@docusaurus/Translate'; -import HomeBreadcrumbItem from '@theme/DocBreadcrumbs/Items/Home'; -import styles from './styles.module.css'; -// TODO move to design system folder -function BreadcrumbsItemLink({children, href, isLast}) { - const className = 'breadcrumbs__link'; - if (isLast) { - return ( - - {children} - - ); - } - return href ? ( - - {children} - - ) : ( - // TODO Google search console doesn't like breadcrumb items without href. - // The schema doesn't seem to require `id` for each `item`, although Google - // insist to infer one, even if it's invalid. Removing `itemProp="item - // name"` for now, since I don't know how to properly fix it. - // See https://github.com/facebook/docusaurus/issues/7241 - {children} - ); -} -// TODO move to design system folder -function BreadcrumbsItem({children, active, index, addMicrodata}) { - return ( -
  • - {children} - -
  • - ); -} -export default function DocBreadcrumbs() { - const breadcrumbs = useSidebarBreadcrumbs(); - const homePageRoute = useHomePageRoute(); - const { metadata } = useDoc(); - const topLevel = isTopLevel(metadata?.slug); - - if (!breadcrumbs) { - return null; - } - return ( - - ); -} - -function isTopLevel(str) { - return str.split("/").length - 1 < 2; -} \ No newline at end of file diff --git a/src/theme/DocBreadcrumbs/styles.module.css b/src/theme/DocBreadcrumbs/styles.module.css deleted file mode 100644 index 72da4671a4..0000000000 --- a/src/theme/DocBreadcrumbs/styles.module.css +++ /dev/null @@ -1,4 +0,0 @@ -.breadcrumbsContainer { - --ifm-breadcrumb-size-multiplier: 0.8; - margin-bottom: 0.8rem; -} diff --git a/src/theme/DocItem/Content/index.js b/src/theme/DocItem/Content/index.js deleted file mode 100644 index e9e78dbbd8..0000000000 --- a/src/theme/DocItem/Content/index.js +++ /dev/null @@ -1,118 +0,0 @@ -import React from "react"; -import clsx from "clsx"; -import { ThemeClassNames } from "@docusaurus/theme-common"; -import { useDoc } from "@docusaurus/theme-common/internal"; -import Heading from "@theme/Heading"; -import MDXContent from "@theme/MDXContent"; -import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; -import styles from "./styles.module.css"; - -/** - Title can be declared inside md content or declared through - front matter and added manually. To make both cases consistent, - the added title is added under the same div.markdown block - See https://github.com/facebook/docusaurus/pull/4882#issuecomment-853021120 - - We render a "synthetic title" if: - - user doesn't ask to hide it with front matter - - the markdown content does not already contain a top-level h1 heading -*/ -function useSyntheticTitle() { - const { metadata, frontMatter, contentTitle } = useDoc(); - const shouldRender = - !frontMatter.hide_title && typeof contentTitle === "undefined"; - if (!shouldRender) { - return null; - } - return metadata.title; -} -export default function DocItemContent({ children }) { - const { metadata } = useDoc(); - - const topLevel = isTopLevel(metadata?.slug); - - const syntheticTitle = useSyntheticTitle(); - - return ( -
    - {syntheticTitle && ( -
    -
    - {syntheticTitle} -
    -
    - )} - -
    - - {children} -
    -
    - ); -} - -function isTopLevel(str) { - return str.split("/").length - 1 < 2; -} - -// Sub component -function MetaActions({ style }) { - const { metadata } = useDoc(); - - // Edit this page - const editUrl = metadata?.editUrl; - - // Submit issue - const { siteConfig } = useDocusaurusContext(); - const { customFields } = siteConfig; - const { enableEditUrlLinks, enableIssueLinks, issueBaseUrl } = customFields; - - // Last updated at - const formattedLastUpdatedAt = new Date(metadata?.lastUpdatedAt).toLocaleDateString('en-US', { - year: 'numeric', - month: 'short', - day: '2-digit' - }); - - return ( -
    - {/* Edit URL link */} - {editUrl && enableEditUrlLinks && ( - - SUBMIT A PR - - )} - - {/* Submit an issue link */} - {enableIssueLinks && issueBaseUrl && ( - - SUBMIT AN ISSUE - - )} - - {/* Last updated */} - - last edit: {formattedLastUpdatedAt} - -
    - ); -} diff --git a/src/theme/DocItem/Content/styles.module.css b/src/theme/DocItem/Content/styles.module.css deleted file mode 100644 index 997d655ae3..0000000000 --- a/src/theme/DocItem/Content/styles.module.css +++ /dev/null @@ -1,65 +0,0 @@ -.link { - color: var(--grey-900); - font-family: 'DM Mono', monospace; - font-size: 0.75rem; - line-height: 1.6; - letter-spacing: 0.6px; - text-decoration-line: underline; -} -[data-theme="dark"] .link { - color: var(--grey-100) -} - -.lastEdit { - color: var(--text-primary); - font-family: 'DM Mono', monospace; - font-size: 0.75rem; - line-height: 1.6; - letter-spacing: 0.6px; - text-transform: uppercase; -} - -.topLevelDoc > h1 { - margin-bottom: 48px !important; - padding-bottom: 48px; - font-family: Haffer; - font-size: 3.9rem !important; - line-height: 90%; - letter-spacing: -3.04px; - position: relative; - padding-bottom: 22px !important; - margin-top: 0px !important; -} -@media screen and (max-width: 550px) { - .topLevelDoc > h1 { - margin-top: 32px !important; - font-size: 3.3rem !important; - } -} -.topLevelDoc > h1::after { - content: ''; - background-position: 0 0; - background-image: linear-gradient(to right, var(--grey-900), 1.5px, transparent 1.5px); - background-repeat: repeat-x; - background-size: 6px; - display: block; - width: 100%; - height: 1.5px; - position: absolute; - bottom: 0px; - left: 0; -} -[data-theme="dark"] .topLevelDoc > h1::after { - background-image: linear-gradient(to right, var(--grey-100), 1.5px, transparent 1.5px); -} -@media screen and (min-width: 997px) { - .topLevelDoc > h1::after { - width: 138%; - } -} - -@media screen and (max-width: 996px) { - .hideOnMobile { - display: none !important; - } -} \ No newline at end of file diff --git a/src/theme/DocItem/Footer/index.js b/src/theme/DocItem/Footer/index.js deleted file mode 100644 index ca6a8df43b..0000000000 --- a/src/theme/DocItem/Footer/index.js +++ /dev/null @@ -1,62 +0,0 @@ -import React, { useEffect, useState } from "react"; -import clsx from "clsx"; -import { ThemeClassNames } from "@docusaurus/theme-common"; -import { useDoc } from "@docusaurus/theme-common/internal"; -import TagsListInline from "@theme/TagsListInline"; -import { track } from "@vercel/analytics"; -import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; - -function TagsRow(props) { - return ( -
    -
    - -
    -
    - ); -} - -export default function DocItemFooter() { - const { metadata } = useDoc(); - const { tags } = metadata; - - const canDisplayTagsRow = tags.length > 0; - - // Optional feedback - const { siteConfig } = useDocusaurusContext(); - const { customFields } = siteConfig; - const { enableFeedback } = customFields; - - return ( -
    - {enableFeedback && ( -
    -
    - was this helpful? -
    - track("VeryHappy")}> - :D - - track("Happy")}> - :) - - track("Sad")}> - :( - - track("VerySad")}> - x( - -
    -
    -
    - )} - - {canDisplayTagsRow && } -
    - ); -} diff --git a/src/theme/DocItem/Footer/styles.module.css b/src/theme/DocItem/Footer/styles.module.css deleted file mode 100644 index 7c1e964419..0000000000 --- a/src/theme/DocItem/Footer/styles.module.css +++ /dev/null @@ -1,11 +0,0 @@ -.lastUpdated { - margin-top: 0.2rem; - font-style: italic; - font-size: smaller; -} - -@media (min-width: 997px) { - .lastUpdated { - text-align: right; - } -} diff --git a/src/theme/DocItem/Layout/index.js b/src/theme/DocItem/Layout/index.js deleted file mode 100644 index e5c43e6761..0000000000 --- a/src/theme/DocItem/Layout/index.js +++ /dev/null @@ -1,61 +0,0 @@ -import React from 'react'; -import clsx from 'clsx'; -import { useWindowSize } from '@docusaurus/theme-common'; -import { useDoc } from '@docusaurus/theme-common/internal'; -import DocItemPaginator from '@theme/DocItem/Paginator'; -import DocVersionBanner from '@theme/DocVersionBanner'; -import DocVersionBadge from '@theme/DocVersionBadge'; -import DocItemFooter from '@theme/DocItem/Footer'; -import DocItemTOCMobile from '@theme/DocItem/TOC/Mobile'; -import DocItemTOCDesktop from '@theme/DocItem/TOC/Desktop'; -import DocItemContent from '@theme/DocItem/Content'; -import DocBreadcrumbs from '@theme/DocBreadcrumbs'; -import Unlisted from '@theme/Unlisted'; -import styles from './styles.module.css'; -/** - * Decide if the toc should be rendered, on mobile or desktop viewports - */ -function useDocTOC() { - const { frontMatter, toc } = useDoc(); - const windowSize = useWindowSize(); - const hidden = frontMatter.hide_table_of_contents; - const canRender = !hidden && toc.length > 0; - const mobile = canRender ? : undefined; - const desktop = - canRender && (windowSize === 'desktop' || windowSize === 'ssr') ? ( - - ) : undefined; - return { - hidden, - mobile, - desktop, - }; -} -export default function DocItemLayout({ children }) { - const docTOC = useDocTOC(); - const { - metadata: { unlisted, formattedLastUpdatedAt }, - } = useDoc(); - const { metadata } = useDoc(); - - - return ( -
    -
    - {unlisted && } - -
    -
    - - - {docTOC.mobile} - {children} - -
    - -
    -
    - {docTOC.desktop &&
    {docTOC.desktop}
    } -
    - ); -} diff --git a/src/theme/DocItem/Layout/styles.module.css b/src/theme/DocItem/Layout/styles.module.css deleted file mode 100644 index d5aaec1322..0000000000 --- a/src/theme/DocItem/Layout/styles.module.css +++ /dev/null @@ -1,10 +0,0 @@ -.docItemContainer header + *, -.docItemContainer article > *:first-child { - margin-top: 0; -} - -@media (min-width: 997px) { - .docItemCol { - max-width: 75% !important; - } -} diff --git a/src/theme/DocSidebar/Desktop/CollapseButton/index.js b/src/theme/DocSidebar/Desktop/CollapseButton/index.js deleted file mode 100644 index 2df337b581..0000000000 --- a/src/theme/DocSidebar/Desktop/CollapseButton/index.js +++ /dev/null @@ -1,28 +0,0 @@ -import React from 'react'; -import clsx from 'clsx'; -import {translate} from '@docusaurus/Translate'; -import IconArrow from '@theme/Icon/Arrow'; -import styles from './styles.module.css'; -export default function CollapseButton({onClick}) { - return ( - - ); -} diff --git a/src/theme/DocSidebar/Desktop/CollapseButton/styles.module.css b/src/theme/DocSidebar/Desktop/CollapseButton/styles.module.css deleted file mode 100644 index df46519f22..0000000000 --- a/src/theme/DocSidebar/Desktop/CollapseButton/styles.module.css +++ /dev/null @@ -1,40 +0,0 @@ -:root { - --docusaurus-collapse-button-bg: transparent; - --docusaurus-collapse-button-bg-hover: rgb(0 0 0 / 10%); -} - -[data-theme='dark']:root { - --docusaurus-collapse-button-bg: rgb(255 255 255 / 5%); - --docusaurus-collapse-button-bg-hover: rgb(255 255 255 / 10%); -} - -@media (min-width: 997px) { - .collapseSidebarButton { - display: block !important; - background-color: var(--docusaurus-collapse-button-bg); - height: 40px; - position: sticky; - bottom: 0; - border-radius: 0; - border: 1px solid var(--ifm-toc-border-color); - } - - .collapseSidebarButtonIcon { - transform: rotate(180deg); - margin-top: 4px; - } - - [dir='rtl'] .collapseSidebarButtonIcon { - transform: rotate(0); - } - - .collapseSidebarButton:hover, - .collapseSidebarButton:focus { - background-color: var(--docusaurus-collapse-button-bg-hover); - } -} - -.collapseSidebarButton { - display: none; - margin: 0; -} diff --git a/src/theme/DocSidebar/Desktop/Content/index.js b/src/theme/DocSidebar/Desktop/Content/index.js deleted file mode 100644 index c88b0db25a..0000000000 --- a/src/theme/DocSidebar/Desktop/Content/index.js +++ /dev/null @@ -1,44 +0,0 @@ -import React, {useState} from 'react'; -import clsx from 'clsx'; -import {ThemeClassNames} from '@docusaurus/theme-common'; -import { - useAnnouncementBar, - useScrollPosition, -} from '@docusaurus/theme-common/internal'; -import {translate} from '@docusaurus/Translate'; -import DocSidebarItems from '@theme/DocSidebarItems'; -import styles from './styles.module.css'; -function useShowAnnouncementBar() { - const {isActive} = useAnnouncementBar(); - const [showAnnouncementBar, setShowAnnouncementBar] = useState(isActive); - useScrollPosition( - ({scrollY}) => { - if (isActive) { - setShowAnnouncementBar(scrollY === 0); - } - }, - [isActive], - ); - return isActive && showAnnouncementBar; -} -export default function DocSidebarDesktopContent({path, sidebar, className}) { - const showAnnouncementBar = useShowAnnouncementBar(); - return ( - - ); -} diff --git a/src/theme/DocSidebar/Desktop/Content/styles.module.css b/src/theme/DocSidebar/Desktop/Content/styles.module.css deleted file mode 100644 index 0c43a4e40f..0000000000 --- a/src/theme/DocSidebar/Desktop/Content/styles.module.css +++ /dev/null @@ -1,16 +0,0 @@ -@media (min-width: 997px) { - .menu { - flex-grow: 1; - padding: 0.5rem; - } - @supports (scrollbar-gutter: stable) { - .menu { - padding: 0.5rem 0 0.5rem 0.5rem; - scrollbar-gutter: stable; - } - } - - .menuWithAnnouncementBar { - margin-bottom: var(--docusaurus-announcement-bar-height); - } -} diff --git a/src/theme/DocSidebar/Desktop/index.js b/src/theme/DocSidebar/Desktop/index.js deleted file mode 100644 index 07f1464f8f..0000000000 --- a/src/theme/DocSidebar/Desktop/index.js +++ /dev/null @@ -1,28 +0,0 @@ -import React from 'react'; -import clsx from 'clsx'; -import {useThemeConfig} from '@docusaurus/theme-common'; -import Logo from '@theme/Logo'; -import CollapseButton from '@theme/DocSidebar/Desktop/CollapseButton'; -import Content from '@theme/DocSidebar/Desktop/Content'; -import styles from './styles.module.css'; -function DocSidebarDesktop({path, sidebar, onCollapse, isHidden}) { - const { - navbar: {hideOnScroll}, - docs: { - sidebar: {hideable}, - }, - } = useThemeConfig(); - return ( -
    - {hideOnScroll && } - - {hideable && } -
    - ); -} -export default React.memo(DocSidebarDesktop); diff --git a/src/theme/DocSidebar/Desktop/styles.module.css b/src/theme/DocSidebar/Desktop/styles.module.css deleted file mode 100644 index f518be4023..0000000000 --- a/src/theme/DocSidebar/Desktop/styles.module.css +++ /dev/null @@ -1,36 +0,0 @@ -@media (min-width: 997px) { - .sidebar { - display: flex; - flex-direction: column; - height: 100%; - padding-top: var(--ifm-navbar-height); - } - - .sidebarWithHideableNavbar { - padding-top: 0; - } - - .sidebarHidden { - opacity: 0; - visibility: hidden; - } - - .sidebarLogo { - display: flex !important; - align-items: center; - margin: 0 var(--ifm-navbar-padding-horizontal); - min-height: var(--ifm-navbar-height); - max-height: var(--ifm-navbar-height); - color: inherit !important; - text-decoration: none !important; - } - - .sidebarLogo img { - margin-right: 0.5rem; - height: 2rem; - } -} - -.sidebarLogo { - display: none; -} diff --git a/src/theme/DocSidebar/Mobile/index.js b/src/theme/DocSidebar/Mobile/index.js deleted file mode 100644 index 9fc6a832be..0000000000 --- a/src/theme/DocSidebar/Mobile/index.js +++ /dev/null @@ -1,39 +0,0 @@ -import React from 'react'; -import clsx from 'clsx'; -import { - NavbarSecondaryMenuFiller, - ThemeClassNames, -} from '@docusaurus/theme-common'; -import {useNavbarMobileSidebar} from '@docusaurus/theme-common/internal'; -import DocSidebarItems from '@theme/DocSidebarItems'; -// eslint-disable-next-line react/function-component-definition -const DocSidebarMobileSecondaryMenu = ({sidebar, path}) => { - const mobileSidebar = useNavbarMobileSidebar(); - return ( -
      - { - // Mobile sidebar should only be closed if the category has a link - if (item.type === 'category' && item.href) { - mobileSidebar.toggle(); - } - if (item.type === 'link') { - mobileSidebar.toggle(); - } - }} - level={1} - /> -
    - ); -}; -function DocSidebarMobile(props) { - return ( - - ); -} -export default React.memo(DocSidebarMobile); diff --git a/src/theme/DocSidebar/index.js b/src/theme/DocSidebar/index.js deleted file mode 100644 index d0f4e7e759..0000000000 --- a/src/theme/DocSidebar/index.js +++ /dev/null @@ -1,18 +0,0 @@ -import React from 'react'; -import {useWindowSize} from '@docusaurus/theme-common'; -import DocSidebarDesktop from '@theme/DocSidebar/Desktop'; -import DocSidebarMobile from '@theme/DocSidebar/Mobile'; -export default function DocSidebar(props) { - const windowSize = useWindowSize(); - // Desktop sidebar visible on hydration: need SSR rendering - const shouldRenderSidebarDesktop = - windowSize === 'desktop' || windowSize === 'ssr'; - // Mobile sidebar not visible on hydration: can avoid SSR rendering - const shouldRenderSidebarMobile = windowSize === 'mobile'; - return ( - <> - {shouldRenderSidebarDesktop && } - {shouldRenderSidebarMobile && } - - ); -} diff --git a/src/theme/DocSidebarItem/Category/index.js b/src/theme/DocSidebarItem/Category/index.js deleted file mode 100644 index 2f3115eead..0000000000 --- a/src/theme/DocSidebarItem/Category/index.js +++ /dev/null @@ -1,190 +0,0 @@ -import React, {useEffect, useMemo} from 'react'; -import clsx from 'clsx'; -import { - ThemeClassNames, - useThemeConfig, - usePrevious, - Collapsible, - useCollapsible, -} from '@docusaurus/theme-common'; -import { - isActiveSidebarItem, - findFirstSidebarItemLink, - useDocSidebarItemsExpandedState, - isSamePath, -} from '@docusaurus/theme-common/internal'; -import Link from '@docusaurus/Link'; -import {translate} from '@docusaurus/Translate'; -import useIsBrowser from '@docusaurus/useIsBrowser'; -import DocSidebarItems from '@theme/DocSidebarItems'; -// If we navigate to a category and it becomes active, it should automatically -// expand itself -function useAutoExpandActiveCategory({isActive, collapsed, updateCollapsed}) { - const wasActive = usePrevious(isActive); - useEffect(() => { - const justBecameActive = isActive && !wasActive; - if (justBecameActive && collapsed) { - updateCollapsed(false); - } - }, [isActive, wasActive, collapsed, updateCollapsed]); -} -/** - * When a collapsible category has no link, we still link it to its first child - * during SSR as a temporary fallback. This allows to be able to navigate inside - * the category even when JS fails to load, is delayed or simply disabled - * React hydration becomes an optional progressive enhancement - * see https://github.com/facebookincubator/infima/issues/36#issuecomment-772543188 - * see https://github.com/facebook/docusaurus/issues/3030 - */ -function useCategoryHrefWithSSRFallback(item) { - const isBrowser = useIsBrowser(); - return useMemo(() => { - if (item.href && !item.linkUnlisted) { - return item.href; - } - // In these cases, it's not necessary to render a fallback - // We skip the "findFirstCategoryLink" computation - if (isBrowser || !item.collapsible) { - return undefined; - } - return findFirstSidebarItemLink(item); - }, [item, isBrowser]); -} -function CollapseButton({collapsed, categoryLabel, onClick}) { - return ( - - ); -} -export default function NavbarMobileSidebarHeader() { - return ( -
    - - - -
    - ); -} diff --git a/src/theme/Navbar/MobileSidebar/Layout/index.js b/src/theme/Navbar/MobileSidebar/Layout/index.js deleted file mode 100644 index b19eb2f962..0000000000 --- a/src/theme/Navbar/MobileSidebar/Layout/index.js +++ /dev/null @@ -1,22 +0,0 @@ -import React from 'react'; -import clsx from 'clsx'; -import {useNavbarSecondaryMenu} from '@docusaurus/theme-common/internal'; -export default function NavbarMobileSidebarLayout({ - header, - primaryMenu, - secondaryMenu, -}) { - const {shown: secondaryMenuShown} = useNavbarSecondaryMenu(); - return ( -
    - {header} -
    -
    {primaryMenu}
    -
    {secondaryMenu}
    -
    -
    - ); -} diff --git a/src/theme/Navbar/MobileSidebar/PrimaryMenu/index.js b/src/theme/Navbar/MobileSidebar/PrimaryMenu/index.js deleted file mode 100644 index 9c5d0ec067..0000000000 --- a/src/theme/Navbar/MobileSidebar/PrimaryMenu/index.js +++ /dev/null @@ -1,27 +0,0 @@ -import React from 'react'; -import {useThemeConfig} from '@docusaurus/theme-common'; -import {useNavbarMobileSidebar} from '@docusaurus/theme-common/internal'; -import NavbarItem from '@theme/NavbarItem'; -function useNavbarItems() { - // TODO temporary casting until ThemeConfig type is improved - return useThemeConfig().navbar.items; -} -// The primary menu displays the navbar items -export default function NavbarMobilePrimaryMenu() { - const mobileSidebar = useNavbarMobileSidebar(); - // TODO how can the order be defined for mobile? - // Should we allow providing a different list of items? - const items = useNavbarItems(); - return ( -
      - {items.map((item, i) => ( - mobileSidebar.toggle()} - key={i} - /> - ))} -
    - ); -} diff --git a/src/theme/Navbar/MobileSidebar/SecondaryMenu/index.js b/src/theme/Navbar/MobileSidebar/SecondaryMenu/index.js deleted file mode 100644 index dd71af856a..0000000000 --- a/src/theme/Navbar/MobileSidebar/SecondaryMenu/index.js +++ /dev/null @@ -1,30 +0,0 @@ -import React from 'react'; -import {useThemeConfig} from '@docusaurus/theme-common'; -import {useNavbarSecondaryMenu} from '@docusaurus/theme-common/internal'; -import Translate from '@docusaurus/Translate'; -function SecondaryMenuBackButton(props) { - return ( - - ); -} -// The secondary menu slides from the right and shows contextual information -// such as the docs sidebar -export default function NavbarMobileSidebarSecondaryMenu() { - const isPrimaryMenuEmpty = useThemeConfig().navbar.items.length === 0; - const secondaryMenu = useNavbarSecondaryMenu(); - return ( - <> - {/* edge-case: prevent returning to the primaryMenu when it's empty */} - {!isPrimaryMenuEmpty && ( - secondaryMenu.hide()} /> - )} - {secondaryMenu.content} - - ); -} diff --git a/src/theme/Navbar/MobileSidebar/Toggle/index.js b/src/theme/Navbar/MobileSidebar/Toggle/index.js deleted file mode 100644 index bfe298891b..0000000000 --- a/src/theme/Navbar/MobileSidebar/Toggle/index.js +++ /dev/null @@ -1,22 +0,0 @@ -import React from 'react'; -import {useNavbarMobileSidebar} from '@docusaurus/theme-common/internal'; -import {translate} from '@docusaurus/Translate'; -import IconMenu from '@theme/Icon/Menu'; -export default function MobileSidebarToggle() { - const {toggle, shown} = useNavbarMobileSidebar(); - return ( - - ); -} diff --git a/src/theme/Navbar/MobileSidebar/index.js b/src/theme/Navbar/MobileSidebar/index.js deleted file mode 100644 index 5db3cc7a28..0000000000 --- a/src/theme/Navbar/MobileSidebar/index.js +++ /dev/null @@ -1,23 +0,0 @@ -import React from 'react'; -import { - useLockBodyScroll, - useNavbarMobileSidebar, -} from '@docusaurus/theme-common/internal'; -import NavbarMobileSidebarLayout from '@theme/Navbar/MobileSidebar/Layout'; -import NavbarMobileSidebarHeader from '@theme/Navbar/MobileSidebar/Header'; -import NavbarMobileSidebarPrimaryMenu from '@theme/Navbar/MobileSidebar/PrimaryMenu'; -import NavbarMobileSidebarSecondaryMenu from '@theme/Navbar/MobileSidebar/SecondaryMenu'; -export default function NavbarMobileSidebar() { - const mobileSidebar = useNavbarMobileSidebar(); - useLockBodyScroll(mobileSidebar.shown); - if (!mobileSidebar.shouldRender) { - return null; - } - return ( - } - primaryMenu={} - secondaryMenu={} - /> - ); -} diff --git a/src/theme/Navbar/Search/index.js b/src/theme/Navbar/Search/index.js deleted file mode 100644 index 686f73b8d8..0000000000 --- a/src/theme/Navbar/Search/index.js +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import clsx from 'clsx'; -import styles from './styles.module.css'; -export default function NavbarSearch({children, className}) { - return ( -
    - {children} -
    - ); -} diff --git a/src/theme/Navbar/Search/styles.module.css b/src/theme/Navbar/Search/styles.module.css deleted file mode 100644 index f105bdaec3..0000000000 --- a/src/theme/Navbar/Search/styles.module.css +++ /dev/null @@ -1,21 +0,0 @@ -/* -Workaround to avoid rendering empty search container -See https://github.com/facebook/docusaurus/pull/9385 -*/ -.navbarSearchContainer:not(:has(> *)) { - display: none; -} - -@media (max-width: 996px) { - .navbarSearchContainer { - position: absolute; - right: var(--ifm-navbar-padding-horizontal); - } -} - -@media (min-width: 997px) { - .navbarSearchContainer { - padding: var(--ifm-navbar-item-padding-vertical) - var(--ifm-navbar-item-padding-horizontal); - } -} diff --git a/src/theme/Navbar/index.js b/src/theme/Navbar/index.js deleted file mode 100644 index d18a258ca9..0000000000 --- a/src/theme/Navbar/index.js +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import NavbarLayout from '@theme/Navbar/Layout'; -import NavbarContent from '@theme/Navbar/Content'; -export default function Navbar() { - return ( - - - - ); -} diff --git a/src/theme/NavbarItem/ComponentTypes.js b/src/theme/NavbarItem/ComponentTypes.js deleted file mode 100644 index 8a432e7ccb..0000000000 --- a/src/theme/NavbarItem/ComponentTypes.js +++ /dev/null @@ -1,21 +0,0 @@ -import DefaultNavbarItem from '@theme/NavbarItem/DefaultNavbarItem'; -import DropdownNavbarItem from '@theme/NavbarItem/DropdownNavbarItem'; -import LocaleDropdownNavbarItem from '@theme/NavbarItem/LocaleDropdownNavbarItem'; -import SearchNavbarItem from '@theme/NavbarItem/SearchNavbarItem'; -import HtmlNavbarItem from '@theme/NavbarItem/HtmlNavbarItem'; -import DocNavbarItem from '@theme/NavbarItem/DocNavbarItem'; -import DocSidebarNavbarItem from '@theme/NavbarItem/DocSidebarNavbarItem'; -import DocsVersionNavbarItem from '@theme/NavbarItem/DocsVersionNavbarItem'; -import DocsVersionDropdownNavbarItem from '@theme/NavbarItem/DocsVersionDropdownNavbarItem'; -const ComponentTypes = { - default: DefaultNavbarItem, - localeDropdown: LocaleDropdownNavbarItem, - search: SearchNavbarItem, - dropdown: DropdownNavbarItem, - html: HtmlNavbarItem, - doc: DocNavbarItem, - docSidebar: DocSidebarNavbarItem, - docsVersion: DocsVersionNavbarItem, - docsVersionDropdown: DocsVersionDropdownNavbarItem, -}; -export default ComponentTypes; diff --git a/src/theme/NavbarItem/DefaultNavbarItem.js b/src/theme/NavbarItem/DefaultNavbarItem.js deleted file mode 100644 index 42c2240aec..0000000000 --- a/src/theme/NavbarItem/DefaultNavbarItem.js +++ /dev/null @@ -1,46 +0,0 @@ -import React from 'react'; -import clsx from 'clsx'; -import NavbarNavLink from '@theme/NavbarItem/NavbarNavLink'; -function DefaultNavbarItemDesktop({ - className, - isDropdownItem = false, - ...props -}) { - const element = ( - - ); - if (isDropdownItem) { - return
  • {element}
  • ; - } - return element; -} -function DefaultNavbarItemMobile({className, isDropdownItem, ...props}) { - return ( -
  • - -
  • - ); -} -export default function DefaultNavbarItem({ - mobile = false, - position, // Need to destructure position from props so that it doesn't get passed on. - ...props -}) { - const Comp = mobile ? DefaultNavbarItemMobile : DefaultNavbarItemDesktop; - return ( - - ); -} diff --git a/src/theme/NavbarItem/DocNavbarItem.js b/src/theme/NavbarItem/DocNavbarItem.js deleted file mode 100644 index d8c24dc765..0000000000 --- a/src/theme/NavbarItem/DocNavbarItem.js +++ /dev/null @@ -1,30 +0,0 @@ -import React from 'react'; -import {useActiveDocContext} from '@docusaurus/plugin-content-docs/client'; -import {useLayoutDoc} from '@docusaurus/theme-common/internal'; -import DefaultNavbarItem from '@theme/NavbarItem/DefaultNavbarItem'; -export default function DocNavbarItem({ - docId, - label: staticLabel, - docsPluginId, - ...props -}) { - const {activeDoc} = useActiveDocContext(docsPluginId); - const doc = useLayoutDoc(docId, docsPluginId); - const pageActive = activeDoc?.path === doc?.path; - // Draft and unlisted items are not displayed in the navbar. - if (doc === null || (doc.unlisted && !pageActive)) { - return null; - } - return ( - - pageActive || - (!!activeDoc?.sidebar && activeDoc.sidebar === doc.sidebar) - } - label={staticLabel ?? doc.id} - to={doc.path} - /> - ); -} diff --git a/src/theme/NavbarItem/DocSidebarNavbarItem.js b/src/theme/NavbarItem/DocSidebarNavbarItem.js deleted file mode 100644 index 71b5fc02b9..0000000000 --- a/src/theme/NavbarItem/DocSidebarNavbarItem.js +++ /dev/null @@ -1,27 +0,0 @@ -import React from 'react'; -import {useActiveDocContext} from '@docusaurus/plugin-content-docs/client'; -import {useLayoutDocsSidebar} from '@docusaurus/theme-common/internal'; -import DefaultNavbarItem from '@theme/NavbarItem/DefaultNavbarItem'; -export default function DocSidebarNavbarItem({ - sidebarId, - label, - docsPluginId, - ...props -}) { - const {activeDoc} = useActiveDocContext(docsPluginId); - const sidebarLink = useLayoutDocsSidebar(sidebarId, docsPluginId).link; - if (!sidebarLink) { - throw new Error( - `DocSidebarNavbarItem: Sidebar with ID "${sidebarId}" doesn't have anything to be linked to.`, - ); - } - return ( - activeDoc?.sidebar === sidebarId} - label={label ?? sidebarLink.label} - to={sidebarLink.path} - /> - ); -} diff --git a/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.js b/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.js deleted file mode 100644 index c4a5ec65c9..0000000000 --- a/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.js +++ /dev/null @@ -1,84 +0,0 @@ -import React from 'react'; -import { - useVersions, - useActiveDocContext, -} from '@docusaurus/plugin-content-docs/client'; -import {useDocsPreferredVersion} from '@docusaurus/theme-common'; -import {useDocsVersionCandidates} from '@docusaurus/theme-common/internal'; -import {translate} from '@docusaurus/Translate'; -import {useLocation} from '@docusaurus/router'; -import DefaultNavbarItem from '@theme/NavbarItem/DefaultNavbarItem'; -import DropdownNavbarItem from '@theme/NavbarItem/DropdownNavbarItem'; -const getVersionMainDoc = (version) => - version.docs.find((doc) => doc.id === version.mainDocId); -export default function DocsVersionDropdownNavbarItem({ - mobile, - docsPluginId, - dropdownActiveClassDisabled, - dropdownItemsBefore, - dropdownItemsAfter, - ...props -}) { - const {search, hash} = useLocation(); - const activeDocContext = useActiveDocContext(docsPluginId); - const versions = useVersions(docsPluginId); - const {savePreferredVersionName} = useDocsPreferredVersion(docsPluginId); - const versionLinks = versions.map((version) => { - // We try to link to the same doc, in another version - // When not possible, fallback to the "main doc" of the version - const versionDoc = - activeDocContext.alternateDocVersions[version.name] ?? - getVersionMainDoc(version); - return { - label: version.label, - // preserve ?search#hash suffix on version switches - to: `${versionDoc.path}${search}${hash}`, - isActive: () => version === activeDocContext.activeVersion, - onClick: () => savePreferredVersionName(version.name), - }; - }); - const items = [ - ...dropdownItemsBefore, - ...versionLinks, - ...dropdownItemsAfter, - ]; - const dropdownVersion = useDocsVersionCandidates(docsPluginId)[0]; - // Mobile dropdown is handled a bit differently - const dropdownLabel = - mobile && items.length > 1 - ? translate({ - id: 'theme.navbar.mobileVersionsDropdown.label', - message: 'Versions', - description: - 'The label for the navbar versions dropdown on mobile view', - }) - : dropdownVersion.label; - const dropdownTo = - mobile && items.length > 1 - ? undefined - : getVersionMainDoc(dropdownVersion).path; - // We don't want to render a version dropdown with 0 or 1 item. If we build - // the site with a single docs version (onlyIncludeVersions: ['1.0.0']), - // We'd rather render a button instead of a dropdown - if (items.length <= 1) { - return ( - false : undefined} - /> - ); - } - return ( - false : undefined} - /> - ); -} diff --git a/src/theme/NavbarItem/DocsVersionNavbarItem.js b/src/theme/NavbarItem/DocsVersionNavbarItem.js deleted file mode 100644 index e5cc20248f..0000000000 --- a/src/theme/NavbarItem/DocsVersionNavbarItem.js +++ /dev/null @@ -1,16 +0,0 @@ -import React from 'react'; -import {useDocsVersionCandidates} from '@docusaurus/theme-common/internal'; -import DefaultNavbarItem from '@theme/NavbarItem/DefaultNavbarItem'; -const getVersionMainDoc = (version) => - version.docs.find((doc) => doc.id === version.mainDocId); -export default function DocsVersionNavbarItem({ - label: staticLabel, - to: staticTo, - docsPluginId, - ...props -}) { - const version = useDocsVersionCandidates(docsPluginId)[0]; - const label = staticLabel ?? version.label; - const path = staticTo ?? getVersionMainDoc(version).path; - return ; -} diff --git a/src/theme/NavbarItem/DropdownNavbarItem/index.js b/src/theme/NavbarItem/DropdownNavbarItem/index.js deleted file mode 100644 index 31e9acea4b..0000000000 --- a/src/theme/NavbarItem/DropdownNavbarItem/index.js +++ /dev/null @@ -1,297 +0,0 @@ -import React, { useState, useRef, useEffect } from "react"; -import clsx from "clsx"; -import { - isRegexpStringMatch, - useCollapsible, - Collapsible, -} from "@docusaurus/theme-common"; -import { - isSamePath, - useLocalPathname, -} from "@docusaurus/theme-common/internal"; -import NavbarNavLink from "@theme/NavbarItem/NavbarNavLink"; -import NavbarItem from "@theme/NavbarItem"; -import styles from "./styles.module.css"; -import Link from "@docusaurus/Link"; -import { IoMdArrowDropright, IoMdArrowDropdown } from "react-icons/io"; -import { useLocation } from "@docusaurus/router"; -function isItemActive(item, localPathname) { - if (isSamePath(item.to, localPathname)) { - return true; - } - if (isRegexpStringMatch(item.activeBaseRegex, localPathname)) { - return true; - } - if (item.activeBasePath && localPathname.startsWith(item.activeBasePath)) { - return true; - } - return false; -} -function containsActiveItems(items, localPathname) { - return items.some((item) => isItemActive(item, localPathname)); -} -function DropdownNavbarItemDesktop({ - items, - position, - className, - onClick, - ...props -}) { - const dropdownRef = useRef(null); - const [showDropdown, setShowDropdown] = useState(false); - const [currentDocTitle, setCurrentDocTitle] = useState(''); - useEffect(() => { - const handleClickOutside = (event) => { - if (!dropdownRef.current || dropdownRef.current.contains(event.target)) { - return; - } - setShowDropdown(false); - }; - document.addEventListener("mousedown", handleClickOutside); - document.addEventListener("touchstart", handleClickOutside); - document.addEventListener("focusin", handleClickOutside); - return () => { - document.removeEventListener("mousedown", handleClickOutside); - document.removeEventListener("touchstart", handleClickOutside); - document.removeEventListener("focusin", handleClickOutside); - }; - }, [dropdownRef]); - // // console.log(items); - const location = useLocation(); - useEffect(() => { - function getDocTitle(listOfItems, index) { - // // console.log(listOfItems, index); - if (listOfItems.length === index) { - return null; - } - - if (listOfItems[index]?.dropdown) { - return getDocTitle(listOfItems[index]?.dropdown, 0) - } else if (listOfItems[index]?.to === location.pathname) { - return listOfItems[index]?.label - } else { - index++; - return getDocTitle(listOfItems, index) - } - } - - setCurrentDocTitle(getDocTitle(items, 0)) - // console.log(getDocTitle(items, 0), 'hello', null) - }, [ - location.pathname - ]) - return ( -
    - e.preventDefault()} - onKeyDown={(e) => { - if (e.key === "Enter") { - e.preventDefault(); - setShowDropdown(!showDropdown); - } - }} - > - - {/* {props.children ?? props.label} */} - - {/*
      - {items.map((childItemProps, i) => ( - - ))} -
    */} - -
    - ); -} -function DropdownNavbarItemMobile({ - items, - className, - position, // Need to destructure position from props so that it doesn't get passed on. - onClick, - ...props -}) { - const localPathname = useLocalPathname(); - // console.log(localPathname, 'localpathname'); - - const containsActive = containsActiveItems(items, localPathname); - const { collapsed, toggleCollapsed, setCollapsed } = useCollapsible({ - initialState: () => !containsActive, - }); - // Expand/collapse if any item active after a navigation - useEffect(() => { - if (containsActive) { - setCollapsed(!containsActive); - } - }, [localPathname, containsActive, setCollapsed]); - // console.log(onClick.toString()); - // console.log(items, 'items'); - return ( -
  • - { - e.preventDefault(); - toggleCollapsed(); - }} - > - {props.children ?? props.label} - - - {items.map((childItemProps, i) => ( - childItemProps.hasOwnProperty('dropdown') ? () : - - ))} - - {/* */} -
  • - ); -} - -function DropdownItemsMobile({ items, onClick, className, ...props }) { - // console.log("Wow it's render", items); - const location = useLocation() - function getDocTitle(listOfItems, index) { - // // console.log(listOfItems, index); - if (listOfItems.length === index) { - return false; - } - - if (listOfItems[index]?.dropdown) { - return getDocTitle(listOfItems[index]?.dropdown, 0) - } else if (listOfItems[index]?.to === location.pathname) { - return true - } else { - index++; - return getDocTitle(listOfItems, index) - } - } - const containsActive = getDocTitle(items, 0) - // console.log(containsActive, 'containsActive'); - const { collapsed, toggleCollapsed, setCollapsed } = useCollapsible({ - initialState: () => !containsActive, - }); - // return items.map(item => item.label) - return
  • - { - e.preventDefault(); - toggleCollapsed(); - }} - > - {props.children ?? props.label} - - - {items.map((childItemProps, i) => - ( - - ) - )} - -
  • -} - -function DropdownItems({ items }) { - return ( -
      - {items.map((childItemProps, i) => { - const [dropdownStatus, setDropdownStatus] = useState(false); - - return childItemProps.hasOwnProperty("dropdown") ? ( -
    • -
      setDropdownStatus(!dropdownStatus)} - className="has-dropdown" - > - {childItemProps.label} - - {dropdownStatus ? ( - - ) : ( - - )} -
      - -
        - {childItemProps.dropdown.map((data) => { - return ( -
      • - - {data.label} - -
      • - ); - })} -
      -
    • - ) : ( - - ); - })} -
    - ); -} - -export default function DropdownNavbarItem({ mobile = false, ...props }) { - // console.log(props, mobile, "props"); - const Comp = mobile ? DropdownNavbarItemMobile : DropdownNavbarItemDesktop; - return ; -} diff --git a/src/theme/NavbarItem/DropdownNavbarItem/styles.module.css b/src/theme/NavbarItem/DropdownNavbarItem/styles.module.css deleted file mode 100644 index 10ee92f520..0000000000 --- a/src/theme/NavbarItem/DropdownNavbarItem/styles.module.css +++ /dev/null @@ -1,3 +0,0 @@ -.dropdownNavbarItemMobile { - cursor: pointer; -} diff --git a/src/theme/NavbarItem/HtmlNavbarItem.js b/src/theme/NavbarItem/HtmlNavbarItem.js deleted file mode 100644 index 22869415af..0000000000 --- a/src/theme/NavbarItem/HtmlNavbarItem.js +++ /dev/null @@ -1,22 +0,0 @@ -import React from 'react'; -import clsx from 'clsx'; -export default function HtmlNavbarItem({ - value, - className, - mobile = false, - isDropdownItem = false, -}) { - const Comp = isDropdownItem ? 'li' : 'div'; - return ( - - ); -} diff --git a/src/theme/NavbarItem/LocaleDropdownNavbarItem/index.js b/src/theme/NavbarItem/LocaleDropdownNavbarItem/index.js deleted file mode 100644 index 158927f0b6..0000000000 --- a/src/theme/NavbarItem/LocaleDropdownNavbarItem/index.js +++ /dev/null @@ -1,68 +0,0 @@ -import React from 'react'; -import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; -import {useAlternatePageUtils} from '@docusaurus/theme-common/internal'; -import {translate} from '@docusaurus/Translate'; -import {useLocation} from '@docusaurus/router'; -import DropdownNavbarItem from '@theme/NavbarItem/DropdownNavbarItem'; -import IconLanguage from '@theme/Icon/Language'; -import styles from './styles.module.css'; -export default function LocaleDropdownNavbarItem({ - mobile, - dropdownItemsBefore, - dropdownItemsAfter, - queryString = '', - ...props -}) { - const { - i18n: {currentLocale, locales, localeConfigs}, - } = useDocusaurusContext(); - const alternatePageUtils = useAlternatePageUtils(); - const {search, hash} = useLocation(); - const localeItems = locales.map((locale) => { - const baseTo = `pathname://${alternatePageUtils.createUrl({ - locale, - fullyQualified: false, - })}`; - // preserve ?search#hash suffix on locale switches - const to = `${baseTo}${search}${hash}${queryString}`; - return { - label: localeConfigs[locale].label, - lang: localeConfigs[locale].htmlLang, - to, - target: '_self', - autoAddBaseUrl: false, - className: - // eslint-disable-next-line no-nested-ternary - locale === currentLocale - ? // Similar idea as DefaultNavbarItem: select the right Infima active - // class name. This cannot be substituted with isActive, because the - // target URLs contain `pathname://` and therefore are not NavLinks! - mobile - ? 'menu__link--active' - : 'dropdown__link--active' - : '', - }; - }); - const items = [...dropdownItemsBefore, ...localeItems, ...dropdownItemsAfter]; - // Mobile is handled a bit differently - const dropdownLabel = mobile - ? translate({ - message: 'Languages', - id: 'theme.navbar.mobileLanguageDropdown.label', - description: 'The label for the mobile language switcher dropdown', - }) - : localeConfigs[currentLocale].label; - return ( - - - {dropdownLabel} - - } - items={items} - /> - ); -} diff --git a/src/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css b/src/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css deleted file mode 100644 index 8804a08ea6..0000000000 --- a/src/theme/NavbarItem/LocaleDropdownNavbarItem/styles.module.css +++ /dev/null @@ -1,4 +0,0 @@ -.iconLanguage { - vertical-align: text-bottom; - margin-right: 5px; -} diff --git a/src/theme/NavbarItem/NavbarNavLink.js b/src/theme/NavbarItem/NavbarNavLink.js deleted file mode 100644 index 5a75675a85..0000000000 --- a/src/theme/NavbarItem/NavbarNavLink.js +++ /dev/null @@ -1,62 +0,0 @@ -import React from 'react'; -import Link from '@docusaurus/Link'; -import useBaseUrl from '@docusaurus/useBaseUrl'; -import isInternalUrl from '@docusaurus/isInternalUrl'; -import {isRegexpStringMatch} from '@docusaurus/theme-common'; -import IconExternalLink from '@theme/Icon/ExternalLink'; -export default function NavbarNavLink({ - activeBasePath, - activeBaseRegex, - to, - href, - label, - html, - isDropdownLink, - prependBaseUrlToHref, - ...props -}) { - // TODO all this seems hacky - // {to: 'version'} should probably be forbidden, in favor of {to: '/version'} - const toUrl = useBaseUrl(to); - const activeBaseUrl = useBaseUrl(activeBasePath); - const normalizedHref = useBaseUrl(href, {forcePrependBaseUrl: true}); - const isExternalLink = label && href && !isInternalUrl(href); - // Link content is set through html XOR label - const linkContentProps = html - ? {dangerouslySetInnerHTML: {__html: html}} - : { - children: ( - <> - {label} - {isExternalLink && ( - - )} - - ), - }; - if (href) { - return ( - - ); - } - return ( - - activeBaseRegex - ? isRegexpStringMatch(activeBaseRegex, location.pathname) - : location.pathname.startsWith(activeBaseUrl), - })} - {...props} - {...linkContentProps} - /> - ); -} diff --git a/src/theme/NavbarItem/SearchNavbarItem.js b/src/theme/NavbarItem/SearchNavbarItem.js deleted file mode 100644 index 9cf4462a50..0000000000 --- a/src/theme/NavbarItem/SearchNavbarItem.js +++ /dev/null @@ -1,13 +0,0 @@ -import React from 'react'; -import SearchBar from '@theme/SearchBar'; -import NavbarSearch from '@theme/Navbar/Search'; -export default function SearchNavbarItem({mobile, className}) { - if (mobile) { - return null; - } - return ( - - - - ); -} diff --git a/src/theme/NavbarItem/index.js b/src/theme/NavbarItem/index.js deleted file mode 100644 index c542ba40d3..0000000000 --- a/src/theme/NavbarItem/index.js +++ /dev/null @@ -1,18 +0,0 @@ -import React from 'react'; -import ComponentTypes from '@theme/NavbarItem/ComponentTypes'; -function normalizeComponentType(type, props) { - // Backward compatibility: navbar item with no type set - // but containing dropdown items should use the type "dropdown" - if (!type || type === 'default') { - return 'items' in props ? 'dropdown' : 'default'; - } - return type; -} -export default function NavbarItem({type, ...props}) { - const componentType = normalizeComponentType(type, props); - const NavbarItemComponent = ComponentTypes[componentType]; - if (!NavbarItemComponent) { - throw new Error(`No NavbarItem component found for type "${type}".`); - } - return ; -} diff --git a/src/theme/SearchBar/CustomSearchButton.js b/src/theme/SearchBar/CustomSearchButton.js deleted file mode 100644 index 6757843e44..0000000000 --- a/src/theme/SearchBar/CustomSearchButton.js +++ /dev/null @@ -1,142 +0,0 @@ -import React, { useEffect, useState } from "react"; -import styles from "./styles.module.css"; -// import { IoSearchCircleOutline } from "react-icons/io5"; - -{ - /* */ -} - -export default function CustomSearchButton({ - onTouchStart, - onFocus, - onMouseOver, - onClick, - ref, - translations, - placeholder, -}) { - - - const [isMacOS, setIsMacOS] = useState(false) - useEffect(() => { - // Function to detect MacOS - const userAgent = window.navigator.userAgent; - const macPlatforms = ["Macintosh", "MacIntel", "MacPPC", "Mac68K"]; - setIsMacOS(macPlatforms.some(platform => userAgent.includes(platform))) - }, []) - - - return ( - <> -
    -
    - - - - - - - - - - -

    {placeholder}

    -
    - {/* Dynamically render Ctrl or Cmd key SVG based on OS */} - {isMacOS ? ( - // SVG for MacOS (Cmd key) - - - - - ) : ( - // SVG for Other OS (Ctrl key) - - - Ctrl - - )} - {/* K key */} - - - - -
    -
    -
    - - - -
    -
    - - ); -} diff --git a/src/theme/SearchBar/index.js b/src/theme/SearchBar/index.js deleted file mode 100644 index 567cb5cd3b..0000000000 --- a/src/theme/SearchBar/index.js +++ /dev/null @@ -1,196 +0,0 @@ -import React, { useCallback, useMemo, useRef, useState } from "react"; -import { DocSearchButton, useDocSearchKeyboardEvents } from "@docsearch/react"; -import Head from "@docusaurus/Head"; -import Link from "@docusaurus/Link"; -import { useHistory } from "@docusaurus/router"; -import { - isRegexpStringMatch, - useSearchLinkCreator, -} from "@docusaurus/theme-common"; -import { - useAlgoliaContextualFacetFilters, - useSearchResultUrlProcessor, -} from "@docusaurus/theme-search-algolia/client"; -import Translate from "@docusaurus/Translate"; -import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; -import { createPortal } from "react-dom"; -import translations from "@theme/SearchTranslations"; -import { useWindowSize } from "@docusaurus/theme-common"; -import CustomSearchButton from "./CustomSearchButton"; -import styles from './styles.module.css'; - -let DocSearchModal = null; -function Hit({ hit, children }) { - return {children}; -} -function ResultsFooter({ state, onClose }) { - const createSearchLink = useSearchLinkCreator(); - return ( - - - {"See all {count} results"} - - - ); -} -function mergeFacetFilters(f1, f2) { - const normalize = (f) => (typeof f === "string" ? [f] : f); - return [...normalize(f1), ...normalize(f2)]; -} -function DocSearch({ contextualSearch, externalUrlRegex, ...props }) { - const { siteMetadata } = useDocusaurusContext(); - const processSearchResultUrl = useSearchResultUrlProcessor(); - const contextualSearchFacetFilters = useAlgoliaContextualFacetFilters(); - const configFacetFilters = props.searchParameters?.facetFilters ?? []; - const facetFilters = contextualSearch - ? // Merge contextual search filters with config filters - mergeFacetFilters(contextualSearchFacetFilters, configFacetFilters) - : // ... or use config facetFilters - configFacetFilters; - // We let user override default searchParameters if she wants to - const searchParameters = { - ...props.searchParameters, - facetFilters, - }; - const history = useHistory(); - const searchContainer = useRef(null); - const searchButtonRef = useRef(null); - const [isOpen, setIsOpen] = useState(false); - const [initialQuery, setInitialQuery] = useState(undefined); - const importDocSearchModalIfNeeded = useCallback(() => { - if (DocSearchModal) { - return Promise.resolve(); - } - return Promise.all([ - import("@docsearch/react/modal"), - import("@docsearch/react/style"), - import("./styles.css"), - ]).then(([{ DocSearchModal: Modal }]) => { - DocSearchModal = Modal; - }); - }, []); - const onOpen = useCallback(() => { - importDocSearchModalIfNeeded().then(() => { - searchContainer.current = document.createElement("div"); - document.body.insertBefore( - searchContainer.current, - document.body.firstChild - ); - setIsOpen(true); - }); - }, [importDocSearchModalIfNeeded, setIsOpen]); - const onClose = useCallback(() => { - setIsOpen(false); - searchContainer.current?.remove(); - }, [setIsOpen]); - const onInput = useCallback( - (event) => { - importDocSearchModalIfNeeded().then(() => { - setIsOpen(true); - setInitialQuery(event.key); - }); - }, - [importDocSearchModalIfNeeded, setIsOpen, setInitialQuery] - ); - const navigator = useRef({ - navigate({ itemUrl }) { - // Algolia results could contain URL's from other domains which cannot - // be served through history and should navigate with window.location - if (isRegexpStringMatch(externalUrlRegex, itemUrl)) { - window.location.href = itemUrl; - } else { - history.push(itemUrl); - } - }, - }).current; - const transformItems = useRef((items) => - props.transformItems - ? // Custom transformItems - props.transformItems(items) - : // Default transformItems - items.map((item) => ({ - ...item, - url: processSearchResultUrl(item.url), - })) - ).current; - const resultsFooterComponent = useMemo( - () => - // eslint-disable-next-line react/no-unstable-nested-components - (footerProps) => - , - [onClose] - ); - const transformSearchClient = useCallback( - (searchClient) => { - searchClient.addAlgoliaAgent( - "docusaurus", - siteMetadata.docusaurusVersion - ); - return searchClient; - }, - [siteMetadata.docusaurusVersion] - ); - useDocSearchKeyboardEvents({ - isOpen, - onOpen, - onClose, - onInput, - searchButtonRef, - }); - - return ( - <> - - {/* This hints the browser that the website will load data from Algolia, - and allows it to preconnect to the DocSearch cluster. It makes the first - query faster, especially on mobile. */} - - - {/* Prevents sidebar items from appearing above search on scroll*/} -
    - - - {isOpen && - DocSearchModal && - searchContainer.current && - createPortal( - , - searchContainer.current - )} - - ); -} -export default function SearchBar() { - const { siteConfig } = useDocusaurusContext(); - return ; -} diff --git a/src/theme/SearchBar/styles.css b/src/theme/SearchBar/styles.css deleted file mode 100644 index a4ab068808..0000000000 --- a/src/theme/SearchBar/styles.css +++ /dev/null @@ -1,89 +0,0 @@ -:root { - --docsearch-primary-color: var(--ifm-color-primary); - --docsearch-text-color: var(--ifm-font-color-base); -} - -.DocSearch-Button { - margin: 0; - transition: all var(--ifm-transition-fast) - var(--ifm-transition-timing-default); -} - -.DocSearch-Container { - z-index: calc(var(--ifm-z-index-fixed) + 1); -} - -.search_container p { - font-size: 14px !important; - letter-spacing: 0.28px; -} - -@media (min-width: 997px) { - .custom_algolia { - position: absolute; - top: 122px; - left: 4px; - } -} - -.search_mobile_icon { - align-items: center; - background: var(--docsearch-searchbox-background); - border: 0; - border-radius: 40px; - color: var(--docsearch-muted-color); - cursor: pointer; - /* display: flex; */ - font-weight: 500; - height: 36px; - justify-content: space-between; - margin: 0 0 0 16px; - padding: 0 8px; - -webkit-user-select: none; - user-select: none; - width: 36px; - display:none; -} - -@media (max-width: 996px) { - - .search_container { - width: auto; - } - .search_mobile_icon{ - display: flex; - justify-content: center; - } - - .custom_algolia { - right: 1rem; - left: unset; - transform: translateX(-50%); - } - - .search_container > div { - width: 36px !important; - min-width: 36px !important; - max-width: 36px !important; - height: 36px; - } - -} -@media (max-width: 996px) -{ - .custom_algolia { - - } -} - -.search_mask { - position:absolute; - height:80px; - background:white; - width:268px; - top:-26px; - display:none; -} -[data-theme="dark"] .search_mask { - background:#000; -} \ No newline at end of file diff --git a/src/theme/SearchBar/styles.module.css b/src/theme/SearchBar/styles.module.css deleted file mode 100644 index 612e0d61e0..0000000000 --- a/src/theme/SearchBar/styles.module.css +++ /dev/null @@ -1,55 +0,0 @@ -:root { - --custom-container-bg: #fff; - --custom-container-border: #dbdde1; - --custom-container-color: #5F6368; -} - -[data-theme="dark"] { - --custom-container-bg: #000; - --custom-container-border: #242424; - --custom-container-color: #5F6368; -} - -.container { - width: 100%; - display: flex; - flex-direction: row; - align-items: center; - justify-content: flex-start; - border: 1px solid var(--custom-container-border); - border-radius: 4px; - padding: 12px; - cursor: pointer; - position: relative; - background-color: var(--custom-container-bg); -} - -.container > p { - margin: 0; - margin-left: 8px; - font-size: 14px; - line-height: 22.4px; - color: var(--custom-container-color); -} - -.keys { - display: flex; - flex-direction: row; - align-items: center; - justify-content: flex-start; - flex-wrap: wrap; - position: absolute; - top: 50%; - transform: translateY(-50%); - right: 12px; -} -.keys > svg:first-child { - margin-right: 4px; -} - -@media (max-width: 997px) { - /* Algolia search container */ - .container { - display: none; - } -} \ No newline at end of file diff --git a/src/theme/TOC/index.js b/src/theme/TOC/index.js deleted file mode 100644 index 7e7fb531e1..0000000000 --- a/src/theme/TOC/index.js +++ /dev/null @@ -1,34 +0,0 @@ -import React, { useEffect, useState } from "react"; -import clsx from "clsx"; -import TOCItems from "@theme/TOCItems"; -import styles from "./styles.module.css"; -import contentStyles from "../DocItem/Content/styles.module.css" -// Using a custom className -// This prevents TOCInline/TOCCollapsible getting highlighted by mistake -const LINK_CLASS_NAME = "table-of-contents__link toc-highlight"; -const LINK_ACTIVE_CLASS_NAME = "table-of-contents__link--active"; -export default function TOC({ className, ...props }) { - const [tocHeight, setTocHeight] = useState(0); // Initialize with default height - - useEffect(() => { - const element = document.querySelector(`.${contentStyles.topLevelDoc} > :nth-child(3)`); - if (element) { - const yCoordinate = element.getBoundingClientRect().y + window.scrollY; - setTocHeight(`${yCoordinate-112}px`); // Set the height based on Y-coordinate - } - }, []); - - - return ( -
    - -
    - ); -} diff --git a/src/theme/TOC/styles.module.css b/src/theme/TOC/styles.module.css deleted file mode 100644 index 5f15b63191..0000000000 --- a/src/theme/TOC/styles.module.css +++ /dev/null @@ -1,25 +0,0 @@ -.tableOfContents { - max-height: calc(100vh - (var(--ifm-navbar-height) + 2rem)); - overflow-y: auto; - position: sticky; - top: calc(var(--ifm-navbar-height) + 1rem); -} - -@media (max-width: 996px) { - .tableOfContents { - display: none; - } - - .docItemContainer { - padding: 0 0.3rem; - } -} - -.link { - color: var(--grey-900); - font-family: 'DM Mono', monospace; - font-size: 0.75rem; - line-height: normal; - letter-spacing: 0.6px; - text-decoration-line: underline; -} diff --git a/static/bittensor-media-assets/Bittensor-mediaassets-2024Dec02.zip b/static/bittensor-media-assets/Bittensor-mediaassets-2024Dec02.zip deleted file mode 100644 index 3dceda81cb..0000000000 Binary files a/static/bittensor-media-assets/Bittensor-mediaassets-2024Dec02.zip and /dev/null differ diff --git a/static/btwallet-api/html/.buildinfo b/static/btwallet-api/html/.buildinfo deleted file mode 100644 index 51d0fb66a7..0000000000 --- a/static/btwallet-api/html/.buildinfo +++ /dev/null @@ -1,4 +0,0 @@ -# Sphinx build info version 1 -# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 790454dd4a137ddea3d2d266795e841b -tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/static/btwallet-api/html/_static/basic.css b/static/btwallet-api/html/_static/basic.css deleted file mode 100644 index 2af6139e6b..0000000000 --- a/static/btwallet-api/html/_static/basic.css +++ /dev/null @@ -1,925 +0,0 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/* -- main layout ----------------------------------------------------------- */ - -div.clearer { - clear: both; -} - -div.section::after { - display: block; - content: ''; - clear: left; -} - -/* -- relbar ---------------------------------------------------------------- */ - -div.related { - width: 100%; - font-size: 90%; -} - -div.related h3 { - display: none; -} - -div.related ul { - margin: 0; - padding: 0 0 0 10px; - list-style: none; -} - -div.related li { - display: inline; -} - -div.related li.right { - float: right; - margin-right: 5px; -} - -/* -- sidebar --------------------------------------------------------------- */ - -div.sphinxsidebarwrapper { - padding: 10px 5px 0 10px; -} - -div.sphinxsidebar { - float: left; - width: 270px; - margin-left: -100%; - font-size: 90%; - word-wrap: break-word; - overflow-wrap : break-word; -} - -div.sphinxsidebar ul { - list-style: none; -} - -div.sphinxsidebar ul ul, -div.sphinxsidebar ul.want-points { - margin-left: 20px; - list-style: square; -} - -div.sphinxsidebar ul ul { - margin-top: 0; - margin-bottom: 0; -} - -div.sphinxsidebar form { - margin-top: 10px; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - -div.sphinxsidebar #searchbox form.search { - overflow: hidden; -} - -div.sphinxsidebar #searchbox input[type="text"] { - float: left; - width: 80%; - padding: 0.25em; - box-sizing: border-box; -} - -div.sphinxsidebar #searchbox input[type="submit"] { - float: left; - width: 20%; - border-left: none; - padding: 0.25em; - box-sizing: border-box; -} - - -img { - border: 0; - max-width: 100%; -} - -/* -- search page ----------------------------------------------------------- */ - -ul.search { - margin: 10px 0 0 20px; - padding: 0; -} - -ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; -} - -ul.search li a { - font-weight: bold; -} - -ul.search li p.context { - color: #888; - margin: 2px 0 0 30px; - text-align: left; -} - -ul.keywordmatches li.goodmatch a { - font-weight: bold; -} - -/* -- index page ------------------------------------------------------------ */ - -table.contentstable { - width: 90%; - margin-left: auto; - margin-right: auto; -} - -table.contentstable p.biglink { - line-height: 150%; -} - -a.biglink { - font-size: 1.3em; -} - -span.linkdescr { - font-style: italic; - padding-top: 5px; - font-size: 90%; -} - -/* -- general index --------------------------------------------------------- */ - -table.indextable { - width: 100%; -} - -table.indextable td { - text-align: left; - vertical-align: top; -} - -table.indextable ul { - margin-top: 0; - margin-bottom: 0; - list-style-type: none; -} - -table.indextable > tbody > tr > td > ul { - padding-left: 0em; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -div.modindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -div.genindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -/* -- domain module index --------------------------------------------------- */ - -table.modindextable td { - padding: 2px; - border-collapse: collapse; -} - -/* -- general body styles --------------------------------------------------- */ - -div.body { - min-width: 360px; - max-width: 800px; -} - -div.body p, div.body dd, div.body li, div.body blockquote { - -moz-hyphens: auto; - -ms-hyphens: auto; - -webkit-hyphens: auto; - hyphens: auto; -} - -a.headerlink { - visibility: hidden; -} - -a:visited { - color: #551A8B; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink, -caption:hover > a.headerlink, -p.caption:hover > a.headerlink, -div.code-block-caption:hover > a.headerlink { - visibility: visible; -} - -div.body p.caption { - text-align: inherit; -} - -div.body td { - text-align: left; -} - -.first { - margin-top: 0 !important; -} - -p.rubric { - margin-top: 30px; - font-weight: bold; -} - -img.align-left, figure.align-left, .figure.align-left, object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, figure.align-right, .figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, figure.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -img.align-default, figure.align-default, .figure.align-default { - display: block; - margin-left: auto; - margin-right: auto; -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-default { - text-align: center; -} - -.align-right { - text-align: right; -} - -/* -- sidebars -------------------------------------------------------------- */ - -div.sidebar, -aside.sidebar { - margin: 0 0 0.5em 1em; - border: 1px solid #ddb; - padding: 7px; - background-color: #ffe; - width: 40%; - float: right; - clear: right; - overflow-x: auto; -} - -p.sidebar-title { - font-weight: bold; -} - -nav.contents, -aside.topic, -div.admonition, div.topic, blockquote { - clear: left; -} - -/* -- topics ---------------------------------------------------------------- */ - -nav.contents, -aside.topic, -div.topic { - border: 1px solid #ccc; - padding: 7px; - margin: 10px 0 10px 0; -} - -p.topic-title { - font-size: 1.1em; - font-weight: bold; - margin-top: 10px; -} - -/* -- admonitions ----------------------------------------------------------- */ - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 7px; -} - -div.admonition dt { - font-weight: bold; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -/* -- content of sidebars/topics/admonitions -------------------------------- */ - -div.sidebar > :last-child, -aside.sidebar > :last-child, -nav.contents > :last-child, -aside.topic > :last-child, -div.topic > :last-child, -div.admonition > :last-child { - margin-bottom: 0; -} - -div.sidebar::after, -aside.sidebar::after, -nav.contents::after, -aside.topic::after, -div.topic::after, -div.admonition::after, -blockquote::after { - display: block; - content: ''; - clear: both; -} - -/* -- tables ---------------------------------------------------------------- */ - -table.docutils { - margin-top: 10px; - margin-bottom: 10px; - border: 0; - border-collapse: collapse; -} - -table.align-center { - margin-left: auto; - margin-right: auto; -} - -table.align-default { - margin-left: auto; - margin-right: auto; -} - -table caption span.caption-number { - font-style: italic; -} - -table caption span.caption-text { -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} - -th { - text-align: left; - padding-right: 5px; -} - -table.citation { - border-left: solid 1px gray; - margin-left: 1px; -} - -table.citation td { - border-bottom: none; -} - -th > :first-child, -td > :first-child { - margin-top: 0px; -} - -th > :last-child, -td > :last-child { - margin-bottom: 0px; -} - -/* -- figures --------------------------------------------------------------- */ - -div.figure, figure { - margin: 0.5em; - padding: 0.5em; -} - -div.figure p.caption, figcaption { - padding: 0.3em; -} - -div.figure p.caption span.caption-number, -figcaption span.caption-number { - font-style: italic; -} - -div.figure p.caption span.caption-text, -figcaption span.caption-text { -} - -/* -- field list styles ----------------------------------------------------- */ - -table.field-list td, table.field-list th { - border: 0 !important; -} - -.field-list ul { - margin: 0; - padding-left: 1em; -} - -.field-list p { - margin: 0; -} - -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -/* -- hlist styles ---------------------------------------------------------- */ - -table.hlist { - margin: 1em 0; -} - -table.hlist td { - vertical-align: top; -} - -/* -- object description styles --------------------------------------------- */ - -.sig { - font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; -} - -.sig-name, code.descname { - background-color: transparent; - font-weight: bold; -} - -.sig-name { - font-size: 1.1em; -} - -code.descname { - font-size: 1.2em; -} - -.sig-prename, code.descclassname { - background-color: transparent; -} - -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - -.sig-param.n { - font-style: italic; -} - -/* C++ specific styling */ - -.sig-inline.c-texpr, -.sig-inline.cpp-texpr { - font-family: unset; -} - -.sig.c .k, .sig.c .kt, -.sig.cpp .k, .sig.cpp .kt { - color: #0033B3; -} - -.sig.c .m, -.sig.cpp .m { - color: #1750EB; -} - -.sig.c .s, .sig.c .sc, -.sig.cpp .s, .sig.cpp .sc { - color: #067D17; -} - - -/* -- other body styles ----------------------------------------------------- */ - -ol.arabic { - list-style: decimal; -} - -ol.loweralpha { - list-style: lower-alpha; -} - -ol.upperalpha { - list-style: upper-alpha; -} - -ol.lowerroman { - list-style: lower-roman; -} - -ol.upperroman { - list-style: upper-roman; -} - -:not(li) > ol > li:first-child > :first-child, -:not(li) > ul > li:first-child > :first-child { - margin-top: 0px; -} - -:not(li) > ol > li:last-child > :last-child, -:not(li) > ul > li:last-child > :last-child { - margin-bottom: 0px; -} - -ol.simple ol p, -ol.simple ul p, -ul.simple ol p, -ul.simple ul p { - margin-top: 0; -} - -ol.simple > li:not(:first-child) > p, -ul.simple > li:not(:first-child) > p { - margin-top: 0; -} - -ol.simple p, -ul.simple p { - margin-bottom: 0; -} - -aside.footnote > span, -div.citation > span { - float: left; -} -aside.footnote > span:last-of-type, -div.citation > span:last-of-type { - padding-right: 0.5em; -} -aside.footnote > p { - margin-left: 2em; -} -div.citation > p { - margin-left: 4em; -} -aside.footnote > p:last-of-type, -div.citation > p:last-of-type { - margin-bottom: 0em; -} -aside.footnote > p:last-of-type:after, -div.citation > p:last-of-type:after { - content: ""; - clear: both; -} - -dl.field-list { - display: grid; - grid-template-columns: fit-content(30%) auto; -} - -dl.field-list > dt { - font-weight: bold; - word-break: break-word; - padding-left: 0.5em; - padding-right: 5px; -} - -dl.field-list > dd { - padding-left: 0.5em; - margin-top: 0em; - margin-left: 0em; - margin-bottom: 0em; -} - -dl { - margin-bottom: 15px; -} - -dd > :first-child { - margin-top: 0px; -} - -dd ul, dd table { - margin-bottom: 10px; -} - -dd { - margin-top: 3px; - margin-bottom: 10px; - margin-left: 30px; -} - -.sig dd { - margin-top: 0px; - margin-bottom: 0px; -} - -.sig dl { - margin-top: 0px; - margin-bottom: 0px; -} - -dl > dd:last-child, -dl > dd:last-child > :last-child { - margin-bottom: 0; -} - -dt:target, span.highlighted { - background-color: #fbe54e; -} - -rect.highlighted { - fill: #fbe54e; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} - -.versionmodified { - font-style: italic; -} - -.system-message { - background-color: #fda; - padding: 5px; - border: 3px solid red; -} - -.footnote:target { - background-color: #ffa; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -.guilabel, .menuselection { - font-family: sans-serif; -} - -.accelerator { - text-decoration: underline; -} - -.classifier { - font-style: oblique; -} - -.classifier:before { - font-style: normal; - margin: 0 0.5em; - content: ":"; - display: inline-block; -} - -abbr, acronym { - border-bottom: dotted 1px; - cursor: help; -} - -.translated { - background-color: rgba(207, 255, 207, 0.2) -} - -.untranslated { - background-color: rgba(255, 207, 207, 0.2) -} - -/* -- code displays --------------------------------------------------------- */ - -pre { - overflow: auto; - overflow-y: hidden; /* fixes display issues on Chrome browsers */ -} - -pre, div[class*="highlight-"] { - clear: both; -} - -span.pre { - -moz-hyphens: none; - -ms-hyphens: none; - -webkit-hyphens: none; - hyphens: none; - white-space: nowrap; -} - -div[class*="highlight-"] { - margin: 1em 0; -} - -td.linenos pre { - border: 0; - background-color: transparent; - color: #aaa; -} - -table.highlighttable { - display: block; -} - -table.highlighttable tbody { - display: block; -} - -table.highlighttable tr { - display: flex; -} - -table.highlighttable td { - margin: 0; - padding: 0; -} - -table.highlighttable td.linenos { - padding-right: 0.5em; -} - -table.highlighttable td.code { - flex: 1; - overflow: hidden; -} - -.highlight .hll { - display: block; -} - -div.highlight pre, -table.highlighttable pre { - margin: 0; -} - -div.code-block-caption + div { - margin-top: 0; -} - -div.code-block-caption { - margin-top: 1em; - padding: 2px 5px; - font-size: small; -} - -div.code-block-caption code { - background-color: transparent; -} - -table.highlighttable td.linenos, -span.linenos, -div.highlight span.gp { /* gp: Generic.Prompt */ - user-select: none; - -webkit-user-select: text; /* Safari fallback only */ - -webkit-user-select: none; /* Chrome/Safari */ - -moz-user-select: none; /* Firefox */ - -ms-user-select: none; /* IE10+ */ -} - -div.code-block-caption span.caption-number { - padding: 0.1em 0.3em; - font-style: italic; -} - -div.code-block-caption span.caption-text { -} - -div.literal-block-wrapper { - margin: 1em 0; -} - -code.xref, a code { - background-color: transparent; - font-weight: bold; -} - -h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { - background-color: transparent; -} - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family: sans-serif; -} - -div.viewcode-block:target { - margin: -1px -10px; - padding: 0 10px; -} - -/* -- math display ---------------------------------------------------------- */ - -img.math { - vertical-align: middle; -} - -div.body div.math p { - text-align: center; -} - -span.eqno { - float: right; -} - -span.eqno a.headerlink { - position: absolute; - z-index: 1; -} - -div.math:hover a.headerlink { - visibility: visible; -} - -/* -- printout stylesheet --------------------------------------------------- */ - -@media print { - div.document, - div.documentwrapper, - div.bodywrapper { - margin: 0 !important; - width: 100%; - } - - div.sphinxsidebar, - div.related, - div.footer, - #top-link { - display: none; - } -} \ No newline at end of file diff --git a/static/btwallet-api/html/_static/bittensor-custom.css b/static/btwallet-api/html/_static/bittensor-custom.css deleted file mode 100644 index 71e3492e85..0000000000 --- a/static/btwallet-api/html/_static/bittensor-custom.css +++ /dev/null @@ -1,157 +0,0 @@ -/* CSS customized by Raj Karamchedu on 29 January 2024 */ - -@font-face { - font-family: "Haffer"; - src: url(./fonts/Haffer-Light.ttf); - font-weight: 200; - font-style: normal; -} - -@font-face { - font-family: "Haffer"; - src: url(./fonts/Haffer-Medium.ttf); - font-weight: 400; - font-style: normal; -} - -@font-face { - font-family: "Haffer"; - src: url(./fonts/Haffer-Regular.ttf); - font-weight: normal; - font-style: normal; -} - -@font-face { - font-family: "Haffer"; - src: url(./fonts/Haffer-SemiBold.ttf); - font-weight: bold; - font-style: normal; -} - -@font-face { - font-family: "HafferSQ"; - src: url(./fonts/HafferSQ-Light.ttf); - font-weight: 200; - font-style: normal; -} - -@font-face { - font-family: "HafferSQ"; - src: url(./fonts/HafferSQ-Medium.ttf); - font-weight: 400; - font-style: normal; -} - -@font-face { - font-family: "HafferSQ"; - src: url(./fonts/HafferSQ-Regular.ttf); - font-weight: normal; - font-style: normal; -} - -@font-face { - font-family: "HafferSQ"; - src: url(./fonts/HafferSQ-SemiBold.ttf); - font-weight: bold; - font-style: normal; -} - -@font-face { - font-family: "TTCommonsPro"; - src: url(./fonts/TTCommonsProMonoMedium.ttf); - font-weight: 200; - font-style: normal; -} - -@font-face { - font-family: "TTCommonsPro"; - src: url(./fonts/TTCommonsProMonoRegular.ttf); - font-weight: 100; - font-style: normal; -} - -@font-face { - font-family: "FiraCode"; - src: url(./fonts/FiraCode_VariableFont_wght.ttf); -} - - - -html { - --pst-font-family-base-system: 'Haffer', -apple-system, BlinkMacSystemFont, Segoe UI, "Helvetica Neue", Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol; - --pst-font-family-monospace-system: "TTCommonsPro", Menlo, Consolas, Monaco, - Liberation Mono, Lucida Console, monospace; - --pst-sidebar-font-size: 1.0rem; - --pst-font-family-base: var(--pst-font-family-base-system); - --pst-font-family-heading: var(--pst-font-family-base-system); - --pst-font-family-monospace: var(--pst-font-family-monospace-system); - --pst-color-inline-code-links: #0c0c0c; - -} - -html[data-theme=dark]{ - --pst-color-surface: none; - --pst-color-inline-code-links: #fff; - --pst-color-target: #545454; - --pst-color-inline-code: #1fd01f; - --pst-color-table-row-hover-bg: #003200; -} - - -html[data-theme=light]{ - --pst-color-surface: none; - --pst-color-inline-code-links: #000; - --pst-color-target: #eaebed; - --pst-color-inline-code: #0fa50f; - --pst-color-table-row-hover-bg: #ffffc0; -} - -html[data-theme=dark], html[data-theme=light] { - --pst-color-primary: #838793; -} - -p { - font-size: 16px !important; -} - -code.xref, a code { - font-weight: normal; -} - -code.literal { - background-color: none; - border: none; -} - -.dropdown, .dropdown-center, .dropend, .dropstart, .dropup, .dropup-center { - position: relative; - display: none; -} - -/* .search-button { - display: none; -} */ - -.btn-fullscreen-button { - display: none; -} - -.bd-sidebar-secondary .onthispage { - display: none; -} - -@media (min-width: 992px){ -.bd-sidebar-primary { - flex-basis: 25%; -} -} - -.bd-sidebar-secondary{ - max-height: calc(100vh - var(--pst-header-height)); -} - -@media (min-width: 960px){ -.bd-page-width { - max-width: 98rem; -} -} \ No newline at end of file diff --git a/static/btwallet-api/html/_static/custom-css-for-sphinx-book-theme.css b/static/btwallet-api/html/_static/custom-css-for-sphinx-book-theme.css deleted file mode 100644 index 143a284db8..0000000000 --- a/static/btwallet-api/html/_static/custom-css-for-sphinx-book-theme.css +++ /dev/null @@ -1,174 +0,0 @@ -@import url('https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;600;700&family=Poppins:wght@400;500;600&family=JetBrains+Mono&display=swap'); - -body { - color: #221f1f; - font-family: 'Open Sans', sans-serif; -} - -h1 { - font-size: 2.2em; -} - -h2 { - font-size: 1.5em; -} - -h3 { - font-size: 1.2em; -} - -h4 { - font-size: 1.0em; -} - -.nav { - font-family: 'Poppins', sans-serif; -} - -.header-style, h1, h2, h3, h4, h5, h6 { - font-family: 'Poppins', sans-serif; - font-weight: 500; -} - -.bd-toc .tocsection { - padding: 4.0rem 0 .5rem 1rem !important; /* Right-side bar top padding to align with the main content title. */ -} - - -#main-content { - margin-top: 1rem !important; /* Main content pushed down to align with the site title below logo on the left-side bar. If you change this you must change the .bd-toc .tocsection padding from 7.8rem. */ -} - - -.admonition.note .admonition-title { - background-color: #fff0ec; - letter-spacing: 0.045rem; -} - -.admonition .admonition-title { - font-family: 'Poppins', sans-serif; -} - - -nav.bd-links li.toctree-l1 { - line-height: 1.45; -} - -.card { - box-shadow: 0 .5rem 1rem rgba(0,0,0,.15)!important; - transition: all 0.3s ease-in-out!important; -} - -@media (min-width: 576px) { - .card-deck .card { - margin-bottom: 15px; - transition: all 0.3s ease-in-out!important; - } -} - -@media (min-width: 1200px) { - .container, .container-lg, .container-md, .container sm, .container-xl { - max-width: 1400px; - } -} - -nav.bd-links p.caption { - letter-spacing: 0.1em; - font-family: 'Poppins', sans-serif; -} - -.caption-text { - letter-spacing: 0.1em; - font-family: 'Poppins', sans-serif; - font-size: 0.9em; - text-transform: uppercase; - font-weight: bold; - position: relative; - margin-top: 1.25em; - margin-bottom: 0; -} - -toc-h1, .toc-h2, .toc-h3, .toc-h4 { - line-height: 1.45; - margin-bottom: 0.5em; -} - -@media only screen and (min-width: 768px) { - #navbar-toggler { - display: none; - } -} - -div.navbar_extra_footer { - display: none; -} - -div.dropdown-buttons-trigger { - display: none; -} - -a.full-screen-button { - display: none; -} - -pre { - line-height: 150%; - background-color: #f1f3f4; /* #ffc1070d; */ - padding: 22px; - color: #37474f; - font-size: 95%; - border: none; - box-shadow: none; - /* font-family: 'JetBrains Mono', sans-serif; Avoid this here or else glyphs in code snippets. */ -} - -.header-style, h1, h2, h3, h4, h5, h6 { - line-height: 1.35; -} - -nav.bd-links li.toctree-l1, nav.bd-links li.toctree-l2, nav.bd-links li.toctree-l3, nav.bd-links li.toctree-l4, nav.bd-links li.toctree-l5 { - margin-bottom: 0.35em; -} - -.bd-sidebar nav ul.nav a:hover, .bd-sidebar nav ul.nav li.active>a, .bd-sidebar nav ul.nav li.active>a:hover { - color: #221f1f; -} -.bd-sidebar-secondary .onthispage { - height: 3rem; - min-height: 3rem; - display: none; -} - -.prev-next-bottom { - height: 3em; - font-family: 'Poppins', sans-serif; - font-weight: 500; -} - -blockquote { - margin: 1rem 0 1rem; - border-left: 0px solid #ccc; - padding: .1em .1em; -} - -main.bd-content #main-content div.section ul p, main.bd-content #main-content div.section ol p { - margin-bottom: .5rem; -} - -table td, .table th { - padding: .75rem; - vertical-align: top; - border-top: 1px solid #dee2e6; - border-bottom: 1px solid #dee2e6; - border-right: 1px solid #dee2e6; - border-left: 1px solid #dee2e6; -} - -.footer { - font-size: .8em; -} - -.bd-header-article .article-header-buttons { - /* display: flex; */ - display: none; -} diff --git a/static/btwallet-api/html/_static/doctools.js b/static/btwallet-api/html/_static/doctools.js deleted file mode 100644 index 4d67807d17..0000000000 --- a/static/btwallet-api/html/_static/doctools.js +++ /dev/null @@ -1,156 +0,0 @@ -/* - * doctools.js - * ~~~~~~~~~~~ - * - * Base JavaScript utilities for all Sphinx HTML documentation. - * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ -"use strict"; - -const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ - "TEXTAREA", - "INPUT", - "SELECT", - "BUTTON", -]); - -const _ready = (callback) => { - if (document.readyState !== "loading") { - callback(); - } else { - document.addEventListener("DOMContentLoaded", callback); - } -}; - -/** - * Small JavaScript module for the documentation. - */ -const Documentation = { - init: () => { - Documentation.initDomainIndexTable(); - Documentation.initOnKeyListeners(); - }, - - /** - * i18n support - */ - TRANSLATIONS: {}, - PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), - LOCALE: "unknown", - - // gettext and ngettext don't access this so that the functions - // can safely bound to a different name (_ = Documentation.gettext) - gettext: (string) => { - const translated = Documentation.TRANSLATIONS[string]; - switch (typeof translated) { - case "undefined": - return string; // no translation - case "string": - return translated; // translation exists - default: - return translated[0]; // (singular, plural) translation tuple exists - } - }, - - ngettext: (singular, plural, n) => { - const translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated !== "undefined") - return translated[Documentation.PLURAL_EXPR(n)]; - return n === 1 ? singular : plural; - }, - - addTranslations: (catalog) => { - Object.assign(Documentation.TRANSLATIONS, catalog.messages); - Documentation.PLURAL_EXPR = new Function( - "n", - `return (${catalog.plural_expr})` - ); - Documentation.LOCALE = catalog.locale; - }, - - /** - * helper function to focus on search bar - */ - focusSearchBar: () => { - document.querySelectorAll("input[name=q]")[0]?.focus(); - }, - - /** - * Initialise the domain index toggle buttons - */ - initDomainIndexTable: () => { - const toggler = (el) => { - const idNumber = el.id.substr(7); - const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); - if (el.src.substr(-9) === "minus.png") { - el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; - toggledRows.forEach((el) => (el.style.display = "none")); - } else { - el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; - toggledRows.forEach((el) => (el.style.display = "")); - } - }; - - const togglerElements = document.querySelectorAll("img.toggler"); - togglerElements.forEach((el) => - el.addEventListener("click", (event) => toggler(event.currentTarget)) - ); - togglerElements.forEach((el) => (el.style.display = "")); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); - }, - - initOnKeyListeners: () => { - // only install a listener if it is really needed - if ( - !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && - !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS - ) - return; - - document.addEventListener("keydown", (event) => { - // bail for input elements - if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; - // bail with special keys - if (event.altKey || event.ctrlKey || event.metaKey) return; - - if (!event.shiftKey) { - switch (event.key) { - case "ArrowLeft": - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; - - const prevLink = document.querySelector('link[rel="prev"]'); - if (prevLink && prevLink.href) { - window.location.href = prevLink.href; - event.preventDefault(); - } - break; - case "ArrowRight": - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; - - const nextLink = document.querySelector('link[rel="next"]'); - if (nextLink && nextLink.href) { - window.location.href = nextLink.href; - event.preventDefault(); - } - break; - } - } - - // some keyboard layouts may need Shift to get / - switch (event.key) { - case "/": - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; - Documentation.focusSearchBar(); - event.preventDefault(); - } - }); - }, -}; - -// quick alias for translations -const _ = Documentation.gettext; - -_ready(Documentation.init); diff --git a/static/btwallet-api/html/_static/documentation_options.js b/static/btwallet-api/html/_static/documentation_options.js deleted file mode 100644 index 4ea7447b78..0000000000 --- a/static/btwallet-api/html/_static/documentation_options.js +++ /dev/null @@ -1,13 +0,0 @@ -const DOCUMENTATION_OPTIONS = { - VERSION: '1.0', - LANGUAGE: 'en', - COLLAPSE_INDEX: false, - BUILDER: 'html', - FILE_SUFFIX: '.html', - LINK_SUFFIX: '.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '', - NAVIGATION_WITH_KEYS: false, - SHOW_SEARCH_SUMMARY: true, - ENABLE_SEARCH_SHORTCUTS: true, -}; \ No newline at end of file diff --git a/static/btwallet-api/html/_static/file.png b/static/btwallet-api/html/_static/file.png deleted file mode 100644 index a858a410e4..0000000000 Binary files a/static/btwallet-api/html/_static/file.png and /dev/null differ diff --git a/static/btwallet-api/html/_static/fonts/FiraCode_VariableFont_wght.ttf b/static/btwallet-api/html/_static/fonts/FiraCode_VariableFont_wght.ttf deleted file mode 100644 index 0013e0ad05..0000000000 Binary files a/static/btwallet-api/html/_static/fonts/FiraCode_VariableFont_wght.ttf and /dev/null differ diff --git a/static/btwallet-api/html/_static/fonts/Haffer-Light.ttf b/static/btwallet-api/html/_static/fonts/Haffer-Light.ttf deleted file mode 100644 index 4823831012..0000000000 Binary files a/static/btwallet-api/html/_static/fonts/Haffer-Light.ttf and /dev/null differ diff --git a/static/btwallet-api/html/_static/fonts/Haffer-Medium.ttf b/static/btwallet-api/html/_static/fonts/Haffer-Medium.ttf deleted file mode 100644 index 1977e1df34..0000000000 Binary files a/static/btwallet-api/html/_static/fonts/Haffer-Medium.ttf and /dev/null differ diff --git a/static/btwallet-api/html/_static/fonts/Haffer-Regular.ttf b/static/btwallet-api/html/_static/fonts/Haffer-Regular.ttf deleted file mode 100644 index fb2b457ab1..0000000000 Binary files a/static/btwallet-api/html/_static/fonts/Haffer-Regular.ttf and /dev/null differ diff --git a/static/btwallet-api/html/_static/fonts/Haffer-SemiBold.ttf b/static/btwallet-api/html/_static/fonts/Haffer-SemiBold.ttf deleted file mode 100644 index ef01086009..0000000000 Binary files a/static/btwallet-api/html/_static/fonts/Haffer-SemiBold.ttf and /dev/null differ diff --git a/static/btwallet-api/html/_static/fonts/HafferSQ-Light.ttf b/static/btwallet-api/html/_static/fonts/HafferSQ-Light.ttf deleted file mode 100644 index 1abd355828..0000000000 Binary files a/static/btwallet-api/html/_static/fonts/HafferSQ-Light.ttf and /dev/null differ diff --git a/static/btwallet-api/html/_static/fonts/HafferSQ-Medium.ttf b/static/btwallet-api/html/_static/fonts/HafferSQ-Medium.ttf deleted file mode 100644 index a27000db2c..0000000000 Binary files a/static/btwallet-api/html/_static/fonts/HafferSQ-Medium.ttf and /dev/null differ diff --git a/static/btwallet-api/html/_static/fonts/HafferSQ-Regular.ttf b/static/btwallet-api/html/_static/fonts/HafferSQ-Regular.ttf deleted file mode 100644 index df3a2190d5..0000000000 Binary files a/static/btwallet-api/html/_static/fonts/HafferSQ-Regular.ttf and /dev/null differ diff --git a/static/btwallet-api/html/_static/fonts/HafferSQ-SemiBold.ttf b/static/btwallet-api/html/_static/fonts/HafferSQ-SemiBold.ttf deleted file mode 100644 index f2d0584595..0000000000 Binary files a/static/btwallet-api/html/_static/fonts/HafferSQ-SemiBold.ttf and /dev/null differ diff --git a/static/btwallet-api/html/_static/fonts/TTCommonsProMonoMedium.ttf b/static/btwallet-api/html/_static/fonts/TTCommonsProMonoMedium.ttf deleted file mode 100644 index 987ee9fded..0000000000 Binary files a/static/btwallet-api/html/_static/fonts/TTCommonsProMonoMedium.ttf and /dev/null differ diff --git a/static/btwallet-api/html/_static/fonts/TTCommonsProMonoRegular.ttf b/static/btwallet-api/html/_static/fonts/TTCommonsProMonoRegular.ttf deleted file mode 100644 index c2bf574c06..0000000000 Binary files a/static/btwallet-api/html/_static/fonts/TTCommonsProMonoRegular.ttf and /dev/null differ diff --git a/static/btwallet-api/html/_static/graphviz.css b/static/btwallet-api/html/_static/graphviz.css deleted file mode 100644 index 027576e34d..0000000000 --- a/static/btwallet-api/html/_static/graphviz.css +++ /dev/null @@ -1,19 +0,0 @@ -/* - * graphviz.css - * ~~~~~~~~~~~~ - * - * Sphinx stylesheet -- graphviz extension. - * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -img.graphviz { - border: 0; - max-width: 100%; -} - -object.graphviz { - max-width: 100%; -} diff --git a/static/btwallet-api/html/_static/images/logo_binder.svg b/static/btwallet-api/html/_static/images/logo_binder.svg deleted file mode 100644 index 45fecf7511..0000000000 --- a/static/btwallet-api/html/_static/images/logo_binder.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - -logo - - - - - - - - diff --git a/static/btwallet-api/html/_static/images/logo_colab.png b/static/btwallet-api/html/_static/images/logo_colab.png deleted file mode 100644 index b7560ec216..0000000000 Binary files a/static/btwallet-api/html/_static/images/logo_colab.png and /dev/null differ diff --git a/static/btwallet-api/html/_static/images/logo_deepnote.svg b/static/btwallet-api/html/_static/images/logo_deepnote.svg deleted file mode 100644 index fa77ebfc25..0000000000 --- a/static/btwallet-api/html/_static/images/logo_deepnote.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/static/btwallet-api/html/_static/images/logo_jupyterhub.svg b/static/btwallet-api/html/_static/images/logo_jupyterhub.svg deleted file mode 100644 index 60cfe9f222..0000000000 --- a/static/btwallet-api/html/_static/images/logo_jupyterhub.svg +++ /dev/null @@ -1 +0,0 @@ -logo_jupyterhubHub diff --git a/static/btwallet-api/html/_static/language_data.js b/static/btwallet-api/html/_static/language_data.js deleted file mode 100644 index 367b8ed81b..0000000000 --- a/static/btwallet-api/html/_static/language_data.js +++ /dev/null @@ -1,199 +0,0 @@ -/* - * language_data.js - * ~~~~~~~~~~~~~~~~ - * - * This script contains the language-specific data used by searchtools.js, - * namely the list of stopwords, stemmer, scorer and splitter. - * - * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; - - -/* Non-minified version is copied as a separate JS file, if available */ - -/** - * Porter Stemmer - */ -var Stemmer = function() { - - var step2list = { - ational: 'ate', - tional: 'tion', - enci: 'ence', - anci: 'ance', - izer: 'ize', - bli: 'ble', - alli: 'al', - entli: 'ent', - eli: 'e', - ousli: 'ous', - ization: 'ize', - ation: 'ate', - ator: 'ate', - alism: 'al', - iveness: 'ive', - fulness: 'ful', - ousness: 'ous', - aliti: 'al', - iviti: 'ive', - biliti: 'ble', - logi: 'log' - }; - - var step3list = { - icate: 'ic', - ative: '', - alize: 'al', - iciti: 'ic', - ical: 'ic', - ful: '', - ness: '' - }; - - var c = "[^aeiou]"; // consonant - var v = "[aeiouy]"; // vowel - var C = c + "[^aeiouy]*"; // consonant sequence - var V = v + "[aeiou]*"; // vowel sequence - - var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 - var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 - var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 - var s_v = "^(" + C + ")?" + v; // vowel in stem - - this.stemWord = function (w) { - var stem; - var suffix; - var firstch; - var origword = w; - - if (w.length < 3) - return w; - - var re; - var re2; - var re3; - var re4; - - firstch = w.substr(0,1); - if (firstch == "y") - w = firstch.toUpperCase() + w.substr(1); - - // Step 1a - re = /^(.+?)(ss|i)es$/; - re2 = /^(.+?)([^s])s$/; - - if (re.test(w)) - w = w.replace(re,"$1$2"); - else if (re2.test(w)) - w = w.replace(re2,"$1$2"); - - // Step 1b - re = /^(.+?)eed$/; - re2 = /^(.+?)(ed|ing)$/; - if (re.test(w)) { - var fp = re.exec(w); - re = new RegExp(mgr0); - if (re.test(fp[1])) { - re = /.$/; - w = w.replace(re,""); - } - } - else if (re2.test(w)) { - var fp = re2.exec(w); - stem = fp[1]; - re2 = new RegExp(s_v); - if (re2.test(stem)) { - w = stem; - re2 = /(at|bl|iz)$/; - re3 = new RegExp("([^aeiouylsz])\\1$"); - re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); - if (re2.test(w)) - w = w + "e"; - else if (re3.test(w)) { - re = /.$/; - w = w.replace(re,""); - } - else if (re4.test(w)) - w = w + "e"; - } - } - - // Step 1c - re = /^(.+?)y$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = new RegExp(s_v); - if (re.test(stem)) - w = stem + "i"; - } - - // Step 2 - re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - suffix = fp[2]; - re = new RegExp(mgr0); - if (re.test(stem)) - w = stem + step2list[suffix]; - } - - // Step 3 - re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - suffix = fp[2]; - re = new RegExp(mgr0); - if (re.test(stem)) - w = stem + step3list[suffix]; - } - - // Step 4 - re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; - re2 = /^(.+?)(s|t)(ion)$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = new RegExp(mgr1); - if (re.test(stem)) - w = stem; - } - else if (re2.test(w)) { - var fp = re2.exec(w); - stem = fp[1] + fp[2]; - re2 = new RegExp(mgr1); - if (re2.test(stem)) - w = stem; - } - - // Step 5 - re = /^(.+?)e$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = new RegExp(mgr1); - re2 = new RegExp(meq1); - re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); - if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) - w = stem; - } - re = /ll$/; - re2 = new RegExp(mgr1); - if (re.test(w) && re2.test(w)) { - re = /.$/; - w = w.replace(re,""); - } - - // and turn initial Y back to y - if (firstch == "y") - w = firstch.toLowerCase() + w.substr(1); - return w; - } -} - diff --git a/static/btwallet-api/html/_static/locales/ar/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/ar/LC_MESSAGES/booktheme.mo deleted file mode 100644 index 15541a6a37..0000000000 Binary files a/static/btwallet-api/html/_static/locales/ar/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/ar/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/ar/LC_MESSAGES/booktheme.po deleted file mode 100644 index 34d404c6d0..0000000000 --- a/static/btwallet-api/html/_static/locales/ar/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ar\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "طباعة إلى PDF" - -msgid "Theme by the" -msgstr "موضوع بواسطة" - -msgid "Download source file" -msgstr "تنزيل ملف المصدر" - -msgid "open issue" -msgstr "قضية مفتوحة" - -msgid "Contents" -msgstr "محتويات" - -msgid "previous page" -msgstr "الصفحة السابقة" - -msgid "Download notebook file" -msgstr "تنزيل ملف دفتر الملاحظات" - -msgid "Copyright" -msgstr "حقوق النشر" - -msgid "Download this page" -msgstr "قم بتنزيل هذه الصفحة" - -msgid "Source repository" -msgstr "مستودع المصدر" - -msgid "By" -msgstr "بواسطة" - -msgid "repository" -msgstr "مخزن" - -msgid "Last updated on" -msgstr "آخر تحديث في" - -msgid "Toggle navigation" -msgstr "تبديل التنقل" - -msgid "Sphinx Book Theme" -msgstr "موضوع كتاب أبو الهول" - -msgid "suggest edit" -msgstr "أقترح تحرير" - -msgid "Open an issue" -msgstr "افتح قضية" - -msgid "Launch" -msgstr "إطلاق" - -msgid "Fullscreen mode" -msgstr "وضع ملء الشاشة" - -msgid "Edit this page" -msgstr "قم بتحرير هذه الصفحة" - -msgid "By the" -msgstr "بواسطة" - -msgid "next page" -msgstr "الصفحة التالية" diff --git a/static/btwallet-api/html/_static/locales/bg/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/bg/LC_MESSAGES/booktheme.mo deleted file mode 100644 index da95120037..0000000000 Binary files a/static/btwallet-api/html/_static/locales/bg/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/bg/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/bg/LC_MESSAGES/booktheme.po deleted file mode 100644 index 7420c19eb0..0000000000 --- a/static/btwallet-api/html/_static/locales/bg/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "Печат в PDF" - -msgid "Theme by the" -msgstr "Тема от" - -msgid "Download source file" -msgstr "Изтеглете изходния файл" - -msgid "open issue" -msgstr "отворен брой" - -msgid "Contents" -msgstr "Съдържание" - -msgid "previous page" -msgstr "предишна страница" - -msgid "Download notebook file" -msgstr "Изтеглете файла на бележника" - -msgid "Copyright" -msgstr "Авторско право" - -msgid "Download this page" -msgstr "Изтеглете тази страница" - -msgid "Source repository" -msgstr "Хранилище на източника" - -msgid "By" -msgstr "От" - -msgid "repository" -msgstr "хранилище" - -msgid "Last updated on" -msgstr "Последна актуализация на" - -msgid "Toggle navigation" -msgstr "Превключване на навигацията" - -msgid "Sphinx Book Theme" -msgstr "Тема на книгата Sphinx" - -msgid "suggest edit" -msgstr "предложи редактиране" - -msgid "Open an issue" -msgstr "Отворете проблем" - -msgid "Launch" -msgstr "Стартиране" - -msgid "Fullscreen mode" -msgstr "Режим на цял екран" - -msgid "Edit this page" -msgstr "Редактирайте тази страница" - -msgid "By the" -msgstr "По" - -msgid "next page" -msgstr "Следваща страница" diff --git a/static/btwallet-api/html/_static/locales/bn/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/bn/LC_MESSAGES/booktheme.mo deleted file mode 100644 index 6b96639b72..0000000000 Binary files a/static/btwallet-api/html/_static/locales/bn/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/bn/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/bn/LC_MESSAGES/booktheme.po deleted file mode 100644 index 63a07c3627..0000000000 --- a/static/btwallet-api/html/_static/locales/bn/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,63 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: bn\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "পিডিএফ প্রিন্ট করুন" - -msgid "Theme by the" -msgstr "থিম দ্বারা" - -msgid "Download source file" -msgstr "উত্স ফাইল ডাউনলোড করুন" - -msgid "open issue" -msgstr "খোলা সমস্যা" - -msgid "previous page" -msgstr "আগের পৃষ্ঠা" - -msgid "Download notebook file" -msgstr "নোটবুক ফাইল ডাউনলোড করুন" - -msgid "Copyright" -msgstr "কপিরাইট" - -msgid "Download this page" -msgstr "এই পৃষ্ঠাটি ডাউনলোড করুন" - -msgid "Source repository" -msgstr "উত্স সংগ্রহস্থল" - -msgid "By" -msgstr "দ্বারা" - -msgid "Last updated on" -msgstr "সর্বশেষ আপডেট" - -msgid "Toggle navigation" -msgstr "নেভিগেশন টগল করুন" - -msgid "Sphinx Book Theme" -msgstr "স্পিনিক্স বুক থিম" - -msgid "Open an issue" -msgstr "একটি সমস্যা খুলুন" - -msgid "Launch" -msgstr "শুরু করা" - -msgid "Edit this page" -msgstr "এই পৃষ্ঠাটি সম্পাদনা করুন" - -msgid "By the" -msgstr "দ্বারা" - -msgid "next page" -msgstr "পরবর্তী পৃষ্ঠা" diff --git a/static/btwallet-api/html/_static/locales/ca/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/ca/LC_MESSAGES/booktheme.mo deleted file mode 100644 index a4dd30e9bd..0000000000 Binary files a/static/btwallet-api/html/_static/locales/ca/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/ca/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/ca/LC_MESSAGES/booktheme.po deleted file mode 100644 index 8fb358bf1d..0000000000 --- a/static/btwallet-api/html/_static/locales/ca/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,66 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ca\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "Imprimeix a PDF" - -msgid "Theme by the" -msgstr "Tema del" - -msgid "Download source file" -msgstr "Baixeu el fitxer font" - -msgid "open issue" -msgstr "número obert" - -msgid "previous page" -msgstr "Pàgina anterior" - -msgid "Download notebook file" -msgstr "Descarregar fitxer de quadern" - -msgid "Copyright" -msgstr "Copyright" - -msgid "Download this page" -msgstr "Descarregueu aquesta pàgina" - -msgid "Source repository" -msgstr "Dipòsit de fonts" - -msgid "By" -msgstr "Per" - -msgid "Last updated on" -msgstr "Darrera actualització el" - -msgid "Toggle navigation" -msgstr "Commuta la navegació" - -msgid "Sphinx Book Theme" -msgstr "Tema del llibre Esfinx" - -msgid "suggest edit" -msgstr "suggerir edició" - -msgid "Open an issue" -msgstr "Obriu un número" - -msgid "Launch" -msgstr "Llançament" - -msgid "Edit this page" -msgstr "Editeu aquesta pàgina" - -msgid "By the" -msgstr "Per la" - -msgid "next page" -msgstr "pàgina següent" diff --git a/static/btwallet-api/html/_static/locales/cs/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/cs/LC_MESSAGES/booktheme.mo deleted file mode 100644 index c39e01a6ae..0000000000 Binary files a/static/btwallet-api/html/_static/locales/cs/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/cs/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/cs/LC_MESSAGES/booktheme.po deleted file mode 100644 index c6ef469082..0000000000 --- a/static/btwallet-api/html/_static/locales/cs/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: cs\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "Tisk do PDF" - -msgid "Theme by the" -msgstr "Téma od" - -msgid "Download source file" -msgstr "Stáhněte si zdrojový soubor" - -msgid "open issue" -msgstr "otevřené číslo" - -msgid "Contents" -msgstr "Obsah" - -msgid "previous page" -msgstr "předchozí stránka" - -msgid "Download notebook file" -msgstr "Stáhnout soubor poznámkového bloku" - -msgid "Copyright" -msgstr "autorská práva" - -msgid "Download this page" -msgstr "Stáhněte si tuto stránku" - -msgid "Source repository" -msgstr "Zdrojové úložiště" - -msgid "By" -msgstr "Podle" - -msgid "repository" -msgstr "úložiště" - -msgid "Last updated on" -msgstr "Naposledy aktualizováno" - -msgid "Toggle navigation" -msgstr "Přepnout navigaci" - -msgid "Sphinx Book Theme" -msgstr "Téma knihy Sfinga" - -msgid "suggest edit" -msgstr "navrhnout úpravy" - -msgid "Open an issue" -msgstr "Otevřete problém" - -msgid "Launch" -msgstr "Zahájení" - -msgid "Fullscreen mode" -msgstr "Režim celé obrazovky" - -msgid "Edit this page" -msgstr "Upravit tuto stránku" - -msgid "By the" -msgstr "Podle" - -msgid "next page" -msgstr "další strana" diff --git a/static/btwallet-api/html/_static/locales/da/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/da/LC_MESSAGES/booktheme.mo deleted file mode 100644 index f43157d70c..0000000000 Binary files a/static/btwallet-api/html/_static/locales/da/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/da/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/da/LC_MESSAGES/booktheme.po deleted file mode 100644 index 306a38e52d..0000000000 --- a/static/btwallet-api/html/_static/locales/da/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: da\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "Udskriv til PDF" - -msgid "Theme by the" -msgstr "Tema af" - -msgid "Download source file" -msgstr "Download kildefil" - -msgid "open issue" -msgstr "åbent nummer" - -msgid "Contents" -msgstr "Indhold" - -msgid "previous page" -msgstr "forrige side" - -msgid "Download notebook file" -msgstr "Download notesbog-fil" - -msgid "Copyright" -msgstr "ophavsret" - -msgid "Download this page" -msgstr "Download denne side" - -msgid "Source repository" -msgstr "Kildelager" - -msgid "By" -msgstr "Ved" - -msgid "repository" -msgstr "lager" - -msgid "Last updated on" -msgstr "Sidst opdateret den" - -msgid "Toggle navigation" -msgstr "Skift navigation" - -msgid "Sphinx Book Theme" -msgstr "Sphinx bogtema" - -msgid "suggest edit" -msgstr "foreslå redigering" - -msgid "Open an issue" -msgstr "Åbn et problem" - -msgid "Launch" -msgstr "Start" - -msgid "Fullscreen mode" -msgstr "Fuldskærmstilstand" - -msgid "Edit this page" -msgstr "Rediger denne side" - -msgid "By the" -msgstr "Ved" - -msgid "next page" -msgstr "Næste side" diff --git a/static/btwallet-api/html/_static/locales/de/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/de/LC_MESSAGES/booktheme.mo deleted file mode 100644 index 648b565c78..0000000000 Binary files a/static/btwallet-api/html/_static/locales/de/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/de/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/de/LC_MESSAGES/booktheme.po deleted file mode 100644 index 4925360d43..0000000000 --- a/static/btwallet-api/html/_static/locales/de/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: de\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "In PDF drucken" - -msgid "Theme by the" -msgstr "Thema von der" - -msgid "Download source file" -msgstr "Quelldatei herunterladen" - -msgid "open issue" -msgstr "offenes Thema" - -msgid "Contents" -msgstr "Inhalt" - -msgid "previous page" -msgstr "vorherige Seite" - -msgid "Download notebook file" -msgstr "Notebook-Datei herunterladen" - -msgid "Copyright" -msgstr "Urheberrechte ©" - -msgid "Download this page" -msgstr "Laden Sie diese Seite herunter" - -msgid "Source repository" -msgstr "Quell-Repository" - -msgid "By" -msgstr "Durch" - -msgid "repository" -msgstr "Repository" - -msgid "Last updated on" -msgstr "Zuletzt aktualisiert am" - -msgid "Toggle navigation" -msgstr "Navigation umschalten" - -msgid "Sphinx Book Theme" -msgstr "Sphinx-Buch-Thema" - -msgid "suggest edit" -msgstr "vorschlagen zu bearbeiten" - -msgid "Open an issue" -msgstr "Öffnen Sie ein Problem" - -msgid "Launch" -msgstr "Starten" - -msgid "Fullscreen mode" -msgstr "Vollbildmodus" - -msgid "Edit this page" -msgstr "Bearbeite diese Seite" - -msgid "By the" -msgstr "Bis zum" - -msgid "next page" -msgstr "Nächste Seite" diff --git a/static/btwallet-api/html/_static/locales/el/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/el/LC_MESSAGES/booktheme.mo deleted file mode 100644 index fca6e9355f..0000000000 Binary files a/static/btwallet-api/html/_static/locales/el/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/el/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/el/LC_MESSAGES/booktheme.po deleted file mode 100644 index 3e01acbd9a..0000000000 --- a/static/btwallet-api/html/_static/locales/el/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: el\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "Εκτύπωση σε PDF" - -msgid "Theme by the" -msgstr "Θέμα από το" - -msgid "Download source file" -msgstr "Λήψη αρχείου προέλευσης" - -msgid "open issue" -msgstr "ανοιχτό ζήτημα" - -msgid "Contents" -msgstr "Περιεχόμενα" - -msgid "previous page" -msgstr "προηγούμενη σελίδα" - -msgid "Download notebook file" -msgstr "Λήψη αρχείου σημειωματάριου" - -msgid "Copyright" -msgstr "Πνευματική ιδιοκτησία" - -msgid "Download this page" -msgstr "Λήψη αυτής της σελίδας" - -msgid "Source repository" -msgstr "Αποθήκη πηγής" - -msgid "By" -msgstr "Με" - -msgid "repository" -msgstr "αποθήκη" - -msgid "Last updated on" -msgstr "Τελευταία ενημέρωση στις" - -msgid "Toggle navigation" -msgstr "Εναλλαγή πλοήγησης" - -msgid "Sphinx Book Theme" -msgstr "Θέμα βιβλίου Sphinx" - -msgid "suggest edit" -msgstr "προτείνω επεξεργασία" - -msgid "Open an issue" -msgstr "Ανοίξτε ένα ζήτημα" - -msgid "Launch" -msgstr "Εκτόξευση" - -msgid "Fullscreen mode" -msgstr "ΛΕΙΤΟΥΡΓΙΑ ΠΛΗΡΟΥΣ ΟΘΟΝΗΣ" - -msgid "Edit this page" -msgstr "Επεξεργαστείτε αυτήν τη σελίδα" - -msgid "By the" -msgstr "Από το" - -msgid "next page" -msgstr "επόμενη σελίδα" diff --git a/static/btwallet-api/html/_static/locales/eo/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/eo/LC_MESSAGES/booktheme.mo deleted file mode 100644 index d1072bbec6..0000000000 Binary files a/static/btwallet-api/html/_static/locales/eo/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/eo/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/eo/LC_MESSAGES/booktheme.po deleted file mode 100644 index f7ed2262d1..0000000000 --- a/static/btwallet-api/html/_static/locales/eo/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: eo\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "Presi al PDF" - -msgid "Theme by the" -msgstr "Temo de la" - -msgid "Download source file" -msgstr "Elŝutu fontodosieron" - -msgid "open issue" -msgstr "malferma numero" - -msgid "Contents" -msgstr "Enhavo" - -msgid "previous page" -msgstr "antaŭa paĝo" - -msgid "Download notebook file" -msgstr "Elŝutu kajeran dosieron" - -msgid "Copyright" -msgstr "Kopirajto" - -msgid "Download this page" -msgstr "Elŝutu ĉi tiun paĝon" - -msgid "Source repository" -msgstr "Fonto-deponejo" - -msgid "By" -msgstr "De" - -msgid "repository" -msgstr "deponejo" - -msgid "Last updated on" -msgstr "Laste ĝisdatigita la" - -msgid "Toggle navigation" -msgstr "Ŝalti navigadon" - -msgid "Sphinx Book Theme" -msgstr "Sfinksa Libro-Temo" - -msgid "suggest edit" -msgstr "sugesti redaktadon" - -msgid "Open an issue" -msgstr "Malfermu numeron" - -msgid "Launch" -msgstr "Lanĉo" - -msgid "Fullscreen mode" -msgstr "Plenekrana reĝimo" - -msgid "Edit this page" -msgstr "Redaktu ĉi tiun paĝon" - -msgid "By the" -msgstr "Per la" - -msgid "next page" -msgstr "sekva paĝo" diff --git a/static/btwallet-api/html/_static/locales/es/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/es/LC_MESSAGES/booktheme.mo deleted file mode 100644 index ba2ee4dc22..0000000000 Binary files a/static/btwallet-api/html/_static/locales/es/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/es/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/es/LC_MESSAGES/booktheme.po deleted file mode 100644 index 5e0029e5f7..0000000000 --- a/static/btwallet-api/html/_static/locales/es/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: es\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "Imprimir en PDF" - -msgid "Theme by the" -msgstr "Tema por el" - -msgid "Download source file" -msgstr "Descargar archivo fuente" - -msgid "open issue" -msgstr "Tema abierto" - -msgid "Contents" -msgstr "Contenido" - -msgid "previous page" -msgstr "pagina anterior" - -msgid "Download notebook file" -msgstr "Descargar archivo de cuaderno" - -msgid "Copyright" -msgstr "Derechos de autor" - -msgid "Download this page" -msgstr "Descarga esta pagina" - -msgid "Source repository" -msgstr "Repositorio de origen" - -msgid "By" -msgstr "Por" - -msgid "repository" -msgstr "repositorio" - -msgid "Last updated on" -msgstr "Ultima actualización en" - -msgid "Toggle navigation" -msgstr "Navegación de palanca" - -msgid "Sphinx Book Theme" -msgstr "Tema del libro de la esfinge" - -msgid "suggest edit" -msgstr "sugerir editar" - -msgid "Open an issue" -msgstr "Abrir un problema" - -msgid "Launch" -msgstr "Lanzamiento" - -msgid "Fullscreen mode" -msgstr "Modo de pantalla completa" - -msgid "Edit this page" -msgstr "Edita esta página" - -msgid "By the" -msgstr "Por el" - -msgid "next page" -msgstr "siguiente página" diff --git a/static/btwallet-api/html/_static/locales/et/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/et/LC_MESSAGES/booktheme.mo deleted file mode 100644 index 983b82391f..0000000000 Binary files a/static/btwallet-api/html/_static/locales/et/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/et/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/et/LC_MESSAGES/booktheme.po deleted file mode 100644 index 8680982a97..0000000000 --- a/static/btwallet-api/html/_static/locales/et/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: et\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "Prindi PDF-i" - -msgid "Theme by the" -msgstr "Teema" - -msgid "Download source file" -msgstr "Laadige alla lähtefail" - -msgid "open issue" -msgstr "avatud küsimus" - -msgid "Contents" -msgstr "Sisu" - -msgid "previous page" -msgstr "eelmine leht" - -msgid "Download notebook file" -msgstr "Laadige sülearvuti fail alla" - -msgid "Copyright" -msgstr "Autoriõigus" - -msgid "Download this page" -msgstr "Laadige see leht alla" - -msgid "Source repository" -msgstr "Allikahoidla" - -msgid "By" -msgstr "Kõrval" - -msgid "repository" -msgstr "hoidla" - -msgid "Last updated on" -msgstr "Viimati uuendatud" - -msgid "Toggle navigation" -msgstr "Lülita navigeerimine sisse" - -msgid "Sphinx Book Theme" -msgstr "Sfinksiraamatu teema" - -msgid "suggest edit" -msgstr "soovita muuta" - -msgid "Open an issue" -msgstr "Avage probleem" - -msgid "Launch" -msgstr "Käivitage" - -msgid "Fullscreen mode" -msgstr "Täisekraanirežiim" - -msgid "Edit this page" -msgstr "Muutke seda lehte" - -msgid "By the" -msgstr "Autor" - -msgid "next page" -msgstr "järgmine leht" diff --git a/static/btwallet-api/html/_static/locales/fi/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/fi/LC_MESSAGES/booktheme.mo deleted file mode 100644 index d8ac054597..0000000000 Binary files a/static/btwallet-api/html/_static/locales/fi/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/fi/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/fi/LC_MESSAGES/booktheme.po deleted file mode 100644 index 34dac21839..0000000000 --- a/static/btwallet-api/html/_static/locales/fi/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "Tulosta PDF-tiedostoon" - -msgid "Theme by the" -msgstr "Teeman tekijä" - -msgid "Download source file" -msgstr "Lataa lähdetiedosto" - -msgid "open issue" -msgstr "avoin ongelma" - -msgid "Contents" -msgstr "Sisällys" - -msgid "previous page" -msgstr "Edellinen sivu" - -msgid "Download notebook file" -msgstr "Lataa muistikirjatiedosto" - -msgid "Copyright" -msgstr "Tekijänoikeus" - -msgid "Download this page" -msgstr "Lataa tämä sivu" - -msgid "Source repository" -msgstr "Lähteen arkisto" - -msgid "By" -msgstr "Tekijä" - -msgid "repository" -msgstr "arkisto" - -msgid "Last updated on" -msgstr "Viimeksi päivitetty" - -msgid "Toggle navigation" -msgstr "Vaihda navigointia" - -msgid "Sphinx Book Theme" -msgstr "Sphinx-kirjan teema" - -msgid "suggest edit" -msgstr "ehdottaa muokkausta" - -msgid "Open an issue" -msgstr "Avaa ongelma" - -msgid "Launch" -msgstr "Tuoda markkinoille" - -msgid "Fullscreen mode" -msgstr "Koko näytön tila" - -msgid "Edit this page" -msgstr "Muokkaa tätä sivua" - -msgid "By the" -msgstr "Mukaan" - -msgid "next page" -msgstr "seuraava sivu" diff --git a/static/btwallet-api/html/_static/locales/fr/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/fr/LC_MESSAGES/booktheme.mo deleted file mode 100644 index f663d39f0f..0000000000 Binary files a/static/btwallet-api/html/_static/locales/fr/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/fr/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/fr/LC_MESSAGES/booktheme.po deleted file mode 100644 index 8991a1b87b..0000000000 --- a/static/btwallet-api/html/_static/locales/fr/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: fr\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "Imprimer au format PDF" - -msgid "Theme by the" -msgstr "Thème par le" - -msgid "Download source file" -msgstr "Télécharger le fichier source" - -msgid "open issue" -msgstr "signaler un problème" - -msgid "Contents" -msgstr "Contenu" - -msgid "previous page" -msgstr "page précédente" - -msgid "Download notebook file" -msgstr "Télécharger le fichier notebook" - -msgid "Copyright" -msgstr "droits d'auteur" - -msgid "Download this page" -msgstr "Téléchargez cette page" - -msgid "Source repository" -msgstr "Dépôt source" - -msgid "By" -msgstr "Par" - -msgid "repository" -msgstr "dépôt" - -msgid "Last updated on" -msgstr "Dernière mise à jour le" - -msgid "Toggle navigation" -msgstr "Basculer la navigation" - -msgid "Sphinx Book Theme" -msgstr "Thème du livre Sphinx" - -msgid "suggest edit" -msgstr "suggestion de modification" - -msgid "Open an issue" -msgstr "Ouvrez un problème" - -msgid "Launch" -msgstr "lancement" - -msgid "Fullscreen mode" -msgstr "Mode plein écran" - -msgid "Edit this page" -msgstr "Modifier cette page" - -msgid "By the" -msgstr "Par le" - -msgid "next page" -msgstr "page suivante" diff --git a/static/btwallet-api/html/_static/locales/hr/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/hr/LC_MESSAGES/booktheme.mo deleted file mode 100644 index eca4a1a284..0000000000 Binary files a/static/btwallet-api/html/_static/locales/hr/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/hr/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/hr/LC_MESSAGES/booktheme.po deleted file mode 100644 index 42c4233d07..0000000000 --- a/static/btwallet-api/html/_static/locales/hr/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: hr\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "Ispis u PDF" - -msgid "Theme by the" -msgstr "Tema autora" - -msgid "Download source file" -msgstr "Preuzmi izvornu datoteku" - -msgid "open issue" -msgstr "otvoreno izdanje" - -msgid "Contents" -msgstr "Sadržaj" - -msgid "previous page" -msgstr "Prethodna stranica" - -msgid "Download notebook file" -msgstr "Preuzmi datoteku bilježnice" - -msgid "Copyright" -msgstr "Autorska prava" - -msgid "Download this page" -msgstr "Preuzmite ovu stranicu" - -msgid "Source repository" -msgstr "Izvorno spremište" - -msgid "By" -msgstr "Po" - -msgid "repository" -msgstr "spremište" - -msgid "Last updated on" -msgstr "Posljednje ažuriranje:" - -msgid "Toggle navigation" -msgstr "Uključi / isključi navigaciju" - -msgid "Sphinx Book Theme" -msgstr "Tema knjige Sphinx" - -msgid "suggest edit" -msgstr "predloži uređivanje" - -msgid "Open an issue" -msgstr "Otvorite izdanje" - -msgid "Launch" -msgstr "Pokrenite" - -msgid "Fullscreen mode" -msgstr "Način preko cijelog zaslona" - -msgid "Edit this page" -msgstr "Uredite ovu stranicu" - -msgid "By the" -msgstr "Od strane" - -msgid "next page" -msgstr "sljedeća stranica" diff --git a/static/btwallet-api/html/_static/locales/id/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/id/LC_MESSAGES/booktheme.mo deleted file mode 100644 index d07a06a9d2..0000000000 Binary files a/static/btwallet-api/html/_static/locales/id/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/id/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/id/LC_MESSAGES/booktheme.po deleted file mode 100644 index b8d8d898ee..0000000000 --- a/static/btwallet-api/html/_static/locales/id/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: id\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "Cetak ke PDF" - -msgid "Theme by the" -msgstr "Tema oleh" - -msgid "Download source file" -msgstr "Unduh file sumber" - -msgid "open issue" -msgstr "masalah terbuka" - -msgid "Contents" -msgstr "Isi" - -msgid "previous page" -msgstr "halaman sebelumnya" - -msgid "Download notebook file" -msgstr "Unduh file notebook" - -msgid "Copyright" -msgstr "hak cipta" - -msgid "Download this page" -msgstr "Unduh halaman ini" - -msgid "Source repository" -msgstr "Repositori sumber" - -msgid "By" -msgstr "Oleh" - -msgid "repository" -msgstr "gudang" - -msgid "Last updated on" -msgstr "Terakhir diperbarui saat" - -msgid "Toggle navigation" -msgstr "Alihkan navigasi" - -msgid "Sphinx Book Theme" -msgstr "Tema Buku Sphinx" - -msgid "suggest edit" -msgstr "menyarankan edit" - -msgid "Open an issue" -msgstr "Buka masalah" - -msgid "Launch" -msgstr "Meluncurkan" - -msgid "Fullscreen mode" -msgstr "Mode layar penuh" - -msgid "Edit this page" -msgstr "Edit halaman ini" - -msgid "By the" -msgstr "Oleh" - -msgid "next page" -msgstr "halaman selanjutnya" diff --git a/static/btwallet-api/html/_static/locales/it/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/it/LC_MESSAGES/booktheme.mo deleted file mode 100644 index 53ba476edd..0000000000 Binary files a/static/btwallet-api/html/_static/locales/it/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/it/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/it/LC_MESSAGES/booktheme.po deleted file mode 100644 index 36fca59f88..0000000000 --- a/static/btwallet-api/html/_static/locales/it/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: it\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "Stampa in PDF" - -msgid "Theme by the" -msgstr "Tema di" - -msgid "Download source file" -msgstr "Scarica il file sorgente" - -msgid "open issue" -msgstr "questione aperta" - -msgid "Contents" -msgstr "Contenuti" - -msgid "previous page" -msgstr "pagina precedente" - -msgid "Download notebook file" -msgstr "Scarica il file del taccuino" - -msgid "Copyright" -msgstr "Diritto d'autore" - -msgid "Download this page" -msgstr "Scarica questa pagina" - -msgid "Source repository" -msgstr "Repository di origine" - -msgid "By" -msgstr "Di" - -msgid "repository" -msgstr "repository" - -msgid "Last updated on" -msgstr "Ultimo aggiornamento il" - -msgid "Toggle navigation" -msgstr "Attiva / disattiva la navigazione" - -msgid "Sphinx Book Theme" -msgstr "Tema del libro della Sfinge" - -msgid "suggest edit" -msgstr "suggerisci modifica" - -msgid "Open an issue" -msgstr "Apri un problema" - -msgid "Launch" -msgstr "Lanciare" - -msgid "Fullscreen mode" -msgstr "Modalità schermo intero" - -msgid "Edit this page" -msgstr "Modifica questa pagina" - -msgid "By the" -msgstr "Dal" - -msgid "next page" -msgstr "pagina successiva" diff --git a/static/btwallet-api/html/_static/locales/iw/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/iw/LC_MESSAGES/booktheme.mo deleted file mode 100644 index a45c6575e4..0000000000 Binary files a/static/btwallet-api/html/_static/locales/iw/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/iw/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/iw/LC_MESSAGES/booktheme.po deleted file mode 100644 index dede9cb086..0000000000 --- a/static/btwallet-api/html/_static/locales/iw/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: iw\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "הדפס לקובץ PDF" - -msgid "Theme by the" -msgstr "נושא מאת" - -msgid "Download source file" -msgstr "הורד את קובץ המקור" - -msgid "open issue" -msgstr "בעיה פתוחה" - -msgid "Contents" -msgstr "תוכן" - -msgid "previous page" -msgstr "עמוד קודם" - -msgid "Download notebook file" -msgstr "הורד קובץ מחברת" - -msgid "Copyright" -msgstr "זכויות יוצרים" - -msgid "Download this page" -msgstr "הורד דף זה" - -msgid "Source repository" -msgstr "מאגר המקורות" - -msgid "By" -msgstr "על ידי" - -msgid "repository" -msgstr "מאגר" - -msgid "Last updated on" -msgstr "עודכן לאחרונה ב" - -msgid "Toggle navigation" -msgstr "החלף ניווט" - -msgid "Sphinx Book Theme" -msgstr "נושא ספר ספינקס" - -msgid "suggest edit" -msgstr "מציע לערוך" - -msgid "Open an issue" -msgstr "פתח גיליון" - -msgid "Launch" -msgstr "לְהַשִׁיק" - -msgid "Fullscreen mode" -msgstr "מצב מסך מלא" - -msgid "Edit this page" -msgstr "ערוך דף זה" - -msgid "By the" -msgstr "דרך" - -msgid "next page" -msgstr "עמוד הבא" diff --git a/static/btwallet-api/html/_static/locales/ja/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/ja/LC_MESSAGES/booktheme.mo deleted file mode 100644 index 1cefd29ce3..0000000000 Binary files a/static/btwallet-api/html/_static/locales/ja/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/ja/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/ja/LC_MESSAGES/booktheme.po deleted file mode 100644 index 2615f0d874..0000000000 --- a/static/btwallet-api/html/_static/locales/ja/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ja\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "PDFに印刷" - -msgid "Theme by the" -msgstr "のテーマ" - -msgid "Download source file" -msgstr "ソースファイルをダウンロード" - -msgid "open issue" -msgstr "未解決の問題" - -msgid "Contents" -msgstr "目次" - -msgid "previous page" -msgstr "前のページ" - -msgid "Download notebook file" -msgstr "ノートブックファイルをダウンロード" - -msgid "Copyright" -msgstr "Copyright" - -msgid "Download this page" -msgstr "このページをダウンロード" - -msgid "Source repository" -msgstr "ソースリポジトリ" - -msgid "By" -msgstr "著者" - -msgid "repository" -msgstr "リポジトリ" - -msgid "Last updated on" -msgstr "最終更新日" - -msgid "Toggle navigation" -msgstr "ナビゲーションを切り替え" - -msgid "Sphinx Book Theme" -msgstr "スフィンクスの本のテーマ" - -msgid "suggest edit" -msgstr "編集を提案する" - -msgid "Open an issue" -msgstr "問題を報告" - -msgid "Launch" -msgstr "起動" - -msgid "Fullscreen mode" -msgstr "全画面モード" - -msgid "Edit this page" -msgstr "このページを編集" - -msgid "By the" -msgstr "によって" - -msgid "next page" -msgstr "次のページ" diff --git a/static/btwallet-api/html/_static/locales/ko/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/ko/LC_MESSAGES/booktheme.mo deleted file mode 100644 index 06c7ec938b..0000000000 Binary files a/static/btwallet-api/html/_static/locales/ko/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/ko/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/ko/LC_MESSAGES/booktheme.po deleted file mode 100644 index c9e13a427b..0000000000 --- a/static/btwallet-api/html/_static/locales/ko/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ko\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "PDF로 인쇄" - -msgid "Theme by the" -msgstr "테마별" - -msgid "Download source file" -msgstr "소스 파일 다운로드" - -msgid "open issue" -msgstr "열린 문제" - -msgid "Contents" -msgstr "내용" - -msgid "previous page" -msgstr "이전 페이지" - -msgid "Download notebook file" -msgstr "노트북 파일 다운로드" - -msgid "Copyright" -msgstr "저작권" - -msgid "Download this page" -msgstr "이 페이지 다운로드" - -msgid "Source repository" -msgstr "소스 저장소" - -msgid "By" -msgstr "으로" - -msgid "repository" -msgstr "저장소" - -msgid "Last updated on" -msgstr "마지막 업데이트" - -msgid "Toggle navigation" -msgstr "탐색 전환" - -msgid "Sphinx Book Theme" -msgstr "스핑크스 도서 테마" - -msgid "suggest edit" -msgstr "편집 제안" - -msgid "Open an issue" -msgstr "이슈 열기" - -msgid "Launch" -msgstr "시작하다" - -msgid "Fullscreen mode" -msgstr "전체 화면으로보기" - -msgid "Edit this page" -msgstr "이 페이지 편집" - -msgid "By the" -msgstr "에 의해" - -msgid "next page" -msgstr "다음 페이지" diff --git a/static/btwallet-api/html/_static/locales/lt/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/lt/LC_MESSAGES/booktheme.mo deleted file mode 100644 index 4468ba04bc..0000000000 Binary files a/static/btwallet-api/html/_static/locales/lt/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/lt/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/lt/LC_MESSAGES/booktheme.po deleted file mode 100644 index 35eabd955f..0000000000 --- a/static/btwallet-api/html/_static/locales/lt/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lt\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "Spausdinti į PDF" - -msgid "Theme by the" -msgstr "Tema" - -msgid "Download source file" -msgstr "Atsisiųsti šaltinio failą" - -msgid "open issue" -msgstr "atviras klausimas" - -msgid "Contents" -msgstr "Turinys" - -msgid "previous page" -msgstr "Ankstesnis puslapis" - -msgid "Download notebook file" -msgstr "Atsisiųsti nešiojamojo kompiuterio failą" - -msgid "Copyright" -msgstr "Autorių teisės" - -msgid "Download this page" -msgstr "Atsisiųskite šį puslapį" - -msgid "Source repository" -msgstr "Šaltinio saugykla" - -msgid "By" -msgstr "Iki" - -msgid "repository" -msgstr "saugykla" - -msgid "Last updated on" -msgstr "Paskutinį kartą atnaujinta" - -msgid "Toggle navigation" -msgstr "Perjungti naršymą" - -msgid "Sphinx Book Theme" -msgstr "Sfinkso knygos tema" - -msgid "suggest edit" -msgstr "pasiūlyti redaguoti" - -msgid "Open an issue" -msgstr "Atidarykite problemą" - -msgid "Launch" -msgstr "Paleiskite" - -msgid "Fullscreen mode" -msgstr "Pilno ekrano režimas" - -msgid "Edit this page" -msgstr "Redaguoti šį puslapį" - -msgid "By the" -msgstr "Prie" - -msgid "next page" -msgstr "Kitas puslapis" diff --git a/static/btwallet-api/html/_static/locales/lv/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/lv/LC_MESSAGES/booktheme.mo deleted file mode 100644 index 74aa4d8985..0000000000 Binary files a/static/btwallet-api/html/_static/locales/lv/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/lv/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/lv/LC_MESSAGES/booktheme.po deleted file mode 100644 index ee1bd08dfe..0000000000 --- a/static/btwallet-api/html/_static/locales/lv/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: lv\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "Drukāt PDF formātā" - -msgid "Theme by the" -msgstr "Autora tēma" - -msgid "Download source file" -msgstr "Lejupielādēt avota failu" - -msgid "open issue" -msgstr "atklāts jautājums" - -msgid "Contents" -msgstr "Saturs" - -msgid "previous page" -msgstr "iepriekšējā lapa" - -msgid "Download notebook file" -msgstr "Lejupielādēt piezīmju grāmatiņu" - -msgid "Copyright" -msgstr "Autortiesības" - -msgid "Download this page" -msgstr "Lejupielādējiet šo lapu" - -msgid "Source repository" -msgstr "Avota krātuve" - -msgid "By" -msgstr "Autors" - -msgid "repository" -msgstr "krātuve" - -msgid "Last updated on" -msgstr "Pēdējoreiz atjaunināts" - -msgid "Toggle navigation" -msgstr "Pārslēgt navigāciju" - -msgid "Sphinx Book Theme" -msgstr "Sfinksa grāmatas tēma" - -msgid "suggest edit" -msgstr "ieteikt rediģēt" - -msgid "Open an issue" -msgstr "Atveriet problēmu" - -msgid "Launch" -msgstr "Uzsākt" - -msgid "Fullscreen mode" -msgstr "Pilnekrāna režīms" - -msgid "Edit this page" -msgstr "Rediģēt šo lapu" - -msgid "By the" -msgstr "Ar" - -msgid "next page" -msgstr "nākamā lapaspuse" diff --git a/static/btwallet-api/html/_static/locales/ml/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/ml/LC_MESSAGES/booktheme.mo deleted file mode 100644 index 2736e8fcf6..0000000000 Binary files a/static/btwallet-api/html/_static/locales/ml/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/ml/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/ml/LC_MESSAGES/booktheme.po deleted file mode 100644 index d471277d60..0000000000 --- a/static/btwallet-api/html/_static/locales/ml/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,66 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ml\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "PDF- ലേക്ക് പ്രിന്റുചെയ്യുക" - -msgid "Theme by the" -msgstr "പ്രമേയം" - -msgid "Download source file" -msgstr "ഉറവിട ഫയൽ ഡൗൺലോഡുചെയ്യുക" - -msgid "open issue" -msgstr "തുറന്ന പ്രശ്നം" - -msgid "previous page" -msgstr "മുൻപത്തെ താൾ" - -msgid "Download notebook file" -msgstr "നോട്ട്ബുക്ക് ഫയൽ ഡൺലോഡ് ചെയ്യുക" - -msgid "Copyright" -msgstr "പകർപ്പവകാശം" - -msgid "Download this page" -msgstr "ഈ പേജ് ഡൗൺലോഡുചെയ്യുക" - -msgid "Source repository" -msgstr "ഉറവിട ശേഖരം" - -msgid "By" -msgstr "എഴുതിയത്" - -msgid "Last updated on" -msgstr "അവസാനം അപ്‌ഡേറ്റുചെയ്‌തത്" - -msgid "Toggle navigation" -msgstr "നാവിഗേഷൻ ടോഗിൾ ചെയ്യുക" - -msgid "Sphinx Book Theme" -msgstr "സ്ഫിങ്ക്സ് പുസ്തക തീം" - -msgid "suggest edit" -msgstr "എഡിറ്റുചെയ്യാൻ നിർദ്ദേശിക്കുക" - -msgid "Open an issue" -msgstr "ഒരു പ്രശ്നം തുറക്കുക" - -msgid "Launch" -msgstr "സമാരംഭിക്കുക" - -msgid "Edit this page" -msgstr "ഈ പേജ് എഡിറ്റുചെയ്യുക" - -msgid "By the" -msgstr "എഴുതിയത്" - -msgid "next page" -msgstr "അടുത്ത പേജ്" diff --git a/static/btwallet-api/html/_static/locales/mr/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/mr/LC_MESSAGES/booktheme.mo deleted file mode 100644 index fe530100d7..0000000000 Binary files a/static/btwallet-api/html/_static/locales/mr/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/mr/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/mr/LC_MESSAGES/booktheme.po deleted file mode 100644 index f3694acfa5..0000000000 --- a/static/btwallet-api/html/_static/locales/mr/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,66 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: mr\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "पीडीएफवर मुद्रित करा" - -msgid "Theme by the" -msgstr "द्वारा थीम" - -msgid "Download source file" -msgstr "स्त्रोत फाइल डाउनलोड करा" - -msgid "open issue" -msgstr "खुला मुद्दा" - -msgid "previous page" -msgstr "मागील पान" - -msgid "Download notebook file" -msgstr "नोटबुक फाईल डाउनलोड करा" - -msgid "Copyright" -msgstr "कॉपीराइट" - -msgid "Download this page" -msgstr "हे पृष्ठ डाउनलोड करा" - -msgid "Source repository" -msgstr "स्त्रोत भांडार" - -msgid "By" -msgstr "द्वारा" - -msgid "Last updated on" -msgstr "अखेरचे अद्यतनित" - -msgid "Toggle navigation" -msgstr "नेव्हिगेशन टॉगल करा" - -msgid "Sphinx Book Theme" -msgstr "स्फिंक्स बुक थीम" - -msgid "suggest edit" -msgstr "संपादन सुचवा" - -msgid "Open an issue" -msgstr "एक मुद्दा उघडा" - -msgid "Launch" -msgstr "लाँच करा" - -msgid "Edit this page" -msgstr "हे पृष्ठ संपादित करा" - -msgid "By the" -msgstr "द्वारा" - -msgid "next page" -msgstr "पुढील पृष्ठ" diff --git a/static/btwallet-api/html/_static/locales/ms/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/ms/LC_MESSAGES/booktheme.mo deleted file mode 100644 index f02603fa25..0000000000 Binary files a/static/btwallet-api/html/_static/locales/ms/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/ms/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/ms/LC_MESSAGES/booktheme.po deleted file mode 100644 index 65b7c6026a..0000000000 --- a/static/btwallet-api/html/_static/locales/ms/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,66 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ms\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "Cetak ke PDF" - -msgid "Theme by the" -msgstr "Tema oleh" - -msgid "Download source file" -msgstr "Muat turun fail sumber" - -msgid "open issue" -msgstr "isu terbuka" - -msgid "previous page" -msgstr "halaman sebelumnya" - -msgid "Download notebook file" -msgstr "Muat turun fail buku nota" - -msgid "Copyright" -msgstr "hak cipta" - -msgid "Download this page" -msgstr "Muat turun halaman ini" - -msgid "Source repository" -msgstr "Repositori sumber" - -msgid "By" -msgstr "Oleh" - -msgid "Last updated on" -msgstr "Terakhir dikemas kini pada" - -msgid "Toggle navigation" -msgstr "Togol navigasi" - -msgid "Sphinx Book Theme" -msgstr "Tema Buku Sphinx" - -msgid "suggest edit" -msgstr "cadangkan edit" - -msgid "Open an issue" -msgstr "Buka masalah" - -msgid "Launch" -msgstr "Lancarkan" - -msgid "Edit this page" -msgstr "Edit halaman ini" - -msgid "By the" -msgstr "Oleh" - -msgid "next page" -msgstr "muka surat seterusnya" diff --git a/static/btwallet-api/html/_static/locales/nl/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/nl/LC_MESSAGES/booktheme.mo deleted file mode 100644 index e59e7ecb30..0000000000 Binary files a/static/btwallet-api/html/_static/locales/nl/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/nl/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/nl/LC_MESSAGES/booktheme.po deleted file mode 100644 index 71bd1cda70..0000000000 --- a/static/btwallet-api/html/_static/locales/nl/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: nl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "Afdrukken naar pdf" - -msgid "Theme by the" -msgstr "Thema door de" - -msgid "Download source file" -msgstr "Download het bronbestand" - -msgid "open issue" -msgstr "open probleem" - -msgid "Contents" -msgstr "Inhoud" - -msgid "previous page" -msgstr "vorige pagina" - -msgid "Download notebook file" -msgstr "Download notebookbestand" - -msgid "Copyright" -msgstr "auteursrechten" - -msgid "Download this page" -msgstr "Download deze pagina" - -msgid "Source repository" -msgstr "Bronopslagplaats" - -msgid "By" -msgstr "Door" - -msgid "repository" -msgstr "repository" - -msgid "Last updated on" -msgstr "Laatst geupdate op" - -msgid "Toggle navigation" -msgstr "Schakel navigatie" - -msgid "Sphinx Book Theme" -msgstr "Sphinx-boekthema" - -msgid "suggest edit" -msgstr "suggereren bewerken" - -msgid "Open an issue" -msgstr "Open een probleem" - -msgid "Launch" -msgstr "Lancering" - -msgid "Fullscreen mode" -msgstr "Volledig scherm" - -msgid "Edit this page" -msgstr "bewerk deze pagina" - -msgid "By the" -msgstr "Door de" - -msgid "next page" -msgstr "volgende bladzijde" diff --git a/static/btwallet-api/html/_static/locales/no/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/no/LC_MESSAGES/booktheme.mo deleted file mode 100644 index 6cd15c88de..0000000000 Binary files a/static/btwallet-api/html/_static/locales/no/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/no/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/no/LC_MESSAGES/booktheme.po deleted file mode 100644 index b21346a512..0000000000 --- a/static/btwallet-api/html/_static/locales/no/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: no\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "Skriv ut til PDF" - -msgid "Theme by the" -msgstr "Tema av" - -msgid "Download source file" -msgstr "Last ned kildefilen" - -msgid "open issue" -msgstr "åpent nummer" - -msgid "Contents" -msgstr "Innhold" - -msgid "previous page" -msgstr "forrige side" - -msgid "Download notebook file" -msgstr "Last ned notatbokfilen" - -msgid "Copyright" -msgstr "opphavsrett" - -msgid "Download this page" -msgstr "Last ned denne siden" - -msgid "Source repository" -msgstr "Kildedepot" - -msgid "By" -msgstr "Av" - -msgid "repository" -msgstr "oppbevaringssted" - -msgid "Last updated on" -msgstr "Sist oppdatert den" - -msgid "Toggle navigation" -msgstr "Bytt navigasjon" - -msgid "Sphinx Book Theme" -msgstr "Sphinx boktema" - -msgid "suggest edit" -msgstr "foreslå redigering" - -msgid "Open an issue" -msgstr "Åpne et problem" - -msgid "Launch" -msgstr "Start" - -msgid "Fullscreen mode" -msgstr "Fullskjerm-modus" - -msgid "Edit this page" -msgstr "Rediger denne siden" - -msgid "By the" -msgstr "Ved" - -msgid "next page" -msgstr "neste side" diff --git a/static/btwallet-api/html/_static/locales/pl/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/pl/LC_MESSAGES/booktheme.mo deleted file mode 100644 index 9ebb584f77..0000000000 Binary files a/static/btwallet-api/html/_static/locales/pl/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/pl/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/pl/LC_MESSAGES/booktheme.po deleted file mode 100644 index 1b7233f4ff..0000000000 --- a/static/btwallet-api/html/_static/locales/pl/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "Drukuj do PDF" - -msgid "Theme by the" -msgstr "Motyw autorstwa" - -msgid "Download source file" -msgstr "Pobierz plik źródłowy" - -msgid "open issue" -msgstr "otwarty problem" - -msgid "Contents" -msgstr "Zawartość" - -msgid "previous page" -msgstr "Poprzednia strona" - -msgid "Download notebook file" -msgstr "Pobierz plik notatnika" - -msgid "Copyright" -msgstr "prawa autorskie" - -msgid "Download this page" -msgstr "Pobierz tę stronę" - -msgid "Source repository" -msgstr "Repozytorium źródłowe" - -msgid "By" -msgstr "Przez" - -msgid "repository" -msgstr "magazyn" - -msgid "Last updated on" -msgstr "Ostatnia aktualizacja" - -msgid "Toggle navigation" -msgstr "Przełącz nawigację" - -msgid "Sphinx Book Theme" -msgstr "Motyw książki Sphinx" - -msgid "suggest edit" -msgstr "zaproponuj edycję" - -msgid "Open an issue" -msgstr "Otwórz problem" - -msgid "Launch" -msgstr "Uruchomić" - -msgid "Fullscreen mode" -msgstr "Pełny ekran" - -msgid "Edit this page" -msgstr "Edytuj tę strone" - -msgid "By the" -msgstr "Przez" - -msgid "next page" -msgstr "Następna strona" diff --git a/static/btwallet-api/html/_static/locales/pt/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/pt/LC_MESSAGES/booktheme.mo deleted file mode 100644 index d0ddb8728e..0000000000 Binary files a/static/btwallet-api/html/_static/locales/pt/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/pt/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/pt/LC_MESSAGES/booktheme.po deleted file mode 100644 index 1b27314d69..0000000000 --- a/static/btwallet-api/html/_static/locales/pt/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: pt\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "Imprimir em PDF" - -msgid "Theme by the" -msgstr "Tema por" - -msgid "Download source file" -msgstr "Baixar arquivo fonte" - -msgid "open issue" -msgstr "questão aberta" - -msgid "Contents" -msgstr "Conteúdo" - -msgid "previous page" -msgstr "página anterior" - -msgid "Download notebook file" -msgstr "Baixar arquivo de notebook" - -msgid "Copyright" -msgstr "direito autoral" - -msgid "Download this page" -msgstr "Baixe esta página" - -msgid "Source repository" -msgstr "Repositório fonte" - -msgid "By" -msgstr "De" - -msgid "repository" -msgstr "repositório" - -msgid "Last updated on" -msgstr "Última atualização em" - -msgid "Toggle navigation" -msgstr "Alternar de navegação" - -msgid "Sphinx Book Theme" -msgstr "Tema do livro Sphinx" - -msgid "suggest edit" -msgstr "sugerir edição" - -msgid "Open an issue" -msgstr "Abra um problema" - -msgid "Launch" -msgstr "Lançamento" - -msgid "Fullscreen mode" -msgstr "Modo tela cheia" - -msgid "Edit this page" -msgstr "Edite essa página" - -msgid "By the" -msgstr "Pelo" - -msgid "next page" -msgstr "próxima página" diff --git a/static/btwallet-api/html/_static/locales/ro/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/ro/LC_MESSAGES/booktheme.mo deleted file mode 100644 index 3c36ab1df7..0000000000 Binary files a/static/btwallet-api/html/_static/locales/ro/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/ro/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/ro/LC_MESSAGES/booktheme.po deleted file mode 100644 index 1783ad2c4f..0000000000 --- a/static/btwallet-api/html/_static/locales/ro/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ro\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "Imprimați în PDF" - -msgid "Theme by the" -msgstr "Tema de" - -msgid "Download source file" -msgstr "Descărcați fișierul sursă" - -msgid "open issue" -msgstr "problema deschisă" - -msgid "Contents" -msgstr "Cuprins" - -msgid "previous page" -msgstr "pagina anterioară" - -msgid "Download notebook file" -msgstr "Descărcați fișierul notebook" - -msgid "Copyright" -msgstr "Drepturi de autor" - -msgid "Download this page" -msgstr "Descarcă această pagină" - -msgid "Source repository" -msgstr "Depozit sursă" - -msgid "By" -msgstr "De" - -msgid "repository" -msgstr "repertoriu" - -msgid "Last updated on" -msgstr "Ultima actualizare la" - -msgid "Toggle navigation" -msgstr "Comutare navigare" - -msgid "Sphinx Book Theme" -msgstr "Tema Sphinx Book" - -msgid "suggest edit" -msgstr "sugerează editare" - -msgid "Open an issue" -msgstr "Deschideți o problemă" - -msgid "Launch" -msgstr "Lansa" - -msgid "Fullscreen mode" -msgstr "Modul ecran întreg" - -msgid "Edit this page" -msgstr "Editați această pagină" - -msgid "By the" -msgstr "Langa" - -msgid "next page" -msgstr "pagina următoare" diff --git a/static/btwallet-api/html/_static/locales/ru/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/ru/LC_MESSAGES/booktheme.mo deleted file mode 100644 index 6b8ca41f36..0000000000 Binary files a/static/btwallet-api/html/_static/locales/ru/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/ru/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/ru/LC_MESSAGES/booktheme.po deleted file mode 100644 index b1176b7ae7..0000000000 --- a/static/btwallet-api/html/_static/locales/ru/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ru\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "Распечатать в PDF" - -msgid "Theme by the" -msgstr "Тема от" - -msgid "Download source file" -msgstr "Скачать исходный файл" - -msgid "open issue" -msgstr "открытый вопрос" - -msgid "Contents" -msgstr "Содержание" - -msgid "previous page" -msgstr "Предыдущая страница" - -msgid "Download notebook file" -msgstr "Скачать файл записной книжки" - -msgid "Copyright" -msgstr "авторское право" - -msgid "Download this page" -msgstr "Загрузите эту страницу" - -msgid "Source repository" -msgstr "Исходный репозиторий" - -msgid "By" -msgstr "По" - -msgid "repository" -msgstr "хранилище" - -msgid "Last updated on" -msgstr "Последнее обновление" - -msgid "Toggle navigation" -msgstr "Переключить навигацию" - -msgid "Sphinx Book Theme" -msgstr "Тема книги Сфинкс" - -msgid "suggest edit" -msgstr "предложить редактировать" - -msgid "Open an issue" -msgstr "Открыть вопрос" - -msgid "Launch" -msgstr "Запуск" - -msgid "Fullscreen mode" -msgstr "Полноэкранный режим" - -msgid "Edit this page" -msgstr "Редактировать эту страницу" - -msgid "By the" -msgstr "Посредством" - -msgid "next page" -msgstr "Следующая страница" diff --git a/static/btwallet-api/html/_static/locales/sk/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/sk/LC_MESSAGES/booktheme.mo deleted file mode 100644 index 59bd0ddfa3..0000000000 Binary files a/static/btwallet-api/html/_static/locales/sk/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/sk/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/sk/LC_MESSAGES/booktheme.po deleted file mode 100644 index 650128817a..0000000000 --- a/static/btwallet-api/html/_static/locales/sk/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sk\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "Tlač do PDF" - -msgid "Theme by the" -msgstr "Téma od" - -msgid "Download source file" -msgstr "Stiahnite si zdrojový súbor" - -msgid "open issue" -msgstr "otvorené vydanie" - -msgid "Contents" -msgstr "Obsah" - -msgid "previous page" -msgstr "predchádzajúca strana" - -msgid "Download notebook file" -msgstr "Stiahnite si zošit" - -msgid "Copyright" -msgstr "Autorské práva" - -msgid "Download this page" -msgstr "Stiahnite si túto stránku" - -msgid "Source repository" -msgstr "Zdrojové úložisko" - -msgid "By" -msgstr "Autor:" - -msgid "repository" -msgstr "Úložisko" - -msgid "Last updated on" -msgstr "Posledná aktualizácia dňa" - -msgid "Toggle navigation" -msgstr "Prepnúť navigáciu" - -msgid "Sphinx Book Theme" -msgstr "Téma knihy Sfinga" - -msgid "suggest edit" -msgstr "navrhnúť úpravu" - -msgid "Open an issue" -msgstr "Otvorte problém" - -msgid "Launch" -msgstr "Spustiť" - -msgid "Fullscreen mode" -msgstr "Režim celej obrazovky" - -msgid "Edit this page" -msgstr "Upraviť túto stránku" - -msgid "By the" -msgstr "Podľa" - -msgid "next page" -msgstr "ďalšia strana" diff --git a/static/btwallet-api/html/_static/locales/sl/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/sl/LC_MESSAGES/booktheme.mo deleted file mode 100644 index 87bf26de68..0000000000 Binary files a/static/btwallet-api/html/_static/locales/sl/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/sl/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/sl/LC_MESSAGES/booktheme.po deleted file mode 100644 index 3c7e3a8665..0000000000 --- a/static/btwallet-api/html/_static/locales/sl/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "Natisni v PDF" - -msgid "Theme by the" -msgstr "Tema avtorja" - -msgid "Download source file" -msgstr "Prenesite izvorno datoteko" - -msgid "open issue" -msgstr "odprto vprašanje" - -msgid "Contents" -msgstr "Vsebina" - -msgid "previous page" -msgstr "Prejšnja stran" - -msgid "Download notebook file" -msgstr "Prenesite datoteko zvezka" - -msgid "Copyright" -msgstr "avtorske pravice" - -msgid "Download this page" -msgstr "Prenesite to stran" - -msgid "Source repository" -msgstr "Izvorno skladišče" - -msgid "By" -msgstr "Avtor" - -msgid "repository" -msgstr "odlagališče" - -msgid "Last updated on" -msgstr "Nazadnje posodobljeno dne" - -msgid "Toggle navigation" -msgstr "Preklopi navigacijo" - -msgid "Sphinx Book Theme" -msgstr "Tema knjige Sphinx" - -msgid "suggest edit" -msgstr "predlagajte urejanje" - -msgid "Open an issue" -msgstr "Odprite številko" - -msgid "Launch" -msgstr "Kosilo" - -msgid "Fullscreen mode" -msgstr "Celozaslonski način" - -msgid "Edit this page" -msgstr "Uredite to stran" - -msgid "By the" -msgstr "Avtor" - -msgid "next page" -msgstr "Naslednja stran" diff --git a/static/btwallet-api/html/_static/locales/sr/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/sr/LC_MESSAGES/booktheme.mo deleted file mode 100644 index ec740f4852..0000000000 Binary files a/static/btwallet-api/html/_static/locales/sr/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/sr/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/sr/LC_MESSAGES/booktheme.po deleted file mode 100644 index 773b8adae8..0000000000 --- a/static/btwallet-api/html/_static/locales/sr/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sr\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "Испис у ПДФ" - -msgid "Theme by the" -msgstr "Тхеме би" - -msgid "Download source file" -msgstr "Преузми изворну датотеку" - -msgid "open issue" -msgstr "отворено издање" - -msgid "Contents" -msgstr "Садржај" - -msgid "previous page" -msgstr "Претходна страница" - -msgid "Download notebook file" -msgstr "Преузмите датотеку бележнице" - -msgid "Copyright" -msgstr "Ауторско право" - -msgid "Download this page" -msgstr "Преузмите ову страницу" - -msgid "Source repository" -msgstr "Изворно спремиште" - -msgid "By" -msgstr "Од стране" - -msgid "repository" -msgstr "спремиште" - -msgid "Last updated on" -msgstr "Последње ажурирање" - -msgid "Toggle navigation" -msgstr "Укључи / искључи навигацију" - -msgid "Sphinx Book Theme" -msgstr "Тема књиге Спхинк" - -msgid "suggest edit" -msgstr "предложи уређивање" - -msgid "Open an issue" -msgstr "Отворите издање" - -msgid "Launch" -msgstr "Лансирање" - -msgid "Fullscreen mode" -msgstr "Режим целог екрана" - -msgid "Edit this page" -msgstr "Уредите ову страницу" - -msgid "By the" -msgstr "Од" - -msgid "next page" -msgstr "Следећа страна" diff --git a/static/btwallet-api/html/_static/locales/sv/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/sv/LC_MESSAGES/booktheme.mo deleted file mode 100644 index b07dc76ff2..0000000000 Binary files a/static/btwallet-api/html/_static/locales/sv/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/sv/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/sv/LC_MESSAGES/booktheme.po deleted file mode 100644 index bcac54c07b..0000000000 --- a/static/btwallet-api/html/_static/locales/sv/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: sv\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "Skriv ut till PDF" - -msgid "Theme by the" -msgstr "Tema av" - -msgid "Download source file" -msgstr "Ladda ner källfil" - -msgid "open issue" -msgstr "öppna problemrapport" - -msgid "Contents" -msgstr "Innehåll" - -msgid "previous page" -msgstr "föregående sida" - -msgid "Download notebook file" -msgstr "Ladda ner notebook-fil" - -msgid "Copyright" -msgstr "Upphovsrätt" - -msgid "Download this page" -msgstr "Ladda ner den här sidan" - -msgid "Source repository" -msgstr "Källkodsrepositorium" - -msgid "By" -msgstr "Av" - -msgid "repository" -msgstr "repositorium" - -msgid "Last updated on" -msgstr "Senast uppdaterad den" - -msgid "Toggle navigation" -msgstr "Växla navigering" - -msgid "Sphinx Book Theme" -msgstr "Sphinx Boktema" - -msgid "suggest edit" -msgstr "föreslå ändring" - -msgid "Open an issue" -msgstr "Öppna en problemrapport" - -msgid "Launch" -msgstr "Öppna" - -msgid "Fullscreen mode" -msgstr "Fullskärmsläge" - -msgid "Edit this page" -msgstr "Redigera den här sidan" - -msgid "By the" -msgstr "Av den" - -msgid "next page" -msgstr "nästa sida" diff --git a/static/btwallet-api/html/_static/locales/ta/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/ta/LC_MESSAGES/booktheme.mo deleted file mode 100644 index 29f52e1f6f..0000000000 Binary files a/static/btwallet-api/html/_static/locales/ta/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/ta/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/ta/LC_MESSAGES/booktheme.po deleted file mode 100644 index b48bdfaf17..0000000000 --- a/static/btwallet-api/html/_static/locales/ta/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,66 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ta\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "PDF இல் அச்சிடுக" - -msgid "Theme by the" -msgstr "வழங்கிய தீம்" - -msgid "Download source file" -msgstr "மூல கோப்பைப் பதிவிறக்குக" - -msgid "open issue" -msgstr "திறந்த பிரச்சினை" - -msgid "previous page" -msgstr "முந்தைய பக்கம்" - -msgid "Download notebook file" -msgstr "நோட்புக் கோப்பைப் பதிவிறக்கவும்" - -msgid "Copyright" -msgstr "பதிப்புரிமை" - -msgid "Download this page" -msgstr "இந்தப் பக்கத்தைப் பதிவிறக்கவும்" - -msgid "Source repository" -msgstr "மூல களஞ்சியம்" - -msgid "By" -msgstr "வழங்கியவர்" - -msgid "Last updated on" -msgstr "கடைசியாக புதுப்பிக்கப்பட்டது" - -msgid "Toggle navigation" -msgstr "வழிசெலுத்தலை நிலைமாற்று" - -msgid "Sphinx Book Theme" -msgstr "ஸ்பிங்க்ஸ் புத்தக தீம்" - -msgid "suggest edit" -msgstr "திருத்த பரிந்துரைக்கவும்" - -msgid "Open an issue" -msgstr "சிக்கலைத் திறக்கவும்" - -msgid "Launch" -msgstr "தொடங்க" - -msgid "Edit this page" -msgstr "இந்தப் பக்கத்தைத் திருத்தவும்" - -msgid "By the" -msgstr "மூலம்" - -msgid "next page" -msgstr "அடுத்த பக்கம்" diff --git a/static/btwallet-api/html/_static/locales/te/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/te/LC_MESSAGES/booktheme.mo deleted file mode 100644 index 0a5f4b46ad..0000000000 Binary files a/static/btwallet-api/html/_static/locales/te/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/te/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/te/LC_MESSAGES/booktheme.po deleted file mode 100644 index 952278f5f7..0000000000 --- a/static/btwallet-api/html/_static/locales/te/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,66 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: te\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "PDF కి ముద్రించండి" - -msgid "Theme by the" -msgstr "ద్వారా థీమ్" - -msgid "Download source file" -msgstr "మూల ఫైల్‌ను డౌన్‌లోడ్ చేయండి" - -msgid "open issue" -msgstr "ఓపెన్ ఇష్యూ" - -msgid "previous page" -msgstr "ముందు పేజి" - -msgid "Download notebook file" -msgstr "నోట్బుక్ ఫైల్ను డౌన్లోడ్ చేయండి" - -msgid "Copyright" -msgstr "కాపీరైట్" - -msgid "Download this page" -msgstr "ఈ పేజీని డౌన్‌లోడ్ చేయండి" - -msgid "Source repository" -msgstr "మూల రిపోజిటరీ" - -msgid "By" -msgstr "ద్వారా" - -msgid "Last updated on" -msgstr "చివరిగా నవీకరించబడింది" - -msgid "Toggle navigation" -msgstr "నావిగేషన్‌ను టోగుల్ చేయండి" - -msgid "Sphinx Book Theme" -msgstr "సింహిక పుస్తక థీమ్" - -msgid "suggest edit" -msgstr "సవరించమని సూచించండి" - -msgid "Open an issue" -msgstr "సమస్యను తెరవండి" - -msgid "Launch" -msgstr "ప్రారంభించండి" - -msgid "Edit this page" -msgstr "ఈ పేజీని సవరించండి" - -msgid "By the" -msgstr "ద్వారా" - -msgid "next page" -msgstr "తరువాతి పేజీ" diff --git a/static/btwallet-api/html/_static/locales/tg/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/tg/LC_MESSAGES/booktheme.mo deleted file mode 100644 index b21c6c6340..0000000000 Binary files a/static/btwallet-api/html/_static/locales/tg/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/tg/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/tg/LC_MESSAGES/booktheme.po deleted file mode 100644 index c33dc42172..0000000000 --- a/static/btwallet-api/html/_static/locales/tg/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tg\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "Чоп ба PDF" - -msgid "Theme by the" -msgstr "Мавзӯъи аз" - -msgid "Download source file" -msgstr "Файли манбаъро зеркашӣ кунед" - -msgid "open issue" -msgstr "барориши кушод" - -msgid "Contents" -msgstr "Мундариҷа" - -msgid "previous page" -msgstr "саҳифаи қаблӣ" - -msgid "Download notebook file" -msgstr "Файли дафтарро зеркашӣ кунед" - -msgid "Copyright" -msgstr "Ҳуқуқи муаллиф" - -msgid "Download this page" -msgstr "Ин саҳифаро зеркашӣ кунед" - -msgid "Source repository" -msgstr "Анбори манбаъ" - -msgid "By" -msgstr "Бо" - -msgid "repository" -msgstr "анбор" - -msgid "Last updated on" -msgstr "Last навсозӣ дар" - -msgid "Toggle navigation" -msgstr "Гузаришро иваз кунед" - -msgid "Sphinx Book Theme" -msgstr "Сфинкс Мавзӯи китоб" - -msgid "suggest edit" -msgstr "пешниҳод вироиш" - -msgid "Open an issue" -msgstr "Масъаларо кушоед" - -msgid "Launch" -msgstr "Оғоз" - -msgid "Fullscreen mode" -msgstr "Ҳолати экрани пурра" - -msgid "Edit this page" -msgstr "Ин саҳифаро таҳрир кунед" - -msgid "By the" -msgstr "Бо" - -msgid "next page" -msgstr "саҳифаи оянда" diff --git a/static/btwallet-api/html/_static/locales/th/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/th/LC_MESSAGES/booktheme.mo deleted file mode 100644 index abede98aa1..0000000000 Binary files a/static/btwallet-api/html/_static/locales/th/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/th/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/th/LC_MESSAGES/booktheme.po deleted file mode 100644 index 9d24294a7f..0000000000 --- a/static/btwallet-api/html/_static/locales/th/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: th\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "พิมพ์เป็น PDF" - -msgid "Theme by the" -msgstr "ธีมโดย" - -msgid "Download source file" -msgstr "ดาวน์โหลดไฟล์ต้นฉบับ" - -msgid "open issue" -msgstr "เปิดปัญหา" - -msgid "Contents" -msgstr "สารบัญ" - -msgid "previous page" -msgstr "หน้าที่แล้ว" - -msgid "Download notebook file" -msgstr "ดาวน์โหลดไฟล์สมุดบันทึก" - -msgid "Copyright" -msgstr "ลิขสิทธิ์" - -msgid "Download this page" -msgstr "ดาวน์โหลดหน้านี้" - -msgid "Source repository" -msgstr "ที่เก็บซอร์ส" - -msgid "By" -msgstr "โดย" - -msgid "repository" -msgstr "ที่เก็บ" - -msgid "Last updated on" -msgstr "ปรับปรุงล่าสุดเมื่อ" - -msgid "Toggle navigation" -msgstr "ไม่ต้องสลับช่องทาง" - -msgid "Sphinx Book Theme" -msgstr "ธีมหนังสือสฟิงซ์" - -msgid "suggest edit" -msgstr "แนะนำแก้ไข" - -msgid "Open an issue" -msgstr "เปิดปัญหา" - -msgid "Launch" -msgstr "เปิด" - -msgid "Fullscreen mode" -msgstr "โหมดเต็มหน้าจอ" - -msgid "Edit this page" -msgstr "แก้ไขหน้านี้" - -msgid "By the" -msgstr "โดย" - -msgid "next page" -msgstr "หน้าต่อไป" diff --git a/static/btwallet-api/html/_static/locales/tl/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/tl/LC_MESSAGES/booktheme.mo deleted file mode 100644 index 8df1b73310..0000000000 Binary files a/static/btwallet-api/html/_static/locales/tl/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/tl/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/tl/LC_MESSAGES/booktheme.po deleted file mode 100644 index 20e0d07ce5..0000000000 --- a/static/btwallet-api/html/_static/locales/tl/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,66 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tl\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "I-print sa PDF" - -msgid "Theme by the" -msgstr "Tema ng" - -msgid "Download source file" -msgstr "Mag-download ng file ng pinagmulan" - -msgid "open issue" -msgstr "bukas na isyu" - -msgid "previous page" -msgstr "Nakaraang pahina" - -msgid "Download notebook file" -msgstr "Mag-download ng file ng notebook" - -msgid "Copyright" -msgstr "Copyright" - -msgid "Download this page" -msgstr "I-download ang pahinang ito" - -msgid "Source repository" -msgstr "Pinagmulan ng imbakan" - -msgid "By" -msgstr "Ni" - -msgid "Last updated on" -msgstr "Huling na-update noong" - -msgid "Toggle navigation" -msgstr "I-toggle ang pag-navigate" - -msgid "Sphinx Book Theme" -msgstr "Tema ng Sphinx Book" - -msgid "suggest edit" -msgstr "iminumungkahi i-edit" - -msgid "Open an issue" -msgstr "Magbukas ng isyu" - -msgid "Launch" -msgstr "Ilunsad" - -msgid "Edit this page" -msgstr "I-edit ang pahinang ito" - -msgid "By the" -msgstr "Sa pamamagitan ng" - -msgid "next page" -msgstr "Susunod na pahina" diff --git a/static/btwallet-api/html/_static/locales/tr/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/tr/LC_MESSAGES/booktheme.mo deleted file mode 100644 index 029ae18afb..0000000000 Binary files a/static/btwallet-api/html/_static/locales/tr/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/tr/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/tr/LC_MESSAGES/booktheme.po deleted file mode 100644 index a77eb0273f..0000000000 --- a/static/btwallet-api/html/_static/locales/tr/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: tr\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "PDF olarak yazdır" - -msgid "Theme by the" -msgstr "Tarafından tema" - -msgid "Download source file" -msgstr "Kaynak dosyayı indirin" - -msgid "open issue" -msgstr "Açık konu" - -msgid "Contents" -msgstr "İçindekiler" - -msgid "previous page" -msgstr "önceki sayfa" - -msgid "Download notebook file" -msgstr "Defter dosyasını indirin" - -msgid "Copyright" -msgstr "Telif hakkı" - -msgid "Download this page" -msgstr "Bu sayfayı indirin" - -msgid "Source repository" -msgstr "Kaynak kod deposu" - -msgid "By" -msgstr "Tarafından" - -msgid "repository" -msgstr "depo" - -msgid "Last updated on" -msgstr "Son güncelleme tarihi" - -msgid "Toggle navigation" -msgstr "Gezinmeyi değiştir" - -msgid "Sphinx Book Theme" -msgstr "Sfenks Kitap Teması" - -msgid "suggest edit" -msgstr "düzenleme öner" - -msgid "Open an issue" -msgstr "Bir sorunu açın" - -msgid "Launch" -msgstr "Başlatmak" - -msgid "Fullscreen mode" -msgstr "Tam ekran modu" - -msgid "Edit this page" -msgstr "Bu sayfayı düzenle" - -msgid "By the" -msgstr "Tarafından" - -msgid "next page" -msgstr "sonraki Sayfa" diff --git a/static/btwallet-api/html/_static/locales/uk/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/uk/LC_MESSAGES/booktheme.mo deleted file mode 100644 index 16ab78909c..0000000000 Binary files a/static/btwallet-api/html/_static/locales/uk/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/uk/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/uk/LC_MESSAGES/booktheme.po deleted file mode 100644 index 993dd07810..0000000000 --- a/static/btwallet-api/html/_static/locales/uk/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: uk\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "Друк у форматі PDF" - -msgid "Theme by the" -msgstr "Тема від" - -msgid "Download source file" -msgstr "Завантажити вихідний файл" - -msgid "open issue" -msgstr "відкритий випуск" - -msgid "Contents" -msgstr "Зміст" - -msgid "previous page" -msgstr "Попередня сторінка" - -msgid "Download notebook file" -msgstr "Завантажте файл блокнота" - -msgid "Copyright" -msgstr "Авторське право" - -msgid "Download this page" -msgstr "Завантажте цю сторінку" - -msgid "Source repository" -msgstr "Джерело сховища" - -msgid "By" -msgstr "Автор" - -msgid "repository" -msgstr "сховище" - -msgid "Last updated on" -msgstr "Останнє оновлення:" - -msgid "Toggle navigation" -msgstr "Переключити навігацію" - -msgid "Sphinx Book Theme" -msgstr "Тема книги \"Сфінкс\"" - -msgid "suggest edit" -msgstr "запропонувати редагувати" - -msgid "Open an issue" -msgstr "Відкрийте випуск" - -msgid "Launch" -msgstr "Запуск" - -msgid "Fullscreen mode" -msgstr "Повноекранний режим" - -msgid "Edit this page" -msgstr "Редагувати цю сторінку" - -msgid "By the" -msgstr "По" - -msgid "next page" -msgstr "Наступна сторінка" diff --git a/static/btwallet-api/html/_static/locales/ur/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/ur/LC_MESSAGES/booktheme.mo deleted file mode 100644 index de8c84b935..0000000000 Binary files a/static/btwallet-api/html/_static/locales/ur/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/ur/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/ur/LC_MESSAGES/booktheme.po deleted file mode 100644 index 2f774267f8..0000000000 --- a/static/btwallet-api/html/_static/locales/ur/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,66 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: ur\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "پی ڈی ایف پرنٹ کریں" - -msgid "Theme by the" -msgstr "کے ذریعہ تھیم" - -msgid "Download source file" -msgstr "سورس فائل ڈاؤن لوڈ کریں" - -msgid "open issue" -msgstr "کھلا مسئلہ" - -msgid "previous page" -msgstr "سابقہ ​​صفحہ" - -msgid "Download notebook file" -msgstr "نوٹ بک فائل ڈاؤن لوڈ کریں" - -msgid "Copyright" -msgstr "کاپی رائٹ" - -msgid "Download this page" -msgstr "اس صفحے کو ڈاؤن لوڈ کریں" - -msgid "Source repository" -msgstr "ماخذ ذخیرہ" - -msgid "By" -msgstr "بذریعہ" - -msgid "Last updated on" -msgstr "آخری بار تازہ کاری ہوئی" - -msgid "Toggle navigation" -msgstr "نیویگیشن ٹوگل کریں" - -msgid "Sphinx Book Theme" -msgstr "سپنکس بک تھیم" - -msgid "suggest edit" -msgstr "ترمیم کی تجویز کریں" - -msgid "Open an issue" -msgstr "ایک مسئلہ کھولیں" - -msgid "Launch" -msgstr "لانچ کریں" - -msgid "Edit this page" -msgstr "اس صفحے میں ترمیم کریں" - -msgid "By the" -msgstr "کی طرف" - -msgid "next page" -msgstr "اگلا صفحہ" diff --git a/static/btwallet-api/html/_static/locales/vi/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/vi/LC_MESSAGES/booktheme.mo deleted file mode 100644 index 2bb32555c3..0000000000 Binary files a/static/btwallet-api/html/_static/locales/vi/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/vi/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/vi/LC_MESSAGES/booktheme.po deleted file mode 100644 index 33159f3efc..0000000000 --- a/static/btwallet-api/html/_static/locales/vi/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: vi\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "In sang PDF" - -msgid "Theme by the" -msgstr "Chủ đề của" - -msgid "Download source file" -msgstr "Tải xuống tệp nguồn" - -msgid "open issue" -msgstr "vấn đề mở" - -msgid "Contents" -msgstr "Nội dung" - -msgid "previous page" -msgstr "trang trước" - -msgid "Download notebook file" -msgstr "Tải xuống tệp sổ tay" - -msgid "Copyright" -msgstr "Bản quyền" - -msgid "Download this page" -msgstr "Tải xuống trang này" - -msgid "Source repository" -msgstr "Kho nguồn" - -msgid "By" -msgstr "Bởi" - -msgid "repository" -msgstr "kho" - -msgid "Last updated on" -msgstr "Cập nhật lần cuối vào" - -msgid "Toggle navigation" -msgstr "Chuyển đổi điều hướng thành" - -msgid "Sphinx Book Theme" -msgstr "Chủ đề sách nhân sư" - -msgid "suggest edit" -msgstr "đề nghị chỉnh sửa" - -msgid "Open an issue" -msgstr "Mở một vấn đề" - -msgid "Launch" -msgstr "Phóng" - -msgid "Fullscreen mode" -msgstr "Chế độ toàn màn hình" - -msgid "Edit this page" -msgstr "chỉnh sửa trang này" - -msgid "By the" -msgstr "Bằng" - -msgid "next page" -msgstr "Trang tiếp theo" diff --git a/static/btwallet-api/html/_static/locales/zh_CN/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/zh_CN/LC_MESSAGES/booktheme.mo deleted file mode 100644 index 0e3235d090..0000000000 Binary files a/static/btwallet-api/html/_static/locales/zh_CN/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/zh_CN/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/zh_CN/LC_MESSAGES/booktheme.po deleted file mode 100644 index 2e519ef455..0000000000 --- a/static/btwallet-api/html/_static/locales/zh_CN/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "列印成 PDF" - -msgid "Theme by the" -msgstr "主题作者:" - -msgid "Download source file" -msgstr "下载源文件" - -msgid "open issue" -msgstr "创建议题" - -msgid "Contents" -msgstr "目录" - -msgid "previous page" -msgstr "上一页" - -msgid "Download notebook file" -msgstr "下载笔记本文件" - -msgid "Copyright" -msgstr "版权" - -msgid "Download this page" -msgstr "下载此页面" - -msgid "Source repository" -msgstr "源码库" - -msgid "By" -msgstr "作者:" - -msgid "repository" -msgstr "仓库" - -msgid "Last updated on" -msgstr "上次更新时间:" - -msgid "Toggle navigation" -msgstr "显示或隐藏导航栏" - -msgid "Sphinx Book Theme" -msgstr "Sphinx Book 主题" - -msgid "suggest edit" -msgstr "提出修改建议" - -msgid "Open an issue" -msgstr "创建议题" - -msgid "Launch" -msgstr "启动" - -msgid "Fullscreen mode" -msgstr "全屏模式" - -msgid "Edit this page" -msgstr "编辑此页面" - -msgid "By the" -msgstr "作者:" - -msgid "next page" -msgstr "下一页" diff --git a/static/btwallet-api/html/_static/locales/zh_TW/LC_MESSAGES/booktheme.mo b/static/btwallet-api/html/_static/locales/zh_TW/LC_MESSAGES/booktheme.mo deleted file mode 100644 index 9116fa95d0..0000000000 Binary files a/static/btwallet-api/html/_static/locales/zh_TW/LC_MESSAGES/booktheme.mo and /dev/null differ diff --git a/static/btwallet-api/html/_static/locales/zh_TW/LC_MESSAGES/booktheme.po b/static/btwallet-api/html/_static/locales/zh_TW/LC_MESSAGES/booktheme.po deleted file mode 100644 index beecb076b1..0000000000 --- a/static/btwallet-api/html/_static/locales/zh_TW/LC_MESSAGES/booktheme.po +++ /dev/null @@ -1,75 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: Sphinx-Book-Theme\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: zh_TW\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgid "Print to PDF" -msgstr "列印成 PDF" - -msgid "Theme by the" -msgstr "佈景主題作者:" - -msgid "Download source file" -msgstr "下載原始檔" - -msgid "open issue" -msgstr "公開的問題" - -msgid "Contents" -msgstr "目錄" - -msgid "previous page" -msgstr "上一頁" - -msgid "Download notebook file" -msgstr "下載 Notebook 檔案" - -msgid "Copyright" -msgstr "Copyright" - -msgid "Download this page" -msgstr "下載此頁面" - -msgid "Source repository" -msgstr "來源儲存庫" - -msgid "By" -msgstr "作者:" - -msgid "repository" -msgstr "儲存庫" - -msgid "Last updated on" -msgstr "最後更新時間:" - -msgid "Toggle navigation" -msgstr "顯示或隱藏導覽列" - -msgid "Sphinx Book Theme" -msgstr "Sphinx Book 佈景主題" - -msgid "suggest edit" -msgstr "提出修改建議" - -msgid "Open an issue" -msgstr "開啟議題" - -msgid "Launch" -msgstr "啟動" - -msgid "Fullscreen mode" -msgstr "全螢幕模式" - -msgid "Edit this page" -msgstr "編輯此頁面" - -msgid "By the" -msgstr "作者:" - -msgid "next page" -msgstr "下一頁" diff --git a/static/btwallet-api/html/_static/logo-dark-mode.svg b/static/btwallet-api/html/_static/logo-dark-mode.svg deleted file mode 100644 index a56a46c7c0..0000000000 --- a/static/btwallet-api/html/_static/logo-dark-mode.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/static/btwallet-api/html/_static/logo.svg b/static/btwallet-api/html/_static/logo.svg deleted file mode 100644 index 337ffe2d33..0000000000 --- a/static/btwallet-api/html/_static/logo.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/static/btwallet-api/html/_static/minus.png b/static/btwallet-api/html/_static/minus.png deleted file mode 100644 index d96755fdaf..0000000000 Binary files a/static/btwallet-api/html/_static/minus.png and /dev/null differ diff --git a/static/btwallet-api/html/_static/plus.png b/static/btwallet-api/html/_static/plus.png deleted file mode 100644 index 7107cec93a..0000000000 Binary files a/static/btwallet-api/html/_static/plus.png and /dev/null differ diff --git a/static/btwallet-api/html/_static/pygments.css b/static/btwallet-api/html/_static/pygments.css deleted file mode 100644 index 012e6a00a4..0000000000 --- a/static/btwallet-api/html/_static/pygments.css +++ /dev/null @@ -1,152 +0,0 @@ -html[data-theme="light"] .highlight pre { line-height: 125%; } -html[data-theme="light"] .highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } -html[data-theme="light"] .highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } -html[data-theme="light"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } -html[data-theme="light"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } -html[data-theme="light"] .highlight .hll { background-color: #fae4c2 } -html[data-theme="light"] .highlight { background: #fefefe; color: #080808 } -html[data-theme="light"] .highlight .c { color: #515151 } /* Comment */ -html[data-theme="light"] .highlight .err { color: #a12236 } /* Error */ -html[data-theme="light"] .highlight .k { color: #6730c5 } /* Keyword */ -html[data-theme="light"] .highlight .l { color: #7f4707 } /* Literal */ -html[data-theme="light"] .highlight .n { color: #080808 } /* Name */ -html[data-theme="light"] .highlight .o { color: #00622f } /* Operator */ -html[data-theme="light"] .highlight .p { color: #080808 } /* Punctuation */ -html[data-theme="light"] .highlight .ch { color: #515151 } /* Comment.Hashbang */ -html[data-theme="light"] .highlight .cm { color: #515151 } /* Comment.Multiline */ -html[data-theme="light"] .highlight .cp { color: #515151 } /* Comment.Preproc */ -html[data-theme="light"] .highlight .cpf { color: #515151 } /* Comment.PreprocFile */ -html[data-theme="light"] .highlight .c1 { color: #515151 } /* Comment.Single */ -html[data-theme="light"] .highlight .cs { color: #515151 } /* Comment.Special */ -html[data-theme="light"] .highlight .gd { color: #005b82 } /* Generic.Deleted */ -html[data-theme="light"] .highlight .ge { font-style: italic } /* Generic.Emph */ -html[data-theme="light"] .highlight .gh { color: #005b82 } /* Generic.Heading */ -html[data-theme="light"] .highlight .gs { font-weight: bold } /* Generic.Strong */ -html[data-theme="light"] .highlight .gu { color: #005b82 } /* Generic.Subheading */ -html[data-theme="light"] .highlight .kc { color: #6730c5 } /* Keyword.Constant */ -html[data-theme="light"] .highlight .kd { color: #6730c5 } /* Keyword.Declaration */ -html[data-theme="light"] .highlight .kn { color: #6730c5 } /* Keyword.Namespace */ -html[data-theme="light"] .highlight .kp { color: #6730c5 } /* Keyword.Pseudo */ -html[data-theme="light"] .highlight .kr { color: #6730c5 } /* Keyword.Reserved */ -html[data-theme="light"] .highlight .kt { color: #7f4707 } /* Keyword.Type */ -html[data-theme="light"] .highlight .ld { color: #7f4707 } /* Literal.Date */ -html[data-theme="light"] .highlight .m { color: #7f4707 } /* Literal.Number */ -html[data-theme="light"] .highlight .s { color: #00622f } /* Literal.String */ -html[data-theme="light"] .highlight .na { color: #912583 } /* Name.Attribute */ -html[data-theme="light"] .highlight .nb { color: #7f4707 } /* Name.Builtin */ -html[data-theme="light"] .highlight .nc { color: #005b82 } /* Name.Class */ -html[data-theme="light"] .highlight .no { color: #005b82 } /* Name.Constant */ -html[data-theme="light"] .highlight .nd { color: #7f4707 } /* Name.Decorator */ -html[data-theme="light"] .highlight .ni { color: #00622f } /* Name.Entity */ -html[data-theme="light"] .highlight .ne { color: #6730c5 } /* Name.Exception */ -html[data-theme="light"] .highlight .nf { color: #005b82 } /* Name.Function */ -html[data-theme="light"] .highlight .nl { color: #7f4707 } /* Name.Label */ -html[data-theme="light"] .highlight .nn { color: #080808 } /* Name.Namespace */ -html[data-theme="light"] .highlight .nx { color: #080808 } /* Name.Other */ -html[data-theme="light"] .highlight .py { color: #005b82 } /* Name.Property */ -html[data-theme="light"] .highlight .nt { color: #005b82 } /* Name.Tag */ -html[data-theme="light"] .highlight .nv { color: #a12236 } /* Name.Variable */ -html[data-theme="light"] .highlight .ow { color: #6730c5 } /* Operator.Word */ -html[data-theme="light"] .highlight .pm { color: #080808 } /* Punctuation.Marker */ -html[data-theme="light"] .highlight .w { color: #080808 } /* Text.Whitespace */ -html[data-theme="light"] .highlight .mb { color: #7f4707 } /* Literal.Number.Bin */ -html[data-theme="light"] .highlight .mf { color: #7f4707 } /* Literal.Number.Float */ -html[data-theme="light"] .highlight .mh { color: #7f4707 } /* Literal.Number.Hex */ -html[data-theme="light"] .highlight .mi { color: #7f4707 } /* Literal.Number.Integer */ -html[data-theme="light"] .highlight .mo { color: #7f4707 } /* Literal.Number.Oct */ -html[data-theme="light"] .highlight .sa { color: #00622f } /* Literal.String.Affix */ -html[data-theme="light"] .highlight .sb { color: #00622f } /* Literal.String.Backtick */ -html[data-theme="light"] .highlight .sc { color: #00622f } /* Literal.String.Char */ -html[data-theme="light"] .highlight .dl { color: #00622f } /* Literal.String.Delimiter */ -html[data-theme="light"] .highlight .sd { color: #00622f } /* Literal.String.Doc */ -html[data-theme="light"] .highlight .s2 { color: #00622f } /* Literal.String.Double */ -html[data-theme="light"] .highlight .se { color: #00622f } /* Literal.String.Escape */ -html[data-theme="light"] .highlight .sh { color: #00622f } /* Literal.String.Heredoc */ -html[data-theme="light"] .highlight .si { color: #00622f } /* Literal.String.Interpol */ -html[data-theme="light"] .highlight .sx { color: #00622f } /* Literal.String.Other */ -html[data-theme="light"] .highlight .sr { color: #a12236 } /* Literal.String.Regex */ -html[data-theme="light"] .highlight .s1 { color: #00622f } /* Literal.String.Single */ -html[data-theme="light"] .highlight .ss { color: #005b82 } /* Literal.String.Symbol */ -html[data-theme="light"] .highlight .bp { color: #7f4707 } /* Name.Builtin.Pseudo */ -html[data-theme="light"] .highlight .fm { color: #005b82 } /* Name.Function.Magic */ -html[data-theme="light"] .highlight .vc { color: #a12236 } /* Name.Variable.Class */ -html[data-theme="light"] .highlight .vg { color: #a12236 } /* Name.Variable.Global */ -html[data-theme="light"] .highlight .vi { color: #a12236 } /* Name.Variable.Instance */ -html[data-theme="light"] .highlight .vm { color: #7f4707 } /* Name.Variable.Magic */ -html[data-theme="light"] .highlight .il { color: #7f4707 } /* Literal.Number.Integer.Long */ -html[data-theme="dark"] .highlight pre { line-height: 125%; } -html[data-theme="dark"] .highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } -html[data-theme="dark"] .highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } -html[data-theme="dark"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } -html[data-theme="dark"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } -html[data-theme="dark"] .highlight .hll { background-color: #ffd9002e } -html[data-theme="dark"] .highlight { background: #2b2b2b; color: #f8f8f2 } -html[data-theme="dark"] .highlight .c { color: #ffd900 } /* Comment */ -html[data-theme="dark"] .highlight .err { color: #ffa07a } /* Error */ -html[data-theme="dark"] .highlight .k { color: #dcc6e0 } /* Keyword */ -html[data-theme="dark"] .highlight .l { color: #ffd900 } /* Literal */ -html[data-theme="dark"] .highlight .n { color: #f8f8f2 } /* Name */ -html[data-theme="dark"] .highlight .o { color: #abe338 } /* Operator */ -html[data-theme="dark"] .highlight .p { color: #f8f8f2 } /* Punctuation */ -html[data-theme="dark"] .highlight .ch { color: #ffd900 } /* Comment.Hashbang */ -html[data-theme="dark"] .highlight .cm { color: #ffd900 } /* Comment.Multiline */ -html[data-theme="dark"] .highlight .cp { color: #ffd900 } /* Comment.Preproc */ -html[data-theme="dark"] .highlight .cpf { color: #ffd900 } /* Comment.PreprocFile */ -html[data-theme="dark"] .highlight .c1 { color: #ffd900 } /* Comment.Single */ -html[data-theme="dark"] .highlight .cs { color: #ffd900 } /* Comment.Special */ -html[data-theme="dark"] .highlight .gd { color: #00e0e0 } /* Generic.Deleted */ -html[data-theme="dark"] .highlight .ge { font-style: italic } /* Generic.Emph */ -html[data-theme="dark"] .highlight .gh { color: #00e0e0 } /* Generic.Heading */ -html[data-theme="dark"] .highlight .gs { font-weight: bold } /* Generic.Strong */ -html[data-theme="dark"] .highlight .gu { color: #00e0e0 } /* Generic.Subheading */ -html[data-theme="dark"] .highlight .kc { color: #dcc6e0 } /* Keyword.Constant */ -html[data-theme="dark"] .highlight .kd { color: #dcc6e0 } /* Keyword.Declaration */ -html[data-theme="dark"] .highlight .kn { color: #dcc6e0 } /* Keyword.Namespace */ -html[data-theme="dark"] .highlight .kp { color: #dcc6e0 } /* Keyword.Pseudo */ -html[data-theme="dark"] .highlight .kr { color: #dcc6e0 } /* Keyword.Reserved */ -html[data-theme="dark"] .highlight .kt { color: #ffd900 } /* Keyword.Type */ -html[data-theme="dark"] .highlight .ld { color: #ffd900 } /* Literal.Date */ -html[data-theme="dark"] .highlight .m { color: #ffd900 } /* Literal.Number */ -html[data-theme="dark"] .highlight .s { color: #abe338 } /* Literal.String */ -html[data-theme="dark"] .highlight .na { color: #ffd900 } /* Name.Attribute */ -html[data-theme="dark"] .highlight .nb { color: #ffd900 } /* Name.Builtin */ -html[data-theme="dark"] .highlight .nc { color: #00e0e0 } /* Name.Class */ -html[data-theme="dark"] .highlight .no { color: #00e0e0 } /* Name.Constant */ -html[data-theme="dark"] .highlight .nd { color: #ffd900 } /* Name.Decorator */ -html[data-theme="dark"] .highlight .ni { color: #abe338 } /* Name.Entity */ -html[data-theme="dark"] .highlight .ne { color: #dcc6e0 } /* Name.Exception */ -html[data-theme="dark"] .highlight .nf { color: #00e0e0 } /* Name.Function */ -html[data-theme="dark"] .highlight .nl { color: #ffd900 } /* Name.Label */ -html[data-theme="dark"] .highlight .nn { color: #f8f8f2 } /* Name.Namespace */ -html[data-theme="dark"] .highlight .nx { color: #f8f8f2 } /* Name.Other */ -html[data-theme="dark"] .highlight .py { color: #00e0e0 } /* Name.Property */ -html[data-theme="dark"] .highlight .nt { color: #00e0e0 } /* Name.Tag */ -html[data-theme="dark"] .highlight .nv { color: #ffa07a } /* Name.Variable */ -html[data-theme="dark"] .highlight .ow { color: #dcc6e0 } /* Operator.Word */ -html[data-theme="dark"] .highlight .pm { color: #f8f8f2 } /* Punctuation.Marker */ -html[data-theme="dark"] .highlight .w { color: #f8f8f2 } /* Text.Whitespace */ -html[data-theme="dark"] .highlight .mb { color: #ffd900 } /* Literal.Number.Bin */ -html[data-theme="dark"] .highlight .mf { color: #ffd900 } /* Literal.Number.Float */ -html[data-theme="dark"] .highlight .mh { color: #ffd900 } /* Literal.Number.Hex */ -html[data-theme="dark"] .highlight .mi { color: #ffd900 } /* Literal.Number.Integer */ -html[data-theme="dark"] .highlight .mo { color: #ffd900 } /* Literal.Number.Oct */ -html[data-theme="dark"] .highlight .sa { color: #abe338 } /* Literal.String.Affix */ -html[data-theme="dark"] .highlight .sb { color: #abe338 } /* Literal.String.Backtick */ -html[data-theme="dark"] .highlight .sc { color: #abe338 } /* Literal.String.Char */ -html[data-theme="dark"] .highlight .dl { color: #abe338 } /* Literal.String.Delimiter */ -html[data-theme="dark"] .highlight .sd { color: #abe338 } /* Literal.String.Doc */ -html[data-theme="dark"] .highlight .s2 { color: #abe338 } /* Literal.String.Double */ -html[data-theme="dark"] .highlight .se { color: #abe338 } /* Literal.String.Escape */ -html[data-theme="dark"] .highlight .sh { color: #abe338 } /* Literal.String.Heredoc */ -html[data-theme="dark"] .highlight .si { color: #abe338 } /* Literal.String.Interpol */ -html[data-theme="dark"] .highlight .sx { color: #abe338 } /* Literal.String.Other */ -html[data-theme="dark"] .highlight .sr { color: #ffa07a } /* Literal.String.Regex */ -html[data-theme="dark"] .highlight .s1 { color: #abe338 } /* Literal.String.Single */ -html[data-theme="dark"] .highlight .ss { color: #00e0e0 } /* Literal.String.Symbol */ -html[data-theme="dark"] .highlight .bp { color: #ffd900 } /* Name.Builtin.Pseudo */ -html[data-theme="dark"] .highlight .fm { color: #00e0e0 } /* Name.Function.Magic */ -html[data-theme="dark"] .highlight .vc { color: #ffa07a } /* Name.Variable.Class */ -html[data-theme="dark"] .highlight .vg { color: #ffa07a } /* Name.Variable.Global */ -html[data-theme="dark"] .highlight .vi { color: #ffa07a } /* Name.Variable.Instance */ -html[data-theme="dark"] .highlight .vm { color: #ffd900 } /* Name.Variable.Magic */ -html[data-theme="dark"] .highlight .il { color: #ffd900 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/static/btwallet-api/html/_static/sbt-webpack-macros.html b/static/btwallet-api/html/_static/sbt-webpack-macros.html deleted file mode 100644 index 6cbf559faa..0000000000 --- a/static/btwallet-api/html/_static/sbt-webpack-macros.html +++ /dev/null @@ -1,11 +0,0 @@ - -{% macro head_pre_bootstrap() %} - -{% endmacro %} - -{% macro body_post() %} - -{% endmacro %} diff --git a/static/btwallet-api/html/_static/scripts/bootstrap.js b/static/btwallet-api/html/_static/scripts/bootstrap.js deleted file mode 100644 index c8178debbc..0000000000 --- a/static/btwallet-api/html/_static/scripts/bootstrap.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! For license information please see bootstrap.js.LICENSE.txt */ -(()=>{"use strict";var t={d:(e,i)=>{for(var n in i)t.o(i,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:i[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{afterMain:()=>E,afterRead:()=>v,afterWrite:()=>C,applyStyles:()=>$,arrow:()=>J,auto:()=>a,basePlacements:()=>l,beforeMain:()=>y,beforeRead:()=>_,beforeWrite:()=>A,bottom:()=>s,clippingParents:()=>d,computeStyles:()=>it,createPopper:()=>Dt,createPopperBase:()=>St,createPopperLite:()=>$t,detectOverflow:()=>_t,end:()=>h,eventListeners:()=>st,flip:()=>bt,hide:()=>wt,left:()=>r,main:()=>w,modifierPhases:()=>O,offset:()=>Et,placements:()=>g,popper:()=>f,popperGenerator:()=>Lt,popperOffsets:()=>At,preventOverflow:()=>Tt,read:()=>b,reference:()=>p,right:()=>o,start:()=>c,top:()=>n,variationPlacements:()=>m,viewport:()=>u,write:()=>T});var i={};t.r(i),t.d(i,{Alert:()=>Oe,Button:()=>ke,Carousel:()=>li,Collapse:()=>Ei,Dropdown:()=>Ki,Modal:()=>Ln,Offcanvas:()=>Kn,Popover:()=>bs,ScrollSpy:()=>Ls,Tab:()=>Js,Toast:()=>po,Tooltip:()=>fs});var n="top",s="bottom",o="right",r="left",a="auto",l=[n,s,o,r],c="start",h="end",d="clippingParents",u="viewport",f="popper",p="reference",m=l.reduce((function(t,e){return t.concat([e+"-"+c,e+"-"+h])}),[]),g=[].concat(l,[a]).reduce((function(t,e){return t.concat([e,e+"-"+c,e+"-"+h])}),[]),_="beforeRead",b="read",v="afterRead",y="beforeMain",w="main",E="afterMain",A="beforeWrite",T="write",C="afterWrite",O=[_,b,v,y,w,E,A,T,C];function x(t){return t?(t.nodeName||"").toLowerCase():null}function k(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function L(t){return t instanceof k(t).Element||t instanceof Element}function S(t){return t instanceof k(t).HTMLElement||t instanceof HTMLElement}function D(t){return"undefined"!=typeof ShadowRoot&&(t instanceof k(t).ShadowRoot||t instanceof ShadowRoot)}const $={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];S(s)&&x(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});S(n)&&x(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function I(t){return t.split("-")[0]}var N=Math.max,P=Math.min,M=Math.round;function j(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function F(){return!/^((?!chrome|android).)*safari/i.test(j())}function H(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&S(t)&&(s=t.offsetWidth>0&&M(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&M(n.height)/t.offsetHeight||1);var r=(L(t)?k(t):window).visualViewport,a=!F()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function B(t){var e=H(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function W(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&D(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function z(t){return k(t).getComputedStyle(t)}function R(t){return["table","td","th"].indexOf(x(t))>=0}function q(t){return((L(t)?t.ownerDocument:t.document)||window.document).documentElement}function V(t){return"html"===x(t)?t:t.assignedSlot||t.parentNode||(D(t)?t.host:null)||q(t)}function Y(t){return S(t)&&"fixed"!==z(t).position?t.offsetParent:null}function K(t){for(var e=k(t),i=Y(t);i&&R(i)&&"static"===z(i).position;)i=Y(i);return i&&("html"===x(i)||"body"===x(i)&&"static"===z(i).position)?e:i||function(t){var e=/firefox/i.test(j());if(/Trident/i.test(j())&&S(t)&&"fixed"===z(t).position)return null;var i=V(t);for(D(i)&&(i=i.host);S(i)&&["html","body"].indexOf(x(i))<0;){var n=z(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Q(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function X(t,e,i){return N(t,P(e,i))}function U(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function G(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const J={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,a=t.name,c=t.options,h=i.elements.arrow,d=i.modifiersData.popperOffsets,u=I(i.placement),f=Q(u),p=[r,o].indexOf(u)>=0?"height":"width";if(h&&d){var m=function(t,e){return U("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:G(t,l))}(c.padding,i),g=B(h),_="y"===f?n:r,b="y"===f?s:o,v=i.rects.reference[p]+i.rects.reference[f]-d[f]-i.rects.popper[p],y=d[f]-i.rects.reference[f],w=K(h),E=w?"y"===f?w.clientHeight||0:w.clientWidth||0:0,A=v/2-y/2,T=m[_],C=E-g[p]-m[b],O=E/2-g[p]/2+A,x=X(T,O,C),k=f;i.modifiersData[a]=((e={})[k]=x,e.centerOffset=x-O,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&W(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Z(t){return t.split("-")[1]}var tt={top:"auto",right:"auto",bottom:"auto",left:"auto"};function et(t){var e,i=t.popper,a=t.popperRect,l=t.placement,c=t.variation,d=t.offsets,u=t.position,f=t.gpuAcceleration,p=t.adaptive,m=t.roundOffsets,g=t.isFixed,_=d.x,b=void 0===_?0:_,v=d.y,y=void 0===v?0:v,w="function"==typeof m?m({x:b,y}):{x:b,y};b=w.x,y=w.y;var E=d.hasOwnProperty("x"),A=d.hasOwnProperty("y"),T=r,C=n,O=window;if(p){var x=K(i),L="clientHeight",S="clientWidth";x===k(i)&&"static"!==z(x=q(i)).position&&"absolute"===u&&(L="scrollHeight",S="scrollWidth"),(l===n||(l===r||l===o)&&c===h)&&(C=s,y-=(g&&x===O&&O.visualViewport?O.visualViewport.height:x[L])-a.height,y*=f?1:-1),l!==r&&(l!==n&&l!==s||c!==h)||(T=o,b-=(g&&x===O&&O.visualViewport?O.visualViewport.width:x[S])-a.width,b*=f?1:-1)}var D,$=Object.assign({position:u},p&&tt),I=!0===m?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:M(i*s)/s||0,y:M(n*s)/s||0}}({x:b,y},k(i)):{x:b,y};return b=I.x,y=I.y,f?Object.assign({},$,((D={})[C]=A?"0":"",D[T]=E?"0":"",D.transform=(O.devicePixelRatio||1)<=1?"translate("+b+"px, "+y+"px)":"translate3d("+b+"px, "+y+"px, 0)",D)):Object.assign({},$,((e={})[C]=A?y+"px":"",e[T]=E?b+"px":"",e.transform="",e))}const it={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:I(e.placement),variation:Z(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,et(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,et(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var nt={passive:!0};const st={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=k(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,nt)})),a&&l.addEventListener("resize",i.update,nt),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,nt)})),a&&l.removeEventListener("resize",i.update,nt)}},data:{}};var ot={left:"right",right:"left",bottom:"top",top:"bottom"};function rt(t){return t.replace(/left|right|bottom|top/g,(function(t){return ot[t]}))}var at={start:"end",end:"start"};function lt(t){return t.replace(/start|end/g,(function(t){return at[t]}))}function ct(t){var e=k(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function ht(t){return H(q(t)).left+ct(t).scrollLeft}function dt(t){var e=z(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function ut(t){return["html","body","#document"].indexOf(x(t))>=0?t.ownerDocument.body:S(t)&&dt(t)?t:ut(V(t))}function ft(t,e){var i;void 0===e&&(e=[]);var n=ut(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=k(n),r=s?[o].concat(o.visualViewport||[],dt(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(ft(V(r)))}function pt(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function mt(t,e,i){return e===u?pt(function(t,e){var i=k(t),n=q(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=F();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+ht(t),y:l}}(t,i)):L(e)?function(t,e){var i=H(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):pt(function(t){var e,i=q(t),n=ct(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=N(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=N(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+ht(t),l=-n.scrollTop;return"rtl"===z(s||i).direction&&(a+=N(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(q(t)))}function gt(t){var e,i=t.reference,a=t.element,l=t.placement,d=l?I(l):null,u=l?Z(l):null,f=i.x+i.width/2-a.width/2,p=i.y+i.height/2-a.height/2;switch(d){case n:e={x:f,y:i.y-a.height};break;case s:e={x:f,y:i.y+i.height};break;case o:e={x:i.x+i.width,y:p};break;case r:e={x:i.x-a.width,y:p};break;default:e={x:i.x,y:i.y}}var m=d?Q(d):null;if(null!=m){var g="y"===m?"height":"width";switch(u){case c:e[m]=e[m]-(i[g]/2-a[g]/2);break;case h:e[m]=e[m]+(i[g]/2-a[g]/2)}}return e}function _t(t,e){void 0===e&&(e={});var i=e,r=i.placement,a=void 0===r?t.placement:r,c=i.strategy,h=void 0===c?t.strategy:c,m=i.boundary,g=void 0===m?d:m,_=i.rootBoundary,b=void 0===_?u:_,v=i.elementContext,y=void 0===v?f:v,w=i.altBoundary,E=void 0!==w&&w,A=i.padding,T=void 0===A?0:A,C=U("number"!=typeof T?T:G(T,l)),O=y===f?p:f,k=t.rects.popper,D=t.elements[E?O:y],$=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=ft(V(t)),i=["absolute","fixed"].indexOf(z(t).position)>=0&&S(t)?K(t):t;return L(i)?e.filter((function(t){return L(t)&&W(t,i)&&"body"!==x(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=mt(t,i,n);return e.top=N(s.top,e.top),e.right=P(s.right,e.right),e.bottom=P(s.bottom,e.bottom),e.left=N(s.left,e.left),e}),mt(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(L(D)?D:D.contextElement||q(t.elements.popper),g,b,h),I=H(t.elements.reference),M=gt({reference:I,element:k,strategy:"absolute",placement:a}),j=pt(Object.assign({},k,M)),F=y===f?j:I,B={top:$.top-F.top+C.top,bottom:F.bottom-$.bottom+C.bottom,left:$.left-F.left+C.left,right:F.right-$.right+C.right},R=t.modifiersData.offset;if(y===f&&R){var Y=R[a];Object.keys(B).forEach((function(t){var e=[o,s].indexOf(t)>=0?1:-1,i=[n,s].indexOf(t)>=0?"y":"x";B[t]+=Y[i]*e}))}return B}const bt={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,h=t.name;if(!e.modifiersData[h]._skip){for(var d=i.mainAxis,u=void 0===d||d,f=i.altAxis,p=void 0===f||f,_=i.fallbackPlacements,b=i.padding,v=i.boundary,y=i.rootBoundary,w=i.altBoundary,E=i.flipVariations,A=void 0===E||E,T=i.allowedAutoPlacements,C=e.options.placement,O=I(C),x=_||(O!==C&&A?function(t){if(I(t)===a)return[];var e=rt(t);return[lt(t),e,lt(e)]}(C):[rt(C)]),k=[C].concat(x).reduce((function(t,i){return t.concat(I(i)===a?function(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,c=i.allowedAutoPlacements,h=void 0===c?g:c,d=Z(n),u=d?a?m:m.filter((function(t){return Z(t)===d})):l,f=u.filter((function(t){return h.indexOf(t)>=0}));0===f.length&&(f=u);var p=f.reduce((function(e,i){return e[i]=_t(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[I(i)],e}),{});return Object.keys(p).sort((function(t,e){return p[t]-p[e]}))}(e,{placement:i,boundary:v,rootBoundary:y,padding:b,flipVariations:A,allowedAutoPlacements:T}):i)}),[]),L=e.rects.reference,S=e.rects.popper,D=new Map,$=!0,N=k[0],P=0;P=0,B=H?"width":"height",W=_t(e,{placement:M,boundary:v,rootBoundary:y,altBoundary:w,padding:b}),z=H?F?o:r:F?s:n;L[B]>S[B]&&(z=rt(z));var R=rt(z),q=[];if(u&&q.push(W[j]<=0),p&&q.push(W[z]<=0,W[R]<=0),q.every((function(t){return t}))){N=M,$=!1;break}D.set(M,q)}if($)for(var V=function(t){var e=k.find((function(e){var i=D.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return N=e,"break"},Y=A?3:1;Y>0&&"break"!==V(Y);Y--);e.placement!==N&&(e.modifiersData[h]._skip=!0,e.placement=N,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function vt(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function yt(t){return[n,o,s,r].some((function(e){return t[e]>=0}))}const wt={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=_t(e,{elementContext:"reference"}),a=_t(e,{altBoundary:!0}),l=vt(r,n),c=vt(a,s,o),h=yt(l),d=yt(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},Et={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,s=t.name,a=i.offset,l=void 0===a?[0,0]:a,c=g.reduce((function(t,i){return t[i]=function(t,e,i){var s=I(t),a=[r,n].indexOf(s)>=0?-1:1,l="function"==typeof i?i(Object.assign({},e,{placement:t})):i,c=l[0],h=l[1];return c=c||0,h=(h||0)*a,[r,o].indexOf(s)>=0?{x:h,y:c}:{x:c,y:h}}(i,e.rects,l),t}),{}),h=c[e.placement],d=h.x,u=h.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=d,e.modifiersData.popperOffsets.y+=u),e.modifiersData[s]=c}},At={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=gt({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},Tt={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,a=t.name,l=i.mainAxis,h=void 0===l||l,d=i.altAxis,u=void 0!==d&&d,f=i.boundary,p=i.rootBoundary,m=i.altBoundary,g=i.padding,_=i.tether,b=void 0===_||_,v=i.tetherOffset,y=void 0===v?0:v,w=_t(e,{boundary:f,rootBoundary:p,padding:g,altBoundary:m}),E=I(e.placement),A=Z(e.placement),T=!A,C=Q(E),O="x"===C?"y":"x",x=e.modifiersData.popperOffsets,k=e.rects.reference,L=e.rects.popper,S="function"==typeof y?y(Object.assign({},e.rects,{placement:e.placement})):y,D="number"==typeof S?{mainAxis:S,altAxis:S}:Object.assign({mainAxis:0,altAxis:0},S),$=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,M={x:0,y:0};if(x){if(h){var j,F="y"===C?n:r,H="y"===C?s:o,W="y"===C?"height":"width",z=x[C],R=z+w[F],q=z-w[H],V=b?-L[W]/2:0,Y=A===c?k[W]:L[W],U=A===c?-L[W]:-k[W],G=e.elements.arrow,J=b&&G?B(G):{width:0,height:0},tt=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},et=tt[F],it=tt[H],nt=X(0,k[W],J[W]),st=T?k[W]/2-V-nt-et-D.mainAxis:Y-nt-et-D.mainAxis,ot=T?-k[W]/2+V+nt+it+D.mainAxis:U+nt+it+D.mainAxis,rt=e.elements.arrow&&K(e.elements.arrow),at=rt?"y"===C?rt.clientTop||0:rt.clientLeft||0:0,lt=null!=(j=null==$?void 0:$[C])?j:0,ct=z+ot-lt,ht=X(b?P(R,z+st-lt-at):R,z,b?N(q,ct):q);x[C]=ht,M[C]=ht-z}if(u){var dt,ut="x"===C?n:r,ft="x"===C?s:o,pt=x[O],mt="y"===O?"height":"width",gt=pt+w[ut],bt=pt-w[ft],vt=-1!==[n,r].indexOf(E),yt=null!=(dt=null==$?void 0:$[O])?dt:0,wt=vt?gt:pt-k[mt]-L[mt]-yt+D.altAxis,Et=vt?pt+k[mt]+L[mt]-yt-D.altAxis:bt,At=b&&vt?function(t,e,i){var n=X(t,e,i);return n>i?i:n}(wt,pt,Et):X(b?wt:gt,pt,b?Et:bt);x[O]=At,M[O]=At-pt}e.modifiersData[a]=M}},requiresIfExists:["offset"]};function Ct(t,e,i){void 0===i&&(i=!1);var n,s,o=S(e),r=S(e)&&function(t){var e=t.getBoundingClientRect(),i=M(e.width)/t.offsetWidth||1,n=M(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=q(e),l=H(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==x(e)||dt(a))&&(c=(n=e)!==k(n)&&S(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:ct(n)),S(e)?((h=H(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=ht(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function Ot(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var xt={placement:"bottom",modifiers:[],strategy:"absolute"};function kt(){for(var t=arguments.length,e=new Array(t),i=0;iIt.has(t)&&It.get(t).get(e)||null,remove(t,e){if(!It.has(t))return;const i=It.get(t);i.delete(e),0===i.size&&It.delete(t)}},Pt="transitionend",Mt=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),jt=t=>{t.dispatchEvent(new Event(Pt))},Ft=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),Ht=t=>Ft(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(Mt(t)):null,Bt=t=>{if(!Ft(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},Wt=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),zt=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?zt(t.parentNode):null},Rt=()=>{},qt=t=>{t.offsetHeight},Vt=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,Yt=[],Kt=()=>"rtl"===document.documentElement.dir,Qt=t=>{var e;e=()=>{const e=Vt();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(Yt.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of Yt)t()})),Yt.push(e)):e()},Xt=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,Ut=(t,e,i=!0)=>{if(!i)return void Xt(t);const n=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let s=!1;const o=({target:i})=>{i===e&&(s=!0,e.removeEventListener(Pt,o),Xt(t))};e.addEventListener(Pt,o),setTimeout((()=>{s||jt(e)}),n)},Gt=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},Jt=/[^.]*(?=\..*)\.|.*/,Zt=/\..*/,te=/::\d+$/,ee={};let ie=1;const ne={mouseenter:"mouseover",mouseleave:"mouseout"},se=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function oe(t,e){return e&&`${e}::${ie++}`||t.uidEvent||ie++}function re(t){const e=oe(t);return t.uidEvent=e,ee[e]=ee[e]||{},ee[e]}function ae(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function le(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=ue(t);return se.has(o)||(o=t),[n,s,o]}function ce(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=le(e,i,n);if(e in ne){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=re(t),c=l[a]||(l[a]={}),h=ae(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=oe(r,e.replace(Jt,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return pe(s,{delegateTarget:r}),n.oneOff&&fe.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return pe(n,{delegateTarget:t}),i.oneOff&&fe.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function he(t,e,i,n,s){const o=ae(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function de(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&he(t,e,i,r.callable,r.delegationSelector)}function ue(t){return t=t.replace(Zt,""),ne[t]||t}const fe={on(t,e,i,n){ce(t,e,i,n,!1)},one(t,e,i,n){ce(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=le(e,i,n),a=r!==e,l=re(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))de(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(te,"");a&&!e.includes(s)||he(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;he(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=Vt();let s=null,o=!0,r=!0,a=!1;e!==ue(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=pe(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function pe(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function me(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function ge(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const _e={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${ge(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${ge(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=me(t.dataset[n])}return e},getDataAttribute:(t,e)=>me(t.getAttribute(`data-bs-${ge(e)}`))};class be{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=Ft(e)?_e.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...Ft(e)?_e.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],o=Ft(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(o))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${o}" but expected type "${s}".`)}var i}}class ve extends be{constructor(t,e){super(),(t=Ht(t))&&(this._element=t,this._config=this._getConfig(e),Nt.set(this._element,this.constructor.DATA_KEY,this))}dispose(){Nt.remove(this._element,this.constructor.DATA_KEY),fe.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){Ut(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return Nt.get(Ht(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.3"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const ye=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return e?e.split(",").map((t=>Mt(t))).join(","):null},we={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!Wt(t)&&Bt(t)))},getSelectorFromElement(t){const e=ye(t);return e&&we.findOne(e)?e:null},getElementFromSelector(t){const e=ye(t);return e?we.findOne(e):null},getMultipleElementsFromSelector(t){const e=ye(t);return e?we.find(e):[]}},Ee=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;fe.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),Wt(this))return;const s=we.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},Ae=".bs.alert",Te=`close${Ae}`,Ce=`closed${Ae}`;class Oe extends ve{static get NAME(){return"alert"}close(){if(fe.trigger(this._element,Te).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),fe.trigger(this._element,Ce),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Oe.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}Ee(Oe,"close"),Qt(Oe);const xe='[data-bs-toggle="button"]';class ke extends ve{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=ke.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}fe.on(document,"click.bs.button.data-api",xe,(t=>{t.preventDefault();const e=t.target.closest(xe);ke.getOrCreateInstance(e).toggle()})),Qt(ke);const Le=".bs.swipe",Se=`touchstart${Le}`,De=`touchmove${Le}`,$e=`touchend${Le}`,Ie=`pointerdown${Le}`,Ne=`pointerup${Le}`,Pe={endCallback:null,leftCallback:null,rightCallback:null},Me={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class je extends be{constructor(t,e){super(),this._element=t,t&&je.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return Pe}static get DefaultType(){return Me}static get NAME(){return"swipe"}dispose(){fe.off(this._element,Le)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),Xt(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&Xt(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(fe.on(this._element,Ie,(t=>this._start(t))),fe.on(this._element,Ne,(t=>this._end(t))),this._element.classList.add("pointer-event")):(fe.on(this._element,Se,(t=>this._start(t))),fe.on(this._element,De,(t=>this._move(t))),fe.on(this._element,$e,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const Fe=".bs.carousel",He=".data-api",Be="ArrowLeft",We="ArrowRight",ze="next",Re="prev",qe="left",Ve="right",Ye=`slide${Fe}`,Ke=`slid${Fe}`,Qe=`keydown${Fe}`,Xe=`mouseenter${Fe}`,Ue=`mouseleave${Fe}`,Ge=`dragstart${Fe}`,Je=`load${Fe}${He}`,Ze=`click${Fe}${He}`,ti="carousel",ei="active",ii=".active",ni=".carousel-item",si=ii+ni,oi={[Be]:Ve,[We]:qe},ri={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},ai={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class li extends ve{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=we.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===ti&&this.cycle()}static get Default(){return ri}static get DefaultType(){return ai}static get NAME(){return"carousel"}next(){this._slide(ze)}nextWhenVisible(){!document.hidden&&Bt(this._element)&&this.next()}prev(){this._slide(Re)}pause(){this._isSliding&&jt(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?fe.one(this._element,Ke,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void fe.one(this._element,Ke,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?ze:Re;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&fe.on(this._element,Qe,(t=>this._keydown(t))),"hover"===this._config.pause&&(fe.on(this._element,Xe,(()=>this.pause())),fe.on(this._element,Ue,(()=>this._maybeEnableCycle()))),this._config.touch&&je.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of we.find(".carousel-item img",this._element))fe.on(t,Ge,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(qe)),rightCallback:()=>this._slide(this._directionToOrder(Ve)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new je(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=oi[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=we.findOne(ii,this._indicatorsElement);e.classList.remove(ei),e.removeAttribute("aria-current");const i=we.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(ei),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===ze,s=e||Gt(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>fe.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(Ye).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),qt(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(ei),i.classList.remove(ei,c,l),this._isSliding=!1,r(Ke)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return we.findOne(si,this._element)}_getItems(){return we.find(ni,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return Kt()?t===qe?Re:ze:t===qe?ze:Re}_orderToDirection(t){return Kt()?t===Re?qe:Ve:t===Re?Ve:qe}static jQueryInterface(t){return this.each((function(){const e=li.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}fe.on(document,Ze,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=we.getElementFromSelector(this);if(!e||!e.classList.contains(ti))return;t.preventDefault();const i=li.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===_e.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),fe.on(window,Je,(()=>{const t=we.find('[data-bs-ride="carousel"]');for(const e of t)li.getOrCreateInstance(e)})),Qt(li);const ci=".bs.collapse",hi=`show${ci}`,di=`shown${ci}`,ui=`hide${ci}`,fi=`hidden${ci}`,pi=`click${ci}.data-api`,mi="show",gi="collapse",_i="collapsing",bi=`:scope .${gi} .${gi}`,vi='[data-bs-toggle="collapse"]',yi={parent:null,toggle:!0},wi={parent:"(null|element)",toggle:"boolean"};class Ei extends ve{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=we.find(vi);for(const t of i){const e=we.getSelectorFromElement(t),i=we.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return yi}static get DefaultType(){return wi}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Ei.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(fe.trigger(this._element,hi).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(gi),this._element.classList.add(_i),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(_i),this._element.classList.add(gi,mi),this._element.style[e]="",fe.trigger(this._element,di)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(fe.trigger(this._element,ui).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,qt(this._element),this._element.classList.add(_i),this._element.classList.remove(gi,mi);for(const t of this._triggerArray){const e=we.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(_i),this._element.classList.add(gi),fe.trigger(this._element,fi)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(mi)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=Ht(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(vi);for(const e of t){const t=we.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=we.find(bi,this._config.parent);return we.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Ei.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}fe.on(document,pi,vi,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of we.getMultipleElementsFromSelector(this))Ei.getOrCreateInstance(t,{toggle:!1}).toggle()})),Qt(Ei);const Ai="dropdown",Ti=".bs.dropdown",Ci=".data-api",Oi="ArrowUp",xi="ArrowDown",ki=`hide${Ti}`,Li=`hidden${Ti}`,Si=`show${Ti}`,Di=`shown${Ti}`,$i=`click${Ti}${Ci}`,Ii=`keydown${Ti}${Ci}`,Ni=`keyup${Ti}${Ci}`,Pi="show",Mi='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',ji=`${Mi}.${Pi}`,Fi=".dropdown-menu",Hi=Kt()?"top-end":"top-start",Bi=Kt()?"top-start":"top-end",Wi=Kt()?"bottom-end":"bottom-start",zi=Kt()?"bottom-start":"bottom-end",Ri=Kt()?"left-start":"right-start",qi=Kt()?"right-start":"left-start",Vi={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},Yi={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"};class Ki extends ve{constructor(t,e){super(t,e),this._popper=null,this._parent=this._element.parentNode,this._menu=we.next(this._element,Fi)[0]||we.prev(this._element,Fi)[0]||we.findOne(Fi,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return Vi}static get DefaultType(){return Yi}static get NAME(){return Ai}toggle(){return this._isShown()?this.hide():this.show()}show(){if(Wt(this._element)||this._isShown())return;const t={relatedTarget:this._element};if(!fe.trigger(this._element,Si,t).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(".navbar-nav"))for(const t of[].concat(...document.body.children))fe.on(t,"mouseover",Rt);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(Pi),this._element.classList.add(Pi),fe.trigger(this._element,Di,t)}}hide(){if(Wt(this._element)||!this._isShown())return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){if(!fe.trigger(this._element,ki,t).defaultPrevented){if("ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))fe.off(t,"mouseover",Rt);this._popper&&this._popper.destroy(),this._menu.classList.remove(Pi),this._element.classList.remove(Pi),this._element.setAttribute("aria-expanded","false"),_e.removeDataAttribute(this._menu,"popper"),fe.trigger(this._element,Li,t)}}_getConfig(t){if("object"==typeof(t=super._getConfig(t)).reference&&!Ft(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${Ai.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(){if(void 0===e)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let t=this._element;"parent"===this._config.reference?t=this._parent:Ft(this._config.reference)?t=Ht(this._config.reference):"object"==typeof this._config.reference&&(t=this._config.reference);const i=this._getPopperConfig();this._popper=Dt(t,this._menu,i)}_isShown(){return this._menu.classList.contains(Pi)}_getPlacement(){const t=this._parent;if(t.classList.contains("dropend"))return Ri;if(t.classList.contains("dropstart"))return qi;if(t.classList.contains("dropup-center"))return"top";if(t.classList.contains("dropdown-center"))return"bottom";const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?Bi:Hi:e?zi:Wi}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(_e.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...Xt(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=we.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>Bt(t)));i.length&&Gt(i,e,t===xi,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=Ki.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=we.find(ji);for(const i of e){const e=Ki.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Oi,xi].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Mi)?this:we.prev(this,Mi)[0]||we.next(this,Mi)[0]||we.findOne(Mi,t.delegateTarget.parentNode),o=Ki.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}fe.on(document,Ii,Mi,Ki.dataApiKeydownHandler),fe.on(document,Ii,Fi,Ki.dataApiKeydownHandler),fe.on(document,$i,Ki.clearMenus),fe.on(document,Ni,Ki.clearMenus),fe.on(document,$i,Mi,(function(t){t.preventDefault(),Ki.getOrCreateInstance(this).toggle()})),Qt(Ki);const Qi="backdrop",Xi="show",Ui=`mousedown.bs.${Qi}`,Gi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Ji={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Zi extends be{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Gi}static get DefaultType(){return Ji}static get NAME(){return Qi}show(t){if(!this._config.isVisible)return void Xt(t);this._append();const e=this._getElement();this._config.isAnimated&&qt(e),e.classList.add(Xi),this._emulateAnimation((()=>{Xt(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Xi),this._emulateAnimation((()=>{this.dispose(),Xt(t)}))):Xt(t)}dispose(){this._isAppended&&(fe.off(this._element,Ui),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=Ht(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),fe.on(t,Ui,(()=>{Xt(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){Ut(t,this._getElement(),this._config.isAnimated)}}const tn=".bs.focustrap",en=`focusin${tn}`,nn=`keydown.tab${tn}`,sn="backward",on={autofocus:!0,trapElement:null},rn={autofocus:"boolean",trapElement:"element"};class an extends be{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return on}static get DefaultType(){return rn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),fe.off(document,tn),fe.on(document,en,(t=>this._handleFocusin(t))),fe.on(document,nn,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,fe.off(document,tn))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=we.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===sn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?sn:"forward")}}const ln=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",cn=".sticky-top",hn="padding-right",dn="margin-right";class un{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,hn,(e=>e+t)),this._setElementAttributes(ln,hn,(e=>e+t)),this._setElementAttributes(cn,dn,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,hn),this._resetElementAttributes(ln,hn),this._resetElementAttributes(cn,dn)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&_e.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=_e.getDataAttribute(t,e);null!==i?(_e.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(Ft(t))e(t);else for(const i of we.find(t,this._element))e(i)}}const fn=".bs.modal",pn=`hide${fn}`,mn=`hidePrevented${fn}`,gn=`hidden${fn}`,_n=`show${fn}`,bn=`shown${fn}`,vn=`resize${fn}`,yn=`click.dismiss${fn}`,wn=`mousedown.dismiss${fn}`,En=`keydown.dismiss${fn}`,An=`click${fn}.data-api`,Tn="modal-open",Cn="show",On="modal-static",xn={backdrop:!0,focus:!0,keyboard:!0},kn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class Ln extends ve{constructor(t,e){super(t,e),this._dialog=we.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new un,this._addEventListeners()}static get Default(){return xn}static get DefaultType(){return kn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||fe.trigger(this._element,_n,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(Tn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(fe.trigger(this._element,pn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(Cn),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){fe.off(window,fn),fe.off(this._dialog,fn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Zi({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new an({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=we.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),qt(this._element),this._element.classList.add(Cn),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,fe.trigger(this._element,bn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){fe.on(this._element,En,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),fe.on(window,vn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),fe.on(this._element,wn,(t=>{fe.one(this._element,yn,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(Tn),this._resetAdjustments(),this._scrollBar.reset(),fe.trigger(this._element,gn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(fe.trigger(this._element,mn).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(On)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(On),this._queueCallback((()=>{this._element.classList.remove(On),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=Kt()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=Kt()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=Ln.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}fe.on(document,An,'[data-bs-toggle="modal"]',(function(t){const e=we.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),fe.one(e,_n,(t=>{t.defaultPrevented||fe.one(e,gn,(()=>{Bt(this)&&this.focus()}))}));const i=we.findOne(".modal.show");i&&Ln.getInstance(i).hide(),Ln.getOrCreateInstance(e).toggle(this)})),Ee(Ln),Qt(Ln);const Sn=".bs.offcanvas",Dn=".data-api",$n=`load${Sn}${Dn}`,In="show",Nn="showing",Pn="hiding",Mn=".offcanvas.show",jn=`show${Sn}`,Fn=`shown${Sn}`,Hn=`hide${Sn}`,Bn=`hidePrevented${Sn}`,Wn=`hidden${Sn}`,zn=`resize${Sn}`,Rn=`click${Sn}${Dn}`,qn=`keydown.dismiss${Sn}`,Vn={backdrop:!0,keyboard:!0,scroll:!1},Yn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class Kn extends ve{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return Vn}static get DefaultType(){return Yn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||fe.trigger(this._element,jn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new un).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Nn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(In),this._element.classList.remove(Nn),fe.trigger(this._element,Fn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(fe.trigger(this._element,Hn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(Pn),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(In,Pn),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new un).reset(),fe.trigger(this._element,Wn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Zi({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():fe.trigger(this._element,Bn)}:null})}_initializeFocusTrap(){return new an({trapElement:this._element})}_addEventListeners(){fe.on(this._element,qn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():fe.trigger(this._element,Bn))}))}static jQueryInterface(t){return this.each((function(){const e=Kn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}fe.on(document,Rn,'[data-bs-toggle="offcanvas"]',(function(t){const e=we.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),Wt(this))return;fe.one(e,Wn,(()=>{Bt(this)&&this.focus()}));const i=we.findOne(Mn);i&&i!==e&&Kn.getInstance(i).hide(),Kn.getOrCreateInstance(e).toggle(this)})),fe.on(window,$n,(()=>{for(const t of we.find(Mn))Kn.getOrCreateInstance(t).show()})),fe.on(window,zn,(()=>{for(const t of we.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&Kn.getOrCreateInstance(t).hide()})),Ee(Kn),Qt(Kn);const Qn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],dd:[],div:[],dl:[],dt:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Xn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Un=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Gn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Xn.has(i)||Boolean(Un.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Jn={allowList:Qn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
    "},Zn={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},ts={entry:"(string|element|function|null)",selector:"(string|element)"};class es extends be{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Jn}static get DefaultType(){return Zn}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},ts)}_setContent(t,e,i){const n=we.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?Ft(e)?this._putElementInTemplate(Ht(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Gn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return Xt(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const is=new Set(["sanitize","allowList","sanitizeFn"]),ns="fade",ss="show",os=".tooltip-inner",rs=".modal",as="hide.bs.modal",ls="hover",cs="focus",hs={AUTO:"auto",TOP:"top",RIGHT:Kt()?"left":"right",BOTTOM:"bottom",LEFT:Kt()?"right":"left"},ds={allowList:Qn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},us={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class fs extends ve{constructor(t,i){if(void 0===e)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,i),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return ds}static get DefaultType(){return us}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),fe.off(this._element.closest(rs),as,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=fe.trigger(this._element,this.constructor.eventName("show")),e=(zt(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),fe.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(ss),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))fe.on(t,"mouseover",Rt);this._queueCallback((()=>{fe.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!fe.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(ss),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))fe.off(t,"mouseover",Rt);this._activeTrigger.click=!1,this._activeTrigger[cs]=!1,this._activeTrigger[ls]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),fe.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ns,ss),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ns),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new es({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{[os]:this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ns)}_isShown(){return this.tip&&this.tip.classList.contains(ss)}_createPopper(t){const e=Xt(this._config.placement,[this,t,this._element]),i=hs[e.toUpperCase()];return Dt(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return Xt(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...Xt(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)fe.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ls?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ls?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");fe.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?cs:ls]=!0,e._enter()})),fe.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?cs:ls]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},fe.on(this._element.closest(rs),as,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=_e.getDataAttributes(this._element);for(const t of Object.keys(e))is.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:Ht(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=fs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}Qt(fs);const ps=".popover-header",ms=".popover-body",gs={...fs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},_s={...fs.DefaultType,content:"(null|string|element|function)"};class bs extends fs{static get Default(){return gs}static get DefaultType(){return _s}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{[ps]:this._getTitle(),[ms]:this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=bs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}Qt(bs);const vs=".bs.scrollspy",ys=`activate${vs}`,ws=`click${vs}`,Es=`load${vs}.data-api`,As="active",Ts="[href]",Cs=".nav-link",Os=`${Cs}, .nav-item > ${Cs}, .list-group-item`,xs={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},ks={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Ls extends ve{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return xs}static get DefaultType(){return ks}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=Ht(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(fe.off(this._config.target,ws),fe.on(this._config.target,ws,Ts,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=we.find(Ts,this._config.target);for(const e of t){if(!e.hash||Wt(e))continue;const t=we.findOne(decodeURI(e.hash),this._element);Bt(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(As),this._activateParents(t),fe.trigger(this._element,ys,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))we.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(As);else for(const e of we.parents(t,".nav, .list-group"))for(const t of we.prev(e,Os))t.classList.add(As)}_clearActiveClass(t){t.classList.remove(As);const e=we.find(`${Ts}.${As}`,t);for(const t of e)t.classList.remove(As)}static jQueryInterface(t){return this.each((function(){const e=Ls.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}fe.on(window,Es,(()=>{for(const t of we.find('[data-bs-spy="scroll"]'))Ls.getOrCreateInstance(t)})),Qt(Ls);const Ss=".bs.tab",Ds=`hide${Ss}`,$s=`hidden${Ss}`,Is=`show${Ss}`,Ns=`shown${Ss}`,Ps=`click${Ss}`,Ms=`keydown${Ss}`,js=`load${Ss}`,Fs="ArrowLeft",Hs="ArrowRight",Bs="ArrowUp",Ws="ArrowDown",zs="Home",Rs="End",qs="active",Vs="fade",Ys="show",Ks=".dropdown-toggle",Qs=`:not(${Ks})`,Xs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',Us=`.nav-link${Qs}, .list-group-item${Qs}, [role="tab"]${Qs}, ${Xs}`,Gs=`.${qs}[data-bs-toggle="tab"], .${qs}[data-bs-toggle="pill"], .${qs}[data-bs-toggle="list"]`;class Js extends ve{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),fe.on(this._element,Ms,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?fe.trigger(e,Ds,{relatedTarget:t}):null;fe.trigger(t,Is,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(qs),this._activate(we.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),fe.trigger(t,Ns,{relatedTarget:e})):t.classList.add(Ys)}),t,t.classList.contains(Vs)))}_deactivate(t,e){t&&(t.classList.remove(qs),t.blur(),this._deactivate(we.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),fe.trigger(t,$s,{relatedTarget:e})):t.classList.remove(Ys)}),t,t.classList.contains(Vs)))}_keydown(t){if(![Fs,Hs,Bs,Ws,zs,Rs].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!Wt(t)));let i;if([zs,Rs].includes(t.key))i=e[t.key===zs?0:e.length-1];else{const n=[Hs,Ws].includes(t.key);i=Gt(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Js.getOrCreateInstance(i).show())}_getChildren(){return we.find(Us,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=we.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=we.findOne(t,i);s&&s.classList.toggle(n,e)};n(Ks,qs),n(".dropdown-menu",Ys),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(qs)}_getInnerElement(t){return t.matches(Us)?t:we.findOne(Us,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Js.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}fe.on(document,Ps,Xs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),Wt(this)||Js.getOrCreateInstance(this).show()})),fe.on(window,js,(()=>{for(const t of we.find(Gs))Js.getOrCreateInstance(t)})),Qt(Js);const Zs=".bs.toast",to=`mouseover${Zs}`,eo=`mouseout${Zs}`,io=`focusin${Zs}`,no=`focusout${Zs}`,so=`hide${Zs}`,oo=`hidden${Zs}`,ro=`show${Zs}`,ao=`shown${Zs}`,lo="hide",co="show",ho="showing",uo={animation:"boolean",autohide:"boolean",delay:"number"},fo={animation:!0,autohide:!0,delay:5e3};class po extends ve{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return fo}static get DefaultType(){return uo}static get NAME(){return"toast"}show(){fe.trigger(this._element,ro).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(lo),qt(this._element),this._element.classList.add(co,ho),this._queueCallback((()=>{this._element.classList.remove(ho),fe.trigger(this._element,ao),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(fe.trigger(this._element,so).defaultPrevented||(this._element.classList.add(ho),this._queueCallback((()=>{this._element.classList.add(lo),this._element.classList.remove(ho,co),fe.trigger(this._element,oo)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(co),super.dispose()}isShown(){return this._element.classList.contains(co)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){fe.on(this._element,to,(t=>this._onInteraction(t,!0))),fe.on(this._element,eo,(t=>this._onInteraction(t,!1))),fe.on(this._element,io,(t=>this._onInteraction(t,!0))),fe.on(this._element,no,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=po.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}function mo(t){"loading"!=document.readyState?t():document.addEventListener("DOMContentLoaded",t)}Ee(po),Qt(po),mo((function(){[].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')).map((function(t){return new fs(t,{delay:{show:500,hide:100}})}))})),mo((function(){document.getElementById("pst-back-to-top").addEventListener("click",(function(){document.body.scrollTop=0,document.documentElement.scrollTop=0}))})),mo((function(){var t=document.getElementById("pst-back-to-top"),e=document.getElementsByClassName("bd-header")[0].getBoundingClientRect();window.addEventListener("scroll",(function(){this.oldScroll>this.scrollY&&this.scrollY>e.bottom?t.style.display="block":t.style.display="none",this.oldScroll=this.scrollY}))})),window.bootstrap=i})(); -//# sourceMappingURL=bootstrap.js.map \ No newline at end of file diff --git a/static/btwallet-api/html/_static/scripts/bootstrap.js.LICENSE.txt b/static/btwallet-api/html/_static/scripts/bootstrap.js.LICENSE.txt deleted file mode 100644 index 28755c2c5b..0000000000 --- a/static/btwallet-api/html/_static/scripts/bootstrap.js.LICENSE.txt +++ /dev/null @@ -1,5 +0,0 @@ -/*! - * Bootstrap v5.3.3 (https://getbootstrap.com/) - * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ diff --git a/static/btwallet-api/html/_static/scripts/bootstrap.js.map b/static/btwallet-api/html/_static/scripts/bootstrap.js.map deleted file mode 100644 index e9e815891f..0000000000 --- a/static/btwallet-api/html/_static/scripts/bootstrap.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"scripts/bootstrap.js","mappings":"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","sources":["webpack://pydata_sphinx_theme/webpack/bootstrap","webpack://pydata_sphinx_theme/webpack/runtime/define property getters","webpack://pydata_sphinx_theme/webpack/runtime/hasOwnProperty shorthand","webpack://pydata_sphinx_theme/webpack/runtime/make namespace object","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/enums.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/applyStyles.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getBasePlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/math.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/userAgent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/contains.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/within.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/expandToHashMap.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/arrow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getVariation.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/computeStyles.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/eventListeners.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/rectToClientRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/computeOffsets.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/detectOverflow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/flip.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/hide.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/offset.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getAltAxis.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/orderModifiers.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/createPopper.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/debounce.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/mergeByName.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/popper.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/popper-lite.js","webpack://pydata_sphinx_theme/./node_modules/bootstrap/dist/js/bootstrap.esm.js","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/scripts/mixin.js","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/scripts/bootstrap.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n });\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref) {\n var name = _ref.name,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options,\n effect = _ref.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","/*!\n * Bootstrap v5.3.3 (https://getbootstrap.com/)\n * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\nimport * as Popper from '@popperjs/core';\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\n\nconst elementMap = new Map();\nconst Data = {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map());\n }\n const instanceMap = elementMap.get(element);\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);\n return;\n }\n instanceMap.set(key, instance);\n },\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null;\n }\n return null;\n },\n remove(element, key) {\n if (!elementMap.has(element)) {\n return;\n }\n const instanceMap = elementMap.get(element);\n instanceMap.delete(key);\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element);\n }\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1000000;\nconst MILLISECONDS_MULTIPLIER = 1000;\nconst TRANSITION_END = 'transitionend';\n\n/**\n * Properly escape IDs selectors to handle weird IDs\n * @param {string} selector\n * @returns {string}\n */\nconst parseSelector = selector => {\n if (selector && window.CSS && window.CSS.escape) {\n // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`);\n }\n return selector;\n};\n\n// Shout-out Angus Croll (https://goo.gl/pxwQGp)\nconst toType = object => {\n if (object === null || object === undefined) {\n return `${object}`;\n }\n return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase();\n};\n\n/**\n * Public Util API\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID);\n } while (document.getElementById(prefix));\n return prefix;\n};\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0;\n }\n\n // Get transition-duration of the element\n let {\n transitionDuration,\n transitionDelay\n } = window.getComputedStyle(element);\n const floatTransitionDuration = Number.parseFloat(transitionDuration);\n const floatTransitionDelay = Number.parseFloat(transitionDelay);\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0;\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0];\n transitionDelay = transitionDelay.split(',')[0];\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n};\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END));\n};\nconst isElement = object => {\n if (!object || typeof object !== 'object') {\n return false;\n }\n if (typeof object.jquery !== 'undefined') {\n object = object[0];\n }\n return typeof object.nodeType !== 'undefined';\n};\nconst getElement = object => {\n // it's a jQuery object or a node element\n if (isElement(object)) {\n return object.jquery ? object[0] : object;\n }\n if (typeof object === 'string' && object.length > 0) {\n return document.querySelector(parseSelector(object));\n }\n return null;\n};\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false;\n }\n const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible';\n // Handle `details` element as its content may falsie appear visible when it is closed\n const closedDetails = element.closest('details:not([open])');\n if (!closedDetails) {\n return elementIsVisible;\n }\n if (closedDetails !== element) {\n const summary = element.closest('summary');\n if (summary && summary.parentNode !== closedDetails) {\n return false;\n }\n if (summary === null) {\n return false;\n }\n }\n return elementIsVisible;\n};\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true;\n }\n if (element.classList.contains('disabled')) {\n return true;\n }\n if (typeof element.disabled !== 'undefined') {\n return element.disabled;\n }\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';\n};\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null;\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode();\n return root instanceof ShadowRoot ? root : null;\n }\n if (element instanceof ShadowRoot) {\n return element;\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null;\n }\n return findShadowRoot(element.parentNode);\n};\nconst noop = () => {};\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n element.offsetHeight; // eslint-disable-line no-unused-expressions\n};\nconst getjQuery = () => {\n if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return window.jQuery;\n }\n return null;\n};\nconst DOMContentLoadedCallbacks = [];\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n for (const callback of DOMContentLoadedCallbacks) {\n callback();\n }\n });\n }\n DOMContentLoadedCallbacks.push(callback);\n } else {\n callback();\n }\n};\nconst isRTL = () => document.documentElement.dir === 'rtl';\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery();\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME;\n const JQUERY_NO_CONFLICT = $.fn[name];\n $.fn[name] = plugin.jQueryInterface;\n $.fn[name].Constructor = plugin;\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT;\n return plugin.jQueryInterface;\n };\n }\n });\n};\nconst execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue;\n};\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback);\n return;\n }\n const durationPadding = 5;\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;\n let called = false;\n const handler = ({\n target\n }) => {\n if (target !== transitionElement) {\n return;\n }\n called = true;\n transitionElement.removeEventListener(TRANSITION_END, handler);\n execute(callback);\n };\n transitionElement.addEventListener(TRANSITION_END, handler);\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement);\n }\n }, emulatedDuration);\n};\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n const listLength = list.length;\n let index = list.indexOf(activeElement);\n\n // if the element does not exist in the list return an element\n // depending on the direction and if cycle is allowed\n if (index === -1) {\n return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0];\n }\n index += shouldGetNext ? 1 : -1;\n if (isCycleAllowed) {\n index = (index + listLength) % listLength;\n }\n return list[Math.max(0, Math.min(index, listLength - 1))];\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/;\nconst stripNameRegex = /\\..*/;\nconst stripUidRegex = /::\\d+$/;\nconst eventRegistry = {}; // Events storage\nlet uidEvent = 1;\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n};\nconst nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);\n\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;\n}\nfunction getElementEvents(element) {\n const uid = makeEventUid(element);\n element.uidEvent = uid;\n eventRegistry[uid] = eventRegistry[uid] || {};\n return eventRegistry[uid];\n}\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n hydrateObj(event, {\n delegateTarget: element\n });\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn);\n }\n return fn.apply(element, [event]);\n };\n}\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector);\n for (let {\n target\n } = event; target && target !== this; target = target.parentNode) {\n for (const domElement of domElements) {\n if (domElement !== target) {\n continue;\n }\n hydrateObj(event, {\n delegateTarget: target\n });\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn);\n }\n return fn.apply(target, [event]);\n }\n }\n };\n}\nfunction findHandler(events, callable, delegationSelector = null) {\n return Object.values(events).find(event => event.callable === callable && event.delegationSelector === delegationSelector);\n}\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n const isDelegated = typeof handler === 'string';\n // TODO: tooltip passes `false` instead of selector, so we need to check\n const callable = isDelegated ? delegationFunction : handler || delegationFunction;\n let typeEvent = getTypeEvent(originalTypeEvent);\n if (!nativeEvents.has(typeEvent)) {\n typeEvent = originalTypeEvent;\n }\n return [isDelegated, callable, typeEvent];\n}\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return;\n }\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (originalTypeEvent in customEvents) {\n const wrapFunction = fn => {\n return function (event) {\n if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {\n return fn.call(this, event);\n }\n };\n };\n callable = wrapFunction(callable);\n }\n const events = getElementEvents(element);\n const handlers = events[typeEvent] || (events[typeEvent] = {});\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);\n if (previousFunction) {\n previousFunction.oneOff = previousFunction.oneOff && oneOff;\n return;\n }\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''));\n const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);\n fn.delegationSelector = isDelegated ? handler : null;\n fn.callable = callable;\n fn.oneOff = oneOff;\n fn.uidEvent = uid;\n handlers[uid] = fn;\n element.addEventListener(typeEvent, fn, isDelegated);\n}\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector);\n if (!fn) {\n return;\n }\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));\n delete events[typeEvent][fn.uidEvent];\n}\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {};\n for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n if (handlerKey.includes(namespace)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n }\n }\n}\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '');\n return customEvents[event] || event;\n}\nconst EventHandler = {\n on(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, false);\n },\n one(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, true);\n },\n off(element, originalTypeEvent, handler, delegationFunction) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return;\n }\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n const inNamespace = typeEvent !== originalTypeEvent;\n const events = getElementEvents(element);\n const storeElementEvent = events[typeEvent] || {};\n const isNamespace = originalTypeEvent.startsWith('.');\n if (typeof callable !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!Object.keys(storeElementEvent).length) {\n return;\n }\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);\n return;\n }\n if (isNamespace) {\n for (const elementEvent of Object.keys(events)) {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));\n }\n }\n for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n const handlerKey = keyHandlers.replace(stripUidRegex, '');\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n }\n }\n },\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null;\n }\n const $ = getjQuery();\n const typeEvent = getTypeEvent(event);\n const inNamespace = event !== typeEvent;\n let jQueryEvent = null;\n let bubbles = true;\n let nativeDispatch = true;\n let defaultPrevented = false;\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args);\n $(element).trigger(jQueryEvent);\n bubbles = !jQueryEvent.isPropagationStopped();\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();\n defaultPrevented = jQueryEvent.isDefaultPrevented();\n }\n const evt = hydrateObj(new Event(event, {\n bubbles,\n cancelable: true\n }), args);\n if (defaultPrevented) {\n evt.preventDefault();\n }\n if (nativeDispatch) {\n element.dispatchEvent(evt);\n }\n if (evt.defaultPrevented && jQueryEvent) {\n jQueryEvent.preventDefault();\n }\n return evt;\n }\n};\nfunction hydrateObj(obj, meta = {}) {\n for (const [key, value] of Object.entries(meta)) {\n try {\n obj[key] = value;\n } catch (_unused) {\n Object.defineProperty(obj, key, {\n configurable: true,\n get() {\n return value;\n }\n });\n }\n }\n return obj;\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(value) {\n if (value === 'true') {\n return true;\n }\n if (value === 'false') {\n return false;\n }\n if (value === Number(value).toString()) {\n return Number(value);\n }\n if (value === '' || value === 'null') {\n return null;\n }\n if (typeof value !== 'string') {\n return value;\n }\n try {\n return JSON.parse(decodeURIComponent(value));\n } catch (_unused) {\n return value;\n }\n}\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);\n}\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);\n },\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);\n },\n getDataAttributes(element) {\n if (!element) {\n return {};\n }\n const attributes = {};\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'));\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '');\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);\n attributes[pureKey] = normalizeData(element.dataset[key]);\n }\n return attributes;\n },\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Class definition\n */\n\nclass Config {\n // Getters\n static get Default() {\n return {};\n }\n static get DefaultType() {\n return {};\n }\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!');\n }\n _getConfig(config) {\n config = this._mergeConfigObj(config);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n _configAfterMerge(config) {\n return config;\n }\n _mergeConfigObj(config, element) {\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {}; // try to parse\n\n return {\n ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n };\n }\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const [property, expectedTypes] of Object.entries(configTypes)) {\n const value = config[property];\n const valueType = isElement(value) ? 'element' : toType(value);\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`);\n }\n }\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst VERSION = '5.3.3';\n\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n constructor(element, config) {\n super();\n element = getElement(element);\n if (!element) {\n return;\n }\n this._element = element;\n this._config = this._getConfig(config);\n Data.set(this._element, this.constructor.DATA_KEY, this);\n }\n\n // Public\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY);\n EventHandler.off(this._element, this.constructor.EVENT_KEY);\n for (const propertyName of Object.getOwnPropertyNames(this)) {\n this[propertyName] = null;\n }\n }\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated);\n }\n _getConfig(config) {\n config = this._mergeConfigObj(config, this._element);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n\n // Static\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY);\n }\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);\n }\n static get VERSION() {\n return VERSION;\n }\n static get DATA_KEY() {\n return `bs.${this.NAME}`;\n }\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`;\n }\n static eventName(name) {\n return `${name}${this.EVENT_KEY}`;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target');\n if (!selector || selector === '#') {\n let hrefAttribute = element.getAttribute('href');\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) {\n return null;\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`;\n }\n selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null;\n }\n return selector ? selector.split(',').map(sel => parseSelector(sel)).join(',') : null;\n};\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector));\n },\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector);\n },\n children(element, selector) {\n return [].concat(...element.children).filter(child => child.matches(selector));\n },\n parents(element, selector) {\n const parents = [];\n let ancestor = element.parentNode.closest(selector);\n while (ancestor) {\n parents.push(ancestor);\n ancestor = ancestor.parentNode.closest(selector);\n }\n return parents;\n },\n prev(element, selector) {\n let previous = element.previousElementSibling;\n while (previous) {\n if (previous.matches(selector)) {\n return [previous];\n }\n previous = previous.previousElementSibling;\n }\n return [];\n },\n // TODO: this is now unused; remove later along with prev()\n next(element, selector) {\n let next = element.nextElementSibling;\n while (next) {\n if (next.matches(selector)) {\n return [next];\n }\n next = next.nextElementSibling;\n }\n return [];\n },\n focusableChildren(element) {\n const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable=\"true\"]'].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',');\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));\n },\n getSelectorFromElement(element) {\n const selector = getSelector(element);\n if (selector) {\n return SelectorEngine.findOne(selector) ? selector : null;\n }\n return null;\n },\n getElementFromSelector(element) {\n const selector = getSelector(element);\n return selector ? SelectorEngine.findOne(selector) : null;\n },\n getMultipleElementsFromSelector(element) {\n const selector = getSelector(element);\n return selector ? SelectorEngine.find(selector) : [];\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`;\n const name = component.NAME;\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n if (isDisabled(this)) {\n return;\n }\n const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`);\n const instance = component.getOrCreateInstance(target);\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]();\n });\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$f = 'alert';\nconst DATA_KEY$a = 'bs.alert';\nconst EVENT_KEY$b = `.${DATA_KEY$a}`;\nconst EVENT_CLOSE = `close${EVENT_KEY$b}`;\nconst EVENT_CLOSED = `closed${EVENT_KEY$b}`;\nconst CLASS_NAME_FADE$5 = 'fade';\nconst CLASS_NAME_SHOW$8 = 'show';\n\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME$f;\n }\n\n // Public\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);\n if (closeEvent.defaultPrevented) {\n return;\n }\n this._element.classList.remove(CLASS_NAME_SHOW$8);\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated);\n }\n\n // Private\n _destroyElement() {\n this._element.remove();\n EventHandler.trigger(this._element, EVENT_CLOSED);\n this.dispose();\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this);\n if (typeof config !== 'string') {\n return;\n }\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](this);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Alert, 'close');\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$e = 'button';\nconst DATA_KEY$9 = 'bs.button';\nconst EVENT_KEY$a = `.${DATA_KEY$9}`;\nconst DATA_API_KEY$6 = '.data-api';\nconst CLASS_NAME_ACTIVE$3 = 'active';\nconst SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle=\"button\"]';\nconst EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;\n\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME$e;\n }\n\n // Public\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3));\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this);\n if (config === 'toggle') {\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => {\n event.preventDefault();\n const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);\n const data = Button.getOrCreateInstance(button);\n data.toggle();\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/swipe.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$d = 'swipe';\nconst EVENT_KEY$9 = '.bs.swipe';\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`;\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`;\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`;\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`;\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`;\nconst POINTER_TYPE_TOUCH = 'touch';\nconst POINTER_TYPE_PEN = 'pen';\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event';\nconst SWIPE_THRESHOLD = 40;\nconst Default$c = {\n endCallback: null,\n leftCallback: null,\n rightCallback: null\n};\nconst DefaultType$c = {\n endCallback: '(function|null)',\n leftCallback: '(function|null)',\n rightCallback: '(function|null)'\n};\n\n/**\n * Class definition\n */\n\nclass Swipe extends Config {\n constructor(element, config) {\n super();\n this._element = element;\n if (!element || !Swipe.isSupported()) {\n return;\n }\n this._config = this._getConfig(config);\n this._deltaX = 0;\n this._supportPointerEvents = Boolean(window.PointerEvent);\n this._initEvents();\n }\n\n // Getters\n static get Default() {\n return Default$c;\n }\n static get DefaultType() {\n return DefaultType$c;\n }\n static get NAME() {\n return NAME$d;\n }\n\n // Public\n dispose() {\n EventHandler.off(this._element, EVENT_KEY$9);\n }\n\n // Private\n _start(event) {\n if (!this._supportPointerEvents) {\n this._deltaX = event.touches[0].clientX;\n return;\n }\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX;\n }\n }\n _end(event) {\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX - this._deltaX;\n }\n this._handleSwipe();\n execute(this._config.endCallback);\n }\n _move(event) {\n this._deltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX;\n }\n _handleSwipe() {\n const absDeltaX = Math.abs(this._deltaX);\n if (absDeltaX <= SWIPE_THRESHOLD) {\n return;\n }\n const direction = absDeltaX / this._deltaX;\n this._deltaX = 0;\n if (!direction) {\n return;\n }\n execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback);\n }\n _initEvents() {\n if (this._supportPointerEvents) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event));\n EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event));\n this._element.classList.add(CLASS_NAME_POINTER_EVENT);\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event));\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event));\n EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event));\n }\n }\n _eventIsPointerPenTouch(event) {\n return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);\n }\n\n // Static\n static isSupported() {\n return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$c = 'carousel';\nconst DATA_KEY$8 = 'bs.carousel';\nconst EVENT_KEY$8 = `.${DATA_KEY$8}`;\nconst DATA_API_KEY$5 = '.data-api';\nconst ARROW_LEFT_KEY$1 = 'ArrowLeft';\nconst ARROW_RIGHT_KEY$1 = 'ArrowRight';\nconst TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\nconst ORDER_NEXT = 'next';\nconst ORDER_PREV = 'prev';\nconst DIRECTION_LEFT = 'left';\nconst DIRECTION_RIGHT = 'right';\nconst EVENT_SLIDE = `slide${EVENT_KEY$8}`;\nconst EVENT_SLID = `slid${EVENT_KEY$8}`;\nconst EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$8}`;\nconst EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$8}`;\nconst EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$8}`;\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY$8}`;\nconst EVENT_LOAD_DATA_API$3 = `load${EVENT_KEY$8}${DATA_API_KEY$5}`;\nconst EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`;\nconst CLASS_NAME_CAROUSEL = 'carousel';\nconst CLASS_NAME_ACTIVE$2 = 'active';\nconst CLASS_NAME_SLIDE = 'slide';\nconst CLASS_NAME_END = 'carousel-item-end';\nconst CLASS_NAME_START = 'carousel-item-start';\nconst CLASS_NAME_NEXT = 'carousel-item-next';\nconst CLASS_NAME_PREV = 'carousel-item-prev';\nconst SELECTOR_ACTIVE = '.active';\nconst SELECTOR_ITEM = '.carousel-item';\nconst SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM;\nconst SELECTOR_ITEM_IMG = '.carousel-item img';\nconst SELECTOR_INDICATORS = '.carousel-indicators';\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]';\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY$1]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY$1]: DIRECTION_LEFT\n};\nconst Default$b = {\n interval: 5000,\n keyboard: true,\n pause: 'hover',\n ride: false,\n touch: true,\n wrap: true\n};\nconst DefaultType$b = {\n interval: '(number|boolean)',\n // TODO:v6 remove boolean support\n keyboard: 'boolean',\n pause: '(string|boolean)',\n ride: '(boolean|string)',\n touch: 'boolean',\n wrap: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._interval = null;\n this._activeElement = null;\n this._isSliding = false;\n this.touchTimeout = null;\n this._swipeHelper = null;\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);\n this._addEventListeners();\n if (this._config.ride === CLASS_NAME_CAROUSEL) {\n this.cycle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$b;\n }\n static get DefaultType() {\n return DefaultType$b;\n }\n static get NAME() {\n return NAME$c;\n }\n\n // Public\n next() {\n this._slide(ORDER_NEXT);\n }\n nextWhenVisible() {\n // FIXME TODO use `document.visibilityState`\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next();\n }\n }\n prev() {\n this._slide(ORDER_PREV);\n }\n pause() {\n if (this._isSliding) {\n triggerTransitionEnd(this._element);\n }\n this._clearInterval();\n }\n cycle() {\n this._clearInterval();\n this._updateInterval();\n this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval);\n }\n _maybeEnableCycle() {\n if (!this._config.ride) {\n return;\n }\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.cycle());\n return;\n }\n this.cycle();\n }\n to(index) {\n const items = this._getItems();\n if (index > items.length - 1 || index < 0) {\n return;\n }\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index));\n return;\n }\n const activeIndex = this._getItemIndex(this._getActive());\n if (activeIndex === index) {\n return;\n }\n const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;\n this._slide(order, items[index]);\n }\n dispose() {\n if (this._swipeHelper) {\n this._swipeHelper.dispose();\n }\n super.dispose();\n }\n\n // Private\n _configAfterMerge(config) {\n config.defaultInterval = config.interval;\n return config;\n }\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN$1, event => this._keydown(event));\n }\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER$1, () => this.pause());\n EventHandler.on(this._element, EVENT_MOUSELEAVE$1, () => this._maybeEnableCycle());\n }\n if (this._config.touch && Swipe.isSupported()) {\n this._addTouchEventListeners();\n }\n }\n _addTouchEventListeners() {\n for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault());\n }\n const endCallBack = () => {\n if (this._config.pause !== 'hover') {\n return;\n }\n\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause();\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout);\n }\n this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval);\n };\n const swipeConfig = {\n leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n endCallback: endCallBack\n };\n this._swipeHelper = new Swipe(this._element, swipeConfig);\n }\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return;\n }\n const direction = KEY_TO_DIRECTION[event.key];\n if (direction) {\n event.preventDefault();\n this._slide(this._directionToOrder(direction));\n }\n }\n _getItemIndex(element) {\n return this._getItems().indexOf(element);\n }\n _setActiveIndicatorElement(index) {\n if (!this._indicatorsElement) {\n return;\n }\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement);\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);\n activeIndicator.removeAttribute('aria-current');\n const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement);\n if (newActiveIndicator) {\n newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2);\n newActiveIndicator.setAttribute('aria-current', 'true');\n }\n }\n _updateInterval() {\n const element = this._activeElement || this._getActive();\n if (!element) {\n return;\n }\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);\n this._config.interval = elementInterval || this._config.defaultInterval;\n }\n _slide(order, element = null) {\n if (this._isSliding) {\n return;\n }\n const activeElement = this._getActive();\n const isNext = order === ORDER_NEXT;\n const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap);\n if (nextElement === activeElement) {\n return;\n }\n const nextElementIndex = this._getItemIndex(nextElement);\n const triggerEvent = eventName => {\n return EventHandler.trigger(this._element, eventName, {\n relatedTarget: nextElement,\n direction: this._orderToDirection(order),\n from: this._getItemIndex(activeElement),\n to: nextElementIndex\n });\n };\n const slideEvent = triggerEvent(EVENT_SLIDE);\n if (slideEvent.defaultPrevented) {\n return;\n }\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n // TODO: change tests that use empty divs to avoid this check\n return;\n }\n const isCycling = Boolean(this._interval);\n this.pause();\n this._isSliding = true;\n this._setActiveIndicatorElement(nextElementIndex);\n this._activeElement = nextElement;\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;\n nextElement.classList.add(orderClassName);\n reflow(nextElement);\n activeElement.classList.add(directionalClassName);\n nextElement.classList.add(directionalClassName);\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName);\n nextElement.classList.add(CLASS_NAME_ACTIVE$2);\n activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);\n this._isSliding = false;\n triggerEvent(EVENT_SLID);\n };\n this._queueCallback(completeCallBack, activeElement, this._isAnimated());\n if (isCycling) {\n this.cycle();\n }\n }\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_SLIDE);\n }\n _getActive() {\n return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n }\n _getItems() {\n return SelectorEngine.find(SELECTOR_ITEM, this._element);\n }\n _clearInterval() {\n if (this._interval) {\n clearInterval(this._interval);\n this._interval = null;\n }\n }\n _directionToOrder(direction) {\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;\n }\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;\n }\n _orderToDirection(order) {\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Carousel.getOrCreateInstance(this, config);\n if (typeof config === 'number') {\n data.to(config);\n return;\n }\n if (typeof config === 'string') {\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return;\n }\n event.preventDefault();\n const carousel = Carousel.getOrCreateInstance(target);\n const slideIndex = this.getAttribute('data-bs-slide-to');\n if (slideIndex) {\n carousel.to(slideIndex);\n carousel._maybeEnableCycle();\n return;\n }\n if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n carousel.next();\n carousel._maybeEnableCycle();\n return;\n }\n carousel.prev();\n carousel._maybeEnableCycle();\n});\nEventHandler.on(window, EVENT_LOAD_DATA_API$3, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);\n for (const carousel of carousels) {\n Carousel.getOrCreateInstance(carousel);\n }\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Carousel);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$b = 'collapse';\nconst DATA_KEY$7 = 'bs.collapse';\nconst EVENT_KEY$7 = `.${DATA_KEY$7}`;\nconst DATA_API_KEY$4 = '.data-api';\nconst EVENT_SHOW$6 = `show${EVENT_KEY$7}`;\nconst EVENT_SHOWN$6 = `shown${EVENT_KEY$7}`;\nconst EVENT_HIDE$6 = `hide${EVENT_KEY$7}`;\nconst EVENT_HIDDEN$6 = `hidden${EVENT_KEY$7}`;\nconst EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`;\nconst CLASS_NAME_SHOW$7 = 'show';\nconst CLASS_NAME_COLLAPSE = 'collapse';\nconst CLASS_NAME_COLLAPSING = 'collapsing';\nconst CLASS_NAME_COLLAPSED = 'collapsed';\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal';\nconst WIDTH = 'width';\nconst HEIGHT = 'height';\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';\nconst SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle=\"collapse\"]';\nconst Default$a = {\n parent: null,\n toggle: true\n};\nconst DefaultType$a = {\n parent: '(null|element)',\n toggle: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._isTransitioning = false;\n this._triggerArray = [];\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);\n for (const elem of toggleList) {\n const selector = SelectorEngine.getSelectorFromElement(elem);\n const filterElement = SelectorEngine.find(selector).filter(foundElement => foundElement === this._element);\n if (selector !== null && filterElement.length) {\n this._triggerArray.push(elem);\n }\n }\n this._initializeChildren();\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());\n }\n if (this._config.toggle) {\n this.toggle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$a;\n }\n static get DefaultType() {\n return DefaultType$a;\n }\n static get NAME() {\n return NAME$b;\n }\n\n // Public\n toggle() {\n if (this._isShown()) {\n this.hide();\n } else {\n this.show();\n }\n }\n show() {\n if (this._isTransitioning || this._isShown()) {\n return;\n }\n let activeChildren = [];\n\n // find active children\n if (this._config.parent) {\n activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element => element !== this._element).map(element => Collapse.getOrCreateInstance(element, {\n toggle: false\n }));\n }\n if (activeChildren.length && activeChildren[0]._isTransitioning) {\n return;\n }\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$6);\n if (startEvent.defaultPrevented) {\n return;\n }\n for (const activeInstance of activeChildren) {\n activeInstance.hide();\n }\n const dimension = this._getDimension();\n this._element.classList.remove(CLASS_NAME_COLLAPSE);\n this._element.classList.add(CLASS_NAME_COLLAPSING);\n this._element.style[dimension] = 0;\n this._addAriaAndCollapsedClass(this._triggerArray, true);\n this._isTransitioning = true;\n const complete = () => {\n this._isTransitioning = false;\n this._element.classList.remove(CLASS_NAME_COLLAPSING);\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n this._element.style[dimension] = '';\n EventHandler.trigger(this._element, EVENT_SHOWN$6);\n };\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n const scrollSize = `scroll${capitalizedDimension}`;\n this._queueCallback(complete, this._element, true);\n this._element.style[dimension] = `${this._element[scrollSize]}px`;\n }\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return;\n }\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$6);\n if (startEvent.defaultPrevented) {\n return;\n }\n const dimension = this._getDimension();\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;\n reflow(this._element);\n this._element.classList.add(CLASS_NAME_COLLAPSING);\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n for (const trigger of this._triggerArray) {\n const element = SelectorEngine.getElementFromSelector(trigger);\n if (element && !this._isShown(element)) {\n this._addAriaAndCollapsedClass([trigger], false);\n }\n }\n this._isTransitioning = true;\n const complete = () => {\n this._isTransitioning = false;\n this._element.classList.remove(CLASS_NAME_COLLAPSING);\n this._element.classList.add(CLASS_NAME_COLLAPSE);\n EventHandler.trigger(this._element, EVENT_HIDDEN$6);\n };\n this._element.style[dimension] = '';\n this._queueCallback(complete, this._element, true);\n }\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW$7);\n }\n\n // Private\n _configAfterMerge(config) {\n config.toggle = Boolean(config.toggle); // Coerce string values\n config.parent = getElement(config.parent);\n return config;\n }\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;\n }\n _initializeChildren() {\n if (!this._config.parent) {\n return;\n }\n const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);\n for (const element of children) {\n const selected = SelectorEngine.getElementFromSelector(element);\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected));\n }\n }\n }\n _getFirstLevelChildren(selector) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);\n // remove children if greater depth\n return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element));\n }\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return;\n }\n for (const element of triggerArray) {\n element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);\n element.setAttribute('aria-expanded', isOpen);\n }\n }\n\n // Static\n static jQueryInterface(config) {\n const _config = {};\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false;\n }\n return this.each(function () {\n const data = Collapse.getOrCreateInstance(this, _config);\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) {\n // preventDefault only for elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {\n event.preventDefault();\n }\n for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n Collapse.getOrCreateInstance(element, {\n toggle: false\n }).toggle();\n }\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Collapse);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$a = 'dropdown';\nconst DATA_KEY$6 = 'bs.dropdown';\nconst EVENT_KEY$6 = `.${DATA_KEY$6}`;\nconst DATA_API_KEY$3 = '.data-api';\nconst ESCAPE_KEY$2 = 'Escape';\nconst TAB_KEY$1 = 'Tab';\nconst ARROW_UP_KEY$1 = 'ArrowUp';\nconst ARROW_DOWN_KEY$1 = 'ArrowDown';\nconst RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button\n\nconst EVENT_HIDE$5 = `hide${EVENT_KEY$6}`;\nconst EVENT_HIDDEN$5 = `hidden${EVENT_KEY$6}`;\nconst EVENT_SHOW$5 = `show${EVENT_KEY$6}`;\nconst EVENT_SHOWN$5 = `shown${EVENT_KEY$6}`;\nconst EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst CLASS_NAME_SHOW$6 = 'show';\nconst CLASS_NAME_DROPUP = 'dropup';\nconst CLASS_NAME_DROPEND = 'dropend';\nconst CLASS_NAME_DROPSTART = 'dropstart';\nconst CLASS_NAME_DROPUP_CENTER = 'dropup-center';\nconst CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center';\nconst SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)';\nconst SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE$3}.${CLASS_NAME_SHOW$6}`;\nconst SELECTOR_MENU = '.dropdown-menu';\nconst SELECTOR_NAVBAR = '.navbar';\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav';\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';\nconst PLACEMENT_TOPCENTER = 'top';\nconst PLACEMENT_BOTTOMCENTER = 'bottom';\nconst Default$9 = {\n autoClose: true,\n boundary: 'clippingParents',\n display: 'dynamic',\n offset: [0, 2],\n popperConfig: null,\n reference: 'toggle'\n};\nconst DefaultType$9 = {\n autoClose: '(boolean|string)',\n boundary: '(string|element)',\n display: 'string',\n offset: '(array|string|function)',\n popperConfig: '(null|object|function)',\n reference: '(string|element|object)'\n};\n\n/**\n * Class definition\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._popper = null;\n this._parent = this._element.parentNode; // dropdown wrapper\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent);\n this._inNavbar = this._detectNavbar();\n }\n\n // Getters\n static get Default() {\n return Default$9;\n }\n static get DefaultType() {\n return DefaultType$9;\n }\n static get NAME() {\n return NAME$a;\n }\n\n // Public\n toggle() {\n return this._isShown() ? this.hide() : this.show();\n }\n show() {\n if (isDisabled(this._element) || this._isShown()) {\n return;\n }\n const relatedTarget = {\n relatedTarget: this._element\n };\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$5, relatedTarget);\n if (showEvent.defaultPrevented) {\n return;\n }\n this._createPopper();\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop);\n }\n }\n this._element.focus();\n this._element.setAttribute('aria-expanded', true);\n this._menu.classList.add(CLASS_NAME_SHOW$6);\n this._element.classList.add(CLASS_NAME_SHOW$6);\n EventHandler.trigger(this._element, EVENT_SHOWN$5, relatedTarget);\n }\n hide() {\n if (isDisabled(this._element) || !this._isShown()) {\n return;\n }\n const relatedTarget = {\n relatedTarget: this._element\n };\n this._completeHide(relatedTarget);\n }\n dispose() {\n if (this._popper) {\n this._popper.destroy();\n }\n super.dispose();\n }\n update() {\n this._inNavbar = this._detectNavbar();\n if (this._popper) {\n this._popper.update();\n }\n }\n\n // Private\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$5, relatedTarget);\n if (hideEvent.defaultPrevented) {\n return;\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop);\n }\n }\n if (this._popper) {\n this._popper.destroy();\n }\n this._menu.classList.remove(CLASS_NAME_SHOW$6);\n this._element.classList.remove(CLASS_NAME_SHOW$6);\n this._element.setAttribute('aria-expanded', 'false');\n Manipulator.removeDataAttribute(this._menu, 'popper');\n EventHandler.trigger(this._element, EVENT_HIDDEN$5, relatedTarget);\n }\n _getConfig(config) {\n config = super._getConfig(config);\n if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME$a.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`);\n }\n return config;\n }\n _createPopper() {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)');\n }\n let referenceElement = this._element;\n if (this._config.reference === 'parent') {\n referenceElement = this._parent;\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference);\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference;\n }\n const popperConfig = this._getPopperConfig();\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig);\n }\n _isShown() {\n return this._menu.classList.contains(CLASS_NAME_SHOW$6);\n }\n _getPlacement() {\n const parentDropdown = this._parent;\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n return PLACEMENT_TOPCENTER;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n return PLACEMENT_BOTTOMCENTER;\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;\n }\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;\n }\n _detectNavbar() {\n return this._element.closest(SELECTOR_NAVBAR) !== null;\n }\n _getOffset() {\n const {\n offset\n } = this._config;\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10));\n }\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element);\n }\n return offset;\n }\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n }, {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n };\n\n // Disable Popper if we have a static display or Dropdown is in Navbar\n if (this._inNavbar || this._config.display === 'static') {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // TODO: v6 remove\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }];\n }\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n };\n }\n _selectMenuItem({\n key,\n target\n }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element));\n if (!items.length) {\n return;\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY$1, !items.includes(target)).focus();\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n static clearMenus(event) {\n if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1) {\n return;\n }\n const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);\n for (const toggle of openToggles) {\n const context = Dropdown.getInstance(toggle);\n if (!context || context._config.autoClose === false) {\n continue;\n }\n const composedPath = event.composedPath();\n const isMenuTarget = composedPath.includes(context._menu);\n if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {\n continue;\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue;\n }\n const relatedTarget = {\n relatedTarget: context._element\n };\n if (event.type === 'click') {\n relatedTarget.clickEvent = event;\n }\n context._completeHide(relatedTarget);\n }\n }\n static dataApiKeydownHandler(event) {\n // If not an UP | DOWN | ESCAPE key => not a dropdown command\n // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n const isInput = /input|textarea/i.test(event.target.tagName);\n const isEscapeEvent = event.key === ESCAPE_KEY$2;\n const isUpOrDownEvent = [ARROW_UP_KEY$1, ARROW_DOWN_KEY$1].includes(event.key);\n if (!isUpOrDownEvent && !isEscapeEvent) {\n return;\n }\n if (isInput && !isEscapeEvent) {\n return;\n }\n event.preventDefault();\n\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3, event.delegateTarget.parentNode);\n const instance = Dropdown.getOrCreateInstance(getToggleButton);\n if (isUpOrDownEvent) {\n event.stopPropagation();\n instance.show();\n instance._selectMenuItem(event);\n return;\n }\n if (instance._isShown()) {\n // else is escape and we check if it is shown\n event.stopPropagation();\n instance.hide();\n getToggleButton.focus();\n }\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);\nEventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);\nEventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {\n event.preventDefault();\n Dropdown.getOrCreateInstance(this).toggle();\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Dropdown);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$9 = 'backdrop';\nconst CLASS_NAME_FADE$4 = 'fade';\nconst CLASS_NAME_SHOW$5 = 'show';\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME$9}`;\nconst Default$8 = {\n className: 'modal-backdrop',\n clickCallback: null,\n isAnimated: false,\n isVisible: true,\n // if false, we use the backdrop helper without adding any element to the dom\n rootElement: 'body' // give the choice to place backdrop under different elements\n};\nconst DefaultType$8 = {\n className: 'string',\n clickCallback: '(function|null)',\n isAnimated: 'boolean',\n isVisible: 'boolean',\n rootElement: '(element|string)'\n};\n\n/**\n * Class definition\n */\n\nclass Backdrop extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n this._isAppended = false;\n this._element = null;\n }\n\n // Getters\n static get Default() {\n return Default$8;\n }\n static get DefaultType() {\n return DefaultType$8;\n }\n static get NAME() {\n return NAME$9;\n }\n\n // Public\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback);\n return;\n }\n this._append();\n const element = this._getElement();\n if (this._config.isAnimated) {\n reflow(element);\n }\n element.classList.add(CLASS_NAME_SHOW$5);\n this._emulateAnimation(() => {\n execute(callback);\n });\n }\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback);\n return;\n }\n this._getElement().classList.remove(CLASS_NAME_SHOW$5);\n this._emulateAnimation(() => {\n this.dispose();\n execute(callback);\n });\n }\n dispose() {\n if (!this._isAppended) {\n return;\n }\n EventHandler.off(this._element, EVENT_MOUSEDOWN);\n this._element.remove();\n this._isAppended = false;\n }\n\n // Private\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div');\n backdrop.className = this._config.className;\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE$4);\n }\n this._element = backdrop;\n }\n return this._element;\n }\n _configAfterMerge(config) {\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement);\n return config;\n }\n _append() {\n if (this._isAppended) {\n return;\n }\n const element = this._getElement();\n this._config.rootElement.append(element);\n EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback);\n });\n this._isAppended = true;\n }\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated);\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$8 = 'focustrap';\nconst DATA_KEY$5 = 'bs.focustrap';\nconst EVENT_KEY$5 = `.${DATA_KEY$5}`;\nconst EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$5}`;\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$5}`;\nconst TAB_KEY = 'Tab';\nconst TAB_NAV_FORWARD = 'forward';\nconst TAB_NAV_BACKWARD = 'backward';\nconst Default$7 = {\n autofocus: true,\n trapElement: null // The element to trap focus inside of\n};\nconst DefaultType$7 = {\n autofocus: 'boolean',\n trapElement: 'element'\n};\n\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n this._isActive = false;\n this._lastTabNavDirection = null;\n }\n\n // Getters\n static get Default() {\n return Default$7;\n }\n static get DefaultType() {\n return DefaultType$7;\n }\n static get NAME() {\n return NAME$8;\n }\n\n // Public\n activate() {\n if (this._isActive) {\n return;\n }\n if (this._config.autofocus) {\n this._config.trapElement.focus();\n }\n EventHandler.off(document, EVENT_KEY$5); // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN$2, event => this._handleFocusin(event));\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));\n this._isActive = true;\n }\n deactivate() {\n if (!this._isActive) {\n return;\n }\n this._isActive = false;\n EventHandler.off(document, EVENT_KEY$5);\n }\n\n // Private\n _handleFocusin(event) {\n const {\n trapElement\n } = this._config;\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n return;\n }\n const elements = SelectorEngine.focusableChildren(trapElement);\n if (elements.length === 0) {\n trapElement.focus();\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus();\n } else {\n elements[0].focus();\n }\n }\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return;\n }\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';\nconst SELECTOR_STICKY_CONTENT = '.sticky-top';\nconst PROPERTY_PADDING = 'padding-right';\nconst PROPERTY_MARGIN = 'margin-right';\n\n/**\n * Class definition\n */\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body;\n }\n\n // Public\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth;\n return Math.abs(window.innerWidth - documentWidth);\n }\n hide() {\n const width = this.getWidth();\n this._disableOverFlow();\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width);\n }\n reset() {\n this._resetElementAttributes(this._element, 'overflow');\n this._resetElementAttributes(this._element, PROPERTY_PADDING);\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);\n }\n isOverflowing() {\n return this.getWidth() > 0;\n }\n\n // Private\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow');\n this._element.style.overflow = 'hidden';\n }\n _setElementAttributes(selector, styleProperty, callback) {\n const scrollbarWidth = this.getWidth();\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return;\n }\n this._saveInitialAttribute(element, styleProperty);\n const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);\n element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`);\n };\n this._applyManipulationCallback(selector, manipulationCallBack);\n }\n _saveInitialAttribute(element, styleProperty) {\n const actualValue = element.style.getPropertyValue(styleProperty);\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProperty, actualValue);\n }\n }\n _resetElementAttributes(selector, styleProperty) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProperty);\n // We only want to remove the property if the value is `null`; the value can also be zero\n if (value === null) {\n element.style.removeProperty(styleProperty);\n return;\n }\n Manipulator.removeDataAttribute(element, styleProperty);\n element.style.setProperty(styleProperty, value);\n };\n this._applyManipulationCallback(selector, manipulationCallBack);\n }\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector);\n return;\n }\n for (const sel of SelectorEngine.find(selector, this._element)) {\n callBack(sel);\n }\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$7 = 'modal';\nconst DATA_KEY$4 = 'bs.modal';\nconst EVENT_KEY$4 = `.${DATA_KEY$4}`;\nconst DATA_API_KEY$2 = '.data-api';\nconst ESCAPE_KEY$1 = 'Escape';\nconst EVENT_HIDE$4 = `hide${EVENT_KEY$4}`;\nconst EVENT_HIDE_PREVENTED$1 = `hidePrevented${EVENT_KEY$4}`;\nconst EVENT_HIDDEN$4 = `hidden${EVENT_KEY$4}`;\nconst EVENT_SHOW$4 = `show${EVENT_KEY$4}`;\nconst EVENT_SHOWN$4 = `shown${EVENT_KEY$4}`;\nconst EVENT_RESIZE$1 = `resize${EVENT_KEY$4}`;\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$4}`;\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$4}`;\nconst EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$4}`;\nconst EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$4}${DATA_API_KEY$2}`;\nconst CLASS_NAME_OPEN = 'modal-open';\nconst CLASS_NAME_FADE$3 = 'fade';\nconst CLASS_NAME_SHOW$4 = 'show';\nconst CLASS_NAME_STATIC = 'modal-static';\nconst OPEN_SELECTOR$1 = '.modal.show';\nconst SELECTOR_DIALOG = '.modal-dialog';\nconst SELECTOR_MODAL_BODY = '.modal-body';\nconst SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle=\"modal\"]';\nconst Default$6 = {\n backdrop: true,\n focus: true,\n keyboard: true\n};\nconst DefaultType$6 = {\n backdrop: '(boolean|string)',\n focus: 'boolean',\n keyboard: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);\n this._backdrop = this._initializeBackDrop();\n this._focustrap = this._initializeFocusTrap();\n this._isShown = false;\n this._isTransitioning = false;\n this._scrollBar = new ScrollBarHelper();\n this._addEventListeners();\n }\n\n // Getters\n static get Default() {\n return Default$6;\n }\n static get DefaultType() {\n return DefaultType$6;\n }\n static get NAME() {\n return NAME$7;\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget);\n }\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, {\n relatedTarget\n });\n if (showEvent.defaultPrevented) {\n return;\n }\n this._isShown = true;\n this._isTransitioning = true;\n this._scrollBar.hide();\n document.body.classList.add(CLASS_NAME_OPEN);\n this._adjustDialog();\n this._backdrop.show(() => this._showElement(relatedTarget));\n }\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4);\n if (hideEvent.defaultPrevented) {\n return;\n }\n this._isShown = false;\n this._isTransitioning = true;\n this._focustrap.deactivate();\n this._element.classList.remove(CLASS_NAME_SHOW$4);\n this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());\n }\n dispose() {\n EventHandler.off(window, EVENT_KEY$4);\n EventHandler.off(this._dialog, EVENT_KEY$4);\n this._backdrop.dispose();\n this._focustrap.deactivate();\n super.dispose();\n }\n handleUpdate() {\n this._adjustDialog();\n }\n\n // Private\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop),\n // 'static' option will be translated to true, and booleans will keep their value,\n isAnimated: this._isAnimated()\n });\n }\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n });\n }\n _showElement(relatedTarget) {\n // try to append dynamic modal\n if (!document.body.contains(this._element)) {\n document.body.append(this._element);\n }\n this._element.style.display = 'block';\n this._element.removeAttribute('aria-hidden');\n this._element.setAttribute('aria-modal', true);\n this._element.setAttribute('role', 'dialog');\n this._element.scrollTop = 0;\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);\n if (modalBody) {\n modalBody.scrollTop = 0;\n }\n reflow(this._element);\n this._element.classList.add(CLASS_NAME_SHOW$4);\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate();\n }\n this._isTransitioning = false;\n EventHandler.trigger(this._element, EVENT_SHOWN$4, {\n relatedTarget\n });\n };\n this._queueCallback(transitionComplete, this._dialog, this._isAnimated());\n }\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {\n if (event.key !== ESCAPE_KEY$1) {\n return;\n }\n if (this._config.keyboard) {\n this.hide();\n return;\n }\n this._triggerBackdropTransition();\n });\n EventHandler.on(window, EVENT_RESIZE$1, () => {\n if (this._isShown && !this._isTransitioning) {\n this._adjustDialog();\n }\n });\n EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n if (this._element !== event.target || this._element !== event2.target) {\n return;\n }\n if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition();\n return;\n }\n if (this._config.backdrop) {\n this.hide();\n }\n });\n });\n }\n _hideModal() {\n this._element.style.display = 'none';\n this._element.setAttribute('aria-hidden', true);\n this._element.removeAttribute('aria-modal');\n this._element.removeAttribute('role');\n this._isTransitioning = false;\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN);\n this._resetAdjustments();\n this._scrollBar.reset();\n EventHandler.trigger(this._element, EVENT_HIDDEN$4);\n });\n }\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE$3);\n }\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED$1);\n if (hideEvent.defaultPrevented) {\n return;\n }\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n const initialOverflowY = this._element.style.overflowY;\n // return if the following background transition hasn't yet completed\n if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n return;\n }\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden';\n }\n this._element.classList.add(CLASS_NAME_STATIC);\n this._queueCallback(() => {\n this._element.classList.remove(CLASS_NAME_STATIC);\n this._queueCallback(() => {\n this._element.style.overflowY = initialOverflowY;\n }, this._dialog);\n }, this._dialog);\n this._element.focus();\n }\n\n /**\n * The following methods are used to handle overflowing modals\n */\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n const scrollbarWidth = this._scrollBar.getWidth();\n const isBodyOverflowing = scrollbarWidth > 0;\n if (isBodyOverflowing && !isModalOverflowing) {\n const property = isRTL() ? 'paddingLeft' : 'paddingRight';\n this._element.style[property] = `${scrollbarWidth}px`;\n }\n if (!isBodyOverflowing && isModalOverflowing) {\n const property = isRTL() ? 'paddingRight' : 'paddingLeft';\n this._element.style[property] = `${scrollbarWidth}px`;\n }\n }\n _resetAdjustments() {\n this._element.style.paddingLeft = '';\n this._element.style.paddingRight = '';\n }\n\n // Static\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](relatedTarget);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n EventHandler.one(target, EVENT_SHOW$4, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return;\n }\n EventHandler.one(target, EVENT_HIDDEN$4, () => {\n if (isVisible(this)) {\n this.focus();\n }\n });\n });\n\n // avoid conflict when clicking modal toggler while another one is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1);\n if (alreadyOpen) {\n Modal.getInstance(alreadyOpen).hide();\n }\n const data = Modal.getOrCreateInstance(target);\n data.toggle(this);\n});\nenableDismissTrigger(Modal);\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Modal);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$6 = 'offcanvas';\nconst DATA_KEY$3 = 'bs.offcanvas';\nconst EVENT_KEY$3 = `.${DATA_KEY$3}`;\nconst DATA_API_KEY$1 = '.data-api';\nconst EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$3}${DATA_API_KEY$1}`;\nconst ESCAPE_KEY = 'Escape';\nconst CLASS_NAME_SHOW$3 = 'show';\nconst CLASS_NAME_SHOWING$1 = 'showing';\nconst CLASS_NAME_HIDING = 'hiding';\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop';\nconst OPEN_SELECTOR = '.offcanvas.show';\nconst EVENT_SHOW$3 = `show${EVENT_KEY$3}`;\nconst EVENT_SHOWN$3 = `shown${EVENT_KEY$3}`;\nconst EVENT_HIDE$3 = `hide${EVENT_KEY$3}`;\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$3}`;\nconst EVENT_HIDDEN$3 = `hidden${EVENT_KEY$3}`;\nconst EVENT_RESIZE = `resize${EVENT_KEY$3}`;\nconst EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$3}${DATA_API_KEY$1}`;\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$3}`;\nconst SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle=\"offcanvas\"]';\nconst Default$5 = {\n backdrop: true,\n keyboard: true,\n scroll: false\n};\nconst DefaultType$5 = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n scroll: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._isShown = false;\n this._backdrop = this._initializeBackDrop();\n this._focustrap = this._initializeFocusTrap();\n this._addEventListeners();\n }\n\n // Getters\n static get Default() {\n return Default$5;\n }\n static get DefaultType() {\n return DefaultType$5;\n }\n static get NAME() {\n return NAME$6;\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget);\n }\n show(relatedTarget) {\n if (this._isShown) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {\n relatedTarget\n });\n if (showEvent.defaultPrevented) {\n return;\n }\n this._isShown = true;\n this._backdrop.show();\n if (!this._config.scroll) {\n new ScrollBarHelper().hide();\n }\n this._element.setAttribute('aria-modal', true);\n this._element.setAttribute('role', 'dialog');\n this._element.classList.add(CLASS_NAME_SHOWING$1);\n const completeCallBack = () => {\n if (!this._config.scroll || this._config.backdrop) {\n this._focustrap.activate();\n }\n this._element.classList.add(CLASS_NAME_SHOW$3);\n this._element.classList.remove(CLASS_NAME_SHOWING$1);\n EventHandler.trigger(this._element, EVENT_SHOWN$3, {\n relatedTarget\n });\n };\n this._queueCallback(completeCallBack, this._element, true);\n }\n hide() {\n if (!this._isShown) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);\n if (hideEvent.defaultPrevented) {\n return;\n }\n this._focustrap.deactivate();\n this._element.blur();\n this._isShown = false;\n this._element.classList.add(CLASS_NAME_HIDING);\n this._backdrop.hide();\n const completeCallback = () => {\n this._element.classList.remove(CLASS_NAME_SHOW$3, CLASS_NAME_HIDING);\n this._element.removeAttribute('aria-modal');\n this._element.removeAttribute('role');\n if (!this._config.scroll) {\n new ScrollBarHelper().reset();\n }\n EventHandler.trigger(this._element, EVENT_HIDDEN$3);\n };\n this._queueCallback(completeCallback, this._element, true);\n }\n dispose() {\n this._backdrop.dispose();\n this._focustrap.deactivate();\n super.dispose();\n }\n\n // Private\n _initializeBackDrop() {\n const clickCallback = () => {\n if (this._config.backdrop === 'static') {\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n return;\n }\n this.hide();\n };\n\n // 'static' option will be translated to true, and booleans will keep their value\n const isVisible = Boolean(this._config.backdrop);\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: isVisible ? clickCallback : null\n });\n }\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n });\n }\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return;\n }\n if (this._config.keyboard) {\n this.hide();\n return;\n }\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n });\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](this);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n if (isDisabled(this)) {\n return;\n }\n EventHandler.one(target, EVENT_HIDDEN$3, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus();\n }\n });\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);\n if (alreadyOpen && alreadyOpen !== target) {\n Offcanvas.getInstance(alreadyOpen).hide();\n }\n const data = Offcanvas.getOrCreateInstance(target);\n data.toggle(this);\n});\nEventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {\n for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n Offcanvas.getOrCreateInstance(selector).show();\n }\n});\nEventHandler.on(window, EVENT_RESIZE, () => {\n for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n if (getComputedStyle(element).position !== 'fixed') {\n Offcanvas.getOrCreateInstance(element).hide();\n }\n }\n});\nenableDismissTrigger(Offcanvas);\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Offcanvas);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n// js-docs-start allow-list\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\nconst DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n dd: [],\n div: [],\n dl: [],\n dt: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n};\n// js-docs-end allow-list\n\nconst uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);\n\n/**\n * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n * contexts.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n */\n// eslint-disable-next-line unicorn/better-regex\nconst SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i;\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase();\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue));\n }\n return true;\n }\n\n // Check if a regular expression validates the attribute.\n return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName));\n};\nfunction sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n if (!unsafeHtml.length) {\n return unsafeHtml;\n }\n if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n return sanitizeFunction(unsafeHtml);\n }\n const domParser = new window.DOMParser();\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'));\n for (const element of elements) {\n const elementName = element.nodeName.toLowerCase();\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove();\n continue;\n }\n const attributeList = [].concat(...element.attributes);\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);\n for (const attribute of attributeList) {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName);\n }\n }\n }\n return createdDocument.body.innerHTML;\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/template-factory.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$5 = 'TemplateFactory';\nconst Default$4 = {\n allowList: DefaultAllowlist,\n content: {},\n // { selector : text , selector2 : text2 , }\n extraClass: '',\n html: false,\n sanitize: true,\n sanitizeFn: null,\n template: '
    '\n};\nconst DefaultType$4 = {\n allowList: 'object',\n content: 'object',\n extraClass: '(string|function)',\n html: 'boolean',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n template: 'string'\n};\nconst DefaultContentType = {\n entry: '(string|element|function|null)',\n selector: '(string|element)'\n};\n\n/**\n * Class definition\n */\n\nclass TemplateFactory extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n }\n\n // Getters\n static get Default() {\n return Default$4;\n }\n static get DefaultType() {\n return DefaultType$4;\n }\n static get NAME() {\n return NAME$5;\n }\n\n // Public\n getContent() {\n return Object.values(this._config.content).map(config => this._resolvePossibleFunction(config)).filter(Boolean);\n }\n hasContent() {\n return this.getContent().length > 0;\n }\n changeContent(content) {\n this._checkContent(content);\n this._config.content = {\n ...this._config.content,\n ...content\n };\n return this;\n }\n toHtml() {\n const templateWrapper = document.createElement('div');\n templateWrapper.innerHTML = this._maybeSanitize(this._config.template);\n for (const [selector, text] of Object.entries(this._config.content)) {\n this._setContent(templateWrapper, text, selector);\n }\n const template = templateWrapper.children[0];\n const extraClass = this._resolvePossibleFunction(this._config.extraClass);\n if (extraClass) {\n template.classList.add(...extraClass.split(' '));\n }\n return template;\n }\n\n // Private\n _typeCheckConfig(config) {\n super._typeCheckConfig(config);\n this._checkContent(config.content);\n }\n _checkContent(arg) {\n for (const [selector, content] of Object.entries(arg)) {\n super._typeCheckConfig({\n selector,\n entry: content\n }, DefaultContentType);\n }\n }\n _setContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template);\n if (!templateElement) {\n return;\n }\n content = this._resolvePossibleFunction(content);\n if (!content) {\n templateElement.remove();\n return;\n }\n if (isElement(content)) {\n this._putElementInTemplate(getElement(content), templateElement);\n return;\n }\n if (this._config.html) {\n templateElement.innerHTML = this._maybeSanitize(content);\n return;\n }\n templateElement.textContent = content;\n }\n _maybeSanitize(arg) {\n return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg;\n }\n _resolvePossibleFunction(arg) {\n return execute(arg, [this]);\n }\n _putElementInTemplate(element, templateElement) {\n if (this._config.html) {\n templateElement.innerHTML = '';\n templateElement.append(element);\n return;\n }\n templateElement.textContent = element.textContent;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$4 = 'tooltip';\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);\nconst CLASS_NAME_FADE$2 = 'fade';\nconst CLASS_NAME_MODAL = 'modal';\nconst CLASS_NAME_SHOW$2 = 'show';\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner';\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;\nconst EVENT_MODAL_HIDE = 'hide.bs.modal';\nconst TRIGGER_HOVER = 'hover';\nconst TRIGGER_FOCUS = 'focus';\nconst TRIGGER_CLICK = 'click';\nconst TRIGGER_MANUAL = 'manual';\nconst EVENT_HIDE$2 = 'hide';\nconst EVENT_HIDDEN$2 = 'hidden';\nconst EVENT_SHOW$2 = 'show';\nconst EVENT_SHOWN$2 = 'shown';\nconst EVENT_INSERTED = 'inserted';\nconst EVENT_CLICK$1 = 'click';\nconst EVENT_FOCUSIN$1 = 'focusin';\nconst EVENT_FOCUSOUT$1 = 'focusout';\nconst EVENT_MOUSEENTER = 'mouseenter';\nconst EVENT_MOUSELEAVE = 'mouseleave';\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n};\nconst Default$3 = {\n allowList: DefaultAllowlist,\n animation: true,\n boundary: 'clippingParents',\n container: false,\n customClass: '',\n delay: 0,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n html: false,\n offset: [0, 6],\n placement: 'top',\n popperConfig: null,\n sanitize: true,\n sanitizeFn: null,\n selector: false,\n template: '
    ' + '
    ' + '
    ' + '
    ',\n title: '',\n trigger: 'hover focus'\n};\nconst DefaultType$3 = {\n allowList: 'object',\n animation: 'boolean',\n boundary: '(string|element)',\n container: '(string|element|boolean)',\n customClass: '(string|function)',\n delay: '(number|object)',\n fallbackPlacements: 'array',\n html: 'boolean',\n offset: '(array|string|function)',\n placement: '(string|function)',\n popperConfig: '(null|object|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n selector: '(string|boolean)',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string'\n};\n\n/**\n * Class definition\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)');\n }\n super(element, config);\n\n // Private\n this._isEnabled = true;\n this._timeout = 0;\n this._isHovered = null;\n this._activeTrigger = {};\n this._popper = null;\n this._templateFactory = null;\n this._newContent = null;\n\n // Protected\n this.tip = null;\n this._setListeners();\n if (!this._config.selector) {\n this._fixTitle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$3;\n }\n static get DefaultType() {\n return DefaultType$3;\n }\n static get NAME() {\n return NAME$4;\n }\n\n // Public\n enable() {\n this._isEnabled = true;\n }\n disable() {\n this._isEnabled = false;\n }\n toggleEnabled() {\n this._isEnabled = !this._isEnabled;\n }\n toggle() {\n if (!this._isEnabled) {\n return;\n }\n this._activeTrigger.click = !this._activeTrigger.click;\n if (this._isShown()) {\n this._leave();\n return;\n }\n this._enter();\n }\n dispose() {\n clearTimeout(this._timeout);\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n if (this._element.getAttribute('data-bs-original-title')) {\n this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'));\n }\n this._disposePopper();\n super.dispose();\n }\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements');\n }\n if (!(this._isWithContent() && this._isEnabled)) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW$2));\n const shadowRoot = findShadowRoot(this._element);\n const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element);\n if (showEvent.defaultPrevented || !isInTheDom) {\n return;\n }\n\n // TODO: v6 remove this or make it optional\n this._disposePopper();\n const tip = this._getTipElement();\n this._element.setAttribute('aria-describedby', tip.getAttribute('id'));\n const {\n container\n } = this._config;\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip);\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));\n }\n this._popper = this._createPopper(tip);\n tip.classList.add(CLASS_NAME_SHOW$2);\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop);\n }\n }\n const complete = () => {\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN$2));\n if (this._isHovered === false) {\n this._leave();\n }\n this._isHovered = false;\n };\n this._queueCallback(complete, this.tip, this._isAnimated());\n }\n hide() {\n if (!this._isShown()) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE$2));\n if (hideEvent.defaultPrevented) {\n return;\n }\n const tip = this._getTipElement();\n tip.classList.remove(CLASS_NAME_SHOW$2);\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop);\n }\n }\n this._activeTrigger[TRIGGER_CLICK] = false;\n this._activeTrigger[TRIGGER_FOCUS] = false;\n this._activeTrigger[TRIGGER_HOVER] = false;\n this._isHovered = null; // it is a trick to support manual triggering\n\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return;\n }\n if (!this._isHovered) {\n this._disposePopper();\n }\n this._element.removeAttribute('aria-describedby');\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN$2));\n };\n this._queueCallback(complete, this.tip, this._isAnimated());\n }\n update() {\n if (this._popper) {\n this._popper.update();\n }\n }\n\n // Protected\n _isWithContent() {\n return Boolean(this._getTitle());\n }\n _getTipElement() {\n if (!this.tip) {\n this.tip = this._createTipElement(this._newContent || this._getContentForTemplate());\n }\n return this.tip;\n }\n _createTipElement(content) {\n const tip = this._getTemplateFactory(content).toHtml();\n\n // TODO: remove this check in v6\n if (!tip) {\n return null;\n }\n tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);\n // TODO: v6 the following can be achieved with CSS only\n tip.classList.add(`bs-${this.constructor.NAME}-auto`);\n const tipId = getUID(this.constructor.NAME).toString();\n tip.setAttribute('id', tipId);\n if (this._isAnimated()) {\n tip.classList.add(CLASS_NAME_FADE$2);\n }\n return tip;\n }\n setContent(content) {\n this._newContent = content;\n if (this._isShown()) {\n this._disposePopper();\n this.show();\n }\n }\n _getTemplateFactory(content) {\n if (this._templateFactory) {\n this._templateFactory.changeContent(content);\n } else {\n this._templateFactory = new TemplateFactory({\n ...this._config,\n // the `content` var has to be after `this._config`\n // to override config.content in case of popover\n content,\n extraClass: this._resolvePossibleFunction(this._config.customClass)\n });\n }\n return this._templateFactory;\n }\n _getContentForTemplate() {\n return {\n [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n };\n }\n _getTitle() {\n return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title');\n }\n\n // Private\n _initializeOnDelegatedTarget(event) {\n return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());\n }\n _isAnimated() {\n return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE$2);\n }\n _isShown() {\n return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW$2);\n }\n _createPopper(tip) {\n const placement = execute(this._config.placement, [this, tip, this._element]);\n const attachment = AttachmentMap[placement.toUpperCase()];\n return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment));\n }\n _getOffset() {\n const {\n offset\n } = this._config;\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10));\n }\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element);\n }\n return offset;\n }\n _resolvePossibleFunction(arg) {\n return execute(arg, [this._element]);\n }\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [{\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n }, {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }, {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n }, {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n }, {\n name: 'preSetPlacement',\n enabled: true,\n phase: 'beforeMain',\n fn: data => {\n // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n this._getTipElement().setAttribute('data-popper-placement', data.state.placement);\n }\n }]\n };\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n };\n }\n _setListeners() {\n const triggers = this._config.trigger.split(' ');\n for (const trigger of triggers) {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context.toggle();\n });\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN$1);\n const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT$1);\n EventHandler.on(this._element, eventIn, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;\n context._enter();\n });\n EventHandler.on(this._element, eventOut, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);\n context._leave();\n });\n }\n }\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide();\n }\n };\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n }\n _fixTitle() {\n const title = this._element.getAttribute('title');\n if (!title) {\n return;\n }\n if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n this._element.setAttribute('aria-label', title);\n }\n this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility\n this._element.removeAttribute('title');\n }\n _enter() {\n if (this._isShown() || this._isHovered) {\n this._isHovered = true;\n return;\n }\n this._isHovered = true;\n this._setTimeout(() => {\n if (this._isHovered) {\n this.show();\n }\n }, this._config.delay.show);\n }\n _leave() {\n if (this._isWithActiveTrigger()) {\n return;\n }\n this._isHovered = false;\n this._setTimeout(() => {\n if (!this._isHovered) {\n this.hide();\n }\n }, this._config.delay.hide);\n }\n _setTimeout(handler, timeout) {\n clearTimeout(this._timeout);\n this._timeout = setTimeout(handler, timeout);\n }\n _isWithActiveTrigger() {\n return Object.values(this._activeTrigger).includes(true);\n }\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element);\n for (const dataAttribute of Object.keys(dataAttributes)) {\n if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n delete dataAttributes[dataAttribute];\n }\n }\n config = {\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n };\n config = this._mergeConfigObj(config);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n _configAfterMerge(config) {\n config.container = config.container === false ? document.body : getElement(config.container);\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n };\n }\n if (typeof config.title === 'number') {\n config.title = config.title.toString();\n }\n if (typeof config.content === 'number') {\n config.content = config.content.toString();\n }\n return config;\n }\n _getDelegateConfig() {\n const config = {};\n for (const [key, value] of Object.entries(this._config)) {\n if (this.constructor.Default[key] !== value) {\n config[key] = value;\n }\n }\n config.selector = false;\n config.trigger = 'manual';\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config;\n }\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy();\n this._popper = null;\n }\n if (this.tip) {\n this.tip.remove();\n this.tip = null;\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tooltip);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$3 = 'popover';\nconst SELECTOR_TITLE = '.popover-header';\nconst SELECTOR_CONTENT = '.popover-body';\nconst Default$2 = {\n ...Tooltip.Default,\n content: '',\n offset: [0, 8],\n placement: 'right',\n template: '
    ' + '
    ' + '

    ' + '
    ' + '
    ',\n trigger: 'click'\n};\nconst DefaultType$2 = {\n ...Tooltip.DefaultType,\n content: '(null|string|element|function)'\n};\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n // Getters\n static get Default() {\n return Default$2;\n }\n static get DefaultType() {\n return DefaultType$2;\n }\n static get NAME() {\n return NAME$3;\n }\n\n // Overrides\n _isWithContent() {\n return this._getTitle() || this._getContent();\n }\n\n // Private\n _getContentForTemplate() {\n return {\n [SELECTOR_TITLE]: this._getTitle(),\n [SELECTOR_CONTENT]: this._getContent()\n };\n }\n _getContent() {\n return this._resolvePossibleFunction(this._config.content);\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Popover);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$2 = 'scrollspy';\nconst DATA_KEY$2 = 'bs.scrollspy';\nconst EVENT_KEY$2 = `.${DATA_KEY$2}`;\nconst DATA_API_KEY = '.data-api';\nconst EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;\nconst EVENT_CLICK = `click${EVENT_KEY$2}`;\nconst EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$2}${DATA_API_KEY}`;\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';\nconst CLASS_NAME_ACTIVE$1 = 'active';\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]';\nconst SELECTOR_TARGET_LINKS = '[href]';\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';\nconst SELECTOR_NAV_LINKS = '.nav-link';\nconst SELECTOR_NAV_ITEMS = '.nav-item';\nconst SELECTOR_LIST_ITEMS = '.list-group-item';\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`;\nconst SELECTOR_DROPDOWN = '.dropdown';\nconst SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';\nconst Default$1 = {\n offset: null,\n // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: '0px 0px -25%',\n smoothScroll: false,\n target: null,\n threshold: [0.1, 0.5, 1]\n};\nconst DefaultType$1 = {\n offset: '(number|null)',\n // TODO v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: 'string',\n smoothScroll: 'boolean',\n target: 'element',\n threshold: 'array'\n};\n\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n\n // this._element is the observablesContainer and config.target the menu links wrapper\n this._targetLinks = new Map();\n this._observableSections = new Map();\n this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element;\n this._activeTarget = null;\n this._observer = null;\n this._previousScrollData = {\n visibleEntryTop: 0,\n parentScrollTop: 0\n };\n this.refresh(); // initialize\n }\n\n // Getters\n static get Default() {\n return Default$1;\n }\n static get DefaultType() {\n return DefaultType$1;\n }\n static get NAME() {\n return NAME$2;\n }\n\n // Public\n refresh() {\n this._initializeTargetsAndObservables();\n this._maybeEnableSmoothScroll();\n if (this._observer) {\n this._observer.disconnect();\n } else {\n this._observer = this._getNewObserver();\n }\n for (const section of this._observableSections.values()) {\n this._observer.observe(section);\n }\n }\n dispose() {\n this._observer.disconnect();\n super.dispose();\n }\n\n // Private\n _configAfterMerge(config) {\n // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n config.target = getElement(config.target) || document.body;\n\n // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin;\n if (typeof config.threshold === 'string') {\n config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value));\n }\n return config;\n }\n _maybeEnableSmoothScroll() {\n if (!this._config.smoothScroll) {\n return;\n }\n\n // unregister any previous listeners\n EventHandler.off(this._config.target, EVENT_CLICK);\n EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n const observableSection = this._observableSections.get(event.target.hash);\n if (observableSection) {\n event.preventDefault();\n const root = this._rootElement || window;\n const height = observableSection.offsetTop - this._element.offsetTop;\n if (root.scrollTo) {\n root.scrollTo({\n top: height,\n behavior: 'smooth'\n });\n return;\n }\n\n // Chrome 60 doesn't support `scrollTo`\n root.scrollTop = height;\n }\n });\n }\n _getNewObserver() {\n const options = {\n root: this._rootElement,\n threshold: this._config.threshold,\n rootMargin: this._config.rootMargin\n };\n return new IntersectionObserver(entries => this._observerCallback(entries), options);\n }\n\n // The logic of selection\n _observerCallback(entries) {\n const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`);\n const activate = entry => {\n this._previousScrollData.visibleEntryTop = entry.target.offsetTop;\n this._process(targetElement(entry));\n };\n const parentScrollTop = (this._rootElement || document.documentElement).scrollTop;\n const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;\n this._previousScrollData.parentScrollTop = parentScrollTop;\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n this._activeTarget = null;\n this._clearActiveClass(targetElement(entry));\n continue;\n }\n const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop;\n // if we are scrolling down, pick the bigger offsetTop\n if (userScrollsDown && entryIsLowerThanPrevious) {\n activate(entry);\n // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n if (!parentScrollTop) {\n return;\n }\n continue;\n }\n\n // if we are scrolling up, pick the smallest offsetTop\n if (!userScrollsDown && !entryIsLowerThanPrevious) {\n activate(entry);\n }\n }\n }\n _initializeTargetsAndObservables() {\n this._targetLinks = new Map();\n this._observableSections = new Map();\n const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target);\n for (const anchor of targetLinks) {\n // ensure that the anchor has an id and is not disabled\n if (!anchor.hash || isDisabled(anchor)) {\n continue;\n }\n const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element);\n\n // ensure that the observableSection exists & is visible\n if (isVisible(observableSection)) {\n this._targetLinks.set(decodeURI(anchor.hash), anchor);\n this._observableSections.set(anchor.hash, observableSection);\n }\n }\n }\n _process(target) {\n if (this._activeTarget === target) {\n return;\n }\n this._clearActiveClass(this._config.target);\n this._activeTarget = target;\n target.classList.add(CLASS_NAME_ACTIVE$1);\n this._activateParents(target);\n EventHandler.trigger(this._element, EVENT_ACTIVATE, {\n relatedTarget: target\n });\n }\n _activateParents(target) {\n // Activate dropdown parents\n if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1);\n return;\n }\n for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n // Set triggered links parents as active\n // With both
      and