diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..20e2a31 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,11 @@ +**/node_modules +__pycache__ +*.pyc +*.pyo +*.pyd +.env* +db.sqlite3 +db.sqlite3-journal +*.log +v2ray-core +xray-core \ No newline at end of file diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..b76a1fa --- /dev/null +++ b/.env.example @@ -0,0 +1,50 @@ +UVICORN_HOST = "0.0.0.0" +UVICORN_PORT = 8000 + + +## We highly recommend add admin using `marzban cli` tool and do not use +## the following variables which is somehow hard codded infrmation. +# SUDO_USERNAME = "admin" +# SUDO_PASSWORD = "admin" + +# UVICORN_UDS: "/run/marzban.socket" +# UVICORN_SSL_CERTFILE = "/var/lib/marzban/certs/example.com/fullchain.pem" +# UVICORN_SSL_KEYFILE = "/var/lib/marzban/certs/example.com/key.pem" + + +# XRAY_JSON = "xray_config.json" +# XRAY_SUBSCRIPTION_URL_PREFIX = "https://example.com" +# XRAY_SUBSCRIPTION_PATH = sub +# XRAY_EXECUTABLE_PATH = "/usr/local/bin/xray" +# XRAY_ASSETS_PATH = "/usr/local/share/xray" +# XRAY_EXCLUDE_INBOUND_TAGS = "INBOUND_X INBOUND_Y" +# XRAY_FALLBACKS_INBOUND_TAG = "INBOUND_X" + + +# TELEGRAM_API_TOKEN = 123456789:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# TELEGRAM_ADMIN_ID = 987654321, 123456789 +# TELEGRAM_LOGGER_CHANNEL_ID = -1234567890123 +# TELEGRAM_DEFAULT_VLESS_FLOW = "xtls-rprx-vision" +# TELEGRAM_PROXY_URL = "http://localhost:8080" + +# DISCORD_WEBHOOK_URL = "https://discord.com/api/webhooks/xxxxxxx" + +# CUSTOM_TEMPLATES_DIRECTORY="/var/lib/marzban/templates/" +# CLASH_SUBSCRIPTION_TEMPLATE="clash/my-custom-template.yml" +# SUBSCRIPTION_PAGE_TEMPLATE="subscription/index.html" +# HOME_PAGE_TEMPLATE="home/index.html" + +# Set headers for subscription +# SUB_PROFILE_TITLE = "Susbcription" +# SUB_SUPPORT_URL = "https://t.me/support" +# SUB_UPDATE_INTERVAL = "12" + +# SQLALCHEMY_DATABASE_URL = "sqlite:///db.sqlite3" + +### for developers +# DOCS=true +# DEBUG=true +# WEBHOOK_ADDRESS = "http://127.0.0.1:9000/" +# WEBHOOK_SECRET = "something-very-very-secret" +# VITE_BASE_API="https://example.com/api/" +# JWT_ACCESS_TOKEN_EXPIRE_MINUTES = 1440 diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..d349818 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,33 @@ +--- +name: Bug report +about: Create a report to help us improve +title: Bug title +labels: bug +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Machine details (please complete the following information):** + - OS: [e.g. ubuntu 20] +- Python version: [e.g 3.8] +- Nodejs version: [e.g 16.17] +- Browser [e.g. chrome, safari] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..6819cf2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: Feature title +labels: enhancement +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..ea4f204 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,44 @@ +name: Build + +on: + push: + tags: + - 'v*.*.*' + +jobs: + build-docker-image: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Login to GitHub Container Registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push + uses: docker/build-push-action@v3 + with: + context: . + platforms: linux/amd64,linux/arm64 + push: true + tags: | + gozargah/marzban:latest + gozargah/marzban:${{github.ref_name}} + ghcr.io/gozargah/marzban:latest + ghcr.io/gozargah/marzban:${{github.ref_name}} diff --git a/.github/workflows/pylint.yml b/.github/workflows/pylint.yml new file mode 100644 index 0000000..e44f0a7 --- /dev/null +++ b/.github/workflows/pylint.yml @@ -0,0 +1,24 @@ +name: Pylint + +on: [push] + +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.8", "3.9", "3.10"] + steps: + - uses: actions/checkout@v3 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v3 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install pylint + pip install -r requirements.txt + - name: Analysing the code with pylint + run: | + pylint $(git ls-files '*.py') diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f9f7327 --- /dev/null +++ b/.gitignore @@ -0,0 +1,198 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +*.sqlite* + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.venv +venv/ +venv.bak/ +.vscode/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +.idea/ + +.env +v2ray-core +xray-core + +# don't track custom/dev.json/yaml/yml configs, such as xray-custom.json or clash-dev.yaml +*-custom.json +*-custom.yaml +*-custom.yml +*-dev.json +*-dev.yml +*-dev.yaml +*-debug.* + +# Python virtual environment +bin +pyvenv.cfg +lib64 +include/site/python3.11/greenlet +share/man/man1 + +# Frontend + +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +.env + +stats.html +yarn.lock + +app/dashboard/build/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..79150ff --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,68 @@ +# Contribute to Marzban +Thanks for considering contributing to Marzban! + +## Questions + +Please don't ask your questions in issues. Instead, use one of the following ways to ask: +- Ask on our telegram group: [@Gozargah_Marzban](https://t.me/gozargah_marzban) +- Ask on our [GitHub Discussions](https://github.com/gozargah/marzban/discussions) for long term discussion or larger questions. + + +## Reporting issues + +Include the following information in your post: +- Describe what you expected to happen. +- Describe what actually happened. Include server logs or any error that browser shows. +- If possible, post your xray json config file and what you have set in env (by censoring critical information). +- Also tell the version of Marzban, Xray and docker (if you use docker) you are using. + + +# Submitting a Pull Request +If there is not an open issue for what you want to submit, prefer opening one for discussion before working on a PR. You can work on any issue that doesn't have an open PR linked to it or a maintainer assigned to it. These show up in the sidebar. No need to ask if you can work on an issue that interests you. + +## Branches +When starting development on this project, please make sure to create a new branch off the `dev` branch. This helps to keep the `master` branch stable and free of any development work that may not be complete or fully tested. + +## Project Structure +``` +. +├── app # Backend code (FastAPI - Python) +│ └── dashboard # Frontend code (React - Typescript) +├── cli # CLI code (Typer - Python) +└── xray_api # Client of Xray's gRPC API +``` + +## Backend +Backend is built using FastAPI and uses SQLAlchemy as the ORM for database operations. All Pydantic models can be found in the `app/models` directory, while all database-related operations and models are in the `app/db` directory. The migration scripts for the database (Alembic) can be found in the `app/db/migrations` directory. + +### Python Code Formatting +To maintain consistency in the codebase, we require all code to be formatted using +```bash +autopep8 --max-line-length 120 +``` + +## Frontend +Frontend is pre-built and served by FastAPI from the `app/dashboard/build` directory. To rebuild the frontend, first make sure you have the necessary dependencies installed by running `npm install` in the `app/dashboard` directory. Then, simply remove the `app/dashboard/build` directory and run the Python code again, and it will rebuild the frontend automatically. + +### Components Library +Frontend uses `Chakra-UI` as the component library, so please adhere to the Chakra-UI approach when contributing. Strive to create components that are cohesive and serve a single purpose. Keep in mind that readability and maintainability are more important than brevity, so prioritize those factors when writing your code. + +## Marzban CLI +Marzban CLI is built using [Typer](https://typer.tiangolo.com/), and its commands' code can be found in `cli` directory. Its documentation is generated using [Typer CLI](https://typer.tiangolo.com/typer-cli/) which can be re-generated by navigating to project's root directory and running the following command: + +```bash +$ PYTHONPATH=$(pwd) typer marzban-cli.py utils docs --name "marzban-cli" --output ./cli/README.md +``` + +## Debug Mode +To run the project in debug mode with auto-reload, you can set the environment variable `DEBUG` to `true`. then by running the `main.py`, the backend and frontend will run separately on different ports. + +Note that you must first install the necessary npm packages by running npm install inside the app/dashboard directory before running in debug mode. +```bash +cd app/dashboard +npm install +cd ../.. +``` + +If you run the project with debug mode off and delete the `app/dashboard/build` directory, the frontend will be rebuilt automatically on the next run. However, no rebuild will occur while inside debug mode." + diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..c5439b2 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,24 @@ +FROM python:3.10-slim + +ENV PYTHONUNBUFFERED 1 + +WORKDIR /code + +RUN apt-get update \ + && apt-get install -y curl unzip gcc python3-dev \ + && rm -rf /var/lib/apt/lists/* + +RUN bash -c "$(curl -L https://github.com/Gozargah/Marzban-scripts/raw/master/install_latest_xray.sh)" + +COPY ./requirements.txt /code/ +RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt + +COPY . /code + +RUN apt-get remove -y curl unzip gcc python3-dev + +RUN ln -s /code/marzban-cli.py /usr/bin/marzban-cli \ + && chmod +x /usr/bin/marzban-cli \ + && marzban-cli completion install --shell bash + +CMD ["bash", "-c", "alembic upgrade head; python main.py"] \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..425d087 --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 21 January 2023 + + Copyright (C) 2023 Gozargah organization. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/README-fa.md b/README-fa.md new file mode 100755 index 0000000..b92fe62 --- /dev/null +++ b/README-fa.md @@ -0,0 +1,370 @@ +

+ + + + + + +

+ +

مرزبان

+ +

+ راه حل یکپارچه برای مدیریت پروتکل های مختلف. قدرت گرفته از Xray +

+ +
+

+ + + + + + + + + + + + + + + + + + +

+ +

+ + English + + / + + فارسی + + / + + 简体中文 + + / + + Русский + +

+ +

+ + Elk screenshots + +

+ + +## فهرست مطالب +- [بررسی اجمالی](#بررسی-اجمالی) + - [چرا مرزبان؟](#چرا-مرزبان) + - [امکانات](#امکانات) +- [راهنمای نصب](#راهنمای-نصب) +- [تنظیمات](#تنظیمات) +- [استفاده از API](#استفاده-از-api) +- [پشتیبان گیری از مرزبان](#پشتیبان-گیری-از-مرزبان) +- [ربات تلگرام](#ربات-تلگرام) +- [رابط خط فرمان (CLI) مرزبان](#رابط-خط-فرمان-cli-مرزبان) +- [ارسال اعلان‌ها به آدرس وبهوک](#ارسال-اعلانها-به-آدرس-وبهوک) +- [کمک مالی](#کمک-مالی) +- [لایسنس](#لایسنس) +- [مشارکت در توسعه](#مشارکت-در-توسعه) + + +# بررسی اجمالی + +مرزبان یک نرم افزار (وب اپلیکیشن) مدیریت پروکسی است که امکان مدیریت چند صد حساب پروکسی را با قدرت و دسترسی بالا فراهم میکند. مرزبان از [Xray-core](https://github.com/XTLS/Xray-core) قدرت گرفته و با Python و React پیاده سازی شده است. + +## چرا مرزبان؟ + +مرزبان دارای یک رابط کاربری ساده است که قابلیت های زیادی دارد. مرزبان امکان ایجاد چند نوع پروکسی برای کاربر ها را فراهم میکند بدون اینکه به تنظیمات پیچیده ای نیاز داشته باشید. به کمک رابط کاربری تحت وب مرزبان، شما میتوانید کاربران را مانیتور، ویرایش و در صورت نیاز، محدود کنید. + +### امکانات + +- **رابط کاربری تحت وب** آماده +- به صورت **REST API** پیاده سازی شده +- پشتیبانی از پروتکل های **Vmess**, **VLESS**, **Trojan** و **Shadowsocks** +- امکان فعالسازی **چندین پروتکل** برای هر یوزر +- امکان ساخت **چندین کاربر** بر روی یک inbound +- پشتیبانی از **چندین inbound** بر روی **یک port** (به کمک fallbacks) +- محدودیت بر اساس مصرف **ترافیک** و **تاریخ انقضا** +- محدودیت **ترافیک دوره ای** (به عنوان مثال روزانه، هفتگی و غیره) +- پشتیبانی از **Subscription link** سازگار با **V2ray** _(مثل نرم افزار های V2RayNG, OneClick, Nekoray و...)_ و **Clash** +- ساخت **لینک اشتراک گذاری** و **QRcode** به صورت خودکار +- مانیتورینگ منابع سرور و **مصرف ترافیک** +- پشتیبانی از تنظیمات xray +- پشتیبانی از **TLS** +- **ربات تلگرام** +- **رابط خط فرمان (CLI)** داخلی +- قابلیت ایجاد **چندین مدیر** (تکمیل نشده است) + +# راهنمای نصب + +برای نصب کافیه دستور زیر رو اجرا کنید + +```bash +sudo bash -c "$(curl -sL https://github.com/Gozargah/Marzban-scripts/raw/master/marzban.sh)" @ install +``` + +وقتی نصب تمام شد: + +- شما لاگ های مرزبان رو مشاهده میکنید که می‌توانید با بستن ترمینال یا فشار دادن `Ctrl+C` از آن خارج شوید +- فایل های مرزبان در پوشه `/opt/marzban` قرار می‌گیرند +- فایل تنظیمات در مسیر `/opt/marzban/.env` قرار می‌گیرد ([تنظیمات](#تنظیمات) را مشاهده کنید) +- فایل های مهم (اطلاعات) مرزبان در مسیر `/usr/lib/marzban` قرار می‌گیرند +- شما از طریق آدرس `http://YOUR_SERVER_IP:8000/dashboard/` می‌توانید وارد داشبورد مرزبان شوید (YOUR_SERVER_IP را با آیپی سرور خود عوض کنید) + +در مرحله بعد, باید یک ادمین سودو بسازید + +```bash +marzban cli admin create --sudo +``` + +تمام! حالا با این اطلاعات می‌توانید وارد مرزبان شوید + +برای مشاهده راهنمای اسکریپت مرزبان دستور زیر را اجرا کنید + +```bash +marzban --help +``` + +اگر مشتاق هستید که مرزبان رو با پایتون و به صورت دستی اجرا کنید، مراحل زیر را مشاهده کنید +
+

نصب به صورت دستی (پیچیده)

+ +لطفا xray را نصب کنید. +شما میتواند به کمک [Xray-install](https://github.com/XTLS/Xray-install) این کار را انجام دهید. + +```bash +bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install +``` + +پروژه را clone کنید و dependency ها را نصب کنید. دقت کنید که نسخه پایتون شما Python>=3.8 باشد. + +```bash +git clone https://github.com/Gozargah/Marzban.git +cd Marzban +wget -qO- https://bootstrap.pypa.io/get-pip.py | python3 - +python3 -m pip install -r requirements.txt +``` + +همچنین میتواند از , [Python Virtualenv](https://pypi.org/project/virtualenv/) هم استفاده کنید. + +سپس کامند زیر را اجرا کنید تا دیتابیس تنظیم شود. + +```bash +alembic upgrade head +``` + +اگر می خواهید از `marzban-cli` استفاده کنید، باید آن را به یک فایل در `$PATH` خود لینک و قابل اجرا (executable) کنید. سپس تکمیل خودکار (auto-completion) آن را نصب کنید: + +```bash +sudo ln -s $(pwd)/marzban-cli.py /usr/bin/marzban-cli +sudo chmod +x /usr/bin/marzban-cli +marzban-cli completion install +``` + +حالا یک کپی از `.env.example` با نام `.env` بسازید و با یک ادیتور آن را باز کنید و تنظیمات دلخواه خود را انجام دهید. یه عنوان مثال نام کاربری و رمز عبور را می توانید در این فایل تغییر دهید. + +```bash +cp .env.example .env +nano .env +``` + +> برای اطلاعات بیشتر بخش [تنظیمات](#تنظیمات) را مطالعه کنید. + +در انتها, مرزبان را به کمک دستور زیر اجرا کنید. + +```bash +python3 main.py +``` + +اجرا با استفاده از systemctl در لینوکس +``` +systemctl enable /var/lib/marzban/marzban.service +systemctl start marzban +``` + +اجرا با nginx +``` +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name example.com; + + ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; + + location ~* /(dashboard|api|docs|redoc|openapi.json) { + proxy_pass http://0.0.0.0:8000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } +} +``` +or +``` +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name marzban.example.com; + + ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; + + location / { + proxy_pass http://0.0.0.0:8000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } +} +``` + +به صورت پیشفرض مرزبان در آدرس `http://localhost:8000/dashboard` اجرا میشود. شما میتوانید با تغییر `UVICORN_HOST` و `UVICORN_PORT`، هاست و پورت را تغییر دهید. +
+ +# تنظیمات + +> متغیر های زیر در فایل ‍`env` یا `.env` استفاده میشوند. شما می توانید با تعریف و تغییر آن ها، تنظیمات مرزبان را تغییر دهید. + +| توضیحات | متغیر | +| ----------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------: | +| نام کاربری مدیر کل | SUDO_USERNAME | +| رمز عبور مدیر کل | SUDO_PASSWORD | +| آدرس دیتابیس ([بر اساس مستندات SQLAlchemy](https://docs.sqlalchemy.org/en/20/core/engines.html#database-urls)) | SQLALCHEMY_DATABASE_URL | +| آدرس هاستی که مرزبان روی آن اجرا میشود (پیشفرض: `0.0.0.0`) | UVICORN_HOST | +| پورتی که مرزبان روی آن اجرا میشود (پیشفرض: `8000`) | UVICORN_PORT | +| اجرای مرزبان بر روی یک Unix domain socket | UVICORN_UDS | +| آدرس گواهی SSL به جهت ایمن کردن پنل مرزبان | UVICORN_SSL_CERTFILE | +| آدرس کلید گواهی SSL | UVICORN_SSL_KEYFILE | +| مسیر فایل json تنظیمات xray (پیشفرض: `xray_config.json`) | XRAY_JSON | +| مسیر باینری xray (پیشفرض: `/usr/local/bin/xray`) | XRAY_EXECUTABLE_PATH | +| مسیر asset های xray (پیشفرض: `/usr/local/share/xray`) | XRAY_ASSETS_PATH | +| پیشوند (یا هاست) آدرس های اشتراکی (زمانی کاربرد دارد که نیاز دارید دامنه subscription link ها با دامنه پنل متفاوت باشد) | XRAY_SUBSCRIPTION_URL_PREFIX | +| تگ inboundای که به عنوان fallback استفاده میشود. | XRAY_FALLBACKS_INBOUND_TAG | +| تگ های inbound ای که لازم نیست در کانفیگ های ساخته شده وجود داشته باشند. | XRAY_EXCLUDE_INBOUND_TAGS | +| آدرس محل template های شخصی سازی شده کاربر | CUSTOM_TEMPLATES_DIRECTORY | +| تمپلیت مورد استفاده برای تولید کانفیگ های Clash (پیشفرض: `clash/default.yml`) | CLASH_SUBSCRIPTION_TEMPLATE | +| تمپلیت صفحه اطلاعات اشتراک کاربر (پیشفرض `subscription/index.html`) | SUBSCRIPTION_PAGE_TEMPLATE | +| تمپلیت صفحه اول (پیشفرض: `home/index.html`) | HOME_PAGE_TEMPLATE | +| توکن ربات تلگرام (دریافت از [@botfather](https://t.me/botfather)) | TELEGRAM_API_TOKEN | +| آیدی عددی ادمین در تلگرام (دریافت از [@userinfobot](https://t.me/userinfobot)) | TELEGRAM_ADMIN_ID | +| اجرای ربات از طریق پروکسی | TELEGRAM_PROXY_URL | +| مدت زمان انقضا توکن دسترسی به پنل مرزبان, `0` به معنای بدون تاریخ انقضا است (پیشفرض: `1440`) | JWT_ACCESS_TOKEN_EXPIRE_MINUTES | +| فعال سازی داکیومنتیشن به آدرس `/docs` و `/redoc`(پیشفرض: `False`) | DOCS | +| فعالسازی حالت توسعه (development) (پیشفرض: `False`) | DEBUG | +| WEBHOOK_ADDRESS | آدرس webhook که تغییرات حالت یک کاربر به آن ارسال می‌شوند. اگر این متغیر مقدار داشته باشد، ارسال پیام‌ها انجام می‌شوند. | +| WEBHOOK_SECRET | متغیری که به عنوان `x-webhook-secret` در header ارسال می‌شود. (پیشفرض: `None`) | +| تعداد دفعاتی که برای ارسال یک پیام، در صورت تشخیص خطا در ارسال تلاش دوباره شود (پیشفرض `3`) | NUMBER_OF_RECURRENT_NOTIFICATIONS | +| مدت زمان بین هر ارسال دوباره پیام در صورت تشخیص خطا در ارسال به ثانیه (پیشفرض: `180`) | RECURRENT_NOTIFICATIONS_TIMEOUT | +| هنگام رسیدن مصرف کاربر به چه درصدی پیام اخطار به آدرس وبهوک ارسال شود (پیشفرض: `80`) | NOTIFY_REACHED_USAGE_PERCENT | +| چند روز مانده به انتهای سرویس پیام اخطار به آدرس وبهوک ارسال شود (پیشفرض: `3`) | NOTIFY_DAYS_LEFT | + + +# استفاده از API +مرزبان به توسعه دهندگانAPI REST ارائه می دهد. برای مشاهده اسناد API در قالب Swagger UI یا ReDoc، متغیر `DOCS=True` را در تنظیمات خود ست کنید و در مرورگر به مسیر `/docs` و `/redoc` بروید. + + +# پشتیبان گیری از مرزبان +بهتر است همیشه از فایل های مرزبان خود نسخه پشتیبان تهیه کنید تا در صورت خرابی سیستم یا حذف تصادفی اطلاعات از دست نروند. مراحل تهیه نسخه پشتیبان از مرزبان به شرح زیر است: + +1. به طور پیش فرض، تمام فایل های مهم مرزبان در `/var/lib/marzban` ذخیره می شوند (در نسخه داکر). کل پوشه `/var/lib/marzban` را در یک مکان پشتیبان مورد نظر خود، مانند هارد دیسک خارجی یا فضای ذخیره سازی ابری کپی کنید. +2. علاوه بر این، مطمئن شوید که از فایل env خود که حاوی متغیرهای تنظیمات شما است و همچنین فایل پیکربندی Xray خود نسخه پشتیبان تهیه کنید. + +با انجام این مراحل، می توانید اطمینان حاصل کنید که از تمام فایل ها و داده های مرزبان خود یک نسخه پشتیبان تهیه کرده اید. به خاطر داشته باشید که نسخه های پشتیبان خود را به طور مرتب به روز کنید تا آنها را به روز نگه دارید. + + +# ربات تلگرام +مرزبان دارای یک ربات تلگرام داخلی است که می تواند مدیریت سرور، ایجاد و حذف کاربر و ارسال نوتیفیکیشن را انجام دهد. این ربات را می توان با انجام چند مرحله ساده به راحتی فعال کرد + +برای فعال کردن ربات تلگرام: + +1. در تنظیمات، متغیر`TELEGRAM_API_TOKEN` را به API TOKEN ربات تلگرام خود تنظیم کنید. +2. همینطور، متغیر`TELEGRAM_ADMIN_ID` را به شناسه عددی حساب تلگرام خود تنظیم کنید. شما می‌توانید شناسه خود را از [@userinfobot](https://t.me/userinfobot) دریافت کنید. + + +# رابط خط فرمان (CLI) مرزبان +مرزبان دارای یک رابط خط فرمان (Command Line Interface / CLI) داخلی است که به مدیران اجازه می دهد با مرزبان ارتباط مستقیم داشته باشند. + +اگر از Docker برای مرزبان استفاده می کنید، بهتر است از دستور های `docker exec` یا `docker-compose exec` استفاده کنید تا به پوسته (shell) تعاملی کانتینر مرزبان دسترسی پیدا کنید. + +برای مثال، به پوشه ی `docker-compose.yml` مرزبان بروید و دستور زیر را اجرا کنید: + +```bash +$ sudo docker-compose exec -it marzban bash +``` + +رابط خط فرمان (CLI) مرزبان از طریق دستور `marzban-cli` هرکجا در دسترس خواهد بود! + +برای کسب اطلاعات بیشتر می توانید [مستندات CLI مرزبان](./cli/README.md) را مطالعه کنید. + + +# ارسال اعلان‌ها به آدرس وبهوک +شما می‌توانید آدرسی را برای مرزبان فراهم کنید تا تغییرات کاربران را به صورت اعلان برای شما ارسال کند. + +اعلان‌ها به صورت یک درخواست POST به آدرسی که در `WEBHOOK_ADDRESS` فراهم شده به همراه مقدار تعیین شده در `WEBHOOK_SECRET` به عنوان `x-webhook-secret` در header درخواست ارسال می‌شوند. + +نمونه‌ای از درخواست ارسال شده توسط مرزبان: + +``` +Headers: +Host: 0.0.0.0:9000 +User-Agent: python-requests/2.28.1 +Accept-Encoding: gzip, deflate +Accept: */* +Connection: keep-alive +x-webhook-secret: something-very-very-secret +Content-Length: 107 +Content-Type: application/json + + + +Body: +{"username": "marzban_test_user", "action": "user_updated", "enqueued_at": 1680506457.636369, "tries": 0} +``` + +انواع مختلف actionهایی که مرزبان ارسال می‌کند: `user_created`, `user_updated`, `user_deleted`, `user_limited`, `user_expired`, `user_disabled`, `user_enabled` + + +# کمک مالی +اگر مرزبان را برای شما مفید بوده و می‌خواهید از توسعه آن حمایت کنید، می‌توانید در یکی از طریق یکی از شبکه های کریپتو زیر کمک مالی کنید: + +- شبکه TRON (TRX): `TX8kJoDcowQPBFTYHAJR36GyoUKP1Xwzkb` +- شبکه ETH، BNB، MATIC: `0xFdc9ad32454FA4fc4733270FCc12ddBFb68b83F7` +- شبکه بیت کوین: `bc1qpys2nefgsjjgae3g3gqy9crsv3h3rm96tlkz0v` +- شبکه Dogecoin: `DJAocBAu8y6LwhDKUktLAyzV8xyoFeHH6R` +- شبکه TON: `EQAVf-7hAXHlF-jmrKE44oBwN7HGQFVBLAtrOsev5K4qR4P8` + + +از حمایت شما متشکرم! + + +# لایسنس + +توسعه یافته شده در [ناشناس!] و منتشر شده تحت لایسنس [AGPL-3.0](./LICENSE). + + +# مشارکت در توسعه +این ❤️‍🔥 تقدیم به همه‌ی کسایی که در توسعه مرزبان مشارکت می‌کنند! اگر می‌خواهید مشارکت داشته باشید، لطفاً [دستورالعمل‌های مشارکت](CONTRIBUTING.md) ما را بررسی کنید و در صورت تمایل Pull Request ارسال کنید یا یک Issue باز کنید. همچنین از شما برای پیوستن به گروه [تلگرام](https://t.me/gozargah_marzban) ما برای حمایت یا کمک به راهنمایی استقبال می کنیم. + +لطفا اگر امکانش رو دارید، با بررسی [لیست کار ها](https://github.com/gozargah/marzban/issues) به ما در بهبود مرزبان کمک کنید. کمک های شما با آغوش باز پذیرفته میشه. + +

+با تشکر از همه همکارانی که به بهبود مرزبان کمک کردند: +

+

+ + + +

+

+ ساخته شده با contrib.rocks +

+ diff --git a/README-ru.md b/README-ru.md new file mode 100644 index 0000000..bf058db --- /dev/null +++ b/README-ru.md @@ -0,0 +1,397 @@ +

+ + + + + + +

+ +

Marzban

+ +

+ Унифицированное решение с графическим интерфейсом, устойчивое к цензуре, на базе Xray +

+ +
+

+ + + + + + + + + + + + + + + + + + +

+ +

+ + English + + / + + فارسی + + / + + 简体中文 + + / + + Русский + +

+ +

+ + Marzban screenshots + +

+ +## Оглавление + +- [Введение](#введение) + - [Почему Marzban](#почему-marzban) + - [Функции](#функции) +- [Руководство по установке](#руководство-по-установке) +- [Конфигурация](#конфигурация) +- [API](#api) +- [Backup](#backup) +- [Telegram бот](#telegram-bot) +- [Marzban CLI](#marzban-cli) +- [Marzban Node](#marzban-node) +- [Webhook уведомления](#webhook-уведомления) +- [Поддержка](#поддержка) +- [Лицензия](#лицензия) +- [Участники](#участники) + +# Введение + +Marzban (Персидское слово "Пограничник" - произносится /mærz'ban/) — это инструмент управления прокси-серверами, который предоставляет простой и удобный пользовательский интерфейс для управления сотнями учетных записей прокси на базе [Xray-core](https://github.com/XTLS/Xray-core) и созданный с использованием Python и ReactJS. + +## Почему Marzban? + +Marzban удобен в использовании, многофункционален и надежен. Он позволяет создавать различные прокси для пользователей без сложной настройки. С помощью встроенного веб-интерфейса можно контролировать, изменять и ограничивать пользователей. + +### Функции + +- Готовый **Web UI** +- **REST API** бэкэнд +- Поддержка [**множества узлов**](#marzban-node) (для распределения инфраструктуры и масштабируемости) +- Поддержка протоколов **Vmess**, **VLESS**, **Trojan** и **Shadowsocks** +- Возможность активации **нескольких протоколов** для каждого пользователя +- **Несколько пользователей** на одном inbound +- **Несколько inbound** на **одном порту** (поддержка fallbacks) +- Ограничения на основе **количества трафика** и **срока действия** +- Ограничение трафика по **периодам** (например выдавать трафик на день, неделю и т. д.) +- Поддержка **ссылок-подписок** совместимых с **V2ray** _(такие как V2RayNG, OneClick, Nekoray, и др.)_, **Clash** и **ClashMeta** +- Автоматическая генерация **Ссылок** и **QRcode** +- Мониторинг ресурсов сервера и **использования трафика** +- Настраиваемые конфигурации xray +- Поддержка **TLS** и **REALITY** +- Встроенный **Telegram Bot** +- Встроенный **Command Line Interface (CLI)** +- **Несколько языков** +- Поддержка **Нескольких администраторов** (WIP) + +# Руководство по установке + +Выполните быструю установку с помощью следующей команды: + +```bash +sudo bash -c "$(curl -sL https://github.com/Gozargah/Marzban-scripts/raw/master/marzban.sh)" @ install +``` + +Когда установка будет завершена: +- Вы увидите логи, которые можно остановить, нажав `Ctrl+C` или закрыв терминал. +- Файлы Marzban будут размещены по адресу `/opt/marzban`. +- Файл конфигурации будет размещен по адресу `/opt/marzban/.env` (см. [Конфигурация](#конфигурация)). +- Файлы с данными будут размещены по адресу `/var/lib/marzban`. +- Вы можете получить доступ к панели управления, введя в адресной строке `http://YOUR_SERVER_IP:8000/dashboard/` (заменив YOUR_SERVER_IP на актуальный IP адрес вашего сервера). + +Далее, Вам нужно создать главного администратора для входа в панель управления Marzban, выполнив следующую команду: + +```bash +marzban cli admin create --sudo +``` + +Готово! Теперь Вы можете войти, используя данные своей учетной записи. + +Для того, чтобы увидеть справочное сообщение от скрипта Marzban, выполните команду: + +```bash +marzban --help +``` + +Если Вы хотите запустить проект, используя его исходный код, обратитесь к разделу ниже +
+

Ручная установка

+ +Установите xray на Ваш сервер. + +Вы можете сделать это, используя [Xray-install](https://github.com/XTLS/Xray-install): + +```bash +bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install +``` + +Клонируйте этот проект и установите зависимости (Вам нужен Python >= 3.8): + +```bash +git clone https://github.com/Gozargah/Marzban.git +cd Marzban +wget -qO- https://bootstrap.pypa.io/get-pip.py | python3 - +python3 -m pip install -r requirements.txt +``` + +В качестве альтернативы для создания виртуальной среды можно использовать [Python Virtualenv](https://pypi.org/project/virtualenv/). + +Затем выполните следующую команду для запуска скрипта миграции базы данных: + +```bash +alembic upgrade head +``` + +Если Вы хотите использовать `marzban-cli`, необходимо связать его с файлом в `$PATH`, сделать его исполняемым и установить: + +```bash +sudo ln -s $(pwd)/marzban-cli.py /usr/bin/marzban-cli +sudo chmod +x /usr/bin/marzban-cli +marzban-cli completion install +``` + +Теперь настало время настройки. + +Создайте копию файла `.env.example`, посмотрите его и отредактируйте с помощью текстового редактора,например `nano`. + +Возможно, вам захочется изменить учетные данные администратора. + +```bash +cp .env.example .env +nano .env +``` + +> Проверьте раздел [Конфигурации](#конфигурация) для получения большей информации. + +В завершение запустите приложение с помощью следующей команды: + +```bash +python3 main.py +``` + +Для запуска с помощью linux systemctl (скопируйте файл marzban.service в `/var/lib/marzban/marzban.service`): + +``` +systemctl enable /var/lib/marzban/marzban.service +systemctl start marzban +``` + +Для использования с nginx: + +``` +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name example.com; + + ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; + + location ~* /(dashboard|api|docs|redoc|openapi.json) { + proxy_pass http://0.0.0.0:8000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + # xray-core ws-path: / + # client ws-path: /marzban/me/2087 + # + # All traffic is proxed through port 443, and send to the xray port(2087, 2088 etc.). + # The '/marzban' in location regex path can changed any characters by yourself. + # + # /${path}/${username}/${xray-port} + location ~* /marzban/.+/(.+)$ { + proxy_redirect off; + proxy_pass http://127.0.0.1:$1/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } +} +``` + +или: + +``` +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name marzban.example.com; + + ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; + + location / { + proxy_pass http://0.0.0.0:8000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } +} +``` + +По умолчанию приложение будет запускаться на `http://localhost:8000/dashboard`. Вы можете настроить его, изменив переменные окружения `UVICORN_HOST` и `UVICORN_PORT`. +
+ +# Конфигурация + +> Ниже приведены настройки, которые можно задать с помощью переменных окружения поместив их в файл `.env`. + +| Перменная | Описание | +| --------------------------------- | ----------------------------------------------------------------------------------------------------- | +| SUDO_USERNAME | Имя пользователя главного администратора | +| SUDO_PASSWORD | Пароль главного администратора | +| SQLALCHEMY_DATABASE_URL | Путь к файлу БД ([SQLAlchemy's docs](https://docs.sqlalchemy.org/en/20/core/engines.html#database-urls)) | +| UVICORN_HOST | Привязка приложения к хосту (по умолчанию: `0.0.0.0`) | +| UVICORN_PORT | Привязка приложения к порту (по умолчанию: `8000`) | +| UVICORN_UDS | Привязка приложения к UNIX domain socket | +| UVICORN_SSL_CERTFILE | Адрес файла сертификата SSL | +| UVICORN_SSL_KEYFILE | Адрес файла ключа SSL | +| XRAY_JSON | Адрес файла JSON конфигурации Xray. (по умолчанию: `xray_config.json`) | +| XRAY_EXECUTABLE_PATH | Путь к бинарникам Xray (по умолчанию: `/usr/local/bin/xray`) | +| XRAY_ASSETS_PATH | Путь к папке с рессурсными файлами для Xray (файлы geoip.dat и geosite.dat) (по умолчанию: `/usr/local/share/xray`) | +| XRAY_SUBSCRIPTION_URL_PREFIX | Префикс адреса подписки | +| XRAY_FALLBACKS_INBOUND_TAG | Если вы используете входящее соединение с несколькими резервными вариантами, укажите здесь его тег +| XRAY_EXCLUDE_INBOUND_TAGS | Теги входящих соединений, которые не требуют управления и не должны быть включены в список прокси +| CUSTOM_TEMPLATES_DIRECTORY | Путь к папке с пользовательскими шаблонами (по умолчанию: `app/templates`) | +| CLASH_SUBSCRIPTION_TEMPLATE | Шаблон для создания конфигурации Clash (по умолчанию: `clash/default.yml`) | +| SUBSCRIPTION_PAGE_TEMPLATE | Шаблон для страницы подписки (по умолчанию: `subscription/index.html`) | +| HOME_PAGE_TEMPLATE | Шаблон главной страницы (по умолчанию: `home/index.html`) | +| TELEGRAM_API_TOKEN | Токен Telegram-бота (полученный от [@botfather](https://t.me/botfather)) | +| TELEGRAM_ADMIN_ID | Числовой идентификатор администратора в Telegram (полученный от [@userinfobot](https://t.me/userinfobot)) | +| TELEGRAM_PROXY_URL | URL прокси для запуска Telegram-бота (если серверы Telegram заблокированы на вашем сервере). | +| JWT_ACCESS_TOKEN_EXPIRE_MINUTES | Время истечения срока действия доступного токена в минутах, `0` означает "без истечения срока действия" (по умолчанию: `1440`) | +| DOCS | Активация документации API по адресам `/docs` и `/redoc`. (по умолчанию: `False`) | +| DEBUG | Активация режима разработки (development) (по умолчанию: `False`) | +| WEBHOOK_ADDRESS | Адрес Webhook для отправки уведомлений. Уведомления Webhook будут отправляться, если это значение было установлено | +| WEBHOOK_SECRET | Webhook secret будет передаваться с каждым запросом в виде `x-webhook-secret` в заголовке (по умолчанию: `None`) | +| NUMBER_OF_RECURRENT_NOTIFICATIONS | Сколько раз повторять попытку отправки уведомления при обнаружении ошибки (по умолчанию: `3`) | +| RECURRENT_NOTIFICATIONS_TIMEOUT | Тайм-аут между каждым повторным запросом при обнаружении ошибки в секундах (по умолчанию: `180`) | +| NOTIFY_REACHED_USAGE_PERCENT | При каком проценте использования отправлять предупреждение (по умолчанию: `80`) | +| NOTIFY_DAYS_LEFT | Когда отправлять предупреждение об истечении срока действия (по умолчанию: `3`) | + +# API + +Marzban предоставляет REST API, позволяющий разработчикам программно взаимодействовать с сервисами Marzban. Для просмотра документации по API в Swagger UI или ReDoc установите переменную `DOCS=True` и перейдите по ссылкам `/docs` и `/redoc`. + +# Backup + +Всегда полезно регулярно создавать резервные копии файлов Marzban, чтобы предотвратить потерю данных в случае системных сбоев или случайного удаления. Ниже приведены шаги для создания резервной копии Marzban: + +1. По умолчанию все важные файлы Marzban сохраняются в папке `/var/lib/marzban` (в версиях Docker). Скопируйте весь каталог `/var/lib/marzban` в выбранное вами место резервного копирования, например на внешний жесткий диск или в облачное хранилище. +2. Кроме того, не забудьте сделать резервную копию файла env, содержащего переменные конфигурации, а также файла конфигурации Xray. Если вы устанавливали Marzban с помощью marzban-scripts (рекомендуемый подход к установке), то env и другие конфигурации должны находиться в каталоге `/opt/marzban/`. + +Выполнив эти действия, вы сможете обеспечить резервное копирование всех файлов и данных Marzban, а также переменных конфигурации и конфигурации Xray на случай, если в будущем потребуется их восстановить. Не забывайте регулярно обновлять резервные копии, чтобы поддерживать их в актуальном состоянии. + +# Telegram Bot + +Marzban поставляется с встроенным ботом Telegram, который может управлять сервером, создавать и удалять пользователей, а также отправлять уведомления. Этот бот можно легко включить, выполнив несколько простых шагов, и он предоставляет удобный способ взаимодействия с Marzban без необходимости каждый раз заходить на сервер. + +Чтобы включить Telegram-бота, выполните следующие действия: + +1. установите `TELEGRAM_API_TOKEN` в качестве API-токена вашего бота. +2. установите `TELEGRAM_ADMIN_ID` в качестве цифрового ID вашего Telegram-аккаунта, который вы можете получить от [@userinfobot](https://t.me/userinfobot) + +# Marzban CLI + +Marzban поставляется с встроенным CLI под названием `marzban-cli`, который позволяет администраторам напрямую взаимодействовать с ним. + +Если вы установили Marzban с помощью скрипта установки, то доступ к командам cli можно получить, выполнив команду: + +```bash +marzban cli [OPTIONS] COMMAND [ARGS]... +``` + +Для получения дополнительной информации можно ознакомиться с [документацией по Marzban CLI](./cli/README.md). + +# Marzban Node + +Проект Marzban представляет [Marzban-node](https://github.com/gozargah/marzban-node), который помогает Вам в распределении инфраструктуры. С помощью Marzban-node можно распределить инфраструктуру по нескольким узлам, получив такие преимущества, как высокая доступность, масштабируемость и гибкость. Marzban-node позволяет пользователям подключаться к различным серверам, предоставляя им гибкость в выборе, а не ограничиваться только одним сервером. +Более подробная информация и инструкции по установке приведены в [официальной документации Marzban-node](https://github.com/gozargah/marzban-node). + + +# Webhook уведомления + +Вы можете задать адрес webhook, и Marzban будет отправлять уведомления на этот адрес. + +Запросы будут отправляться в виде POST-запроса на адрес, указанный в `WEBHOOK_ADDRESS`, с `WEBHOOK_SECRET` в качестве `x-webhook-secret` в заголовках. + +Пример запроса, отправленного Marzban: + +``` +Headers: +Host: 0.0.0.0:9000 +User-Agent: python-requests/2.28.1 +Accept-Encoding: gzip, deflate +Accept: */* +Connection: keep-alive +x-webhook-secret: something-very-very-secret +Content-Length: 107 +Content-Type: application/json + + + +Body: +{"username": "marzban_test_user", "action": "user_updated", "enqueued_at": 1680506457.636369, "tries": 0} +``` + +Различные типы действий: `user_created`, `user_updated`, `user_deleted`, `user_limited`, `user_expired`, `user_disabled`, `user_enabled` + +# Поддержка + +Если вы нашли Marzban полезным и хотели бы поддержать его развитие, вы можете сделать пожертвование в одной из следующих криптовалютных сетей: + +- TRON network (TRC20): `TX8kJoDcowQPBFTYHAJR36GyoUKP1Xwzkb` +- ETH, BNB, MATIC network (ERC20, BEP20): `0xFdc9ad32454FA4fc4733270FCc12ddBFb68b83F7` +- Bitcoin network: `bc1qpys2nefgsjjgae3g3gqy9crsv3h3rm96tlkz0v` +- Dogecoin network: `DJAocBAu8y6LwhDKUktLAyzV8xyoFeHH6R` +- TON network: `EQAVf-7hAXHlF-jmrKE44oBwN7HGQFVBLAtrOsev5K4qR4P8` + +Спасибо за поддержку! + +# Лицензия + +Сделано в [Unknown!] и опубликовано под [AGPL-3.0](./LICENSE). + +# Участники + +Мы ❤️‍🔥 участников проекта! Если вы хотите внести свой вклад, пожалуйста, ознакомьтесь с нашим [Contributing Guidelines](CONTRIBUTING.md) и не стесняйтесь отправлять запросы на исправление ошибок или сообщить о проблеме. Мы также приглашаем вас присоединиться к нашей группе [Telegram](https://t.me/gozargah_marzban) для получения поддержки. + +Проверьте [open issues](https://github.com/gozargah/marzban/issues), чтобы помочь развитию этого проекта. + +

+Спасибо всем участникам, благодаря которым Marzban становится лучше: +

+

+ + + +

+

+ Made with contrib.rocks +

diff --git a/README-zh-cn.md b/README-zh-cn.md new file mode 100644 index 0000000..408d7ba --- /dev/null +++ b/README-zh-cn.md @@ -0,0 +1,340 @@ +

+ + + + + + +

+ +

Marzban

+ +

+ Unified GUI Censorship Resistant Solution Powered by Xray +

+ +
+

+ + + + + + + + + + + + + + + + + + +

+ +

+ + English + + / + + فارسی + + / + + 简体中文 + + / + + Русский + +

+ +

+ + Marzban screenshots + +

+ + +## 目录 +- [概览](#概览) + - [为什么要使用 Marzban?](#为什么要使用-marzban) + - [特性](#特性) +- [安装指南](#安装指南) +- [配置](#配置) +- [如何使用 API](#如何使用-api) +- [如何备份 Marzban](#如何备份-marzban) +- [Telegram bot](#telegram-bot) +- [捐赠](#捐赠) +- [许可](#许可) +- [贡献者](#贡献者) + + +# 概览 + +Marzban(Marzban一词源自波斯语,意为“边境警卫”,发音为 /mærz'ban/)是一个代理管理工具,提供简单易用的用户界面,可管理数百个代理账户,由 [Xray-core](https://github.com/XTLS/Xray-core) 提供支持,使用 Python 和 Reactjs 构建。 + + + +## 为什么要使用 Marzban? + +Marzban 是一个用户友好、功能丰富且可靠的工具。它让您可以为用户创建不同的代理,无需进行任何复杂的配置。通过其内置的 Web 界面,您可以监视、修改和限制用户。 + +### 特性 + +- 内置 **Web 界面** +- 完全支持 **REST API** 的后端 +- 支持 **Vmess**、**VLESS**、**Trojan** 和 **Shadowsocks** 协议 +- 单用户的**多协议**支持 +- 单入站的**多用户**支持 +- 单端口的**多入站**支持(使用 fallbacks) +- **流量**和**过期日期**限制 +- 周期性的流量限制(例如每天、每周等) +- 兼容 **V2ray** 的**订阅链接**(例如 V2RayNG、OneClick、Nekoray 等)和 **Clash** +- 自动化的**分享链接**和**二维码**生成器 +- 系统监控和**流量统计** +- 可自定义的 xray 配置 +- **TLS** 支持 +- 集成的 **Telegram Bot** +- **多管理员**支持(WIP) + + +# 安装指南 +Run the following command + +```bash +sudo bash -c "$(curl -sL https://github.com/Gozargah/Marzban-scripts/raw/master/marzban.sh)" @ install +``` + +Once the installation is complete: + +- You will see the logs that you can stop watching them by closing the terminal or pressing `Ctrl+C` +- The Marzban files will be located at `/opt/marzban` +- The configuration file can be found at `/opt/marzban/.env` (refer to [configurations](#configuration) section to see variables) +- The data files will be placed at `/usr/lib/marzban` +- You can access the Marzban dashboard by opening a web browser and navigating to `http://YOUR_SERVER_IP:8000/dashboard/` (replace YOUR_SERVER_IP with the actual IP address of your server) + +Next, you need to create a sudo admin for logging into the Marzban dashboard by the following command + +```bash +marzban cli admin create --sudo +``` + +That's it! You can login to your dashboard using these credentials + +To see the help message of the Marzban script, run the following command + +```bash +marzban --help +``` + +If you are eager to run the project using the source code, check the section below +
+

手动安装(高级)

+ +在您的机器上安装 xray + +您可以使用 [Xray-install](https://github.com/XTLS/Xray-install) 脚本进行安装: + +```bash +bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install +``` + +克隆项目并安装依赖项。 + +您需要 Python>=3.8 版本。 + +```bash +git clone https://github.com/Gozargah/Marzban.git +cd Marzban +wget -qO- https://bootstrap.pypa.io/get-pip.py | python3 - +python3 -m pip install -r requirements.txt +``` + +另外,为了拥有一个隔离的环境,您可以使用 [Python Virtualenv](https://pypi.org/project/virtualenv/)。 + +然后运行以下命令运行数据库迁移脚本: + +```bash +alembic upgrade head +``` + +现在开始配置: + +复制 `.env.example` 文件,查看并使用文本编辑器(如`nano`)进行编辑。 + +您可能想要修改管理员凭据。 + +```bash +cp .env.example .env +nano .env +``` + +> 请查看[配置](#配置)部分以获取更多信息。 + +最终,使用以下命令启动应用程序: + +```bash +python3 main.py +``` + +也可使用 linux systemctl 启动: +``` +systemctl enable /var/lib/marzban/marzban.service +systemctl start marzban +``` + +配合 nginx 使用: +``` +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name example.com; + + ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; + + location ~* /(dashboard|api|docs|redoc|openapi.json) { + proxy_pass http://0.0.0.0:8000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + # xray-core ws-path: / + # client ws-path: /marzban/me/2087 + # + # 所有流量通过 443 端口进行代理,然后分发至真正的 xray 端口(2087、2088 等等)。 + # 路径中的 “/marzban” 可以改为任意合法 URL 字符. + # + # /${path}/${username}/${xray-port} + location ~* /marzban/.+/(.+)$ { + proxy_redirect off; + proxy_pass http://127.0.0.1:$1/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } +} +``` +或 +``` +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name marzban.example.com; + + ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; + + location / { + proxy_pass http://0.0.0.0:8000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } +} +``` + +默认情况下,应用将在 `http://localhost:8000/dashboard` 上运行。您可以通过更改 `UVICORN_HOST` 和 `UVICORN_PORT` 环境变量来进行配置。 +
+ +# 配置 + +> 您可以使用环境变量或将其放置在 `env` 或 `.env` 文件中来设置以下设置。 + +| 变量 | 描述 | +| ------------------------------- | ---------------------------------------------------------------------------------------------------- | +| SUDO_USERNAME | 管理员用户名(默认: admin) | +| SUDO_PASSWORD | 管理员密码(默认: admin) | +| SQLALCHEMY_DATABASE_URL | 数据库文档([SQLAlchemy's docs](https://docs.sqlalchemy.org/en/20/core/engines.html#database-urls)) | +| UVICORN_HOST | 绑定应用程序到此主机(默认为 `0.0.0.0`) | +| UVICORN_PORT | 绑定应用程序到此端口(默认为 `8000`) | +| UVICORN_UDS | 将应用程序绑定到一个 UNIX 域套接字 | +| UVICORN_SSL_CERTFILE | SSL 证书文件路径 | +| UVICORN_SSL_KEYFILE | SSL 密钥文件路径 | +| XRAY_JSON | Xray 的 json 配置文件路径(默认: `xray_config.json`) | +| XRAY_EXECUTABLE_PATH | Xray 的执行程序路径: `/usr/local/bin/xray`) | +| XRAY_ASSETS_PATH | Xray 的资源目录: `/usr/local/share/xray`) | +| XRAY_SUBSCRIPTION_URL_PREFIX | 订阅URL的前缀 | +| XRAY_FALLBACKS_INBOUND_TAG | 包含 fallbacks 的入站标记, 在您需要使用 fallbacks 配置此项 | +| XRAY_EXCLUDE_INBOUND_TAGS | 不需要此应用程序管理或在链接中包含的入站标记 | +| CLASH_SUBSCRIPTION_TEMPLATE | 将用于生成冲突配置的模板(默认值:`clash/default.yml`) | +| SUBSCRIPTION_PAGE_TEMPLATE | 用于生成订阅信息页面的模板(默认:`subscription/index.html`) | +| HOME_PAGE_TEMPLATE | 诱饵页面模板(默认:`home/index.html`) | +| TELEGRAM_API_TOKEN | Telegram bot API 令牌(可以从 [@botfather](https://t.me/botfather) 获取) | +| TELEGRAM_ADMIN_ID | 管理员的 Telegram ID(可以使用 [@userinfobot](https://t.me/userinfobot) 查找您的 ID) | +| TELEGRAM_PROXY_URL | 在代理下运行 Telegram bot。 | +| JWT_ACCESS_TOKEN_EXPIRE_MINUTES | Access Tokens 的过期时间,以分钟为单位,`0` 表示无限期(默认为 `1440` 分钟) | +| DOCS | API 文档是否应该在 `/docs` 和 `/redoc` 上提供(默认为 `False` | +| DEBUG | 开发者调试模式(默认: `False`) | + + +# 如何使用 API +Marzban 提供了 REST API,使开发人员能够以编程方式与 Marzban 服务进行交互。要在 Swagger UI 或 ReDoc 中查看 API 文档,设置配置变量 `DOCS=True`,然后导航到 `/docs` 和 `/redoc`。 + + +# 如何备份 Marzban + +定期备份 Marzban 文件是预防系统故障或意外删除导致数据丢失的好习惯。以下是备份 Marzban 的步骤: + +1. 默认情况下,所有重要的 Marzban 文件都保存在 `/var/lib/marzban` ( Docker 版本)中。将整个 `/var/lib/marzban` 目录复制到您选择的备份位置,比如外部硬盘或云存储。 +2. 此外,请确保备份您的 `env` 文件,其中包含您的配置变量,以及您的 `Xray` 配置文件。 + +按照这些步骤,您可以确保有备份所有 Marzban 文件和数据,以及您的配置变量和 Xray 配置,以备将来恢复使用。请记得定期更新备份,以保持它们的最新性。 + + +# Telegram bot + +Marzban 配备了一个集成的 Telegram bot,可以处理服务器管理、用户创建和删除,以及发送通知。通过几个简单的步骤,您可以轻松地启用这个机器人,并提供了一种方便的方式与 Marzban 交互,而不需要每次都登录到服务器上。 + +启用 Telegram bot: + +1. 将 `TELEGRAM_API_TOKEN` 设置为您的 bot API Token。 +2. 将 `TELEGRAM_ADMIN_ID` 设置为您的 Telegram ID,您可以从 [@userinfobot](https://t.me/userinfobot) 中获取自己的 ID。 + + +# 捐赠 + +如果您认为 Marzban 有用,并想支持其发展,可以在以下加密网络之一进行捐赠: + +- TRON(TRX) 网络:`TX8kJoDcowQPBFTYHAJR36GyoUKP1Xwzkb` +- ETH、BNB、MATIC 网络:`0xFdc9ad32454FA4fc4733270FCc12ddBFb68b83F7` +- 比特币网络:`bc1qpys2nefgsjjgae3g3gqy9crsv3h3rm96tlkz0v` +- Dogecoin 网络:`DJAocBAu8y6LwhDKUktLAyzV8xyoFeHH6R` +- TON 网络:`EQAVf-7hAXHlF-jmrKE44oBwN7HGQFVBLAtrOsev5K4qR4P8` + + +感谢您的支持! + +# 许可 + +制作于 [Unknown!] 并在 [AGPL-3.0](./LICENSE) 下发布。 + +# 贡献者 + +我们热爱贡献者!如果您想做出贡献,请查看我们的[贡献指南](CONTRIBUTING.md)并随时提交拉取请求或打开问题。我们也欢迎您加入我们的 [Telegram](https://t.me/gozargah_marzban) 群组,以获得支持或贡献指导。 + +查看 [issues](https://github.com/gozargah/marzban/issues) 以帮助改进这个项目。 + + + +

+感谢所有为改善 Marzban 做出贡献的贡献者们: +

+

+ + + +

+

+ Made with contrib.rocks +

+ diff --git a/README.md b/README.md new file mode 100755 index 0000000..08dd29e --- /dev/null +++ b/README.md @@ -0,0 +1,397 @@ +

+ + + + + + +

+ +

Marzban

+ +

+ Unified GUI Censorship Resistant Solution Powered by Xray +

+ +
+

+ + + + + + + + + + + + + + + + + + +

+ +

+ + English + + / + + فارسی + + / + + 简体中文 + + / + + Русский + +

+ +

+ + Marzban screenshots + +

+ +## Table of Contents + +- [Overview](#overview) + - [Why using Marzban?](#why-using-marzban) + - [Features](#features) +- [Installation guide](#installation-guide) +- [Configuration](#configuration) +- [API](#api) +- [Backup](#backup) +- [Telegram Bot](#telegram-bot) +- [Marzban CLI](#marzban-cli) +- [Marzban Node](#marzban-node) +- [Webhook notifications](#webhook-notifications) +- [Donation](#donation) +- [License](#license) +- [Contributors](#contributors) + +# Overview + +Marzban (the Persian word for "border guard" - pronounced /mærz'ban/) is a proxy management tool that provides a simple and easy-to-use user interface for managing hundreds of proxy accounts powered by [Xray-core](https://github.com/XTLS/Xray-core) and built using Python and Reactjs. + +## Why using Marzban? + +Marzban is user-friendly, feature-rich and reliable. It lets you to create different proxies for your users without any complicated configuration. Using its built-in web UI, you are able to monitor, modify and limit users. + +### Features + +- Built-in **Web UI** +- Fully **REST API** backend +- [**Multiple Nodes**](#marzban-node) support (for infrastructure distribution & scalability) +- Supports protocols **Vmess**, **VLESS**, **Trojan** and **Shadowsocks** +- **Multi-protocol** for a single user +- **Multi-user** on a single inbound +- **Multi-inbound** on a **single port** (fallbacks support) +- **Traffic** and **expiry date** limitations +- **Periodic** traffic limit (e.g. daily, weekly, etc.) +- **Subscription link** compatible with **V2ray** _(such as V2RayNG, OneClick, Nekoray, etc.)_, **Clash** and **ClashMeta** +- Automated **Share link** and **QRcode** generator +- System monitoring and **traffic statistics** +- Customizable xray configuration +- **TLS** and **REALITY** support +- Integrated **Telegram Bot** +- Integrated **Command Line Interface (CLI)** +- **Multi-language** +- **Multi-admin** support (WIP) + +# Installation guide + +Run the following command + +```bash +sudo bash -c "$(curl -sL https://github.com/Gozargah/Marzban-scripts/raw/master/marzban.sh)" @ install +``` + +Once the installation is complete: + +- You will see the logs that you can stop watching them by closing the terminal or pressing `Ctrl+C` +- The Marzban files will be located at `/opt/marzban` +- The configuration file can be found at `/opt/marzban/.env` (refer to [configurations](#configuration) section to see variables) +- The data files will be placed at `/var/lib/marzban` +- You can access the Marzban dashboard by opening a web browser and navigating to `http://YOUR_SERVER_IP:8000/dashboard/` (replace YOUR_SERVER_IP with the actual IP address of your server) + +Next, you need to create a sudo admin for logging into the Marzban dashboard by the following command + +```bash +marzban cli admin create --sudo +``` + +That's it! You can login to your dashboard using these credentials + +To see the help message of the Marzban script, run the following command + +```bash +marzban --help +``` + +If you are eager to run the project using the source code, check the section below +
+

Manual install (advanced)

+ +Install xray on your machine + +You can install it using [Xray-install](https://github.com/XTLS/Xray-install) + +```bash +bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install +``` + +Clone this project and install the dependencies (you need Python >= 3.8) + +```bash +git clone https://github.com/Gozargah/Marzban.git +cd Marzban +wget -qO- https://bootstrap.pypa.io/get-pip.py | python3 - +python3 -m pip install -r requirements.txt +``` + +Alternatively, to have an isolated environment you can use [Python Virtualenv](https://pypi.org/project/virtualenv/) + +Then run the following command to run the database migration scripts + +```bash +alembic upgrade head +``` + +If you want to use `marzban-cli`, you should link it to a file in your `$PATH`, make it executable, and install the auto-completion: + +```bash +sudo ln -s $(pwd)/marzban-cli.py /usr/bin/marzban-cli +sudo chmod +x /usr/bin/marzban-cli +marzban-cli completion install +``` + +Now it's time to configuration + +Make a copy of `.env.example` file, take a look and edit it using a text editor like `nano`. + +You probably like to modify the admin credentials. + +```bash +cp .env.example .env +nano .env +``` + +> Check [configurations](#configuration) section for more information + +Eventually, launch the application using command below + +```bash +python3 main.py +``` + +To launch with linux systemctl (copy marzban.service file to `/var/lib/marzban/marzban.service`) + +``` +systemctl enable /var/lib/marzban/marzban.service +systemctl start marzban +``` + +To use with nginx + +``` +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name example.com; + + ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; + + location ~* /(dashboard|api|docs|redoc|openapi.json) { + proxy_pass http://0.0.0.0:8000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + # xray-core ws-path: / + # client ws-path: /marzban/me/2087 + # + # All traffic is proxed through port 443, and send to the xray port(2087, 2088 etc.). + # The '/marzban' in location regex path can changed any characters by yourself. + # + # /${path}/${username}/${xray-port} + location ~* /marzban/.+/(.+)$ { + proxy_redirect off; + proxy_pass http://127.0.0.1:$1/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } +} +``` + +or + +``` +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name marzban.example.com; + + ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; + + location / { + proxy_pass http://0.0.0.0:8000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } +} +``` + +By default the app will be run on `http://localhost:8000/dashboard`. You can configure it using changing the `UVICORN_HOST` and `UVICORN_PORT` environment variables. +
+ +# Configuration + +> You can set settings below using environment variables or placing them in `.env` file. + +| Variable | Description | +| --------------------------------- | ----------------------------------------------------------------------------------------------------- | +| SUDO_USERNAME | Superuser's username | +| SUDO_PASSWORD | Superuser's password | +| SQLALCHEMY_DATABASE_URL | Database URL ([SQLAlchemy's docs](https://docs.sqlalchemy.org/en/20/core/engines.html#database-urls)) | +| UVICORN_HOST | Bind application to this host (default: `0.0.0.0`) | +| UVICORN_PORT | Bind application to this port (default: `8000`) | +| UVICORN_UDS | Bind application to a UNIX domain socket | +| UVICORN_SSL_CERTFILE | SSL certificate file to have application on https | +| UVICORN_SSL_KEYFILE | SSL key file to have application on https | +| XRAY_JSON | Path of Xray's json config file (default: `xray_config.json`) | +| XRAY_EXECUTABLE_PATH | Path of Xray binary (default: `/usr/local/bin/xray`) | +| XRAY_ASSETS_PATH | Path of Xray assets (default: `/usr/local/share/xray`) | +| XRAY_SUBSCRIPTION_URL_PREFIX | Prefix of subscription URLs | +| XRAY_FALLBACKS_INBOUND_TAG | Tag of the inbound that includes fallbacks, needed in the case you're using fallbacks | +| XRAY_EXCLUDE_INBOUND_TAGS | Tags of the inbounds that shouldn't be managed and included in links by application | +| CUSTOM_TEMPLATES_DIRECTORY | Customized templates directory (default: `app/templates`) | +| CLASH_SUBSCRIPTION_TEMPLATE | The template that will be used for generating clash configs (default: `clash/default.yml`) | +| SUBSCRIPTION_PAGE_TEMPLATE | The template used for generating subscription info page (default: `subscription/index.html`) | +| HOME_PAGE_TEMPLATE | Decoy page template (default: `home/index.html`) | +| TELEGRAM_API_TOKEN | Telegram bot API token (get token from [@botfather](https://t.me/botfather)) | +| TELEGRAM_ADMIN_ID | Numeric Telegram ID of admin (use [@userinfobot](https://t.me/userinfobot) to found your ID) | +| TELEGRAM_PROXY_URL | Run Telegram Bot over proxy | +| JWT_ACCESS_TOKEN_EXPIRE_MINUTES | Expire time for the Access Tokens in minutes, `0` considered as infinite (default: `1440`) | +| DOCS | Whether API documents should be available on `/docs` and `/redoc` or not (default: `False`) | +| DEBUG | Debug mode for development (default: `False`) | +| WEBHOOK_ADDRESS | Webhook address to send notifications to. Webhook notifications will be sent if this value was set. | +| WEBHOOK_SECRET | Webhook secret will be sent with each request as `x-webhook-secret` in the header (default: `None`) | +| NUMBER_OF_RECURRENT_NOTIFICATIONS | How many times to retry if an error detected in sending a notification (default: `3`) | +| RECURRENT_NOTIFICATIONS_TIMEOUT | Timeout between each retry if an error detected in sending a notification in seconds (default: `180`) | +| NOTIFY_REACHED_USAGE_PERCENT | At which percentage of usage to send the warning notification (default: `80`) | +| NOTIFY_DAYS_LEFT | When to send warning notifaction about expiration (default: `3`) | + +# API + +Marzban provides a REST API that enables developers to interact with Marzban services programmatically. To view the API documentation in Swagger UI or ReDoc, set the configuration variable `DOCS=True` and navigate to the `/docs` and `/redoc`. + +# Backup + +It's always a good idea to backup your Marzban files regularly to prevent data loss in case of system failures or accidental deletion. Here are the steps to backup Marzban: + +1. By default, all Marzban important files are saved in `/var/lib/marzban` (Docker versions). Copy the entire `/var/lib/marzban` directory to a backup location of your choice, such as an external hard drive or cloud storage. +2. Additionally, make sure to backup your env file, which contains your configuration variables, and also, your Xray config file. If you installed Marzban using marzban-scripts (recommended installation approach), the env and other configurations should be inside `/opt/marzban/` directory. + +By following these steps, you can ensure that you have a backup of all your Marzban files and data, as well as your configuration variables and Xray configuration, in case you need to restore them in the future. Remember to update your backups regularly to keep them up-to-date. + +# Telegram Bot + +Marzban comes with an integrated Telegram bot that can handle server management, user creation and removal, and send notifications. This bot can be easily enabled by following a few simple steps, and it provides a convenient way to interact with Marzban without having to log in to the server every time. + +To enable Telegram Bot: + +1. set `TELEGRAM_API_TOKEN` to your bot's API Token +2. set `TELEGRAM_ADMIN_ID` to your Telegram account's numeric ID, you can get your ID from [@userinfobot](https://t.me/userinfobot) + +# Marzban CLI + +Marzban comes with an integrated CLI named `marzban-cli` which allows administrators to have direct interaction with it. + +If you've installed Marzban using easy install script, you can access the cli commands by running + +```bash +marzban cli [OPTIONS] COMMAND [ARGS]... +``` + +For more information, You can read [Marzban CLI's documentation](./cli/README.md). + +# Marzban Node + +The Marzban project introduces the [Marzban-node](https://github.com/gozargah/marzban-node), which revolutionizes infrastructure distribution. With Marzban-node, you can distribute your infrastructure across multiple locations, unlocking benefits such as redundancy, high availability, scalability, flexibility. Marzban-node empowers users to connect to different servers, offering them the flexibility to choose and connect to multiple servers instead of being limited to only one server. +For more detailed information and installation instructions, please refer to the [Marzban-node official documentation](https://github.com/gozargah/marzban-node) + +# Webhook notifications + +You can set a webhook address and Marzban will send the notifications to that address. + +the requests will be sent as a post request to the adress provided by `WEBHOOK_ADDRESS` with `WEBHOOK_SECRET` as `x-webhook-secret` in the headers. + +Example request sent from Marzban: + +``` +Headers: +Host: 0.0.0.0:9000 +User-Agent: python-requests/2.28.1 +Accept-Encoding: gzip, deflate +Accept: */* +Connection: keep-alive +x-webhook-secret: something-very-very-secret +Content-Length: 107 +Content-Type: application/json + + + +Body: +{"username": "marzban_test_user", "action": "user_updated", "enqueued_at": 1680506457.636369, "tries": 0} +``` + +Different action typs are: `user_created`, `user_updated`, `user_deleted`, `user_limited`, `user_expired`, `user_disabled`, `user_enabled` + +# Donation + +If you found Marzban useful and would like to support its development, you can make a donation in one of the following crypto networks: + +- TRON network (TRC20): `TX8kJoDcowQPBFTYHAJR36GyoUKP1Xwzkb` +- ETH, BNB, MATIC network (ERC20, BEP20): `0xFdc9ad32454FA4fc4733270FCc12ddBFb68b83F7` +- Bitcoin network: `bc1qpys2nefgsjjgae3g3gqy9crsv3h3rm96tlkz0v` +- Dogecoin network: `DJAocBAu8y6LwhDKUktLAyzV8xyoFeHH6R` +- TON network: `EQAVf-7hAXHlF-jmrKE44oBwN7HGQFVBLAtrOsev5K4qR4P8` + +Thank you for your support! + +# License + +Made in [Unknown!] and Published under [AGPL-3.0](./LICENSE). + +# Contributors + +We ❤️‍🔥 contributors! If you'd like to contribute, please check out our [Contributing Guidelines](CONTRIBUTING.md) and feel free to submit a pull request or open an issue. We also welcome you to join our [Telegram](https://t.me/gozargah_marzban) group for either support or contributing guidance. + +Check [open issues](https://github.com/gozargah/marzban/issues) to help the progress of this project. + +

+Thanks to the all contributors who have helped improve Marzban: +

+

+ + + +

+

+ Made with contrib.rocks +

diff --git a/alembic.ini b/alembic.ini new file mode 100644 index 0000000..402281a --- /dev/null +++ b/alembic.ini @@ -0,0 +1,99 @@ +# A generic, single database configuration. + +[alembic] +# path to migration scripts +script_location = app/db/migrations + +# template used to generate migration file names; The default value is %%(rev)s_%%(slug)s +# Uncomment the line below if you want the files to be prepended with date and time +# see https://alembic.sqlalchemy.org/en/latest/tutorial.html#editing-the-ini-file +# for all available tokens +# file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s + +# sys.path path, will be prepended to sys.path if present. +# defaults to the current working directory. +prepend_sys_path = . + +# timezone to use when rendering the date within the migration file +# as well as the filename. +# If specified, requires the python-dateutil library that can be +# installed by adding `alembic[tz]` to the pip requirements +# string value is passed to dateutil.tz.gettz() +# leave blank for localtime +# timezone = + +# max length of characters to apply to the +# "slug" field +# truncate_slug_length = 40 + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + +# set to 'true' to allow .pyc and .pyo files without +# a source .py file to be detected as revisions in the +# versions/ directory +# sourceless = false + +# version location specification; This defaults +# to app/db/migrations/versions. When using multiple version +# directories, initial revisions must be specified with --version-path. +# The path separator used here should be the separator specified by "version_path_separator" below. +# version_locations = %(here)s/bar:%(here)s/bat:app/db/migrations/versions + +# version path separator; As mentioned above, this is the character used to split +# version_locations. The default within new alembic.ini files is "os", which uses os.pathsep. +# If this key is omitted entirely, it falls back to the legacy behavior of splitting on spaces and/or commas. +# Valid values for version_path_separator are: +# +# version_path_separator = : +# version_path_separator = ; +# version_path_separator = space +version_path_separator = os # Use os.pathsep. Default configuration used for new projects. + + +[post_write_hooks] +# post_write_hooks defines scripts or Python functions that are run +# on newly generated revision scripts. See the documentation for further +# detail and examples + +# format using "black" - use the console_scripts runner, against the "black" entrypoint +# hooks = black +# black.type = console_scripts +# black.entrypoint = black +# black.options = -l 79 REVISION_SCRIPT_FILENAME + +# Logging configuration +[loggers] +keys = root,sqlalchemy,alembic + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARN +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARN +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/app/__init__.py b/app/__init__.py new file mode 100755 index 0000000..7c9aa40 --- /dev/null +++ b/app/__init__.py @@ -0,0 +1,70 @@ +import logging + +from apscheduler.schedulers.asyncio import AsyncIOScheduler +from fastapi import FastAPI, Request, status +from fastapi.encoders import jsonable_encoder +from fastapi.exceptions import RequestValidationError +from fastapi.middleware.cors import CORSMiddleware +from fastapi.responses import JSONResponse +from fastapi.routing import APIRoute +from fastapi_responses import custom_openapi + +from config import DOCS, XRAY_SUBSCRIPTION_PATH + +__version__ = "0.4.2" + + +app = FastAPI( + title="MarzbanAPI", + description="Unified GUI Censorship Resistant Solution Powered by Xray", + version=__version__, + docs_url='/docs' if DOCS else None, + redoc_url='/redoc' if DOCS else None +) +app.openapi = custom_openapi(app) +scheduler = AsyncIOScheduler(timezone='UTC') +logger = logging.getLogger('uvicorn.error') +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + + +from app import dashboard, views, jobs # , telegram # noqa + + +def use_route_names_as_operation_ids(app: FastAPI) -> None: + for route in app.routes: + if isinstance(route, APIRoute): + route.operation_id = route.name + + +use_route_names_as_operation_ids(app) + + +@app.on_event("startup") +def on_startup(): + paths = [f"{r.path}/" for r in app.routes] + paths.append("/api/") + if f"/{XRAY_SUBSCRIPTION_PATH}/" in paths: + raise ValueError(f"you can't use /{XRAY_SUBSCRIPTION_PATH}/ as subscription path it reserved for {app.title}") + scheduler.start() + + +@app.on_event("shutdown") +def on_shutdown(): + scheduler.shutdown() + + +@app.exception_handler(RequestValidationError) +def validation_exception_handler(request: Request, exc: RequestValidationError): + details = {} + for error in exc.errors(): + details[error["loc"][-1]] = error.get("msg") + return JSONResponse( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + content=jsonable_encoder({"detail": details}), + ) diff --git a/app/dashboard/.prettierrc.json b/app/dashboard/.prettierrc.json new file mode 100644 index 0000000..1c5e966 --- /dev/null +++ b/app/dashboard/.prettierrc.json @@ -0,0 +1,3 @@ +{ + "printWidth": 80 +} diff --git a/app/dashboard/README.md b/app/dashboard/README.md new file mode 100644 index 0000000..819e840 --- /dev/null +++ b/app/dashboard/README.md @@ -0,0 +1,40 @@ +# Dashboard UI for marzban + +## Requirements + +For development, you will only need Node.js installed on your environement. + +### Node + +[Node](http://nodejs.org/) is really easy to install & now include [NPM](https://npmjs.org/). +This project has been developed on the Nodejs v16.17.0 so if you faced any issue during installation that may related to the node version, install Node with version >= v16.17.0. + +## Install + + git clone https://github.com/gozargah/marz-manager.git + cd marz-manager + yarn install + +### Configure app + +Copy `example.env` to `.env` then set the backend api address: + + VITE_BASE_API=https://somewhere.com/ + +#### Environment variables + +| Name | Description | +| ------------- | ------------------------------------------------------------------------------------ | +| VITE_BASE_API | The api url of the deployed backend ([Marzban](https://github.com/gozargah/Marzban)) | + +## Start development server + + yarn dev + +## Simple build for production + + yarn build + +## Contribution + +Feel free to contribute. Go on and fork the project. After commiting the changes, make a PR. It means a lot to us. diff --git a/app/dashboard/__init__.py b/app/dashboard/__init__.py new file mode 100644 index 0000000..8138e42 --- /dev/null +++ b/app/dashboard/__init__.py @@ -0,0 +1,54 @@ +import atexit +import os +import subprocess +from pathlib import Path + +from app import app +from config import DEBUG, VITE_BASE_API +from fastapi.staticfiles import StaticFiles + +path = '/dashboard/' +base_dir = Path(__file__).parent +build_dir = base_dir / 'build' + + +def build(): + proc = subprocess.Popen( + ['npm', 'run', 'build', '--', '--base', path, '--outDir', build_dir], + env={**os.environ, 'VITE_BASE_API': VITE_BASE_API}, + cwd=base_dir + ) + proc.wait() + with open(build_dir / 'index.html', 'r') as file: + html = file.read() + with open(build_dir / '404.html', 'w') as file: + file.write(html) + + +def run_dev(): + proc = subprocess.Popen( + ['npm', 'run', 'dev', '--', '--host', '0.0.0.0', '--base', path, '--clearScreen', 'false'], + env={**os.environ, 'VITE_BASE_API': VITE_BASE_API}, + cwd=base_dir + ) + + atexit.register(proc.terminate) + + +def run_build(): + if not build_dir.is_dir(): + build() + + app.mount( + path, + StaticFiles(directory=build_dir, html=True), + name="dashboard" + ) + + +@app.on_event("startup") +def startup(): + if DEBUG is True: + run_dev() + else: + run_build() diff --git a/app/dashboard/chakra.config.ts b/app/dashboard/chakra.config.ts new file mode 100644 index 0000000..5041133 --- /dev/null +++ b/app/dashboard/chakra.config.ts @@ -0,0 +1,168 @@ +import { extendTheme } from "@chakra-ui/react"; +export const theme = extendTheme({ + shadows: { outline: "0 0 0 2px var(--chakra-colors-primary-200)" }, + fonts: { + body: `Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif`, + }, + colors: { + "light-border": "#d2d2d4", + primary: { + 50: "#9cb7f2", + 100: "#88a9ef", + 200: "#749aec", + 300: "#618ce9", + 400: "#4d7de7", + 500: "#396fe4", + 600: "#3364cd", + 700: "#2e59b6", + 800: "#284ea0", + 900: "#224389", + }, + gray: { + 750: "#222C3B", + }, + }, + components: { + Alert: { + baseStyle: { + container: { + borderRadius: "6px", + fontSize: "sm", + }, + }, + }, + Select: { + baseStyle: { + field: { + _dark: { + borderColor: "gray.600", + borderRadius: "6px", + }, + _light: { + borderRadius: "6px", + }, + }, + }, + }, + FormHelperText: { + baseStyle: { + fontSize: "xs", + }, + }, + FormLabel: { + baseStyle: { + fontSize: "sm", + fontWeight: "medium", + mb: "1", + _dark: { color: "gray.300" }, + }, + }, + Input: { + baseStyle: { + addon: { + _dark: { + borderColor: "gray.600", + _placeholder: { + color: "gray.500", + }, + }, + }, + field: { + _focusVisible: { + boxShadow: "none", + borderColor: "primary.200", + outlineColor: "primary.200", + }, + _dark: { + borderColor: "gray.600", + _disabled: { + color: "gray.400", + borderColor: "gray.500", + }, + _placeholder: { + color: "gray.500", + }, + }, + }, + }, + }, + Table: { + baseStyle: { + table: { + borderCollapse: "separate", + borderSpacing: 0, + }, + thead: { + borderBottomColor: "light-border", + }, + th: { + background: "#F9FAFB", + borderColor: "light-border !important", + borderBottomColor: "light-border !important", + borderTop: "1px solid ", + borderTopColor: "light-border !important", + _first: { + borderLeft: "1px solid", + borderColor: "light-border !important", + }, + _last: { + borderRight: "1px solid", + borderColor: "light-border !important", + }, + _dark: { + borderColor: "gray.600 !important", + background: "gray.750", + }, + }, + td: { + transition: "all .1s ease-out", + borderColor: "light-border", + borderBottomColor: "light-border !important", + _first: { + borderLeft: "1px solid", + borderColor: "light-border", + _dark: { + borderColor: "gray.600", + }, + }, + _last: { + borderRight: "1px solid", + borderColor: "light-border", + _dark: { + borderColor: "gray.600", + }, + }, + _dark: { + borderColor: "gray.600", + borderBottomColor: "gray.600 !important", + }, + }, + tr: { + "&.interactive": { + cursor: "pointer", + _hover: { + "& > td": { + bg: "gray.200", + }, + _dark: { + "& > td": { + bg: "gray.750", + }, + }, + }, + }, + _last: { + "& > td": { + _first: { + borderBottomLeftRadius: "8px", + }, + _last: { + borderBottomRightRadius: "8px", + }, + }, + }, + }, + }, + }, + }, +}); diff --git a/app/dashboard/example.env b/app/dashboard/example.env new file mode 100644 index 0000000..1409355 --- /dev/null +++ b/app/dashboard/example.env @@ -0,0 +1 @@ +VITE_BASE_API= diff --git a/app/dashboard/index.html b/app/dashboard/index.html new file mode 100644 index 0000000..4fc5208 --- /dev/null +++ b/app/dashboard/index.html @@ -0,0 +1,41 @@ + + + + + + Marzban + + + + + + + + + + + + + +
+ + + diff --git a/app/dashboard/package-lock.json b/app/dashboard/package-lock.json new file mode 100644 index 0000000..59bd466 --- /dev/null +++ b/app/dashboard/package-lock.json @@ -0,0 +1,9758 @@ +{ + "name": "marzban-dashboard", + "version": "0.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "marzban-dashboard", + "version": "0.0.0", + "hasInstallScript": true, + "dependencies": { + "@chakra-ui/react": "^2.5.5", + "@emotion/react": "^11.10.5", + "@emotion/styled": "^11.10.5", + "@heroicons/react": "^2.0.12", + "@hookform/resolvers": "^2.9.10", + "apexcharts": "^3.40.0", + "classnames": "^2.3.2", + "dayjs": "^1.11.6", + "framer-motion": "^7.6.6", + "i18next": "^22.4.14", + "i18next-browser-languagedetector": "^7.0.1", + "i18next-http-backend": "^2.2.0", + "jsoneditor": "^9.10.1", + "lodash.debounce": "^4.0.8", + "ohmyfetch": "^0.4.21", + "qrcode.react": "^3.1.0", + "react": "^18.2.0", + "react-apexcharts": "^1.4.0", + "react-copy-to-clipboard": "^5.1.0", + "react-datepicker": "^4.8.0", + "react-dom": "^18.2.0", + "react-github-btn": "^1.4.0", + "react-hook-form": "^7.39.1", + "react-i18next": "^12.2.0", + "react-json-editor-ajrm": "^2.5.14", + "react-loading-skeleton": "^3.1.0", + "react-query": "^3.39.3", + "react-router-dom": "^6.4.3", + "react-slick": "^0.29.0", + "react-use-websocket": "^4.3.1", + "rollup-plugin-visualizer": "^5.9.0", + "slick-carousel": "^1.8.1", + "vite-tsconfig-paths": "^4.0.3", + "zod": "^3.19.1", + "zustand": "^4.4.6", + "zustand-computed": "^1.3.3" + }, + "devDependencies": { + "@chakra-ui/cli": "^2.3.0", + "@types/jsoneditor": "^9.9.0", + "@types/lodash.debounce": "^4.0.7", + "@types/react": "^18.0.17", + "@types/react-copy-to-clipboard": "^5.0.4", + "@types/react-datepicker": "^4.8.0", + "@types/react-dom": "^18.0.6", + "@types/react-json-editor-ajrm": "^2.5.3", + "@types/react-slick": "^0.23.10", + "@vitejs/plugin-react": "^2.1.0", + "autoprefixer": "^10.4.12", + "sass": "^1.57.1", + "typescript": "^4.9.5", + "vite": "^3.1.0", + "vite-plugin-svgr": "^2.2.2" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", + "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz", + "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.21.0", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.21.0", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.0", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", + "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.3", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", + "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.2", + "@babel/types": "^7.21.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", + "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", + "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.0.tgz", + "integrity": "sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", + "dev": true, + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.21.0.tgz", + "integrity": "sha512-f/Eq+79JEu+KUANFks9UZCcvydOOGMgF7jBrcwjHa5jTZD8JivnhCJYvmlhR/WTXBWonDExPoW0eO/CR4QJirA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz", + "integrity": "sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", + "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.3", + "@babel/types": "^7.23.3", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", + "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@chakra-ui/accordion": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/@chakra-ui/accordion/-/accordion-2.1.11.tgz", + "integrity": "sha512-mfVPmqETp9pyRDHJ33AdF19oHv/LyxVzQJtlxUByuvs8Cj9QQZ2LQLg5kejm+b3mj03A7A6yfbuo3RNaI4Bhsg==", + "dependencies": { + "@chakra-ui/descendant": "3.0.14", + "@chakra-ui/icon": "3.0.16", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-use-controllable-state": "2.0.8", + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/transition": "2.0.16" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "framer-motion": ">=4.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/alert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/alert/-/alert-2.1.0.tgz", + "integrity": "sha512-OcfHwoXI5VrmM+tHJTHT62Bx6TfyfCxSa0PWUOueJzSyhlUOKBND5we6UtrOB7D0jwX45qKKEDJOLG5yCG21jQ==", + "dependencies": { + "@chakra-ui/icon": "3.0.16", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/spinner": "2.0.13" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/anatomy": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/anatomy/-/anatomy-2.1.2.tgz", + "integrity": "sha512-pKfOS/mztc4sUXHNc8ypJ1gPWSolWT770jrgVRfolVbYlki8y5Y+As996zMF6k5lewTu6j9DQequ7Cc9a69IVQ==" + }, + "node_modules/@chakra-ui/avatar": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@chakra-ui/avatar/-/avatar-2.2.8.tgz", + "integrity": "sha512-uBs9PMrqyK111tPIYIKnOM4n3mwgKqGpvYmtwBnnbQLTNLg4gtiWWVbpTuNMpyu1av0xQYomjUt8Doed8w6p8g==", + "dependencies": { + "@chakra-ui/image": "2.0.15", + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/breadcrumb": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@chakra-ui/breadcrumb/-/breadcrumb-2.1.5.tgz", + "integrity": "sha512-p3eQQrHQBkRB69xOmNyBJqEdfCrMt+e0eOH+Pm/DjFWfIVIbnIaFbmDCeWClqlLa21Ypc6h1hR9jEmvg8kmOog==", + "dependencies": { + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/breakpoint-utils": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@chakra-ui/breakpoint-utils/-/breakpoint-utils-2.0.8.tgz", + "integrity": "sha512-Pq32MlEX9fwb5j5xx8s18zJMARNHlQZH2VH1RZgfgRDpp7DcEgtRW5AInfN5CfqdHLO1dGxA7I3MqEuL5JnIsA==", + "dependencies": { + "@chakra-ui/shared-utils": "2.0.5" + } + }, + "node_modules/@chakra-ui/button": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@chakra-ui/button/-/button-2.0.18.tgz", + "integrity": "sha512-E3c99+lOm6ou4nQVOTLkG+IdOPMjsQK+Qe7VyP8A/xeAMFONuibrWPRPpprr4ZkB4kEoLMfNuyH2+aEza3ScUA==", + "dependencies": { + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/spinner": "2.0.13" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/card": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@chakra-ui/card/-/card-2.1.6.tgz", + "integrity": "sha512-fFd/WAdRNVY/WOSQv4skpy0WeVhhI0f7dTY1Sm0jVl0KLmuP/GnpsWtKtqWjNcV00K963EXDyhlk6+9oxbP4gw==", + "dependencies": { + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/checkbox": { + "version": "2.2.14", + "resolved": "https://registry.npmjs.org/@chakra-ui/checkbox/-/checkbox-2.2.14.tgz", + "integrity": "sha512-uqo6lFWLqYBujPglrvRhTAErtuIXpmdpc5w0W4bjK7kyvLhxOpUh1hlDb2WoqlNpfRn/OaNeF6VinPnf9BJL8w==", + "dependencies": { + "@chakra-ui/form-control": "2.0.18", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-callback-ref": "2.0.7", + "@chakra-ui/react-use-controllable-state": "2.0.8", + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@chakra-ui/react-use-safe-layout-effect": "2.0.5", + "@chakra-ui/react-use-update-effect": "2.0.7", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/visually-hidden": "2.0.15", + "@zag-js/focus-visible": "0.2.2" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/cli": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/cli/-/cli-2.4.1.tgz", + "integrity": "sha512-GZZuHUA1cXJWpmYNiVTLPihvY4VhIssRl+AXgw/0IbeodTMop3jWlIioPKLAQeXu5CwvRA6iESyGjnu1V8Zykg==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.3", + "cli-check-node": "^1.3.4", + "cli-handle-unhandled": "^1.1.1", + "cli-welcome": "^2.2.2", + "commander": "^9.3.0", + "esbuild": "^0.17.18", + "prettier": "^2.8.8" + }, + "bin": { + "chakra-cli": "bin/index.js" + } + }, + "node_modules/@chakra-ui/cli/node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@chakra-ui/cli/node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@chakra-ui/cli/node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/@chakra-ui/clickable": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@chakra-ui/clickable/-/clickable-2.0.14.tgz", + "integrity": "sha512-jfsM1qaD74ZykLHmvmsKRhDyokLUxEfL8Il1VoZMNX5RBI0xW/56vKpLTFF/v/+vLPLS+Te2cZdD4+2O+G6ulA==", + "dependencies": { + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/close-button": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@chakra-ui/close-button/-/close-button-2.0.17.tgz", + "integrity": "sha512-05YPXk456t1Xa3KpqTrvm+7smx+95dmaPiwjiBN3p7LHUQVHJd8ZXSDB0V+WKi419k3cVQeJUdU/azDO2f40sw==", + "dependencies": { + "@chakra-ui/icon": "3.0.16" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/color-mode": { + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@chakra-ui/color-mode/-/color-mode-2.1.12.tgz", + "integrity": "sha512-sYyfJGDoJSLYO+V2hxV9r033qhte5Nw/wAn5yRGGZnEEN1dKPEdWQ3XZvglWSDTNd0w9zkoH2w6vP4FBBYb/iw==", + "dependencies": { + "@chakra-ui/react-use-safe-layout-effect": "2.0.5" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/control-box": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@chakra-ui/control-box/-/control-box-2.0.13.tgz", + "integrity": "sha512-FEyrU4crxati80KUF/+1Z1CU3eZK6Sa0Yv7Z/ydtz9/tvGblXW9NFanoomXAOvcIFLbaLQPPATm9Gmpr7VG05A==", + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/counter": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@chakra-ui/counter/-/counter-2.0.14.tgz", + "integrity": "sha512-KxcSRfUbb94dP77xTip2myoE7P2HQQN4V5fRJmNAGbzcyLciJ+aDylUU/UxgNcEjawUp6Q242NbWb1TSbKoqog==", + "dependencies": { + "@chakra-ui/number-utils": "2.0.7", + "@chakra-ui/react-use-callback-ref": "2.0.7", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/css-reset": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/css-reset/-/css-reset-2.1.1.tgz", + "integrity": "sha512-jwEOfIAWmQsnChHQTW/eRE+dfE4MjmhvSvoUug5nkV1pI7veC/20noFlIZxzi82EbiQI8Fs0+Jnusgxr2yaOHA==", + "peerDependencies": { + "@emotion/react": ">=10.0.35", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/descendant": { + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/@chakra-ui/descendant/-/descendant-3.0.14.tgz", + "integrity": "sha512-+Ahvp9H4HMpfScIv9w1vaecGz7qWAaK1YFHHolz/SIsGLaLGlbdp+5UNabQC7L6TUnzzJDQDxzwif78rTD7ang==", + "dependencies": { + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-use-merge-refs": "2.0.7" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/dom-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@chakra-ui/dom-utils/-/dom-utils-2.0.6.tgz", + "integrity": "sha512-PVtDkPrDD5b8aoL6Atg7SLjkwhWb7BwMcLOF1L449L3nZN+DAO3nyAh6iUhZVJyunELj9d0r65CDlnMREyJZmA==" + }, + "node_modules/@chakra-ui/editable": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/@chakra-ui/editable/-/editable-2.0.21.tgz", + "integrity": "sha512-oYuXbHnggxSYJN7P9Pn0Scs9tPC91no4z1y58Oe+ILoJKZ+bFAEHtL7FEISDNJxw++MEukeFu7GU1hVqmdLsKQ==", + "dependencies": { + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-callback-ref": "2.0.7", + "@chakra-ui/react-use-controllable-state": "2.0.8", + "@chakra-ui/react-use-focus-on-pointer-down": "2.0.6", + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@chakra-ui/react-use-safe-layout-effect": "2.0.5", + "@chakra-ui/react-use-update-effect": "2.0.7", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/event-utils": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@chakra-ui/event-utils/-/event-utils-2.0.8.tgz", + "integrity": "sha512-IGM/yGUHS+8TOQrZGpAKOJl/xGBrmRYJrmbHfUE7zrG3PpQyXvbLDP1M+RggkCFVgHlJi2wpYIf0QtQlU0XZfw==" + }, + "node_modules/@chakra-ui/focus-lock": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@chakra-ui/focus-lock/-/focus-lock-2.0.16.tgz", + "integrity": "sha512-UuAdGCPVrCa1lecoAvpOQD7JFT7a9RdmhKWhFt5ioIcekSLJcerdLHuuL3w0qz//8kd1/SOt7oP0aJqdAJQrCw==", + "dependencies": { + "@chakra-ui/dom-utils": "2.0.6", + "react-focus-lock": "^2.9.2" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/form-control": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@chakra-ui/form-control/-/form-control-2.0.18.tgz", + "integrity": "sha512-I0a0jG01IAtRPccOXSNugyRdUAe8Dy40ctqedZvznMweOXzbMCF1m+sHPLdWeWC/VI13VoAispdPY0/zHOdjsQ==", + "dependencies": { + "@chakra-ui/icon": "3.0.16", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/hooks": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@chakra-ui/hooks/-/hooks-2.1.6.tgz", + "integrity": "sha512-oMSOeoOF6/UpwTVlDFHSROAA4hPY8WgJ0erdHs1ZkuwAwHv7UzjDkvrb6xYzAAH9qHoFzc5RIBm6jVoh3LCc+Q==", + "dependencies": { + "@chakra-ui/react-utils": "2.0.12", + "@chakra-ui/utils": "2.0.15", + "compute-scroll-into-view": "1.0.20", + "copy-to-clipboard": "3.3.3" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/icon": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/@chakra-ui/icon/-/icon-3.0.16.tgz", + "integrity": "sha512-RpA1X5Ptz8Mt39HSyEIW1wxAz2AXyf9H0JJ5HVx/dBdMZaGMDJ0HyyPBVci0m4RCoJuyG1HHG/DXJaVfUTVAeg==", + "dependencies": { + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/image": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@chakra-ui/image/-/image-2.0.15.tgz", + "integrity": "sha512-w2rElXtI3FHXuGpMCsSklus+pO1Pl2LWDwsCGdpBQUvGFbnHfl7MftQgTlaGHeD5OS95Pxva39hKrA2VklKHiQ==", + "dependencies": { + "@chakra-ui/react-use-safe-layout-effect": "2.0.5", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/input": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/@chakra-ui/input/-/input-2.0.21.tgz", + "integrity": "sha512-AIWjjg6MgcOtlvKmVoZfPPfgF+sBSWL3Zq2HSCAMvS6h7jfxz/Xv0UTFGPk5F4Wt0YHT7qMySg0Jsm0b78HZJg==", + "dependencies": { + "@chakra-ui/form-control": "2.0.18", + "@chakra-ui/object-utils": "2.0.8", + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/layout": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/@chakra-ui/layout/-/layout-2.1.18.tgz", + "integrity": "sha512-F4Gh2e+DGdaWdWT5NZduIFD9NM7Bnuh8sXARFHWPvIu7yvAwZ3ddqC9GK4F3qUngdmkJxDLWQqRSwSh96Lxbhw==", + "dependencies": { + "@chakra-ui/breakpoint-utils": "2.0.8", + "@chakra-ui/icon": "3.0.16", + "@chakra-ui/object-utils": "2.0.8", + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/lazy-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@chakra-ui/lazy-utils/-/lazy-utils-2.0.5.tgz", + "integrity": "sha512-UULqw7FBvcckQk2n3iPO56TMJvDsNv0FKZI6PlUNJVaGsPbsYxK/8IQ60vZgaTVPtVcjY6BE+y6zg8u9HOqpyg==" + }, + "node_modules/@chakra-ui/live-region": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@chakra-ui/live-region/-/live-region-2.0.13.tgz", + "integrity": "sha512-Ja+Slk6ZkxSA5oJzU2VuGU7TpZpbMb/4P4OUhIf2D30ctmIeXkxTWw1Bs1nGJAVtAPcGS5sKA+zb89i8g+0cTQ==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/media-query": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/@chakra-ui/media-query/-/media-query-3.2.12.tgz", + "integrity": "sha512-8pSLDf3oxxhFrhd40rs7vSeIBfvOmIKHA7DJlGUC/y+9irD24ZwgmCtFnn+y3gI47hTJsopbSX+wb8nr7XPswA==", + "dependencies": { + "@chakra-ui/breakpoint-utils": "2.0.8", + "@chakra-ui/react-env": "3.0.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/menu": { + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@chakra-ui/menu/-/menu-2.1.12.tgz", + "integrity": "sha512-ylNK1VJlr/3/EGg9dLPZ87cBJJjeiYXeU/gOAphsKXMnByrXWhbp4YVnyyyha2KZ0zEw0aPU4nCZ+A69aT9wrg==", + "dependencies": { + "@chakra-ui/clickable": "2.0.14", + "@chakra-ui/descendant": "3.0.14", + "@chakra-ui/lazy-utils": "2.0.5", + "@chakra-ui/popper": "3.0.13", + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-use-animation-state": "2.0.8", + "@chakra-ui/react-use-controllable-state": "2.0.8", + "@chakra-ui/react-use-disclosure": "2.0.8", + "@chakra-ui/react-use-focus-effect": "2.0.9", + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@chakra-ui/react-use-outside-click": "2.0.7", + "@chakra-ui/react-use-update-effect": "2.0.7", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/transition": "2.0.16" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "framer-motion": ">=4.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/modal": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/@chakra-ui/modal/-/modal-2.2.11.tgz", + "integrity": "sha512-2J0ZUV5tEzkPiawdkgPz6bmex7NXAde1VXooMwdvK+vuT8PV3U61yorTJOZVLdw7TjjI1Yo94mzsp6UwBud43Q==", + "dependencies": { + "@chakra-ui/close-button": "2.0.17", + "@chakra-ui/focus-lock": "2.0.16", + "@chakra-ui/portal": "2.0.16", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/transition": "2.0.16", + "aria-hidden": "^1.2.2", + "react-remove-scroll": "^2.5.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "framer-motion": ">=4.0.0", + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@chakra-ui/number-input": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/@chakra-ui/number-input/-/number-input-2.0.19.tgz", + "integrity": "sha512-HDaITvtMEqOauOrCPsARDxKD9PSHmhWywpcyCSOX0lMe4xx2aaGhU0QQFhsJsykj8Er6pytMv6t0KZksdDv3YA==", + "dependencies": { + "@chakra-ui/counter": "2.0.14", + "@chakra-ui/form-control": "2.0.18", + "@chakra-ui/icon": "3.0.16", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-callback-ref": "2.0.7", + "@chakra-ui/react-use-event-listener": "2.0.7", + "@chakra-ui/react-use-interval": "2.0.5", + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@chakra-ui/react-use-safe-layout-effect": "2.0.5", + "@chakra-ui/react-use-update-effect": "2.0.7", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/number-utils": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@chakra-ui/number-utils/-/number-utils-2.0.7.tgz", + "integrity": "sha512-yOGxBjXNvLTBvQyhMDqGU0Oj26s91mbAlqKHiuw737AXHt0aPllOthVUqQMeaYLwLCjGMg0jtI7JReRzyi94Dg==" + }, + "node_modules/@chakra-ui/object-utils": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@chakra-ui/object-utils/-/object-utils-2.0.8.tgz", + "integrity": "sha512-2upjT2JgRuiupdrtBWklKBS6tqeGMA77Nh6Q0JaoQuH/8yq+15CGckqn3IUWkWoGI0Fg3bK9LDlbbD+9DLw95Q==" + }, + "node_modules/@chakra-ui/pin-input": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/@chakra-ui/pin-input/-/pin-input-2.0.20.tgz", + "integrity": "sha512-IHVmerrtHN8F+jRB3W1HnMir1S1TUCWhI7qDInxqPtoRffHt6mzZgLZ0izx8p1fD4HkW4c1d4/ZLEz9uH9bBRg==", + "dependencies": { + "@chakra-ui/descendant": "3.0.14", + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-use-controllable-state": "2.0.8", + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/popover": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@chakra-ui/popover/-/popover-2.1.9.tgz", + "integrity": "sha512-OMJ12VVs9N32tFaZSOqikkKPtwAVwXYsES/D1pff/amBrE3ngCrpxJSIp4uvTdORfIYDojJqrR52ZplDKS9hRQ==", + "dependencies": { + "@chakra-ui/close-button": "2.0.17", + "@chakra-ui/lazy-utils": "2.0.5", + "@chakra-ui/popper": "3.0.13", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-animation-state": "2.0.8", + "@chakra-ui/react-use-disclosure": "2.0.8", + "@chakra-ui/react-use-focus-effect": "2.0.9", + "@chakra-ui/react-use-focus-on-pointer-down": "2.0.6", + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "framer-motion": ">=4.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/popper": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@chakra-ui/popper/-/popper-3.0.13.tgz", + "integrity": "sha512-FwtmYz80Ju8oK3Z1HQfisUE7JIMmDsCQsRBu6XuJ3TFQnBHit73yjZmxKjuRJ4JgyT4WBnZoTF3ATbRKSagBeg==", + "dependencies": { + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@popperjs/core": "^2.9.3" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/portal": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@chakra-ui/portal/-/portal-2.0.16.tgz", + "integrity": "sha512-bVID0qbQ0l4xq38LdqAN4EKD4/uFkDnXzFwOlviC9sl0dNhzICDb1ltuH/Adl1d2HTMqyN60O3GO58eHy7plnQ==", + "dependencies": { + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-use-safe-layout-effect": "2.0.5" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@chakra-ui/progress": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@chakra-ui/progress/-/progress-2.1.6.tgz", + "integrity": "sha512-hHh5Ysv4z6bK+j2GJbi/FT9CVyto2PtNUNwBmr3oNMVsoOUMoRjczfXvvYqp0EHr9PCpxqrq7sRwgQXUzhbDSw==", + "dependencies": { + "@chakra-ui/react-context": "2.0.8" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/provider": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/provider/-/provider-2.2.2.tgz", + "integrity": "sha512-UVwnIDnAWq1aKroN5AF+OpNpUqLVeIUk7tKvX3z4CY9FsPFFi6LTEhRHdhpwaU1Tau3Tf9agEu5URegpY7S8BA==", + "dependencies": { + "@chakra-ui/css-reset": "2.1.1", + "@chakra-ui/portal": "2.0.16", + "@chakra-ui/react-env": "3.0.0", + "@chakra-ui/system": "2.5.5", + "@chakra-ui/utils": "2.0.15" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0", + "@emotion/styled": "^11.0.0", + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@chakra-ui/radio": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/@chakra-ui/radio/-/radio-2.0.22.tgz", + "integrity": "sha512-GsQ5WAnLwivWl6gPk8P1x+tCcpVakCt5R5T0HumF7DGPXKdJbjS+RaFySrbETmyTJsKY4QrfXn+g8CWVrMjPjw==", + "dependencies": { + "@chakra-ui/form-control": "2.0.18", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@chakra-ui/shared-utils": "2.0.5", + "@zag-js/focus-visible": "0.2.2" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/@chakra-ui/react/-/react-2.5.5.tgz", + "integrity": "sha512-aBVMUtdWv2MrptD/tKSqICPsuJ+I+jvauegffO1qPUDlK3RrXIDeOHkLGWohgXNcjY5bGVWguFEzJm97//0ooQ==", + "dependencies": { + "@chakra-ui/accordion": "2.1.11", + "@chakra-ui/alert": "2.1.0", + "@chakra-ui/avatar": "2.2.8", + "@chakra-ui/breadcrumb": "2.1.5", + "@chakra-ui/button": "2.0.18", + "@chakra-ui/card": "2.1.6", + "@chakra-ui/checkbox": "2.2.14", + "@chakra-ui/close-button": "2.0.17", + "@chakra-ui/control-box": "2.0.13", + "@chakra-ui/counter": "2.0.14", + "@chakra-ui/css-reset": "2.1.1", + "@chakra-ui/editable": "2.0.21", + "@chakra-ui/focus-lock": "2.0.16", + "@chakra-ui/form-control": "2.0.18", + "@chakra-ui/hooks": "2.1.6", + "@chakra-ui/icon": "3.0.16", + "@chakra-ui/image": "2.0.15", + "@chakra-ui/input": "2.0.21", + "@chakra-ui/layout": "2.1.18", + "@chakra-ui/live-region": "2.0.13", + "@chakra-ui/media-query": "3.2.12", + "@chakra-ui/menu": "2.1.12", + "@chakra-ui/modal": "2.2.11", + "@chakra-ui/number-input": "2.0.19", + "@chakra-ui/pin-input": "2.0.20", + "@chakra-ui/popover": "2.1.9", + "@chakra-ui/popper": "3.0.13", + "@chakra-ui/portal": "2.0.16", + "@chakra-ui/progress": "2.1.6", + "@chakra-ui/provider": "2.2.2", + "@chakra-ui/radio": "2.0.22", + "@chakra-ui/react-env": "3.0.0", + "@chakra-ui/select": "2.0.19", + "@chakra-ui/skeleton": "2.0.24", + "@chakra-ui/slider": "2.0.23", + "@chakra-ui/spinner": "2.0.13", + "@chakra-ui/stat": "2.0.18", + "@chakra-ui/styled-system": "2.8.0", + "@chakra-ui/switch": "2.0.26", + "@chakra-ui/system": "2.5.5", + "@chakra-ui/table": "2.0.17", + "@chakra-ui/tabs": "2.1.9", + "@chakra-ui/tag": "3.0.0", + "@chakra-ui/textarea": "2.0.19", + "@chakra-ui/theme": "3.0.1", + "@chakra-ui/theme-utils": "2.0.15", + "@chakra-ui/toast": "6.1.1", + "@chakra-ui/tooltip": "2.2.7", + "@chakra-ui/transition": "2.0.16", + "@chakra-ui/utils": "2.0.15", + "@chakra-ui/visually-hidden": "2.0.15" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0", + "@emotion/styled": "^11.0.0", + "framer-motion": ">=4.0.0", + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@chakra-ui/react-children-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-children-utils/-/react-children-utils-2.0.6.tgz", + "integrity": "sha512-QVR2RC7QsOsbWwEnq9YduhpqSFnZGvjjGREV8ygKi8ADhXh93C8azLECCUVgRJF2Wc+So1fgxmjLcbZfY2VmBA==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-context": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-context/-/react-context-2.0.8.tgz", + "integrity": "sha512-tRTKdn6lCTXM6WPjSokAAKCw2ioih7Eg8cNgaYRSwKBck8nkz9YqxgIIEj3dJD7MGtpl24S/SNI98iRWkRwR/A==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-env": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-env/-/react-env-3.0.0.tgz", + "integrity": "sha512-tfMRO2v508HQWAqSADFrwZgR9oU10qC97oV6zGbjHh9ALP0/IcFR+Bi71KRTveDTm85fMeAzZYGj57P3Dsipkw==", + "dependencies": { + "@chakra-ui/react-use-safe-layout-effect": "2.0.5" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-types/-/react-types-2.0.7.tgz", + "integrity": "sha512-12zv2qIZ8EHwiytggtGvo4iLT0APris7T0qaAWqzpUGS0cdUtR8W+V1BJ5Ocq+7tA6dzQ/7+w5hmXih61TuhWQ==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-animation-state": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-animation-state/-/react-use-animation-state-2.0.8.tgz", + "integrity": "sha512-xv9zSF2Rd1mHWQ+m5DLBWeh4atF8qrNvsOs3MNrvxKYBS3f79N3pqcQGrWAEvirXWXfiCeje2VAkEggqFRIo+Q==", + "dependencies": { + "@chakra-ui/dom-utils": "2.0.6", + "@chakra-ui/react-use-event-listener": "2.0.7" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-callback-ref": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-callback-ref/-/react-use-callback-ref-2.0.7.tgz", + "integrity": "sha512-YjT76nTpfHAK5NxplAlZsQwNju5KmQExnqsWNPFeOR6vvbC34+iPSTr+r91i1Hdy7gBSbevsOsd5Wm6RN3GuMw==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-controllable-state": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-controllable-state/-/react-use-controllable-state-2.0.8.tgz", + "integrity": "sha512-F7rdCbLEmRjwwODqWZ3y+mKgSSHPcLQxeUygwk1BkZPXbKkJJKymOIjIynil2cbH7ku3hcSIWRvuhpCcfQWJ7Q==", + "dependencies": { + "@chakra-ui/react-use-callback-ref": "2.0.7" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-disclosure": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-disclosure/-/react-use-disclosure-2.0.8.tgz", + "integrity": "sha512-2ir/mHe1YND40e+FyLHnDsnDsBQPwzKDLzfe9GZri7y31oU83JSbHdlAXAhp3bpjohslwavtRCp+S/zRxfO9aQ==", + "dependencies": { + "@chakra-ui/react-use-callback-ref": "2.0.7" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-event-listener": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-event-listener/-/react-use-event-listener-2.0.7.tgz", + "integrity": "sha512-4wvpx4yudIO3B31pOrXuTHDErawmwiXnvAN7gLEOVREi16+YGNcFnRJ5X5nRrmB7j2MDUtsEDpRBFfw5Z9xQ5g==", + "dependencies": { + "@chakra-ui/react-use-callback-ref": "2.0.7" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-focus-effect": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-focus-effect/-/react-use-focus-effect-2.0.9.tgz", + "integrity": "sha512-20nfNkpbVwyb41q9wxp8c4jmVp6TUGAPE3uFTDpiGcIOyPW5aecQtPmTXPMJH+2aa8Nu1wyoT1btxO+UYiQM3g==", + "dependencies": { + "@chakra-ui/dom-utils": "2.0.6", + "@chakra-ui/react-use-event-listener": "2.0.7", + "@chakra-ui/react-use-safe-layout-effect": "2.0.5", + "@chakra-ui/react-use-update-effect": "2.0.7" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-focus-on-pointer-down": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-focus-on-pointer-down/-/react-use-focus-on-pointer-down-2.0.6.tgz", + "integrity": "sha512-OigXiLRVySn3tyVqJ/rn57WGuukW8TQe8fJYiLwXbcNyAMuYYounvRxvCy2b53sQ7QIZamza0N0jhirbH5FNoQ==", + "dependencies": { + "@chakra-ui/react-use-event-listener": "2.0.7" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-interval": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-interval/-/react-use-interval-2.0.5.tgz", + "integrity": "sha512-1nbdwMi2K87V6p5f5AseOKif2CkldLaJlq1TOqaPRwb7v3aU9rltBtYdf+fIyuHSToNJUV6wd9budCFdLCl3Fg==", + "dependencies": { + "@chakra-ui/react-use-callback-ref": "2.0.7" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-latest-ref": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-latest-ref/-/react-use-latest-ref-2.0.5.tgz", + "integrity": "sha512-3mIuFzMyIo3Ok/D8uhV9voVg7KkrYVO/pwVvNPJOHsDQqCA6DpYE4WDsrIx+fVcwad3Ta7SupexR5PoI+kq6QQ==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-merge-refs": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-merge-refs/-/react-use-merge-refs-2.0.7.tgz", + "integrity": "sha512-zds4Uhsc+AMzdH8JDDkLVet9baUBgtOjPbhC5r3A0ZXjZvGhCztFAVE3aExYiVoMPoHLKbLcqvCWE6ioFKz1lw==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-outside-click": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-outside-click/-/react-use-outside-click-2.0.7.tgz", + "integrity": "sha512-MsAuGLkwYNxNJ5rb8lYNvXApXxYMnJ3MzqBpQj1kh5qP/+JSla9XMjE/P94ub4fSEttmNSqs43SmPPrmPuihsQ==", + "dependencies": { + "@chakra-ui/react-use-callback-ref": "2.0.7" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-pan-event": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-pan-event/-/react-use-pan-event-2.0.9.tgz", + "integrity": "sha512-xu35QXkiyrgsHUOnctl+SwNcwf9Rl62uYE5y8soKOZdBm8E+FvZIt2hxUzK1EoekbJCMzEZ0Yv1ZQCssVkSLaQ==", + "dependencies": { + "@chakra-ui/event-utils": "2.0.8", + "@chakra-ui/react-use-latest-ref": "2.0.5", + "framesync": "6.1.2" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-previous": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-previous/-/react-use-previous-2.0.5.tgz", + "integrity": "sha512-BIZgjycPE4Xr+MkhKe0h67uHXzQQkBX/u5rYPd65iMGdX1bCkbE0oorZNfOHLKdTmnEb4oVsNvfN6Rfr+Mnbxw==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-safe-layout-effect": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-safe-layout-effect/-/react-use-safe-layout-effect-2.0.5.tgz", + "integrity": "sha512-MwAQBz3VxoeFLaesaSEN87reVNVbjcQBDex2WGexAg6hUB6n4gc1OWYH/iXp4tzp4kuggBNhEHkk9BMYXWfhJQ==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-size": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-size/-/react-use-size-2.0.10.tgz", + "integrity": "sha512-fdIkH14GDnKQrtQfxX8N3gxbXRPXEl67Y3zeD9z4bKKcQUAYIMqs0MsPZY+FMpGQw8QqafM44nXfL038aIrC5w==", + "dependencies": { + "@zag-js/element-size": "0.3.2" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-timeout": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-timeout/-/react-use-timeout-2.0.5.tgz", + "integrity": "sha512-QqmB+jVphh3h/CS60PieorpY7UqSPkrQCB7f7F+i9vwwIjtP8fxVHMmkb64K7VlzQiMPzv12nlID5dqkzlv0mw==", + "dependencies": { + "@chakra-ui/react-use-callback-ref": "2.0.7" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-update-effect": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-update-effect/-/react-use-update-effect-2.0.7.tgz", + "integrity": "sha512-vBM2bmmM83ZdDtasWv3PXPznpTUd+FvqBC8J8rxoRmvdMEfrxTiQRBJhiGHLpS9BPLLPQlosN6KdFU97csB6zg==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-utils": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-utils/-/react-utils-2.0.12.tgz", + "integrity": "sha512-GbSfVb283+YA3kA8w8xWmzbjNWk14uhNpntnipHCftBibl0lxtQ9YqMFQLwuFOO0U2gYVocszqqDWX+XNKq9hw==", + "dependencies": { + "@chakra-ui/utils": "2.0.15" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/select": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/@chakra-ui/select/-/select-2.0.19.tgz", + "integrity": "sha512-eAlFh+JhwtJ17OrB6fO6gEAGOMH18ERNrXLqWbYLrs674Le7xuREgtuAYDoxUzvYXYYTTdOJtVbcHGriI3o6rA==", + "dependencies": { + "@chakra-ui/form-control": "2.0.18", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/shared-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@chakra-ui/shared-utils/-/shared-utils-2.0.5.tgz", + "integrity": "sha512-4/Wur0FqDov7Y0nCXl7HbHzCg4aq86h+SXdoUeuCMD3dSj7dpsVnStLYhng1vxvlbUnLpdF4oz5Myt3i/a7N3Q==" + }, + "node_modules/@chakra-ui/skeleton": { + "version": "2.0.24", + "resolved": "https://registry.npmjs.org/@chakra-ui/skeleton/-/skeleton-2.0.24.tgz", + "integrity": "sha512-1jXtVKcl/jpbrJlc/TyMsFyI651GTXY5ma30kWyTXoby2E+cxbV6OR8GB/NMZdGxbQBax8/VdtYVjI0n+OBqWA==", + "dependencies": { + "@chakra-ui/media-query": "3.2.12", + "@chakra-ui/react-use-previous": "2.0.5", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/slider": { + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/@chakra-ui/slider/-/slider-2.0.23.tgz", + "integrity": "sha512-/eyRUXLla+ZdBUPXpakE3SAS2JS8mIJR6qcUYiPVKSpRAi6tMyYeQijAXn2QC1AUVd2JrG8Pz+1Jy7Po3uA7cA==", + "dependencies": { + "@chakra-ui/number-utils": "2.0.7", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-callback-ref": "2.0.7", + "@chakra-ui/react-use-controllable-state": "2.0.8", + "@chakra-ui/react-use-latest-ref": "2.0.5", + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@chakra-ui/react-use-pan-event": "2.0.9", + "@chakra-ui/react-use-size": "2.0.10", + "@chakra-ui/react-use-update-effect": "2.0.7" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/spinner": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@chakra-ui/spinner/-/spinner-2.0.13.tgz", + "integrity": "sha512-T1/aSkVpUIuiYyrjfn1+LsQEG7Onbi1UE9ccS/evgf61Dzy4GgTXQUnDuWFSgpV58owqirqOu6jn/9eCwDlzlg==", + "dependencies": { + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/stat": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@chakra-ui/stat/-/stat-2.0.18.tgz", + "integrity": "sha512-wKyfBqhVlIs9bkSerUc6F9KJMw0yTIEKArW7dejWwzToCLPr47u+CtYO6jlJHV6lRvkhi4K4Qc6pyvtJxZ3VpA==", + "dependencies": { + "@chakra-ui/icon": "3.0.16", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/styled-system": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/styled-system/-/styled-system-2.8.0.tgz", + "integrity": "sha512-bmRv/8ACJGGKGx84U1npiUddwdNifJ+/ETklGwooS5APM0ymwUtBYZpFxjYNJrqvVYpg3mVY6HhMyBVptLS7iA==", + "dependencies": { + "@chakra-ui/shared-utils": "2.0.5", + "csstype": "^3.0.11", + "lodash.mergewith": "4.6.2" + } + }, + "node_modules/@chakra-ui/switch": { + "version": "2.0.26", + "resolved": "https://registry.npmjs.org/@chakra-ui/switch/-/switch-2.0.26.tgz", + "integrity": "sha512-x62lF6VazSZJQuVxosChVR6+0lIJe8Pxgkl/C9vxjhp2yVYb3mew5tcX/sDOu0dYZy8ro/9hMfGkdN4r9xEU8A==", + "dependencies": { + "@chakra-ui/checkbox": "2.2.14", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "framer-motion": ">=4.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/system": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/@chakra-ui/system/-/system-2.5.5.tgz", + "integrity": "sha512-52BIp/Zyvefgxn5RTByfkTeG4J+y81LWEjWm8jCaRFsLVm8IFgqIrngtcq4I7gD5n/UKbneHlb4eLHo4uc5yDQ==", + "dependencies": { + "@chakra-ui/color-mode": "2.1.12", + "@chakra-ui/object-utils": "2.0.8", + "@chakra-ui/react-utils": "2.0.12", + "@chakra-ui/styled-system": "2.8.0", + "@chakra-ui/theme-utils": "2.0.15", + "@chakra-ui/utils": "2.0.15", + "react-fast-compare": "3.2.1" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0", + "@emotion/styled": "^11.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/table": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@chakra-ui/table/-/table-2.0.17.tgz", + "integrity": "sha512-OScheTEp1LOYvTki2NFwnAYvac8siAhW9BI5RKm5f5ORL2gVJo4I72RUqE0aKe1oboxgm7CYt5afT5PS5cG61A==", + "dependencies": { + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/tabs": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@chakra-ui/tabs/-/tabs-2.1.9.tgz", + "integrity": "sha512-Yf8e0kRvaGM6jfkJum0aInQ0U3ZlCafmrYYni2lqjcTtThqu+Yosmo3iYlnullXxCw5MVznfrkb9ySvgQowuYg==", + "dependencies": { + "@chakra-ui/clickable": "2.0.14", + "@chakra-ui/descendant": "3.0.14", + "@chakra-ui/lazy-utils": "2.0.5", + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-use-controllable-state": "2.0.8", + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@chakra-ui/react-use-safe-layout-effect": "2.0.5", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/tag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/tag/-/tag-3.0.0.tgz", + "integrity": "sha512-YWdMmw/1OWRwNkG9pX+wVtZio+B89odaPj6XeMn5nfNN8+jyhIEpouWv34+CO9G0m1lupJTxPSfgLAd7cqXZMA==", + "dependencies": { + "@chakra-ui/icon": "3.0.16", + "@chakra-ui/react-context": "2.0.8" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/textarea": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/@chakra-ui/textarea/-/textarea-2.0.19.tgz", + "integrity": "sha512-adJk+qVGsFeJDvfn56CcJKKse8k7oMGlODrmpnpTdF+xvlsiTM+1GfaJvgNSpHHuQFdz/A0z1uJtfGefk0G2ZA==", + "dependencies": { + "@chakra-ui/form-control": "2.0.18", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/theme": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/theme/-/theme-3.0.1.tgz", + "integrity": "sha512-92kDm/Ux/51uJqhRKevQo/O/rdwucDYcpHg2QuwzdAxISCeYvgtl2TtgOOl5EnqEP0j3IEAvZHZUlv8TTbawaw==", + "dependencies": { + "@chakra-ui/anatomy": "2.1.2", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/theme-tools": "2.0.17" + }, + "peerDependencies": { + "@chakra-ui/styled-system": ">=2.0.0" + } + }, + "node_modules/@chakra-ui/theme-tools": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@chakra-ui/theme-tools/-/theme-tools-2.0.17.tgz", + "integrity": "sha512-Auu38hnihlJZQcPok6itRDBbwof3TpXGYtDPnOvrq4Xp7jnab36HLt7KEXSDPXbtOk3ZqU99pvI1en5LbDrdjg==", + "dependencies": { + "@chakra-ui/anatomy": "2.1.2", + "@chakra-ui/shared-utils": "2.0.5", + "color2k": "^2.0.0" + }, + "peerDependencies": { + "@chakra-ui/styled-system": ">=2.0.0" + } + }, + "node_modules/@chakra-ui/theme-utils": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@chakra-ui/theme-utils/-/theme-utils-2.0.15.tgz", + "integrity": "sha512-UuxtEgE7gwMTGDXtUpTOI7F5X0iHB9ekEOG5PWPn2wWBL7rlk2JtPI7UP5Um5Yg6vvBfXYGK1ySahxqsgf+87g==", + "dependencies": { + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/styled-system": "2.8.0", + "@chakra-ui/theme": "3.0.1", + "lodash.mergewith": "4.6.2" + } + }, + "node_modules/@chakra-ui/toast": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/toast/-/toast-6.1.1.tgz", + "integrity": "sha512-JtjIKkPVjEu8okGGCipCxNVgK/15h5AicTATZ6RbG2MsHmr4GfKG3fUCvpbuZseArqmLqGLQZQJjVE9vJzaSkQ==", + "dependencies": { + "@chakra-ui/alert": "2.1.0", + "@chakra-ui/close-button": "2.0.17", + "@chakra-ui/portal": "2.0.16", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-use-timeout": "2.0.5", + "@chakra-ui/react-use-update-effect": "2.0.7", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/styled-system": "2.8.0", + "@chakra-ui/theme": "3.0.1" + }, + "peerDependencies": { + "@chakra-ui/system": "2.5.5", + "framer-motion": ">=4.0.0", + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@chakra-ui/tooltip": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@chakra-ui/tooltip/-/tooltip-2.2.7.tgz", + "integrity": "sha512-ImUJ6NnVqARaYqpgtO+kzucDRmxo8AF3jMjARw0bx2LxUkKwgRCOEaaRK5p5dHc0Kr6t5/XqjDeUNa19/sLauA==", + "dependencies": { + "@chakra-ui/popper": "3.0.13", + "@chakra-ui/portal": "2.0.16", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-disclosure": "2.0.8", + "@chakra-ui/react-use-event-listener": "2.0.7", + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "framer-motion": ">=4.0.0", + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@chakra-ui/transition": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@chakra-ui/transition/-/transition-2.0.16.tgz", + "integrity": "sha512-E+RkwlPc3H7P1crEXmXwDXMB2lqY2LLia2P5siQ4IEnRWIgZXlIw+8Em+NtHNgusel2N+9yuB0wT9SeZZeZ3CQ==", + "dependencies": { + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "framer-motion": ">=4.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/utils": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@chakra-ui/utils/-/utils-2.0.15.tgz", + "integrity": "sha512-El4+jL0WSaYYs+rJbuYFDbjmfCcfGDmRY95GO4xwzit6YAPZBLcR65rOEwLps+XWluZTy1xdMrusg/hW0c1aAA==", + "dependencies": { + "@types/lodash.mergewith": "4.6.7", + "css-box-model": "1.2.1", + "framesync": "6.1.2", + "lodash.mergewith": "4.6.2" + } + }, + "node_modules/@chakra-ui/visually-hidden": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@chakra-ui/visually-hidden/-/visually-hidden-2.0.15.tgz", + "integrity": "sha512-WWULIiucYRBIewHKFA7BssQ2ABLHLVd9lrUo3N3SZgR0u4ZRDDVEUNOy+r+9ruDze8+36dGbN9wsN1IdELtdOw==", + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz", + "integrity": "sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/serialize": "^1.1.1", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.1.3" + } + }, + "node_modules/@emotion/cache": { + "version": "11.10.5", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.5.tgz", + "integrity": "sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA==", + "dependencies": { + "@emotion/memoize": "^0.8.0", + "@emotion/sheet": "^1.2.1", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "stylis": "4.1.3" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", + "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz", + "integrity": "sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==", + "dependencies": { + "@emotion/memoize": "^0.8.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", + "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==" + }, + "node_modules/@emotion/react": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.10.6.tgz", + "integrity": "sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.10.6", + "@emotion/cache": "^11.10.5", + "@emotion/serialize": "^1.1.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==", + "dependencies": { + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/unitless": "^0.8.0", + "@emotion/utils": "^1.2.0", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.1.tgz", + "integrity": "sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==" + }, + "node_modules/@emotion/styled": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.10.6.tgz", + "integrity": "sha512-OXtBzOmDSJo5Q0AFemHCfl+bUueT8BIcPSxu0EGTpGk6DmI5dnhSzQANm1e1ze0YZL7TDyAyy6s/b/zmGOS3Og==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.10.6", + "@emotion/is-prop-valid": "^1.2.0", + "@emotion/serialize": "^1.1.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@emotion/utils": "^1.2.0" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", + "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz", + "integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", + "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", + "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" + }, + "node_modules/@esbuild/android-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", + "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", + "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@fastify/busboy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", + "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@heroicons/react": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.0.16.tgz", + "integrity": "sha512-x89rFxH3SRdYaA+JCXwfe+RkE1SFTo9GcOkZettHer71Y3T7V+ogKmfw5CjTazgS3d0ClJ7p1NA+SP7VQLQcLw==", + "peerDependencies": { + "react": ">= 16" + } + }, + "node_modules/@hookform/resolvers": { + "version": "2.9.11", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-2.9.11.tgz", + "integrity": "sha512-bA3aZ79UgcHj7tFV7RlgThzwSSHZgvfbt2wprldRkYBcMopdMvHyO17Wwp/twcJasNFischFfS7oz8Katz8DdQ==", + "peerDependencies": { + "react-hook-form": "^7.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@motionone/animation": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.15.1.tgz", + "integrity": "sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ==", + "dependencies": { + "@motionone/easing": "^10.15.1", + "@motionone/types": "^10.15.1", + "@motionone/utils": "^10.15.1", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/dom": { + "version": "10.15.5", + "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.15.5.tgz", + "integrity": "sha512-Xc5avlgyh3xukU9tydh9+8mB8+2zAq+WlLsC3eEIp7Ax7DnXgY7Bj/iv0a4X2R9z9ZFZiaXK3BO0xMYHKbAAdA==", + "dependencies": { + "@motionone/animation": "^10.15.1", + "@motionone/generators": "^10.15.1", + "@motionone/types": "^10.15.1", + "@motionone/utils": "^10.15.1", + "hey-listen": "^1.0.8", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/easing": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.15.1.tgz", + "integrity": "sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw==", + "dependencies": { + "@motionone/utils": "^10.15.1", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/generators": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.15.1.tgz", + "integrity": "sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ==", + "dependencies": { + "@motionone/types": "^10.15.1", + "@motionone/utils": "^10.15.1", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/types": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.15.1.tgz", + "integrity": "sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA==" + }, + "node_modules/@motionone/utils": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.15.1.tgz", + "integrity": "sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw==", + "dependencies": { + "@motionone/types": "^10.15.1", + "hey-listen": "^1.0.8", + "tslib": "^2.3.1" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.6", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", + "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@remix-run/router": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.3.2.tgz", + "integrity": "sha512-t54ONhl/h75X94SWsHGQ4G/ZrCEguKSRQr7DrjTciJXW0YU1QhlwYeycvK5JgkzlxmvrK7wq1NB/PLtHxoiDcA==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@sphinxxxx/color-conversion": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@sphinxxxx/color-conversion/-/color-conversion-2.2.2.tgz", + "integrity": "sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw==" + }, + "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==", + "dev": true, + "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": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.5.0.tgz", + "integrity": "sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA==", + "dev": true, + "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-empty-expression": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.5.0.tgz", + "integrity": "sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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/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==", + "dev": true, + "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==", + "dev": true, + "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/@types/ace": { + "version": "0.0.48", + "resolved": "https://registry.npmjs.org/@types/ace/-/ace-0.0.48.tgz", + "integrity": "sha512-esV6hOWiDOZ6d7w5S11iLu6LQsPGe/9RPzhri7gNNLdrK1LFpO9/m7IZhQL6dat0JHICJ7l51zvHAiCgnPLLHA==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", + "dev": true + }, + "node_modules/@types/jsoneditor": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/@types/jsoneditor/-/jsoneditor-9.9.0.tgz", + "integrity": "sha512-OwDYzMuqCn+QZHQPMDu7miLVtnJueB2lQ42KmX1mZNZTaZxV8v55wiL1sit7cZGA5BzhNWVw8KAHhEoFWYyW3g==", + "dev": true, + "dependencies": { + "@types/ace": "*", + "ajv": "^6.12.0" + } + }, + "node_modules/@types/lodash": { + "version": "4.14.191", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", + "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==" + }, + "node_modules/@types/lodash.debounce": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@types/lodash.debounce/-/lodash.debounce-4.0.7.tgz", + "integrity": "sha512-X1T4wMZ+gT000M2/91SYj0d/7JfeNZ9PeeOldSNoE/lunLeQXKvkmIumI29IaKMotU/ln/McOIvgzZcQ/3TrSA==", + "dev": true, + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/lodash.mergewith": { + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/@types/lodash.mergewith/-/lodash.mergewith-4.6.7.tgz", + "integrity": "sha512-3m+lkO5CLRRYU0fhGRp7zbsGi6+BZj0uTVSwvcKU+nSlhjA9/QRNfuSGnD2mX6hQA7ZbmcCkzk5h4ZYGOtk14A==", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/node": { + "version": "20.1.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.4.tgz", + "integrity": "sha512-At4pvmIOki8yuwLtd7BNHl3CiWNbtclUbNtScGx4OHfBd4/oWoJC8KRCIxXwkdndzhxOsPXihrsOoydxBjlE9Q==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "devOptional": true + }, + "node_modules/@types/react": { + "version": "18.0.28", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz", + "integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==", + "devOptional": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-copy-to-clipboard": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.4.tgz", + "integrity": "sha512-otTJsJpofYAeaIeOwV5xBUGpo6exXG2HX7X4nseToCB2VgPEBxGBHCm/FecZ676doNR7HCSTVtmohxfG2b3/yQ==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-datepicker": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@types/react-datepicker/-/react-datepicker-4.8.0.tgz", + "integrity": "sha512-20uzZsIf4moPAjjHDfPvH8UaOHZBxrkiQZoLS3wgKq8Xhp+95gdercLEdoA7/I8nR9R5Jz2qQkdMIM+Lq4AS1A==", + "dev": true, + "dependencies": { + "@popperjs/core": "^2.9.2", + "@types/react": "*", + "date-fns": "^2.0.1", + "react-popper": "^2.2.5" + } + }, + "node_modules/@types/react-dom": { + "version": "18.0.11", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.11.tgz", + "integrity": "sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-json-editor-ajrm": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/@types/react-json-editor-ajrm/-/react-json-editor-ajrm-2.5.3.tgz", + "integrity": "sha512-hHf3FU1HjL6Lm3rK2iWUJtoYpZ1qDCSffnLAQXCf++TP1Ms18rnB06gBK3psQ8NEW6CfrfRNlirIL3D/P80QVg==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-slick": { + "version": "0.23.10", + "resolved": "https://registry.npmjs.org/@types/react-slick/-/react-slick-0.23.10.tgz", + "integrity": "sha512-ZiqdencANDZy6sWOWJ54LDvebuXFEhDlHtXU9FFipQR2BcYU2QJxZhvJPW6YK7cocibUiNn+YvDTbt1HtCIBVA==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", + "devOptional": true + }, + "node_modules/@vitejs/plugin-react": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-2.2.0.tgz", + "integrity": "sha512-FFpefhvExd1toVRlokZgxgy2JtnBOdp4ZDsq7ldCWaqGSGn9UhWMAVm/1lxPL14JfNS5yGz+s9yFrQY6shoStA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.19.6", + "@babel/plugin-transform-react-jsx": "^7.19.0", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-jsx-self": "^7.18.6", + "@babel/plugin-transform-react-jsx-source": "^7.19.6", + "magic-string": "^0.26.7", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^3.0.0" + } + }, + "node_modules/@zag-js/element-size": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@zag-js/element-size/-/element-size-0.3.2.tgz", + "integrity": "sha512-bVvvigUGvAuj7PCkE5AbzvTJDTw5f3bg9nQdv+ErhVN8SfPPppLJEmmWdxqsRzrHXgx8ypJt/+Ty0kjtISVDsQ==" + }, + "node_modules/@zag-js/focus-visible": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@zag-js/focus-visible/-/focus-visible-0.2.2.tgz", + "integrity": "sha512-0j2gZq8HiZ51z4zNnSkF1iSkqlwRDvdH+son3wHdoz+7IUdMN/5Exd4TxMJ+gq2Of1DiXReYLL9qqh2PdQ4wgA==" + }, + "node_modules/ace-builds": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.20.0.tgz", + "integrity": "sha512-JUvWbRXz7tL3EkcM5CpVyyuu9mvVRo594ZRgwHzb9arb9s2o5gTg94Lrk3zQZzM1udq6fRSDnmU2RClJPt9aNw==" + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/apexcharts": { + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.40.0.tgz", + "integrity": "sha512-dSi3BUfCJkFd67uFp+xffrJVd3lDT7AAUUyRp0qPYiglJ76CeZLddVhM3FAk1P9GCzf8VewqGYUPCYQvXm+b9A==", + "dependencies": { + "svg.draggable.js": "^2.2.2", + "svg.easing.js": "^2.0.0", + "svg.filter.js": "^2.0.2", + "svg.pathmorphing.js": "^0.1.3", + "svg.resize.js": "^1.4.3", + "svg.select.js": "^3.0.1" + } + }, + "node_modules/aria-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz", + "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.13", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", + "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001426", + "fraction.js": "^4.2.0", + "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/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/broadcast-channel": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz", + "integrity": "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "detect-node": "^2.1.0", + "js-sha3": "0.8.0", + "microseconds": "0.2.0", + "nano-time": "1.0.0", + "oblivious-set": "1.0.0", + "rimraf": "3.0.2", + "unload": "2.2.0" + } + }, + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001458", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001458.tgz", + "integrity": "sha512-lQ1VlUUq5q9ro9X+5gOEyH7i3vm+AYVT1WDCVB69XOZ17KZRhnZ9J0Sqz7wTHQaLBJccNCHq8/Ww5LlOIZbB0w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "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" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, + "node_modules/clear-any-console": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/clear-any-console/-/clear-any-console-1.16.2.tgz", + "integrity": "sha512-OL/7wZpNy9x0GBSzz3poWja84Nr7iaH8aYNsJ5Uet2BVLj6Lm1zvWpZN/yH46Vv3ae7YfHmLLMmfHj911fshJg==", + "dev": true + }, + "node_modules/cli-check-node": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/cli-check-node/-/cli-check-node-1.3.4.tgz", + "integrity": "sha512-iLGgQXm82iP8eH3R67qbOWs5qqUOLmNnMy5Lzl/RybcMh3y+H2zWU5POzuQ6oDUOdz4XWuxcFhP75szqd6frLg==", + "dev": true, + "dependencies": { + "chalk": "^3.0.0", + "log-symbols": "^3.0.0" + } + }, + "node_modules/cli-check-node/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cli-check-node/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-check-node/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cli-check-node/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/cli-check-node/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-check-node/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-handle-error": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cli-handle-error/-/cli-handle-error-4.4.0.tgz", + "integrity": "sha512-RyBCnKlc7xVr79cKb9RfBq+4fjwQeX8HKeNzIPnI/W+DWWIUUKh2ur576DpwJ3kZt2UGHlIAOF7N9txy+mgZsA==", + "dev": true, + "dependencies": { + "chalk": "^3.0.0", + "log-symbols": "^3.0.0" + } + }, + "node_modules/cli-handle-error/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cli-handle-error/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-handle-error/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cli-handle-error/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/cli-handle-error/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-handle-error/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-handle-unhandled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cli-handle-unhandled/-/cli-handle-unhandled-1.1.1.tgz", + "integrity": "sha512-Em91mJvU7VdgT2MxQpyY633vW1tDzRjPDbii6ZjEBHHLLh0xDoVkFt/wjvi9nSvJcz9rJmvtJSK8KL/hvF0Stg==", + "dev": true, + "dependencies": { + "cli-handle-error": "^4.1.0" + } + }, + "node_modules/cli-welcome": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/cli-welcome/-/cli-welcome-2.2.2.tgz", + "integrity": "sha512-LgDGS0TW4nIf8v81wpuZzfOEDPcy68u0jKR0Fy5IaWftqdminI6FoDiMFt1mjPylqKGNv/wFsZ7fCs93IeDMIw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "clear-any-console": "^1.16.0", + "prettier": "^2.0.5" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/color2k": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/color2k/-/color2k-2.0.2.tgz", + "integrity": "sha512-kJhwH5nAwb34tmyuqq/lgjEKzlFXn1U99NlnB6Ws4qVaERcRUYeYP1cBw6BJ4vxaWStAUEef4WMr7WjOCnBt8w==" + }, + "node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/compute-scroll-into-view": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", + "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "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/cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dependencies": { + "node-fetch": "2.6.7" + } + }, + "node_modules/css-box-model": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", + "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "dependencies": { + "tiny-invariant": "^1.0.6" + } + }, + "node_modules/csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + }, + "node_modules/date-fns": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/dayjs": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", + "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/destr": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/destr/-/destr-1.2.2.tgz", + "integrity": "sha512-lrbCJwD9saUQrqUfXvl6qoM+QN3W7tLV5pAOs+OqOmopCCz/JkE05MHedJR1xfk4IAnZuJXPVuN5+7jNA2ZCiA==" + }, + "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==" + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.311", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.311.tgz", + "integrity": "sha512-RoDlZufvrtr2Nx3Yx5MB8jX3aHIxm8nRWPJm3yVvyHmyKaRvn90RjzB6hNnt0AkhS3IInJdyRfQb4mWhPvUjVw==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/enquire.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz", + "integrity": "sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw==" + }, + "node_modules/entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "dev": true, + "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==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/esbuild": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", + "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.15.18", + "@esbuild/linux-loong64": "0.15.18", + "esbuild-android-64": "0.15.18", + "esbuild-android-arm64": "0.15.18", + "esbuild-darwin-64": "0.15.18", + "esbuild-darwin-arm64": "0.15.18", + "esbuild-freebsd-64": "0.15.18", + "esbuild-freebsd-arm64": "0.15.18", + "esbuild-linux-32": "0.15.18", + "esbuild-linux-64": "0.15.18", + "esbuild-linux-arm": "0.15.18", + "esbuild-linux-arm64": "0.15.18", + "esbuild-linux-mips64le": "0.15.18", + "esbuild-linux-ppc64le": "0.15.18", + "esbuild-linux-riscv64": "0.15.18", + "esbuild-linux-s390x": "0.15.18", + "esbuild-netbsd-64": "0.15.18", + "esbuild-openbsd-64": "0.15.18", + "esbuild-sunos-64": "0.15.18", + "esbuild-windows-32": "0.15.18", + "esbuild-windows-64": "0.15.18", + "esbuild-windows-arm64": "0.15.18" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", + "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", + "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", + "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", + "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", + "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", + "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", + "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", + "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", + "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", + "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", + "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", + "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", + "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", + "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", + "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", + "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", + "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", + "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", + "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", + "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "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==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "node_modules/focus-lock": { + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-0.11.6.tgz", + "integrity": "sha512-KSuV3ur4gf2KqMNoZx3nXNVhqCkn42GuTYCX4tXPEwf0MjpFQmNMiN6m7dXaUXgIoivL6/65agoUMg4RLS0Vbg==", + "dependencies": { + "tslib": "^2.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/framer-motion": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-7.10.3.tgz", + "integrity": "sha512-k2ccYeZNSpPg//HTaqrU+4pRq9f9ZpaaN7rr0+Rx5zA4wZLbk547wtDzge2db1sB+1mnJ6r59P4xb+aEIi/W+w==", + "dependencies": { + "@motionone/dom": "^10.15.3", + "hey-listen": "^1.0.8", + "tslib": "2.4.0" + }, + "optionalDependencies": { + "@emotion/is-prop-valid": "^0.8.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/framer-motion/node_modules/@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "optional": true, + "dependencies": { + "@emotion/memoize": "0.7.4" + } + }, + "node_modules/framer-motion/node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "optional": true + }, + "node_modules/framer-motion/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/framesync": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/framesync/-/framesync-6.1.2.tgz", + "integrity": "sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g==", + "dependencies": { + "tslib": "2.4.0" + } + }, + "node_modules/framesync/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/github-buttons": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/github-buttons/-/github-buttons-2.24.0.tgz", + "integrity": "sha512-dHpEno4S2JHjsEKPLSTGDTV50q1d08n3H7VDfNNA1m8cz5DMqLCZDdKWQxy4zyvd6M3tKvlVYLs+/H0BF3DggA==" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/hey-listen": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", + "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==" + }, + "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==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/html-parse-stringify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", + "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "dependencies": { + "void-elements": "3.1.0" + } + }, + "node_modules/i18next": { + "version": "22.4.15", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-22.4.15.tgz", + "integrity": "sha512-yYudtbFrrmWKLEhl6jvKUYyYunj4bTBCe2qIUYAxbXoPusY7YmdwPvOE6fx6UIfWvmlbCWDItr7wIs8KEBZ5Zg==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "dependencies": { + "@babel/runtime": "^7.20.6" + } + }, + "node_modules/i18next-browser-languagedetector": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.0.1.tgz", + "integrity": "sha512-Pa5kFwaczXJAeHE56CHG2aWzFBMJNUNghf0Pm4SwSrEMps/PTKqW90EYWlIvhuYStf3Sn1K0vw+gH3+TLdkH1g==", + "dependencies": { + "@babel/runtime": "^7.19.4" + } + }, + "node_modules/i18next-http-backend": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.2.0.tgz", + "integrity": "sha512-Z4sM7R6tzdLknSPER9GisEBxKPg5FkI07UrQniuroZmS15PHQrcCPLyuGKj8SS68tf+O2aEDYSUnmy1TZqZSbw==", + "dependencies": { + "cross-fetch": "3.1.5" + } + }, + "node_modules/immutable": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz", + "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==", + "dev": true + }, + "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==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-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==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/javascript-natural-sort": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", + "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==" + }, + "node_modules/jmespath": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/jquery": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.0.tgz", + "integrity": "sha512-umpJ0/k8X0MvD1ds0P9SfowREz2LenHsQaxSohMZ5OMNEU2r0tf8pdeEFTHMFxWVxKNyU9rTtK3CWzUCTKJUeQ==", + "peer": true + }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "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==" + }, + "node_modules/json-source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/json-source-map/-/json-source-map-0.6.1.tgz", + "integrity": "sha512-1QoztHPsMQqhDq0hlXY5ZqcEdUzxQEIxgFkKl4WUp2pgShObl+9ovi4kRh2TfvAfxAoHOJ9vIMEqk3k4iex7tg==" + }, + "node_modules/json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "dependencies": { + "string-convert": "^0.2.0" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsoneditor": { + "version": "9.10.1", + "resolved": "https://registry.npmjs.org/jsoneditor/-/jsoneditor-9.10.1.tgz", + "integrity": "sha512-vequCPWX+dNndl25+wlniQAaEgJ2Vy+X44a8GL3kOfPrbF9E/ZFH5XEpwyltI1kr95YFTp0PISuwmgwJHpQx4g==", + "dependencies": { + "ace-builds": "^1.15.2", + "ajv": "^6.12.6", + "javascript-natural-sort": "^0.7.1", + "jmespath": "^0.16.0", + "json-source-map": "^0.6.1", + "jsonrepair": "^3.0.2", + "mobius1-selectr": "^2.4.13", + "picomodal": "^3.0.0", + "vanilla-picker": "^2.12.1" + } + }, + "node_modules/jsonrepair": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsonrepair/-/jsonrepair-3.1.0.tgz", + "integrity": "sha512-idqReg23J0PVRAADmZMc5xQM3xeOX5bTB6OTyMnzq33IXJXmn9iJuWIEvGmrN80rQf4d7uLTMEDwpzujNcI0Rg==", + "bin": { + "jsonrepair": "bin/cli.js" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==" + }, + "node_modules/log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", + "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/match-sorter": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.1.tgz", + "integrity": "sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "remove-accents": "0.4.2" + } + }, + "node_modules/microseconds": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz", + "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mobius1-selectr": { + "version": "2.4.13", + "resolved": "https://registry.npmjs.org/mobius1-selectr/-/mobius1-selectr-2.4.13.tgz", + "integrity": "sha512-Mk9qDrvU44UUL0EBhbAA1phfQZ7aMZPjwtL7wkpiBzGh8dETGqfsh50mWoX9EkjDlkONlErWXArHCKfoxVg0Bw==" + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nano-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz", + "integrity": "sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==", + "dependencies": { + "big-integer": "^1.6.16" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch-native": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-0.1.8.tgz", + "integrity": "sha512-ZNaury9r0NxaT2oL65GvdGDy+5PlSaHTovT6JV5tOW07k1TQmgC0olZETa4C9KZg0+6zBr99ctTYa3Utqj9P/Q==" + }, + "node_modules/node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oblivious-set": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz", + "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==" + }, + "node_modules/ohmyfetch": { + "version": "0.4.21", + "resolved": "https://registry.npmjs.org/ohmyfetch/-/ohmyfetch-0.4.21.tgz", + "integrity": "sha512-VG7f/JRvqvBOYvL0tHyEIEG7XHWm7OqIfAs6/HqwWwDfjiJ1g0huIpe5sFEmyb+7hpFa1EGNH2aERWR72tlClw==", + "dependencies": { + "destr": "^1.2.0", + "node-fetch-native": "^0.1.8", + "ufo": "^0.8.6", + "undici": "^5.12.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "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/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==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/picomodal": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/picomodal/-/picomodal-3.0.0.tgz", + "integrity": "sha512-FoR3TDfuLlqUvcEeK5ifpKSVVns6B4BQvc8SDF6THVMuadya6LLtji0QgUDSStw0ZR2J7I6UGi5V2V23rnPWTw==" + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "dev": true, + "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" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "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==", + "dev": true + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "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==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qrcode.react": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/qrcode.react/-/qrcode.react-3.1.0.tgz", + "integrity": "sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.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==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-apexcharts": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/react-apexcharts/-/react-apexcharts-1.4.0.tgz", + "integrity": "sha512-DrcMV4aAMrUG+n6412yzyATWEyCDWlpPBBhVbpzBC4PDeuYU6iF84SmExbck+jx5MUm4U5PM3/T307Mc3kzc9Q==", + "dependencies": { + "prop-types": "^15.5.7" + }, + "peerDependencies": { + "apexcharts": "^3.18.0", + "react": ">=0.13" + } + }, + "node_modules/react-clientside-effect": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz", + "integrity": "sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==", + "dependencies": { + "@babel/runtime": "^7.12.13" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-copy-to-clipboard": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz", + "integrity": "sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==", + "dependencies": { + "copy-to-clipboard": "^3.3.1", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": "^15.3.0 || 16 || 17 || 18" + } + }, + "node_modules/react-datepicker": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-4.10.0.tgz", + "integrity": "sha512-6IfBCZyWj54ZZGLmEZJ9c4Yph0s9MVfEGDC2evOvf9AmVz+RRcfP2Czqad88Ff9wREbcbqa4dk7IFYeXF1d3Ag==", + "dependencies": { + "@popperjs/core": "^2.9.2", + "classnames": "^2.2.6", + "date-fns": "^2.24.0", + "prop-types": "^15.7.2", + "react-onclickoutside": "^6.12.2", + "react-popper": "^2.3.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17 || ^18", + "react-dom": "^16.9.0 || ^17 || ^18" + } + }, + "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==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-fast-compare": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.1.tgz", + "integrity": "sha512-xTYf9zFim2pEif/Fw16dBiXpe0hoy5PxcD8+OwBnTtNLfIm3g6WxhKNurY+6OmdH1u6Ta/W/Vl6vjbYP1MFnDg==" + }, + "node_modules/react-focus-lock": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.9.4.tgz", + "integrity": "sha512-7pEdXyMseqm3kVjhdVH18sovparAzLg5h6WvIx7/Ck3ekjhrrDMEegHSa3swwC8wgfdd7DIdUVRGeiHT9/7Sgg==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "focus-lock": "^0.11.6", + "prop-types": "^15.6.2", + "react-clientside-effect": "^1.2.6", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-github-btn": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/react-github-btn/-/react-github-btn-1.4.0.tgz", + "integrity": "sha512-lV4FYClAfjWnBfv0iNlJUGhamDgIq6TayD0kPZED6VzHWdpcHmPfsYOZ/CFwLfPv4Zp+F4m8QKTj0oy2HjiGXg==", + "dependencies": { + "github-buttons": "^2.22.0" + }, + "peerDependencies": { + "react": ">=16.3.0" + } + }, + "node_modules/react-hook-form": { + "version": "7.43.2", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.43.2.tgz", + "integrity": "sha512-NvD3Oe2Y9hhqo2R4I4iJigDzSLpdMnzUpNMxlnzTbdiT7NT3BW0GxWCzEtwPudZMUPbZhNcSy1EcGAygyhDORg==", + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18" + } + }, + "node_modules/react-i18next": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-12.2.0.tgz", + "integrity": "sha512-5XeVgSygaGfyFmDd2WcXvINRw2WEC1XviW1LXY/xLOEMzsCFRwKqfnHN+hUjla8ZipbVJR27GCMSuTr0BhBBBQ==", + "dependencies": { + "@babel/runtime": "^7.20.6", + "html-parse-stringify": "^3.0.1" + }, + "peerDependencies": { + "i18next": ">= 19.0.0", + "react": ">= 16.8.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "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==" + }, + "node_modules/react-json-editor-ajrm": { + "version": "2.5.14", + "resolved": "https://registry.npmjs.org/react-json-editor-ajrm/-/react-json-editor-ajrm-2.5.14.tgz", + "integrity": "sha512-z2035l5lnU0Wo73AUonj68d1Eh9vjVcLXEa8YogDEeFPcogzYkfT6R38fvYlLKDhP0oI+LyOO/IBWsFkXs4M0Q==", + "dependencies": { + "@babel/runtime": "^7.0.0-rc.0" + }, + "peerDependencies": { + "react": ">=16.2.0", + "react-dom": ">=16.2.0" + } + }, + "node_modules/react-loading-skeleton": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/react-loading-skeleton/-/react-loading-skeleton-3.1.1.tgz", + "integrity": "sha512-gQeNzzKXlevvquRDOhN5kas5VE7toTKrpmE9BpUdf0iip9c5ae0LcVbulh5ebO2CFl4RrYsyLuDtYGyrh1h1iA==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/react-onclickoutside": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.12.2.tgz", + "integrity": "sha512-NMXGa223OnsrGVp5dJHkuKxQ4czdLmXSp5jSV9OqiCky9LOpPATn3vLldc+q5fK3gKbEHvr7J1u0yhBh/xYkpA==", + "funding": { + "type": "individual", + "url": "https://github.com/Pomax/react-onclickoutside/blob/master/FUNDING.md" + }, + "peerDependencies": { + "react": "^15.5.x || ^16.x || ^17.x || ^18.x", + "react-dom": "^15.5.x || ^16.x || ^17.x || ^18.x" + } + }, + "node_modules/react-popper": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", + "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", + "dependencies": { + "react-fast-compare": "^3.0.1", + "warning": "^4.0.2" + }, + "peerDependencies": { + "@popperjs/core": "^2.0.0", + "react": "^16.8.0 || ^17 || ^18", + "react-dom": "^16.8.0 || ^17 || ^18" + } + }, + "node_modules/react-query": { + "version": "3.39.3", + "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz", + "integrity": "sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "broadcast-channel": "^3.4.1", + "match-sorter": "^6.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", + "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", + "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-router": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.8.1.tgz", + "integrity": "sha512-Jgi8BzAJQ8MkPt8ipXnR73rnD7EmZ0HFFb7jdQU24TynGW1Ooqin2KVDN9voSC+7xhqbbCd2cjGUepb6RObnyg==", + "dependencies": { + "@remix-run/router": "1.3.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.8.1.tgz", + "integrity": "sha512-67EXNfkQgf34P7+PSb6VlBuaacGhkKn3kpE51+P6zYSG2kiRoumXEL6e27zTa9+PGF2MNXbgIUHTVlleLbIcHQ==", + "dependencies": { + "@remix-run/router": "1.3.2", + "react-router": "6.8.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-slick": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/react-slick/-/react-slick-0.29.0.tgz", + "integrity": "sha512-TGdOKE+ZkJHHeC4aaoH85m8RnFyWqdqRfAGkhd6dirmATXMZWAxOpTLmw2Ll/jPTQ3eEG7ercFr/sbzdeYCJXA==", + "dependencies": { + "classnames": "^2.2.5", + "enquire.js": "^2.1.6", + "json2mq": "^0.2.0", + "lodash.debounce": "^4.0.8", + "resize-observer-polyfill": "^1.5.0" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-use-websocket": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-use-websocket/-/react-use-websocket-4.3.1.tgz", + "integrity": "sha512-zHPLWrgcqydJaak2O5V9hiz4q2dwkwqNQqpgFVmSuPxLZdsZlnDs8DVHy3WtHH+A6ms/8aHIyX7+7ulOcrnR0Q==", + "peerDependencies": { + "react": ">= 18.0.0", + "react-dom": ">= 18.0.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/remove-accents": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz", + "integrity": "sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dependencies": { + "is-core-module": "^2.9.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-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "devOptional": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-visualizer": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.9.0.tgz", + "integrity": "sha512-bbDOv47+Bw4C/cgs0czZqfm8L82xOZssk4ayZjG40y9zbXclNk7YikrZTDao6p7+HDiGxrN0b65SgZiVm9k1Cg==", + "dependencies": { + "open": "^8.4.0", + "picomatch": "^2.3.1", + "source-map": "^0.7.4", + "yargs": "^17.5.1" + }, + "bin": { + "rollup-plugin-visualizer": "dist/bin/cli.js" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "rollup": "2.x || 3.x" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/sass": { + "version": "1.58.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.3.tgz", + "integrity": "sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/slick-carousel": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.1.tgz", + "integrity": "sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA==", + "peerDependencies": { + "jquery": ">=1.8.0" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true + }, + "node_modules/string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylis": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", + "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/svg.draggable.js": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz", + "integrity": "sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw==", + "dependencies": { + "svg.js": "^2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.easing.js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/svg.easing.js/-/svg.easing.js-2.0.0.tgz", + "integrity": "sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA==", + "dependencies": { + "svg.js": ">=2.3.x" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.filter.js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/svg.filter.js/-/svg.filter.js-2.0.2.tgz", + "integrity": "sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw==", + "dependencies": { + "svg.js": "^2.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.js": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/svg.js/-/svg.js-2.7.1.tgz", + "integrity": "sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA==" + }, + "node_modules/svg.pathmorphing.js": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz", + "integrity": "sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww==", + "dependencies": { + "svg.js": "^2.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.resize.js": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/svg.resize.js/-/svg.resize.js-1.4.3.tgz", + "integrity": "sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw==", + "dependencies": { + "svg.js": "^2.6.5", + "svg.select.js": "^2.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.resize.js/node_modules/svg.select.js": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-2.1.2.tgz", + "integrity": "sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ==", + "dependencies": { + "svg.js": "^2.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.select.js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-3.0.1.tgz", + "integrity": "sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw==", + "dependencies": { + "svg.js": "^2.6.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/tsconfck": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.0.3.tgz", + "integrity": "sha512-o3DsPZO1+C98KqHMdAbWs30zpxD30kj8r9OLA4ML1yghx4khNDzaaShNalfluh8ZPPhzKe3qyVCP1HiZszSAsw==", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^14.13.1 || ^16 || >=18" + }, + "peerDependencies": { + "typescript": "^4.3.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ufo": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-0.8.6.tgz", + "integrity": "sha512-fk6CmUgwKCfX79EzcDQQpSCMxrHstvbLswFChHS0Vump+kFkw7nJBfTZoC1j0bOGoY9I7R3n2DGek5ajbcYnOw==" + }, + "node_modules/undici": { + "version": "5.27.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.27.2.tgz", + "integrity": "sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ==", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/unload": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz", + "integrity": "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==", + "dependencies": { + "@babel/runtime": "^7.6.2", + "detect-node": "^2.0.4" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", + "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/vanilla-picker": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/vanilla-picker/-/vanilla-picker-2.12.1.tgz", + "integrity": "sha512-2qrEP9VYylKXbyzXKsbu2dferBTvqnlsr29XjHwFE+/MEp0VNj6oEUESLDtKZ7DWzGdSv1x/+ujqFZF+KsO3cg==", + "dependencies": { + "@sphinxxxx/color-conversion": "^2.2.2" + } + }, + "node_modules/vite": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.7.tgz", + "integrity": "sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==", + "dev": true, + "dependencies": { + "esbuild": "^0.15.9", + "postcss": "^8.4.18", + "resolve": "^1.22.1", + "rollup": "^2.79.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-svgr": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-2.4.0.tgz", + "integrity": "sha512-q+mJJol6ThvqkkJvvVFEndI4EaKIjSI0I3jNFgSoC9fXAz1M7kYTVUin8fhUsFojFDKZ9VHKtX6NXNaOLpbsHA==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.2", + "@svgr/core": "^6.5.1" + }, + "peerDependencies": { + "vite": "^2.6.0 || 3 || 4" + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.0.5.tgz", + "integrity": "sha512-/L/eHwySFYjwxoYt1WRJniuK/jPv+WGwgRGBYx3leciR5wBeqntQpUE6Js6+TJemChc+ter7fDBKieyEWDx4yQ==", + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^2.0.1" + } + }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zustand": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.4.6.tgz", + "integrity": "sha512-Rb16eW55gqL4W2XZpJh0fnrATxYEG3Apl2gfHTyDSE965x/zxslTikpNch0JgNjJA9zK6gEFW8Fl6d1rTZaqgg==", + "dependencies": { + "use-sync-external-store": "1.2.0" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + }, + "node_modules/zustand-computed": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/zustand-computed/-/zustand-computed-1.3.3.tgz", + "integrity": "sha512-SXhjuH/scwA6T31xsqaqUzPVBoumgCK/PWi8YZXGmuU86HPrqVFxjI6TxLvYw8hGpScZkjFUKBAi1ThO0B6Tng==", + "peerDependencies": { + "react": "^18.2.0", + "zustand": "^4.1.4" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "requires": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + } + }, + "@babel/compat-data": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", + "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", + "dev": true + }, + "@babel/core": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz", + "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.21.0", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.21.0", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.0", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + } + }, + "@babel/generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz", + "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==", + "dev": true, + "requires": { + "@babel/types": "^7.23.3", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "requires": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", + "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.2", + "@babel/types": "^7.21.2" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true + }, + "@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "requires": { + "@babel/types": "^7.20.2" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==" + }, + "@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" + }, + "@babel/helper-validator-option": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "dev": true + }, + "@babel/helpers": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", + "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "dev": true, + "requires": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" + } + }, + "@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "requires": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz", + "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==", + "dev": true + }, + "@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.0.tgz", + "integrity": "sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.21.0" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", + "dev": true, + "requires": { + "@babel/plugin-transform-react-jsx": "^7.18.6" + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.21.0.tgz", + "integrity": "sha512-f/Eq+79JEu+KUANFks9UZCcvydOOGMgF7jBrcwjHa5jTZD8JivnhCJYvmlhR/WTXBWonDExPoW0eO/CR4QJirA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz", + "integrity": "sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/runtime": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "requires": { + "regenerator-runtime": "^0.13.11" + } + }, + "@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + } + }, + "@babel/traverse": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz", + "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.3", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.3", + "@babel/types": "^7.23.3", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", + "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", + "requires": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + }, + "@chakra-ui/accordion": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/@chakra-ui/accordion/-/accordion-2.1.11.tgz", + "integrity": "sha512-mfVPmqETp9pyRDHJ33AdF19oHv/LyxVzQJtlxUByuvs8Cj9QQZ2LQLg5kejm+b3mj03A7A6yfbuo3RNaI4Bhsg==", + "requires": { + "@chakra-ui/descendant": "3.0.14", + "@chakra-ui/icon": "3.0.16", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-use-controllable-state": "2.0.8", + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/transition": "2.0.16" + } + }, + "@chakra-ui/alert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/alert/-/alert-2.1.0.tgz", + "integrity": "sha512-OcfHwoXI5VrmM+tHJTHT62Bx6TfyfCxSa0PWUOueJzSyhlUOKBND5we6UtrOB7D0jwX45qKKEDJOLG5yCG21jQ==", + "requires": { + "@chakra-ui/icon": "3.0.16", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/spinner": "2.0.13" + } + }, + "@chakra-ui/anatomy": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/anatomy/-/anatomy-2.1.2.tgz", + "integrity": "sha512-pKfOS/mztc4sUXHNc8ypJ1gPWSolWT770jrgVRfolVbYlki8y5Y+As996zMF6k5lewTu6j9DQequ7Cc9a69IVQ==" + }, + "@chakra-ui/avatar": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@chakra-ui/avatar/-/avatar-2.2.8.tgz", + "integrity": "sha512-uBs9PMrqyK111tPIYIKnOM4n3mwgKqGpvYmtwBnnbQLTNLg4gtiWWVbpTuNMpyu1av0xQYomjUt8Doed8w6p8g==", + "requires": { + "@chakra-ui/image": "2.0.15", + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/shared-utils": "2.0.5" + } + }, + "@chakra-ui/breadcrumb": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@chakra-ui/breadcrumb/-/breadcrumb-2.1.5.tgz", + "integrity": "sha512-p3eQQrHQBkRB69xOmNyBJqEdfCrMt+e0eOH+Pm/DjFWfIVIbnIaFbmDCeWClqlLa21Ypc6h1hR9jEmvg8kmOog==", + "requires": { + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/shared-utils": "2.0.5" + } + }, + "@chakra-ui/breakpoint-utils": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@chakra-ui/breakpoint-utils/-/breakpoint-utils-2.0.8.tgz", + "integrity": "sha512-Pq32MlEX9fwb5j5xx8s18zJMARNHlQZH2VH1RZgfgRDpp7DcEgtRW5AInfN5CfqdHLO1dGxA7I3MqEuL5JnIsA==", + "requires": { + "@chakra-ui/shared-utils": "2.0.5" + } + }, + "@chakra-ui/button": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@chakra-ui/button/-/button-2.0.18.tgz", + "integrity": "sha512-E3c99+lOm6ou4nQVOTLkG+IdOPMjsQK+Qe7VyP8A/xeAMFONuibrWPRPpprr4ZkB4kEoLMfNuyH2+aEza3ScUA==", + "requires": { + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/spinner": "2.0.13" + } + }, + "@chakra-ui/card": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@chakra-ui/card/-/card-2.1.6.tgz", + "integrity": "sha512-fFd/WAdRNVY/WOSQv4skpy0WeVhhI0f7dTY1Sm0jVl0KLmuP/GnpsWtKtqWjNcV00K963EXDyhlk6+9oxbP4gw==", + "requires": { + "@chakra-ui/shared-utils": "2.0.5" + } + }, + "@chakra-ui/checkbox": { + "version": "2.2.14", + "resolved": "https://registry.npmjs.org/@chakra-ui/checkbox/-/checkbox-2.2.14.tgz", + "integrity": "sha512-uqo6lFWLqYBujPglrvRhTAErtuIXpmdpc5w0W4bjK7kyvLhxOpUh1hlDb2WoqlNpfRn/OaNeF6VinPnf9BJL8w==", + "requires": { + "@chakra-ui/form-control": "2.0.18", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-callback-ref": "2.0.7", + "@chakra-ui/react-use-controllable-state": "2.0.8", + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@chakra-ui/react-use-safe-layout-effect": "2.0.5", + "@chakra-ui/react-use-update-effect": "2.0.7", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/visually-hidden": "2.0.15", + "@zag-js/focus-visible": "0.2.2" + } + }, + "@chakra-ui/cli": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/cli/-/cli-2.4.1.tgz", + "integrity": "sha512-GZZuHUA1cXJWpmYNiVTLPihvY4VhIssRl+AXgw/0IbeodTMop3jWlIioPKLAQeXu5CwvRA6iESyGjnu1V8Zykg==", + "dev": true, + "requires": { + "chokidar": "^3.5.3", + "cli-check-node": "^1.3.4", + "cli-handle-unhandled": "^1.1.1", + "cli-welcome": "^2.2.2", + "commander": "^9.3.0", + "esbuild": "^0.17.18", + "prettier": "^2.8.8" + }, + "dependencies": { + "@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "dev": true, + "optional": true + }, + "esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + } + } + }, + "@chakra-ui/clickable": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@chakra-ui/clickable/-/clickable-2.0.14.tgz", + "integrity": "sha512-jfsM1qaD74ZykLHmvmsKRhDyokLUxEfL8Il1VoZMNX5RBI0xW/56vKpLTFF/v/+vLPLS+Te2cZdD4+2O+G6ulA==", + "requires": { + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@chakra-ui/shared-utils": "2.0.5" + } + }, + "@chakra-ui/close-button": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@chakra-ui/close-button/-/close-button-2.0.17.tgz", + "integrity": "sha512-05YPXk456t1Xa3KpqTrvm+7smx+95dmaPiwjiBN3p7LHUQVHJd8ZXSDB0V+WKi419k3cVQeJUdU/azDO2f40sw==", + "requires": { + "@chakra-ui/icon": "3.0.16" + } + }, + "@chakra-ui/color-mode": { + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@chakra-ui/color-mode/-/color-mode-2.1.12.tgz", + "integrity": "sha512-sYyfJGDoJSLYO+V2hxV9r033qhte5Nw/wAn5yRGGZnEEN1dKPEdWQ3XZvglWSDTNd0w9zkoH2w6vP4FBBYb/iw==", + "requires": { + "@chakra-ui/react-use-safe-layout-effect": "2.0.5" + } + }, + "@chakra-ui/control-box": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@chakra-ui/control-box/-/control-box-2.0.13.tgz", + "integrity": "sha512-FEyrU4crxati80KUF/+1Z1CU3eZK6Sa0Yv7Z/ydtz9/tvGblXW9NFanoomXAOvcIFLbaLQPPATm9Gmpr7VG05A==", + "requires": {} + }, + "@chakra-ui/counter": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@chakra-ui/counter/-/counter-2.0.14.tgz", + "integrity": "sha512-KxcSRfUbb94dP77xTip2myoE7P2HQQN4V5fRJmNAGbzcyLciJ+aDylUU/UxgNcEjawUp6Q242NbWb1TSbKoqog==", + "requires": { + "@chakra-ui/number-utils": "2.0.7", + "@chakra-ui/react-use-callback-ref": "2.0.7", + "@chakra-ui/shared-utils": "2.0.5" + } + }, + "@chakra-ui/css-reset": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/css-reset/-/css-reset-2.1.1.tgz", + "integrity": "sha512-jwEOfIAWmQsnChHQTW/eRE+dfE4MjmhvSvoUug5nkV1pI7veC/20noFlIZxzi82EbiQI8Fs0+Jnusgxr2yaOHA==", + "requires": {} + }, + "@chakra-ui/descendant": { + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/@chakra-ui/descendant/-/descendant-3.0.14.tgz", + "integrity": "sha512-+Ahvp9H4HMpfScIv9w1vaecGz7qWAaK1YFHHolz/SIsGLaLGlbdp+5UNabQC7L6TUnzzJDQDxzwif78rTD7ang==", + "requires": { + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-use-merge-refs": "2.0.7" + } + }, + "@chakra-ui/dom-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@chakra-ui/dom-utils/-/dom-utils-2.0.6.tgz", + "integrity": "sha512-PVtDkPrDD5b8aoL6Atg7SLjkwhWb7BwMcLOF1L449L3nZN+DAO3nyAh6iUhZVJyunELj9d0r65CDlnMREyJZmA==" + }, + "@chakra-ui/editable": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/@chakra-ui/editable/-/editable-2.0.21.tgz", + "integrity": "sha512-oYuXbHnggxSYJN7P9Pn0Scs9tPC91no4z1y58Oe+ILoJKZ+bFAEHtL7FEISDNJxw++MEukeFu7GU1hVqmdLsKQ==", + "requires": { + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-callback-ref": "2.0.7", + "@chakra-ui/react-use-controllable-state": "2.0.8", + "@chakra-ui/react-use-focus-on-pointer-down": "2.0.6", + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@chakra-ui/react-use-safe-layout-effect": "2.0.5", + "@chakra-ui/react-use-update-effect": "2.0.7", + "@chakra-ui/shared-utils": "2.0.5" + } + }, + "@chakra-ui/event-utils": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@chakra-ui/event-utils/-/event-utils-2.0.8.tgz", + "integrity": "sha512-IGM/yGUHS+8TOQrZGpAKOJl/xGBrmRYJrmbHfUE7zrG3PpQyXvbLDP1M+RggkCFVgHlJi2wpYIf0QtQlU0XZfw==" + }, + "@chakra-ui/focus-lock": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@chakra-ui/focus-lock/-/focus-lock-2.0.16.tgz", + "integrity": "sha512-UuAdGCPVrCa1lecoAvpOQD7JFT7a9RdmhKWhFt5ioIcekSLJcerdLHuuL3w0qz//8kd1/SOt7oP0aJqdAJQrCw==", + "requires": { + "@chakra-ui/dom-utils": "2.0.6", + "react-focus-lock": "^2.9.2" + } + }, + "@chakra-ui/form-control": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@chakra-ui/form-control/-/form-control-2.0.18.tgz", + "integrity": "sha512-I0a0jG01IAtRPccOXSNugyRdUAe8Dy40ctqedZvznMweOXzbMCF1m+sHPLdWeWC/VI13VoAispdPY0/zHOdjsQ==", + "requires": { + "@chakra-ui/icon": "3.0.16", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@chakra-ui/shared-utils": "2.0.5" + } + }, + "@chakra-ui/hooks": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@chakra-ui/hooks/-/hooks-2.1.6.tgz", + "integrity": "sha512-oMSOeoOF6/UpwTVlDFHSROAA4hPY8WgJ0erdHs1ZkuwAwHv7UzjDkvrb6xYzAAH9qHoFzc5RIBm6jVoh3LCc+Q==", + "requires": { + "@chakra-ui/react-utils": "2.0.12", + "@chakra-ui/utils": "2.0.15", + "compute-scroll-into-view": "1.0.20", + "copy-to-clipboard": "3.3.3" + } + }, + "@chakra-ui/icon": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/@chakra-ui/icon/-/icon-3.0.16.tgz", + "integrity": "sha512-RpA1X5Ptz8Mt39HSyEIW1wxAz2AXyf9H0JJ5HVx/dBdMZaGMDJ0HyyPBVci0m4RCoJuyG1HHG/DXJaVfUTVAeg==", + "requires": { + "@chakra-ui/shared-utils": "2.0.5" + } + }, + "@chakra-ui/image": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@chakra-ui/image/-/image-2.0.15.tgz", + "integrity": "sha512-w2rElXtI3FHXuGpMCsSklus+pO1Pl2LWDwsCGdpBQUvGFbnHfl7MftQgTlaGHeD5OS95Pxva39hKrA2VklKHiQ==", + "requires": { + "@chakra-ui/react-use-safe-layout-effect": "2.0.5", + "@chakra-ui/shared-utils": "2.0.5" + } + }, + "@chakra-ui/input": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/@chakra-ui/input/-/input-2.0.21.tgz", + "integrity": "sha512-AIWjjg6MgcOtlvKmVoZfPPfgF+sBSWL3Zq2HSCAMvS6h7jfxz/Xv0UTFGPk5F4Wt0YHT7qMySg0Jsm0b78HZJg==", + "requires": { + "@chakra-ui/form-control": "2.0.18", + "@chakra-ui/object-utils": "2.0.8", + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/shared-utils": "2.0.5" + } + }, + "@chakra-ui/layout": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/@chakra-ui/layout/-/layout-2.1.18.tgz", + "integrity": "sha512-F4Gh2e+DGdaWdWT5NZduIFD9NM7Bnuh8sXARFHWPvIu7yvAwZ3ddqC9GK4F3qUngdmkJxDLWQqRSwSh96Lxbhw==", + "requires": { + "@chakra-ui/breakpoint-utils": "2.0.8", + "@chakra-ui/icon": "3.0.16", + "@chakra-ui/object-utils": "2.0.8", + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/shared-utils": "2.0.5" + } + }, + "@chakra-ui/lazy-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@chakra-ui/lazy-utils/-/lazy-utils-2.0.5.tgz", + "integrity": "sha512-UULqw7FBvcckQk2n3iPO56TMJvDsNv0FKZI6PlUNJVaGsPbsYxK/8IQ60vZgaTVPtVcjY6BE+y6zg8u9HOqpyg==" + }, + "@chakra-ui/live-region": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@chakra-ui/live-region/-/live-region-2.0.13.tgz", + "integrity": "sha512-Ja+Slk6ZkxSA5oJzU2VuGU7TpZpbMb/4P4OUhIf2D30ctmIeXkxTWw1Bs1nGJAVtAPcGS5sKA+zb89i8g+0cTQ==", + "requires": {} + }, + "@chakra-ui/media-query": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/@chakra-ui/media-query/-/media-query-3.2.12.tgz", + "integrity": "sha512-8pSLDf3oxxhFrhd40rs7vSeIBfvOmIKHA7DJlGUC/y+9irD24ZwgmCtFnn+y3gI47hTJsopbSX+wb8nr7XPswA==", + "requires": { + "@chakra-ui/breakpoint-utils": "2.0.8", + "@chakra-ui/react-env": "3.0.0", + "@chakra-ui/shared-utils": "2.0.5" + } + }, + "@chakra-ui/menu": { + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@chakra-ui/menu/-/menu-2.1.12.tgz", + "integrity": "sha512-ylNK1VJlr/3/EGg9dLPZ87cBJJjeiYXeU/gOAphsKXMnByrXWhbp4YVnyyyha2KZ0zEw0aPU4nCZ+A69aT9wrg==", + "requires": { + "@chakra-ui/clickable": "2.0.14", + "@chakra-ui/descendant": "3.0.14", + "@chakra-ui/lazy-utils": "2.0.5", + "@chakra-ui/popper": "3.0.13", + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-use-animation-state": "2.0.8", + "@chakra-ui/react-use-controllable-state": "2.0.8", + "@chakra-ui/react-use-disclosure": "2.0.8", + "@chakra-ui/react-use-focus-effect": "2.0.9", + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@chakra-ui/react-use-outside-click": "2.0.7", + "@chakra-ui/react-use-update-effect": "2.0.7", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/transition": "2.0.16" + } + }, + "@chakra-ui/modal": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/@chakra-ui/modal/-/modal-2.2.11.tgz", + "integrity": "sha512-2J0ZUV5tEzkPiawdkgPz6bmex7NXAde1VXooMwdvK+vuT8PV3U61yorTJOZVLdw7TjjI1Yo94mzsp6UwBud43Q==", + "requires": { + "@chakra-ui/close-button": "2.0.17", + "@chakra-ui/focus-lock": "2.0.16", + "@chakra-ui/portal": "2.0.16", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/transition": "2.0.16", + "aria-hidden": "^1.2.2", + "react-remove-scroll": "^2.5.5" + } + }, + "@chakra-ui/number-input": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/@chakra-ui/number-input/-/number-input-2.0.19.tgz", + "integrity": "sha512-HDaITvtMEqOauOrCPsARDxKD9PSHmhWywpcyCSOX0lMe4xx2aaGhU0QQFhsJsykj8Er6pytMv6t0KZksdDv3YA==", + "requires": { + "@chakra-ui/counter": "2.0.14", + "@chakra-ui/form-control": "2.0.18", + "@chakra-ui/icon": "3.0.16", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-callback-ref": "2.0.7", + "@chakra-ui/react-use-event-listener": "2.0.7", + "@chakra-ui/react-use-interval": "2.0.5", + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@chakra-ui/react-use-safe-layout-effect": "2.0.5", + "@chakra-ui/react-use-update-effect": "2.0.7", + "@chakra-ui/shared-utils": "2.0.5" + } + }, + "@chakra-ui/number-utils": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@chakra-ui/number-utils/-/number-utils-2.0.7.tgz", + "integrity": "sha512-yOGxBjXNvLTBvQyhMDqGU0Oj26s91mbAlqKHiuw737AXHt0aPllOthVUqQMeaYLwLCjGMg0jtI7JReRzyi94Dg==" + }, + "@chakra-ui/object-utils": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@chakra-ui/object-utils/-/object-utils-2.0.8.tgz", + "integrity": "sha512-2upjT2JgRuiupdrtBWklKBS6tqeGMA77Nh6Q0JaoQuH/8yq+15CGckqn3IUWkWoGI0Fg3bK9LDlbbD+9DLw95Q==" + }, + "@chakra-ui/pin-input": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/@chakra-ui/pin-input/-/pin-input-2.0.20.tgz", + "integrity": "sha512-IHVmerrtHN8F+jRB3W1HnMir1S1TUCWhI7qDInxqPtoRffHt6mzZgLZ0izx8p1fD4HkW4c1d4/ZLEz9uH9bBRg==", + "requires": { + "@chakra-ui/descendant": "3.0.14", + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-use-controllable-state": "2.0.8", + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@chakra-ui/shared-utils": "2.0.5" + } + }, + "@chakra-ui/popover": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@chakra-ui/popover/-/popover-2.1.9.tgz", + "integrity": "sha512-OMJ12VVs9N32tFaZSOqikkKPtwAVwXYsES/D1pff/amBrE3ngCrpxJSIp4uvTdORfIYDojJqrR52ZplDKS9hRQ==", + "requires": { + "@chakra-ui/close-button": "2.0.17", + "@chakra-ui/lazy-utils": "2.0.5", + "@chakra-ui/popper": "3.0.13", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-animation-state": "2.0.8", + "@chakra-ui/react-use-disclosure": "2.0.8", + "@chakra-ui/react-use-focus-effect": "2.0.9", + "@chakra-ui/react-use-focus-on-pointer-down": "2.0.6", + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@chakra-ui/shared-utils": "2.0.5" + } + }, + "@chakra-ui/popper": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@chakra-ui/popper/-/popper-3.0.13.tgz", + "integrity": "sha512-FwtmYz80Ju8oK3Z1HQfisUE7JIMmDsCQsRBu6XuJ3TFQnBHit73yjZmxKjuRJ4JgyT4WBnZoTF3ATbRKSagBeg==", + "requires": { + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@popperjs/core": "^2.9.3" + } + }, + "@chakra-ui/portal": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@chakra-ui/portal/-/portal-2.0.16.tgz", + "integrity": "sha512-bVID0qbQ0l4xq38LdqAN4EKD4/uFkDnXzFwOlviC9sl0dNhzICDb1ltuH/Adl1d2HTMqyN60O3GO58eHy7plnQ==", + "requires": { + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-use-safe-layout-effect": "2.0.5" + } + }, + "@chakra-ui/progress": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@chakra-ui/progress/-/progress-2.1.6.tgz", + "integrity": "sha512-hHh5Ysv4z6bK+j2GJbi/FT9CVyto2PtNUNwBmr3oNMVsoOUMoRjczfXvvYqp0EHr9PCpxqrq7sRwgQXUzhbDSw==", + "requires": { + "@chakra-ui/react-context": "2.0.8" + } + }, + "@chakra-ui/provider": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/provider/-/provider-2.2.2.tgz", + "integrity": "sha512-UVwnIDnAWq1aKroN5AF+OpNpUqLVeIUk7tKvX3z4CY9FsPFFi6LTEhRHdhpwaU1Tau3Tf9agEu5URegpY7S8BA==", + "requires": { + "@chakra-ui/css-reset": "2.1.1", + "@chakra-ui/portal": "2.0.16", + "@chakra-ui/react-env": "3.0.0", + "@chakra-ui/system": "2.5.5", + "@chakra-ui/utils": "2.0.15" + } + }, + "@chakra-ui/radio": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/@chakra-ui/radio/-/radio-2.0.22.tgz", + "integrity": "sha512-GsQ5WAnLwivWl6gPk8P1x+tCcpVakCt5R5T0HumF7DGPXKdJbjS+RaFySrbETmyTJsKY4QrfXn+g8CWVrMjPjw==", + "requires": { + "@chakra-ui/form-control": "2.0.18", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@chakra-ui/shared-utils": "2.0.5", + "@zag-js/focus-visible": "0.2.2" + } + }, + "@chakra-ui/react": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/@chakra-ui/react/-/react-2.5.5.tgz", + "integrity": "sha512-aBVMUtdWv2MrptD/tKSqICPsuJ+I+jvauegffO1qPUDlK3RrXIDeOHkLGWohgXNcjY5bGVWguFEzJm97//0ooQ==", + "requires": { + "@chakra-ui/accordion": "2.1.11", + "@chakra-ui/alert": "2.1.0", + "@chakra-ui/avatar": "2.2.8", + "@chakra-ui/breadcrumb": "2.1.5", + "@chakra-ui/button": "2.0.18", + "@chakra-ui/card": "2.1.6", + "@chakra-ui/checkbox": "2.2.14", + "@chakra-ui/close-button": "2.0.17", + "@chakra-ui/control-box": "2.0.13", + "@chakra-ui/counter": "2.0.14", + "@chakra-ui/css-reset": "2.1.1", + "@chakra-ui/editable": "2.0.21", + "@chakra-ui/focus-lock": "2.0.16", + "@chakra-ui/form-control": "2.0.18", + "@chakra-ui/hooks": "2.1.6", + "@chakra-ui/icon": "3.0.16", + "@chakra-ui/image": "2.0.15", + "@chakra-ui/input": "2.0.21", + "@chakra-ui/layout": "2.1.18", + "@chakra-ui/live-region": "2.0.13", + "@chakra-ui/media-query": "3.2.12", + "@chakra-ui/menu": "2.1.12", + "@chakra-ui/modal": "2.2.11", + "@chakra-ui/number-input": "2.0.19", + "@chakra-ui/pin-input": "2.0.20", + "@chakra-ui/popover": "2.1.9", + "@chakra-ui/popper": "3.0.13", + "@chakra-ui/portal": "2.0.16", + "@chakra-ui/progress": "2.1.6", + "@chakra-ui/provider": "2.2.2", + "@chakra-ui/radio": "2.0.22", + "@chakra-ui/react-env": "3.0.0", + "@chakra-ui/select": "2.0.19", + "@chakra-ui/skeleton": "2.0.24", + "@chakra-ui/slider": "2.0.23", + "@chakra-ui/spinner": "2.0.13", + "@chakra-ui/stat": "2.0.18", + "@chakra-ui/styled-system": "2.8.0", + "@chakra-ui/switch": "2.0.26", + "@chakra-ui/system": "2.5.5", + "@chakra-ui/table": "2.0.17", + "@chakra-ui/tabs": "2.1.9", + "@chakra-ui/tag": "3.0.0", + "@chakra-ui/textarea": "2.0.19", + "@chakra-ui/theme": "3.0.1", + "@chakra-ui/theme-utils": "2.0.15", + "@chakra-ui/toast": "6.1.1", + "@chakra-ui/tooltip": "2.2.7", + "@chakra-ui/transition": "2.0.16", + "@chakra-ui/utils": "2.0.15", + "@chakra-ui/visually-hidden": "2.0.15" + } + }, + "@chakra-ui/react-children-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-children-utils/-/react-children-utils-2.0.6.tgz", + "integrity": "sha512-QVR2RC7QsOsbWwEnq9YduhpqSFnZGvjjGREV8ygKi8ADhXh93C8azLECCUVgRJF2Wc+So1fgxmjLcbZfY2VmBA==", + "requires": {} + }, + "@chakra-ui/react-context": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-context/-/react-context-2.0.8.tgz", + "integrity": "sha512-tRTKdn6lCTXM6WPjSokAAKCw2ioih7Eg8cNgaYRSwKBck8nkz9YqxgIIEj3dJD7MGtpl24S/SNI98iRWkRwR/A==", + "requires": {} + }, + "@chakra-ui/react-env": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-env/-/react-env-3.0.0.tgz", + "integrity": "sha512-tfMRO2v508HQWAqSADFrwZgR9oU10qC97oV6zGbjHh9ALP0/IcFR+Bi71KRTveDTm85fMeAzZYGj57P3Dsipkw==", + "requires": { + "@chakra-ui/react-use-safe-layout-effect": "2.0.5" + } + }, + "@chakra-ui/react-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-types/-/react-types-2.0.7.tgz", + "integrity": "sha512-12zv2qIZ8EHwiytggtGvo4iLT0APris7T0qaAWqzpUGS0cdUtR8W+V1BJ5Ocq+7tA6dzQ/7+w5hmXih61TuhWQ==", + "requires": {} + }, + "@chakra-ui/react-use-animation-state": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-animation-state/-/react-use-animation-state-2.0.8.tgz", + "integrity": "sha512-xv9zSF2Rd1mHWQ+m5DLBWeh4atF8qrNvsOs3MNrvxKYBS3f79N3pqcQGrWAEvirXWXfiCeje2VAkEggqFRIo+Q==", + "requires": { + "@chakra-ui/dom-utils": "2.0.6", + "@chakra-ui/react-use-event-listener": "2.0.7" + } + }, + "@chakra-ui/react-use-callback-ref": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-callback-ref/-/react-use-callback-ref-2.0.7.tgz", + "integrity": "sha512-YjT76nTpfHAK5NxplAlZsQwNju5KmQExnqsWNPFeOR6vvbC34+iPSTr+r91i1Hdy7gBSbevsOsd5Wm6RN3GuMw==", + "requires": {} + }, + "@chakra-ui/react-use-controllable-state": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-controllable-state/-/react-use-controllable-state-2.0.8.tgz", + "integrity": "sha512-F7rdCbLEmRjwwODqWZ3y+mKgSSHPcLQxeUygwk1BkZPXbKkJJKymOIjIynil2cbH7ku3hcSIWRvuhpCcfQWJ7Q==", + "requires": { + "@chakra-ui/react-use-callback-ref": "2.0.7" + } + }, + "@chakra-ui/react-use-disclosure": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-disclosure/-/react-use-disclosure-2.0.8.tgz", + "integrity": "sha512-2ir/mHe1YND40e+FyLHnDsnDsBQPwzKDLzfe9GZri7y31oU83JSbHdlAXAhp3bpjohslwavtRCp+S/zRxfO9aQ==", + "requires": { + "@chakra-ui/react-use-callback-ref": "2.0.7" + } + }, + "@chakra-ui/react-use-event-listener": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-event-listener/-/react-use-event-listener-2.0.7.tgz", + "integrity": "sha512-4wvpx4yudIO3B31pOrXuTHDErawmwiXnvAN7gLEOVREi16+YGNcFnRJ5X5nRrmB7j2MDUtsEDpRBFfw5Z9xQ5g==", + "requires": { + "@chakra-ui/react-use-callback-ref": "2.0.7" + } + }, + "@chakra-ui/react-use-focus-effect": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-focus-effect/-/react-use-focus-effect-2.0.9.tgz", + "integrity": "sha512-20nfNkpbVwyb41q9wxp8c4jmVp6TUGAPE3uFTDpiGcIOyPW5aecQtPmTXPMJH+2aa8Nu1wyoT1btxO+UYiQM3g==", + "requires": { + "@chakra-ui/dom-utils": "2.0.6", + "@chakra-ui/react-use-event-listener": "2.0.7", + "@chakra-ui/react-use-safe-layout-effect": "2.0.5", + "@chakra-ui/react-use-update-effect": "2.0.7" + } + }, + "@chakra-ui/react-use-focus-on-pointer-down": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-focus-on-pointer-down/-/react-use-focus-on-pointer-down-2.0.6.tgz", + "integrity": "sha512-OigXiLRVySn3tyVqJ/rn57WGuukW8TQe8fJYiLwXbcNyAMuYYounvRxvCy2b53sQ7QIZamza0N0jhirbH5FNoQ==", + "requires": { + "@chakra-ui/react-use-event-listener": "2.0.7" + } + }, + "@chakra-ui/react-use-interval": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-interval/-/react-use-interval-2.0.5.tgz", + "integrity": "sha512-1nbdwMi2K87V6p5f5AseOKif2CkldLaJlq1TOqaPRwb7v3aU9rltBtYdf+fIyuHSToNJUV6wd9budCFdLCl3Fg==", + "requires": { + "@chakra-ui/react-use-callback-ref": "2.0.7" + } + }, + "@chakra-ui/react-use-latest-ref": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-latest-ref/-/react-use-latest-ref-2.0.5.tgz", + "integrity": "sha512-3mIuFzMyIo3Ok/D8uhV9voVg7KkrYVO/pwVvNPJOHsDQqCA6DpYE4WDsrIx+fVcwad3Ta7SupexR5PoI+kq6QQ==", + "requires": {} + }, + "@chakra-ui/react-use-merge-refs": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-merge-refs/-/react-use-merge-refs-2.0.7.tgz", + "integrity": "sha512-zds4Uhsc+AMzdH8JDDkLVet9baUBgtOjPbhC5r3A0ZXjZvGhCztFAVE3aExYiVoMPoHLKbLcqvCWE6ioFKz1lw==", + "requires": {} + }, + "@chakra-ui/react-use-outside-click": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-outside-click/-/react-use-outside-click-2.0.7.tgz", + "integrity": "sha512-MsAuGLkwYNxNJ5rb8lYNvXApXxYMnJ3MzqBpQj1kh5qP/+JSla9XMjE/P94ub4fSEttmNSqs43SmPPrmPuihsQ==", + "requires": { + "@chakra-ui/react-use-callback-ref": "2.0.7" + } + }, + "@chakra-ui/react-use-pan-event": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-pan-event/-/react-use-pan-event-2.0.9.tgz", + "integrity": "sha512-xu35QXkiyrgsHUOnctl+SwNcwf9Rl62uYE5y8soKOZdBm8E+FvZIt2hxUzK1EoekbJCMzEZ0Yv1ZQCssVkSLaQ==", + "requires": { + "@chakra-ui/event-utils": "2.0.8", + "@chakra-ui/react-use-latest-ref": "2.0.5", + "framesync": "6.1.2" + } + }, + "@chakra-ui/react-use-previous": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-previous/-/react-use-previous-2.0.5.tgz", + "integrity": "sha512-BIZgjycPE4Xr+MkhKe0h67uHXzQQkBX/u5rYPd65iMGdX1bCkbE0oorZNfOHLKdTmnEb4oVsNvfN6Rfr+Mnbxw==", + "requires": {} + }, + "@chakra-ui/react-use-safe-layout-effect": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-safe-layout-effect/-/react-use-safe-layout-effect-2.0.5.tgz", + "integrity": "sha512-MwAQBz3VxoeFLaesaSEN87reVNVbjcQBDex2WGexAg6hUB6n4gc1OWYH/iXp4tzp4kuggBNhEHkk9BMYXWfhJQ==", + "requires": {} + }, + "@chakra-ui/react-use-size": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-size/-/react-use-size-2.0.10.tgz", + "integrity": "sha512-fdIkH14GDnKQrtQfxX8N3gxbXRPXEl67Y3zeD9z4bKKcQUAYIMqs0MsPZY+FMpGQw8QqafM44nXfL038aIrC5w==", + "requires": { + "@zag-js/element-size": "0.3.2" + } + }, + "@chakra-ui/react-use-timeout": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-timeout/-/react-use-timeout-2.0.5.tgz", + "integrity": "sha512-QqmB+jVphh3h/CS60PieorpY7UqSPkrQCB7f7F+i9vwwIjtP8fxVHMmkb64K7VlzQiMPzv12nlID5dqkzlv0mw==", + "requires": { + "@chakra-ui/react-use-callback-ref": "2.0.7" + } + }, + "@chakra-ui/react-use-update-effect": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-update-effect/-/react-use-update-effect-2.0.7.tgz", + "integrity": "sha512-vBM2bmmM83ZdDtasWv3PXPznpTUd+FvqBC8J8rxoRmvdMEfrxTiQRBJhiGHLpS9BPLLPQlosN6KdFU97csB6zg==", + "requires": {} + }, + "@chakra-ui/react-utils": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-utils/-/react-utils-2.0.12.tgz", + "integrity": "sha512-GbSfVb283+YA3kA8w8xWmzbjNWk14uhNpntnipHCftBibl0lxtQ9YqMFQLwuFOO0U2gYVocszqqDWX+XNKq9hw==", + "requires": { + "@chakra-ui/utils": "2.0.15" + } + }, + "@chakra-ui/select": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/@chakra-ui/select/-/select-2.0.19.tgz", + "integrity": "sha512-eAlFh+JhwtJ17OrB6fO6gEAGOMH18ERNrXLqWbYLrs674Le7xuREgtuAYDoxUzvYXYYTTdOJtVbcHGriI3o6rA==", + "requires": { + "@chakra-ui/form-control": "2.0.18", + "@chakra-ui/shared-utils": "2.0.5" + } + }, + "@chakra-ui/shared-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@chakra-ui/shared-utils/-/shared-utils-2.0.5.tgz", + "integrity": "sha512-4/Wur0FqDov7Y0nCXl7HbHzCg4aq86h+SXdoUeuCMD3dSj7dpsVnStLYhng1vxvlbUnLpdF4oz5Myt3i/a7N3Q==" + }, + "@chakra-ui/skeleton": { + "version": "2.0.24", + "resolved": "https://registry.npmjs.org/@chakra-ui/skeleton/-/skeleton-2.0.24.tgz", + "integrity": "sha512-1jXtVKcl/jpbrJlc/TyMsFyI651GTXY5ma30kWyTXoby2E+cxbV6OR8GB/NMZdGxbQBax8/VdtYVjI0n+OBqWA==", + "requires": { + "@chakra-ui/media-query": "3.2.12", + "@chakra-ui/react-use-previous": "2.0.5", + "@chakra-ui/shared-utils": "2.0.5" + } + }, + "@chakra-ui/slider": { + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/@chakra-ui/slider/-/slider-2.0.23.tgz", + "integrity": "sha512-/eyRUXLla+ZdBUPXpakE3SAS2JS8mIJR6qcUYiPVKSpRAi6tMyYeQijAXn2QC1AUVd2JrG8Pz+1Jy7Po3uA7cA==", + "requires": { + "@chakra-ui/number-utils": "2.0.7", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-callback-ref": "2.0.7", + "@chakra-ui/react-use-controllable-state": "2.0.8", + "@chakra-ui/react-use-latest-ref": "2.0.5", + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@chakra-ui/react-use-pan-event": "2.0.9", + "@chakra-ui/react-use-size": "2.0.10", + "@chakra-ui/react-use-update-effect": "2.0.7" + } + }, + "@chakra-ui/spinner": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@chakra-ui/spinner/-/spinner-2.0.13.tgz", + "integrity": "sha512-T1/aSkVpUIuiYyrjfn1+LsQEG7Onbi1UE9ccS/evgf61Dzy4GgTXQUnDuWFSgpV58owqirqOu6jn/9eCwDlzlg==", + "requires": { + "@chakra-ui/shared-utils": "2.0.5" + } + }, + "@chakra-ui/stat": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@chakra-ui/stat/-/stat-2.0.18.tgz", + "integrity": "sha512-wKyfBqhVlIs9bkSerUc6F9KJMw0yTIEKArW7dejWwzToCLPr47u+CtYO6jlJHV6lRvkhi4K4Qc6pyvtJxZ3VpA==", + "requires": { + "@chakra-ui/icon": "3.0.16", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/shared-utils": "2.0.5" + } + }, + "@chakra-ui/styled-system": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/styled-system/-/styled-system-2.8.0.tgz", + "integrity": "sha512-bmRv/8ACJGGKGx84U1npiUddwdNifJ+/ETklGwooS5APM0ymwUtBYZpFxjYNJrqvVYpg3mVY6HhMyBVptLS7iA==", + "requires": { + "@chakra-ui/shared-utils": "2.0.5", + "csstype": "^3.0.11", + "lodash.mergewith": "4.6.2" + } + }, + "@chakra-ui/switch": { + "version": "2.0.26", + "resolved": "https://registry.npmjs.org/@chakra-ui/switch/-/switch-2.0.26.tgz", + "integrity": "sha512-x62lF6VazSZJQuVxosChVR6+0lIJe8Pxgkl/C9vxjhp2yVYb3mew5tcX/sDOu0dYZy8ro/9hMfGkdN4r9xEU8A==", + "requires": { + "@chakra-ui/checkbox": "2.2.14", + "@chakra-ui/shared-utils": "2.0.5" + } + }, + "@chakra-ui/system": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/@chakra-ui/system/-/system-2.5.5.tgz", + "integrity": "sha512-52BIp/Zyvefgxn5RTByfkTeG4J+y81LWEjWm8jCaRFsLVm8IFgqIrngtcq4I7gD5n/UKbneHlb4eLHo4uc5yDQ==", + "requires": { + "@chakra-ui/color-mode": "2.1.12", + "@chakra-ui/object-utils": "2.0.8", + "@chakra-ui/react-utils": "2.0.12", + "@chakra-ui/styled-system": "2.8.0", + "@chakra-ui/theme-utils": "2.0.15", + "@chakra-ui/utils": "2.0.15", + "react-fast-compare": "3.2.1" + } + }, + "@chakra-ui/table": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@chakra-ui/table/-/table-2.0.17.tgz", + "integrity": "sha512-OScheTEp1LOYvTki2NFwnAYvac8siAhW9BI5RKm5f5ORL2gVJo4I72RUqE0aKe1oboxgm7CYt5afT5PS5cG61A==", + "requires": { + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/shared-utils": "2.0.5" + } + }, + "@chakra-ui/tabs": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@chakra-ui/tabs/-/tabs-2.1.9.tgz", + "integrity": "sha512-Yf8e0kRvaGM6jfkJum0aInQ0U3ZlCafmrYYni2lqjcTtThqu+Yosmo3iYlnullXxCw5MVznfrkb9ySvgQowuYg==", + "requires": { + "@chakra-ui/clickable": "2.0.14", + "@chakra-ui/descendant": "3.0.14", + "@chakra-ui/lazy-utils": "2.0.5", + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-use-controllable-state": "2.0.8", + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@chakra-ui/react-use-safe-layout-effect": "2.0.5", + "@chakra-ui/shared-utils": "2.0.5" + } + }, + "@chakra-ui/tag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/tag/-/tag-3.0.0.tgz", + "integrity": "sha512-YWdMmw/1OWRwNkG9pX+wVtZio+B89odaPj6XeMn5nfNN8+jyhIEpouWv34+CO9G0m1lupJTxPSfgLAd7cqXZMA==", + "requires": { + "@chakra-ui/icon": "3.0.16", + "@chakra-ui/react-context": "2.0.8" + } + }, + "@chakra-ui/textarea": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/@chakra-ui/textarea/-/textarea-2.0.19.tgz", + "integrity": "sha512-adJk+qVGsFeJDvfn56CcJKKse8k7oMGlODrmpnpTdF+xvlsiTM+1GfaJvgNSpHHuQFdz/A0z1uJtfGefk0G2ZA==", + "requires": { + "@chakra-ui/form-control": "2.0.18", + "@chakra-ui/shared-utils": "2.0.5" + } + }, + "@chakra-ui/theme": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/theme/-/theme-3.0.1.tgz", + "integrity": "sha512-92kDm/Ux/51uJqhRKevQo/O/rdwucDYcpHg2QuwzdAxISCeYvgtl2TtgOOl5EnqEP0j3IEAvZHZUlv8TTbawaw==", + "requires": { + "@chakra-ui/anatomy": "2.1.2", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/theme-tools": "2.0.17" + } + }, + "@chakra-ui/theme-tools": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@chakra-ui/theme-tools/-/theme-tools-2.0.17.tgz", + "integrity": "sha512-Auu38hnihlJZQcPok6itRDBbwof3TpXGYtDPnOvrq4Xp7jnab36HLt7KEXSDPXbtOk3ZqU99pvI1en5LbDrdjg==", + "requires": { + "@chakra-ui/anatomy": "2.1.2", + "@chakra-ui/shared-utils": "2.0.5", + "color2k": "^2.0.0" + } + }, + "@chakra-ui/theme-utils": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@chakra-ui/theme-utils/-/theme-utils-2.0.15.tgz", + "integrity": "sha512-UuxtEgE7gwMTGDXtUpTOI7F5X0iHB9ekEOG5PWPn2wWBL7rlk2JtPI7UP5Um5Yg6vvBfXYGK1ySahxqsgf+87g==", + "requires": { + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/styled-system": "2.8.0", + "@chakra-ui/theme": "3.0.1", + "lodash.mergewith": "4.6.2" + } + }, + "@chakra-ui/toast": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/toast/-/toast-6.1.1.tgz", + "integrity": "sha512-JtjIKkPVjEu8okGGCipCxNVgK/15h5AicTATZ6RbG2MsHmr4GfKG3fUCvpbuZseArqmLqGLQZQJjVE9vJzaSkQ==", + "requires": { + "@chakra-ui/alert": "2.1.0", + "@chakra-ui/close-button": "2.0.17", + "@chakra-ui/portal": "2.0.16", + "@chakra-ui/react-context": "2.0.8", + "@chakra-ui/react-use-timeout": "2.0.5", + "@chakra-ui/react-use-update-effect": "2.0.7", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/styled-system": "2.8.0", + "@chakra-ui/theme": "3.0.1" + } + }, + "@chakra-ui/tooltip": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@chakra-ui/tooltip/-/tooltip-2.2.7.tgz", + "integrity": "sha512-ImUJ6NnVqARaYqpgtO+kzucDRmxo8AF3jMjARw0bx2LxUkKwgRCOEaaRK5p5dHc0Kr6t5/XqjDeUNa19/sLauA==", + "requires": { + "@chakra-ui/popper": "3.0.13", + "@chakra-ui/portal": "2.0.16", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-disclosure": "2.0.8", + "@chakra-ui/react-use-event-listener": "2.0.7", + "@chakra-ui/react-use-merge-refs": "2.0.7", + "@chakra-ui/shared-utils": "2.0.5" + } + }, + "@chakra-ui/transition": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@chakra-ui/transition/-/transition-2.0.16.tgz", + "integrity": "sha512-E+RkwlPc3H7P1crEXmXwDXMB2lqY2LLia2P5siQ4IEnRWIgZXlIw+8Em+NtHNgusel2N+9yuB0wT9SeZZeZ3CQ==", + "requires": { + "@chakra-ui/shared-utils": "2.0.5" + } + }, + "@chakra-ui/utils": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@chakra-ui/utils/-/utils-2.0.15.tgz", + "integrity": "sha512-El4+jL0WSaYYs+rJbuYFDbjmfCcfGDmRY95GO4xwzit6YAPZBLcR65rOEwLps+XWluZTy1xdMrusg/hW0c1aAA==", + "requires": { + "@types/lodash.mergewith": "4.6.7", + "css-box-model": "1.2.1", + "framesync": "6.1.2", + "lodash.mergewith": "4.6.2" + } + }, + "@chakra-ui/visually-hidden": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@chakra-ui/visually-hidden/-/visually-hidden-2.0.15.tgz", + "integrity": "sha512-WWULIiucYRBIewHKFA7BssQ2ABLHLVd9lrUo3N3SZgR0u4ZRDDVEUNOy+r+9ruDze8+36dGbN9wsN1IdELtdOw==", + "requires": {} + }, + "@emotion/babel-plugin": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz", + "integrity": "sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ==", + "requires": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/serialize": "^1.1.1", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.1.3" + } + }, + "@emotion/cache": { + "version": "11.10.5", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.5.tgz", + "integrity": "sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA==", + "requires": { + "@emotion/memoize": "^0.8.0", + "@emotion/sheet": "^1.2.1", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "stylis": "4.1.3" + } + }, + "@emotion/hash": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", + "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==" + }, + "@emotion/is-prop-valid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz", + "integrity": "sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==", + "requires": { + "@emotion/memoize": "^0.8.0" + } + }, + "@emotion/memoize": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", + "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==" + }, + "@emotion/react": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.10.6.tgz", + "integrity": "sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.10.6", + "@emotion/cache": "^11.10.5", + "@emotion/serialize": "^1.1.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "hoist-non-react-statics": "^3.3.1" + } + }, + "@emotion/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==", + "requires": { + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/unitless": "^0.8.0", + "@emotion/utils": "^1.2.0", + "csstype": "^3.0.2" + } + }, + "@emotion/sheet": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.1.tgz", + "integrity": "sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==" + }, + "@emotion/styled": { + "version": "11.10.6", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.10.6.tgz", + "integrity": "sha512-OXtBzOmDSJo5Q0AFemHCfl+bUueT8BIcPSxu0EGTpGk6DmI5dnhSzQANm1e1ze0YZL7TDyAyy6s/b/zmGOS3Og==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.10.6", + "@emotion/is-prop-valid": "^1.2.0", + "@emotion/serialize": "^1.1.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@emotion/utils": "^1.2.0" + } + }, + "@emotion/unitless": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", + "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" + }, + "@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz", + "integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==", + "requires": {} + }, + "@emotion/utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", + "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==" + }, + "@emotion/weak-memoize": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", + "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" + }, + "@esbuild/android-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", + "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", + "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "dev": true, + "optional": true + }, + "@fastify/busboy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", + "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==" + }, + "@heroicons/react": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.0.16.tgz", + "integrity": "sha512-x89rFxH3SRdYaA+JCXwfe+RkE1SFTo9GcOkZettHer71Y3T7V+ogKmfw5CjTazgS3d0ClJ7p1NA+SP7VQLQcLw==", + "requires": {} + }, + "@hookform/resolvers": { + "version": "2.9.11", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-2.9.11.tgz", + "integrity": "sha512-bA3aZ79UgcHj7tFV7RlgThzwSSHZgvfbt2wprldRkYBcMopdMvHyO17Wwp/twcJasNFischFfS7oz8Katz8DdQ==", + "requires": {} + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "@motionone/animation": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.15.1.tgz", + "integrity": "sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ==", + "requires": { + "@motionone/easing": "^10.15.1", + "@motionone/types": "^10.15.1", + "@motionone/utils": "^10.15.1", + "tslib": "^2.3.1" + } + }, + "@motionone/dom": { + "version": "10.15.5", + "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.15.5.tgz", + "integrity": "sha512-Xc5avlgyh3xukU9tydh9+8mB8+2zAq+WlLsC3eEIp7Ax7DnXgY7Bj/iv0a4X2R9z9ZFZiaXK3BO0xMYHKbAAdA==", + "requires": { + "@motionone/animation": "^10.15.1", + "@motionone/generators": "^10.15.1", + "@motionone/types": "^10.15.1", + "@motionone/utils": "^10.15.1", + "hey-listen": "^1.0.8", + "tslib": "^2.3.1" + } + }, + "@motionone/easing": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.15.1.tgz", + "integrity": "sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw==", + "requires": { + "@motionone/utils": "^10.15.1", + "tslib": "^2.3.1" + } + }, + "@motionone/generators": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.15.1.tgz", + "integrity": "sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ==", + "requires": { + "@motionone/types": "^10.15.1", + "@motionone/utils": "^10.15.1", + "tslib": "^2.3.1" + } + }, + "@motionone/types": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.15.1.tgz", + "integrity": "sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA==" + }, + "@motionone/utils": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.15.1.tgz", + "integrity": "sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw==", + "requires": { + "@motionone/types": "^10.15.1", + "hey-listen": "^1.0.8", + "tslib": "^2.3.1" + } + }, + "@popperjs/core": { + "version": "2.11.6", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", + "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==" + }, + "@remix-run/router": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.3.2.tgz", + "integrity": "sha512-t54ONhl/h75X94SWsHGQ4G/ZrCEguKSRQr7DrjTciJXW0YU1QhlwYeycvK5JgkzlxmvrK7wq1NB/PLtHxoiDcA==" + }, + "@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "dev": true, + "requires": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + } + }, + "@sphinxxxx/color-conversion": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@sphinxxxx/color-conversion/-/color-conversion-2.2.2.tgz", + "integrity": "sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw==" + }, + "@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==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-remove-jsx-attribute": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.5.0.tgz", + "integrity": "sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.5.0.tgz", + "integrity": "sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw==", + "dev": true, + "requires": {} + }, + "@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==", + "dev": true, + "requires": {} + }, + "@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==", + "dev": true, + "requires": {} + }, + "@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==", + "dev": true, + "requires": {} + }, + "@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==", + "dev": true, + "requires": {} + }, + "@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==", + "dev": true, + "requires": {} + }, + "@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==", + "dev": true, + "requires": { + "@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" + } + }, + "@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==", + "dev": true, + "requires": { + "@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" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/types": "^7.20.0", + "entities": "^4.4.0" + } + }, + "@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==", + "dev": true, + "requires": { + "@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" + } + }, + "@types/ace": { + "version": "0.0.48", + "resolved": "https://registry.npmjs.org/@types/ace/-/ace-0.0.48.tgz", + "integrity": "sha512-esV6hOWiDOZ6d7w5S11iLu6LQsPGe/9RPzhri7gNNLdrK1LFpO9/m7IZhQL6dat0JHICJ7l51zvHAiCgnPLLHA==", + "dev": true + }, + "@types/estree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", + "dev": true + }, + "@types/jsoneditor": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/@types/jsoneditor/-/jsoneditor-9.9.0.tgz", + "integrity": "sha512-OwDYzMuqCn+QZHQPMDu7miLVtnJueB2lQ42KmX1mZNZTaZxV8v55wiL1sit7cZGA5BzhNWVw8KAHhEoFWYyW3g==", + "dev": true, + "requires": { + "@types/ace": "*", + "ajv": "^6.12.0" + } + }, + "@types/lodash": { + "version": "4.14.191", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", + "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==" + }, + "@types/lodash.debounce": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@types/lodash.debounce/-/lodash.debounce-4.0.7.tgz", + "integrity": "sha512-X1T4wMZ+gT000M2/91SYj0d/7JfeNZ9PeeOldSNoE/lunLeQXKvkmIumI29IaKMotU/ln/McOIvgzZcQ/3TrSA==", + "dev": true, + "requires": { + "@types/lodash": "*" + } + }, + "@types/lodash.mergewith": { + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/@types/lodash.mergewith/-/lodash.mergewith-4.6.7.tgz", + "integrity": "sha512-3m+lkO5CLRRYU0fhGRp7zbsGi6+BZj0uTVSwvcKU+nSlhjA9/QRNfuSGnD2mX6hQA7ZbmcCkzk5h4ZYGOtk14A==", + "requires": { + "@types/lodash": "*" + } + }, + "@types/node": { + "version": "20.1.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.4.tgz", + "integrity": "sha512-At4pvmIOki8yuwLtd7BNHl3CiWNbtclUbNtScGx4OHfBd4/oWoJC8KRCIxXwkdndzhxOsPXihrsOoydxBjlE9Q==", + "dev": true, + "optional": true, + "peer": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "devOptional": true + }, + "@types/react": { + "version": "18.0.28", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz", + "integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==", + "devOptional": true, + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-copy-to-clipboard": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.4.tgz", + "integrity": "sha512-otTJsJpofYAeaIeOwV5xBUGpo6exXG2HX7X4nseToCB2VgPEBxGBHCm/FecZ676doNR7HCSTVtmohxfG2b3/yQ==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-datepicker": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@types/react-datepicker/-/react-datepicker-4.8.0.tgz", + "integrity": "sha512-20uzZsIf4moPAjjHDfPvH8UaOHZBxrkiQZoLS3wgKq8Xhp+95gdercLEdoA7/I8nR9R5Jz2qQkdMIM+Lq4AS1A==", + "dev": true, + "requires": { + "@popperjs/core": "^2.9.2", + "@types/react": "*", + "date-fns": "^2.0.1", + "react-popper": "^2.2.5" + } + }, + "@types/react-dom": { + "version": "18.0.11", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.11.tgz", + "integrity": "sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-json-editor-ajrm": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/@types/react-json-editor-ajrm/-/react-json-editor-ajrm-2.5.3.tgz", + "integrity": "sha512-hHf3FU1HjL6Lm3rK2iWUJtoYpZ1qDCSffnLAQXCf++TP1Ms18rnB06gBK3psQ8NEW6CfrfRNlirIL3D/P80QVg==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-slick": { + "version": "0.23.10", + "resolved": "https://registry.npmjs.org/@types/react-slick/-/react-slick-0.23.10.tgz", + "integrity": "sha512-ZiqdencANDZy6sWOWJ54LDvebuXFEhDlHtXU9FFipQR2BcYU2QJxZhvJPW6YK7cocibUiNn+YvDTbt1HtCIBVA==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", + "devOptional": true + }, + "@vitejs/plugin-react": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-2.2.0.tgz", + "integrity": "sha512-FFpefhvExd1toVRlokZgxgy2JtnBOdp4ZDsq7ldCWaqGSGn9UhWMAVm/1lxPL14JfNS5yGz+s9yFrQY6shoStA==", + "dev": true, + "requires": { + "@babel/core": "^7.19.6", + "@babel/plugin-transform-react-jsx": "^7.19.0", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-jsx-self": "^7.18.6", + "@babel/plugin-transform-react-jsx-source": "^7.19.6", + "magic-string": "^0.26.7", + "react-refresh": "^0.14.0" + } + }, + "@zag-js/element-size": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@zag-js/element-size/-/element-size-0.3.2.tgz", + "integrity": "sha512-bVvvigUGvAuj7PCkE5AbzvTJDTw5f3bg9nQdv+ErhVN8SfPPppLJEmmWdxqsRzrHXgx8ypJt/+Ty0kjtISVDsQ==" + }, + "@zag-js/focus-visible": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@zag-js/focus-visible/-/focus-visible-0.2.2.tgz", + "integrity": "sha512-0j2gZq8HiZ51z4zNnSkF1iSkqlwRDvdH+son3wHdoz+7IUdMN/5Exd4TxMJ+gq2Of1DiXReYLL9qqh2PdQ4wgA==" + }, + "ace-builds": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.20.0.tgz", + "integrity": "sha512-JUvWbRXz7tL3EkcM5CpVyyuu9mvVRo594ZRgwHzb9arb9s2o5gTg94Lrk3zQZzM1udq6fRSDnmU2RClJPt9aNw==" + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "apexcharts": { + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.40.0.tgz", + "integrity": "sha512-dSi3BUfCJkFd67uFp+xffrJVd3lDT7AAUUyRp0qPYiglJ76CeZLddVhM3FAk1P9GCzf8VewqGYUPCYQvXm+b9A==", + "requires": { + "svg.draggable.js": "^2.2.2", + "svg.easing.js": "^2.0.0", + "svg.filter.js": "^2.0.2", + "svg.pathmorphing.js": "^0.1.3", + "svg.resize.js": "^1.4.3", + "svg.select.js": "^3.0.1" + } + }, + "aria-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz", + "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==", + "requires": { + "tslib": "^2.0.0" + } + }, + "autoprefixer": { + "version": "10.4.13", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", + "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "dev": true, + "requires": { + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001426", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "requires": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "broadcast-channel": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz", + "integrity": "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==", + "requires": { + "@babel/runtime": "^7.7.2", + "detect-node": "^2.1.0", + "js-sha3": "0.8.0", + "microseconds": "0.2.0", + "nano-time": "1.0.0", + "oblivious-set": "1.0.0", + "rimraf": "3.0.2", + "unload": "2.2.0" + } + }, + "browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001458", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001458.tgz", + "integrity": "sha512-lQ1VlUUq5q9ro9X+5gOEyH7i3vm+AYVT1WDCVB69XOZ17KZRhnZ9J0Sqz7wTHQaLBJccNCHq8/Ww5LlOIZbB0w==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + } + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.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" + } + }, + "classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, + "clear-any-console": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/clear-any-console/-/clear-any-console-1.16.2.tgz", + "integrity": "sha512-OL/7wZpNy9x0GBSzz3poWja84Nr7iaH8aYNsJ5Uet2BVLj6Lm1zvWpZN/yH46Vv3ae7YfHmLLMmfHj911fshJg==", + "dev": true + }, + "cli-check-node": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/cli-check-node/-/cli-check-node-1.3.4.tgz", + "integrity": "sha512-iLGgQXm82iP8eH3R67qbOWs5qqUOLmNnMy5Lzl/RybcMh3y+H2zWU5POzuQ6oDUOdz4XWuxcFhP75szqd6frLg==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "log-symbols": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "cli-handle-error": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cli-handle-error/-/cli-handle-error-4.4.0.tgz", + "integrity": "sha512-RyBCnKlc7xVr79cKb9RfBq+4fjwQeX8HKeNzIPnI/W+DWWIUUKh2ur576DpwJ3kZt2UGHlIAOF7N9txy+mgZsA==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "log-symbols": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "cli-handle-unhandled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cli-handle-unhandled/-/cli-handle-unhandled-1.1.1.tgz", + "integrity": "sha512-Em91mJvU7VdgT2MxQpyY633vW1tDzRjPDbii6ZjEBHHLLh0xDoVkFt/wjvi9nSvJcz9rJmvtJSK8KL/hvF0Stg==", + "dev": true, + "requires": { + "cli-handle-error": "^4.1.0" + } + }, + "cli-welcome": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/cli-welcome/-/cli-welcome-2.2.2.tgz", + "integrity": "sha512-LgDGS0TW4nIf8v81wpuZzfOEDPcy68u0jKR0Fy5IaWftqdminI6FoDiMFt1mjPylqKGNv/wFsZ7fCs93IeDMIw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "clear-any-console": "^1.16.0", + "prettier": "^2.0.5" + } + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "color2k": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/color2k/-/color2k-2.0.2.tgz", + "integrity": "sha512-kJhwH5nAwb34tmyuqq/lgjEKzlFXn1U99NlnB6Ws4qVaERcRUYeYP1cBw6BJ4vxaWStAUEef4WMr7WjOCnBt8w==" + }, + "commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true + }, + "compute-scroll-into-view": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", + "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "requires": { + "toggle-selection": "^1.0.6" + } + }, + "cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "requires": { + "@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" + } + }, + "cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "requires": { + "node-fetch": "2.6.7" + } + }, + "css-box-model": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", + "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "requires": { + "tiny-invariant": "^1.0.6" + } + }, + "csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + }, + "date-fns": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==" + }, + "dayjs": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", + "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "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==" + }, + "destr": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/destr/-/destr-1.2.2.tgz", + "integrity": "sha512-lrbCJwD9saUQrqUfXvl6qoM+QN3W7tLV5pAOs+OqOmopCCz/JkE05MHedJR1xfk4IAnZuJXPVuN5+7jNA2ZCiA==" + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, + "electron-to-chromium": { + "version": "1.4.311", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.311.tgz", + "integrity": "sha512-RoDlZufvrtr2Nx3Yx5MB8jX3aHIxm8nRWPJm3yVvyHmyKaRvn90RjzB6hNnt0AkhS3IInJdyRfQb4mWhPvUjVw==", + "dev": true + }, + "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==" + }, + "enquire.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz", + "integrity": "sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw==" + }, + "entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "dev": true + }, + "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==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "esbuild": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", + "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.15.18", + "@esbuild/linux-loong64": "0.15.18", + "esbuild-android-64": "0.15.18", + "esbuild-android-arm64": "0.15.18", + "esbuild-darwin-64": "0.15.18", + "esbuild-darwin-arm64": "0.15.18", + "esbuild-freebsd-64": "0.15.18", + "esbuild-freebsd-arm64": "0.15.18", + "esbuild-linux-32": "0.15.18", + "esbuild-linux-64": "0.15.18", + "esbuild-linux-arm": "0.15.18", + "esbuild-linux-arm64": "0.15.18", + "esbuild-linux-mips64le": "0.15.18", + "esbuild-linux-ppc64le": "0.15.18", + "esbuild-linux-riscv64": "0.15.18", + "esbuild-linux-s390x": "0.15.18", + "esbuild-netbsd-64": "0.15.18", + "esbuild-openbsd-64": "0.15.18", + "esbuild-sunos-64": "0.15.18", + "esbuild-windows-32": "0.15.18", + "esbuild-windows-64": "0.15.18", + "esbuild-windows-arm64": "0.15.18" + } + }, + "esbuild-android-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", + "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", + "dev": true, + "optional": true + }, + "esbuild-android-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", + "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", + "dev": true, + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", + "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", + "dev": true, + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", + "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", + "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", + "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", + "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", + "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", + "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", + "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", + "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", + "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", + "dev": true, + "optional": true + }, + "esbuild-linux-riscv64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", + "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", + "dev": true, + "optional": true + }, + "esbuild-linux-s390x": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", + "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", + "dev": true, + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", + "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", + "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", + "dev": true, + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", + "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", + "dev": true, + "optional": true + }, + "esbuild-windows-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", + "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", + "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", + "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", + "dev": true, + "optional": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "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==" + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "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==" + }, + "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==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "focus-lock": { + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-0.11.6.tgz", + "integrity": "sha512-KSuV3ur4gf2KqMNoZx3nXNVhqCkn42GuTYCX4tXPEwf0MjpFQmNMiN6m7dXaUXgIoivL6/65agoUMg4RLS0Vbg==", + "requires": { + "tslib": "^2.0.3" + } + }, + "fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true + }, + "framer-motion": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-7.10.3.tgz", + "integrity": "sha512-k2ccYeZNSpPg//HTaqrU+4pRq9f9ZpaaN7rr0+Rx5zA4wZLbk547wtDzge2db1sB+1mnJ6r59P4xb+aEIi/W+w==", + "requires": { + "@emotion/is-prop-valid": "^0.8.2", + "@motionone/dom": "^10.15.3", + "hey-listen": "^1.0.8", + "tslib": "2.4.0" + }, + "dependencies": { + "@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "optional": true, + "requires": { + "@emotion/memoize": "0.7.4" + } + }, + "@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "optional": true + }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + } + } + }, + "framesync": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/framesync/-/framesync-6.1.2.tgz", + "integrity": "sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g==", + "requires": { + "tslib": "2.4.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==" + }, + "github-buttons": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/github-buttons/-/github-buttons-2.24.0.tgz", + "integrity": "sha512-dHpEno4S2JHjsEKPLSTGDTV50q1d08n3H7VDfNNA1m8cz5DMqLCZDdKWQxy4zyvd6M3tKvlVYLs+/H0BF3DggA==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "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" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "hey-listen": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", + "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==" + }, + "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==", + "requires": { + "react-is": "^16.7.0" + } + }, + "html-parse-stringify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", + "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "requires": { + "void-elements": "3.1.0" + } + }, + "i18next": { + "version": "22.4.15", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-22.4.15.tgz", + "integrity": "sha512-yYudtbFrrmWKLEhl6jvKUYyYunj4bTBCe2qIUYAxbXoPusY7YmdwPvOE6fx6UIfWvmlbCWDItr7wIs8KEBZ5Zg==", + "requires": { + "@babel/runtime": "^7.20.6" + } + }, + "i18next-browser-languagedetector": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.0.1.tgz", + "integrity": "sha512-Pa5kFwaczXJAeHE56CHG2aWzFBMJNUNghf0Pm4SwSrEMps/PTKqW90EYWlIvhuYStf3Sn1K0vw+gH3+TLdkH1g==", + "requires": { + "@babel/runtime": "^7.19.4" + } + }, + "i18next-http-backend": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.2.0.tgz", + "integrity": "sha512-Z4sM7R6tzdLknSPER9GisEBxKPg5FkI07UrQniuroZmS15PHQrcCPLyuGKj8SS68tf+O2aEDYSUnmy1TZqZSbw==", + "requires": { + "cross-fetch": "3.1.5" + } + }, + "immutable": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz", + "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "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==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "requires": { + "has": "^1.0.3" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "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==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "requires": { + "is-docker": "^2.0.0" + } + }, + "javascript-natural-sort": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", + "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==" + }, + "jmespath": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==" + }, + "jquery": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.0.tgz", + "integrity": "sha512-umpJ0/k8X0MvD1ds0P9SfowREz2LenHsQaxSohMZ5OMNEU2r0tf8pdeEFTHMFxWVxKNyU9rTtK3CWzUCTKJUeQ==", + "peer": true + }, + "js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "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==" + }, + "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==" + }, + "json-source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/json-source-map/-/json-source-map-0.6.1.tgz", + "integrity": "sha512-1QoztHPsMQqhDq0hlXY5ZqcEdUzxQEIxgFkKl4WUp2pgShObl+9ovi4kRh2TfvAfxAoHOJ9vIMEqk3k4iex7tg==" + }, + "json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "requires": { + "string-convert": "^0.2.0" + } + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "jsoneditor": { + "version": "9.10.1", + "resolved": "https://registry.npmjs.org/jsoneditor/-/jsoneditor-9.10.1.tgz", + "integrity": "sha512-vequCPWX+dNndl25+wlniQAaEgJ2Vy+X44a8GL3kOfPrbF9E/ZFH5XEpwyltI1kr95YFTp0PISuwmgwJHpQx4g==", + "requires": { + "ace-builds": "^1.15.2", + "ajv": "^6.12.6", + "javascript-natural-sort": "^0.7.1", + "jmespath": "^0.16.0", + "json-source-map": "^0.6.1", + "jsonrepair": "^3.0.2", + "mobius1-selectr": "^2.4.13", + "picomodal": "^3.0.0", + "vanilla-picker": "^2.12.1" + } + }, + "jsonrepair": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsonrepair/-/jsonrepair-3.1.0.tgz", + "integrity": "sha512-idqReg23J0PVRAADmZMc5xQM3xeOX5bTB6OTyMnzq33IXJXmn9iJuWIEvGmrN80rQf4d7uLTMEDwpzujNcI0Rg==" + }, + "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==" + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==" + }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2" + } + }, + "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==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "magic-string": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", + "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, + "match-sorter": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.1.tgz", + "integrity": "sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==", + "requires": { + "@babel/runtime": "^7.12.5", + "remove-accents": "0.4.2" + } + }, + "microseconds": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz", + "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==" + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mobius1-selectr": { + "version": "2.4.13", + "resolved": "https://registry.npmjs.org/mobius1-selectr/-/mobius1-selectr-2.4.13.tgz", + "integrity": "sha512-Mk9qDrvU44UUL0EBhbAA1phfQZ7aMZPjwtL7wkpiBzGh8dETGqfsh50mWoX9EkjDlkONlErWXArHCKfoxVg0Bw==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "nano-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz", + "integrity": "sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==", + "requires": { + "big-integer": "^1.6.16" + } + }, + "nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true + }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "node-fetch-native": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-0.1.8.tgz", + "integrity": "sha512-ZNaury9r0NxaT2oL65GvdGDy+5PlSaHTovT6JV5tOW07k1TQmgC0olZETa4C9KZg0+6zBr99ctTYa3Utqj9P/Q==" + }, + "node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "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==", + "dev": true + }, + "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==" + }, + "oblivious-set": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz", + "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==" + }, + "ohmyfetch": { + "version": "0.4.21", + "resolved": "https://registry.npmjs.org/ohmyfetch/-/ohmyfetch-0.4.21.tgz", + "integrity": "sha512-VG7f/JRvqvBOYvL0tHyEIEG7XHWm7OqIfAs6/HqwWwDfjiJ1g0huIpe5sFEmyb+7hpFa1EGNH2aERWR72tlClw==", + "requires": { + "destr": "^1.2.0", + "node-fetch-native": "^0.1.8", + "ufo": "^0.8.6", + "undici": "^5.12.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "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==", + "requires": { + "callsites": "^3.0.0" + } + }, + "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==", + "requires": { + "@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" + } + }, + "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==" + }, + "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==" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "picomodal": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/picomodal/-/picomodal-3.0.0.tgz", + "integrity": "sha512-FoR3TDfuLlqUvcEeK5ifpKSVVns6B4BQvc8SDF6THVMuadya6LLtji0QgUDSStw0ZR2J7I6UGi5V2V23rnPWTw==" + }, + "postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "dev": true, + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "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==", + "dev": true + }, + "prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" + }, + "qrcode.react": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/qrcode.react/-/qrcode.react-3.1.0.tgz", + "integrity": "sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q==", + "requires": {} + }, + "react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "react-apexcharts": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/react-apexcharts/-/react-apexcharts-1.4.0.tgz", + "integrity": "sha512-DrcMV4aAMrUG+n6412yzyATWEyCDWlpPBBhVbpzBC4PDeuYU6iF84SmExbck+jx5MUm4U5PM3/T307Mc3kzc9Q==", + "requires": { + "prop-types": "^15.5.7" + } + }, + "react-clientside-effect": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz", + "integrity": "sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==", + "requires": { + "@babel/runtime": "^7.12.13" + } + }, + "react-copy-to-clipboard": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz", + "integrity": "sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==", + "requires": { + "copy-to-clipboard": "^3.3.1", + "prop-types": "^15.8.1" + } + }, + "react-datepicker": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-4.10.0.tgz", + "integrity": "sha512-6IfBCZyWj54ZZGLmEZJ9c4Yph0s9MVfEGDC2evOvf9AmVz+RRcfP2Czqad88Ff9wREbcbqa4dk7IFYeXF1d3Ag==", + "requires": { + "@popperjs/core": "^2.9.2", + "classnames": "^2.2.6", + "date-fns": "^2.24.0", + "prop-types": "^15.7.2", + "react-onclickoutside": "^6.12.2", + "react-popper": "^2.3.0" + } + }, + "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==", + "requires": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + } + }, + "react-fast-compare": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.1.tgz", + "integrity": "sha512-xTYf9zFim2pEif/Fw16dBiXpe0hoy5PxcD8+OwBnTtNLfIm3g6WxhKNurY+6OmdH1u6Ta/W/Vl6vjbYP1MFnDg==" + }, + "react-focus-lock": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.9.4.tgz", + "integrity": "sha512-7pEdXyMseqm3kVjhdVH18sovparAzLg5h6WvIx7/Ck3ekjhrrDMEegHSa3swwC8wgfdd7DIdUVRGeiHT9/7Sgg==", + "requires": { + "@babel/runtime": "^7.0.0", + "focus-lock": "^0.11.6", + "prop-types": "^15.6.2", + "react-clientside-effect": "^1.2.6", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + } + }, + "react-github-btn": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/react-github-btn/-/react-github-btn-1.4.0.tgz", + "integrity": "sha512-lV4FYClAfjWnBfv0iNlJUGhamDgIq6TayD0kPZED6VzHWdpcHmPfsYOZ/CFwLfPv4Zp+F4m8QKTj0oy2HjiGXg==", + "requires": { + "github-buttons": "^2.22.0" + } + }, + "react-hook-form": { + "version": "7.43.2", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.43.2.tgz", + "integrity": "sha512-NvD3Oe2Y9hhqo2R4I4iJigDzSLpdMnzUpNMxlnzTbdiT7NT3BW0GxWCzEtwPudZMUPbZhNcSy1EcGAygyhDORg==", + "requires": {} + }, + "react-i18next": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-12.2.0.tgz", + "integrity": "sha512-5XeVgSygaGfyFmDd2WcXvINRw2WEC1XviW1LXY/xLOEMzsCFRwKqfnHN+hUjla8ZipbVJR27GCMSuTr0BhBBBQ==", + "requires": { + "@babel/runtime": "^7.20.6", + "html-parse-stringify": "^3.0.1" + } + }, + "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==" + }, + "react-json-editor-ajrm": { + "version": "2.5.14", + "resolved": "https://registry.npmjs.org/react-json-editor-ajrm/-/react-json-editor-ajrm-2.5.14.tgz", + "integrity": "sha512-z2035l5lnU0Wo73AUonj68d1Eh9vjVcLXEa8YogDEeFPcogzYkfT6R38fvYlLKDhP0oI+LyOO/IBWsFkXs4M0Q==", + "requires": { + "@babel/runtime": "^7.0.0-rc.0" + } + }, + "react-loading-skeleton": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/react-loading-skeleton/-/react-loading-skeleton-3.1.1.tgz", + "integrity": "sha512-gQeNzzKXlevvquRDOhN5kas5VE7toTKrpmE9BpUdf0iip9c5ae0LcVbulh5ebO2CFl4RrYsyLuDtYGyrh1h1iA==", + "requires": {} + }, + "react-onclickoutside": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.12.2.tgz", + "integrity": "sha512-NMXGa223OnsrGVp5dJHkuKxQ4czdLmXSp5jSV9OqiCky9LOpPATn3vLldc+q5fK3gKbEHvr7J1u0yhBh/xYkpA==", + "requires": {} + }, + "react-popper": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", + "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", + "requires": { + "react-fast-compare": "^3.0.1", + "warning": "^4.0.2" + } + }, + "react-query": { + "version": "3.39.3", + "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz", + "integrity": "sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==", + "requires": { + "@babel/runtime": "^7.5.5", + "broadcast-channel": "^3.4.1", + "match-sorter": "^6.0.2" + } + }, + "react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true + }, + "react-remove-scroll": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", + "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", + "requires": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + } + }, + "react-remove-scroll-bar": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", + "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", + "requires": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + } + }, + "react-router": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.8.1.tgz", + "integrity": "sha512-Jgi8BzAJQ8MkPt8ipXnR73rnD7EmZ0HFFb7jdQU24TynGW1Ooqin2KVDN9voSC+7xhqbbCd2cjGUepb6RObnyg==", + "requires": { + "@remix-run/router": "1.3.2" + } + }, + "react-router-dom": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.8.1.tgz", + "integrity": "sha512-67EXNfkQgf34P7+PSb6VlBuaacGhkKn3kpE51+P6zYSG2kiRoumXEL6e27zTa9+PGF2MNXbgIUHTVlleLbIcHQ==", + "requires": { + "@remix-run/router": "1.3.2", + "react-router": "6.8.1" + } + }, + "react-slick": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/react-slick/-/react-slick-0.29.0.tgz", + "integrity": "sha512-TGdOKE+ZkJHHeC4aaoH85m8RnFyWqdqRfAGkhd6dirmATXMZWAxOpTLmw2Ll/jPTQ3eEG7ercFr/sbzdeYCJXA==", + "requires": { + "classnames": "^2.2.5", + "enquire.js": "^2.1.6", + "json2mq": "^0.2.0", + "lodash.debounce": "^4.0.8", + "resize-observer-polyfill": "^1.5.0" + } + }, + "react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "requires": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + } + }, + "react-use-websocket": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-use-websocket/-/react-use-websocket-4.3.1.tgz", + "integrity": "sha512-zHPLWrgcqydJaak2O5V9hiz4q2dwkwqNQqpgFVmSuPxLZdsZlnDs8DVHy3WtHH+A6ms/8aHIyX7+7ulOcrnR0Q==", + "requires": {} + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "remove-accents": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz", + "integrity": "sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==" + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + }, + "resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "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==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "devOptional": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "rollup-plugin-visualizer": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.9.0.tgz", + "integrity": "sha512-bbDOv47+Bw4C/cgs0czZqfm8L82xOZssk4ayZjG40y9zbXclNk7YikrZTDao6p7+HDiGxrN0b65SgZiVm9k1Cg==", + "requires": { + "open": "^8.4.0", + "picomatch": "^2.3.1", + "source-map": "^0.7.4", + "yargs": "^17.5.1" + }, + "dependencies": { + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==" + } + } + }, + "sass": { + "version": "1.58.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.3.tgz", + "integrity": "sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, + "scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + }, + "slick-carousel": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.1.tgz", + "integrity": "sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA==", + "requires": {} + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + }, + "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==", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" + }, + "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==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "stylis": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", + "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "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==" + }, + "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==", + "dev": true + }, + "svg.draggable.js": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz", + "integrity": "sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw==", + "requires": { + "svg.js": "^2.0.1" + } + }, + "svg.easing.js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/svg.easing.js/-/svg.easing.js-2.0.0.tgz", + "integrity": "sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA==", + "requires": { + "svg.js": ">=2.3.x" + } + }, + "svg.filter.js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/svg.filter.js/-/svg.filter.js-2.0.2.tgz", + "integrity": "sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw==", + "requires": { + "svg.js": "^2.2.5" + } + }, + "svg.js": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/svg.js/-/svg.js-2.7.1.tgz", + "integrity": "sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA==" + }, + "svg.pathmorphing.js": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz", + "integrity": "sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww==", + "requires": { + "svg.js": "^2.4.0" + } + }, + "svg.resize.js": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/svg.resize.js/-/svg.resize.js-1.4.3.tgz", + "integrity": "sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw==", + "requires": { + "svg.js": "^2.6.5", + "svg.select.js": "^2.1.2" + }, + "dependencies": { + "svg.select.js": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-2.1.2.tgz", + "integrity": "sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ==", + "requires": { + "svg.js": "^2.2.5" + } + } + } + }, + "svg.select.js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-3.0.1.tgz", + "integrity": "sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw==", + "requires": { + "svg.js": "^2.6.5" + } + }, + "tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "tsconfck": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.0.3.tgz", + "integrity": "sha512-o3DsPZO1+C98KqHMdAbWs30zpxD30kj8r9OLA4ML1yghx4khNDzaaShNalfluh8ZPPhzKe3qyVCP1HiZszSAsw==", + "requires": {} + }, + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + }, + "typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "devOptional": true + }, + "ufo": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-0.8.6.tgz", + "integrity": "sha512-fk6CmUgwKCfX79EzcDQQpSCMxrHstvbLswFChHS0Vump+kFkw7nJBfTZoC1j0bOGoY9I7R3n2DGek5ajbcYnOw==" + }, + "undici": { + "version": "5.27.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.27.2.tgz", + "integrity": "sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ==", + "requires": { + "@fastify/busboy": "^2.0.0" + } + }, + "unload": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz", + "integrity": "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==", + "requires": { + "@babel/runtime": "^7.6.2", + "detect-node": "^2.0.4" + } + }, + "update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "use-callback-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", + "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", + "requires": { + "tslib": "^2.0.0" + } + }, + "use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "requires": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + } + }, + "use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "requires": {} + }, + "vanilla-picker": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/vanilla-picker/-/vanilla-picker-2.12.1.tgz", + "integrity": "sha512-2qrEP9VYylKXbyzXKsbu2dferBTvqnlsr29XjHwFE+/MEp0VNj6oEUESLDtKZ7DWzGdSv1x/+ujqFZF+KsO3cg==", + "requires": { + "@sphinxxxx/color-conversion": "^2.2.2" + } + }, + "vite": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.7.tgz", + "integrity": "sha512-29pdXjk49xAP0QBr0xXqu2s5jiQIXNvE/xwd0vUizYT2Hzqe4BksNNoWllFVXJf4eLZ+UlVQmXfB4lWrc+t18g==", + "dev": true, + "requires": { + "esbuild": "^0.15.9", + "fsevents": "~2.3.2", + "postcss": "^8.4.18", + "resolve": "^1.22.1", + "rollup": "^2.79.1" + } + }, + "vite-plugin-svgr": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-2.4.0.tgz", + "integrity": "sha512-q+mJJol6ThvqkkJvvVFEndI4EaKIjSI0I3jNFgSoC9fXAz1M7kYTVUin8fhUsFojFDKZ9VHKtX6NXNaOLpbsHA==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^5.0.2", + "@svgr/core": "^6.5.1" + } + }, + "vite-tsconfig-paths": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.0.5.tgz", + "integrity": "sha512-/L/eHwySFYjwxoYt1WRJniuK/jPv+WGwgRGBYx3leciR5wBeqntQpUE6Js6+TJemChc+ter7fDBKieyEWDx4yQ==", + "requires": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^2.0.1" + } + }, + "void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==" + }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "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==" + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + }, + "yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" + }, + "zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==" + }, + "zustand": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.4.6.tgz", + "integrity": "sha512-Rb16eW55gqL4W2XZpJh0fnrATxYEG3Apl2gfHTyDSE965x/zxslTikpNch0JgNjJA9zK6gEFW8Fl6d1rTZaqgg==", + "requires": { + "use-sync-external-store": "1.2.0" + } + }, + "zustand-computed": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/zustand-computed/-/zustand-computed-1.3.3.tgz", + "integrity": "sha512-SXhjuH/scwA6T31xsqaqUzPVBoumgCK/PWi8YZXGmuU86HPrqVFxjI6TxLvYw8hGpScZkjFUKBAi1ThO0B6Tng==", + "requires": {} + } + } +} diff --git a/app/dashboard/package.json b/app/dashboard/package.json new file mode 100644 index 0000000..17ff883 --- /dev/null +++ b/app/dashboard/package.json @@ -0,0 +1,69 @@ +{ + "name": "marzban-dashboard", + "private": true, + "version": "0.0.0", + "scripts": { + "dev": "vite --port 3000", + "build": "tsc && vite build", + "preview": "vite preview --port 3000", + "gen:theme-typings": "chakra-cli tokens ./chakra.config.ts", + "postinstall": "npm run gen:theme-typings" + }, + "dependencies": { + "@chakra-ui/icons": "^2.1.1", + "@chakra-ui/react": "^2.5.5", + "@emotion/react": "^11.10.5", + "@emotion/styled": "^11.10.5", + "@heroicons/react": "^2.0.12", + "@hookform/devtools": "^4.3.1", + "@hookform/resolvers": "^2.9.10", + "apexcharts": "^3.40.0", + "classnames": "^2.3.2", + "dayjs": "^1.11.6", + "framer-motion": "^7.6.6", + "i18next": "^22.4.14", + "i18next-browser-languagedetector": "^7.0.1", + "i18next-http-backend": "^2.2.0", + "jsoneditor": "^9.10.1", + "lodash.debounce": "^4.0.8", + "ohmyfetch": "^0.4.21", + "qrcode.react": "^3.1.0", + "react": "^18.2.0", + "react-apexcharts": "^1.4.0", + "react-copy-to-clipboard": "^5.1.0", + "react-datepicker": "^4.8.0", + "react-dom": "^18.2.0", + "react-github-btn": "^1.4.0", + "react-hook-form": "^7.39.1", + "react-i18next": "^12.2.0", + "react-json-editor-ajrm": "^2.5.14", + "react-loading-skeleton": "^3.1.0", + "react-query": "^3.39.3", + "react-router-dom": "^6.4.3", + "react-slick": "^0.29.0", + "react-use-websocket": "^4.3.1", + "rollup-plugin-visualizer": "^5.9.0", + "slick-carousel": "^1.8.1", + "vite-tsconfig-paths": "^4.0.3", + "zod": "^3.19.1", + "zustand": "^4.4.6", + "zustand-computed": "^1.3.3" + }, + "devDependencies": { + "@chakra-ui/cli": "^2.3.0", + "@types/jsoneditor": "^9.9.0", + "@types/lodash.debounce": "^4.0.7", + "@types/react": "^18.0.17", + "@types/react-copy-to-clipboard": "^5.0.4", + "@types/react-datepicker": "^4.8.0", + "@types/react-dom": "^18.0.6", + "@types/react-json-editor-ajrm": "^2.5.3", + "@types/react-slick": "^0.23.10", + "@vitejs/plugin-react": "^2.1.0", + "autoprefixer": "^10.4.12", + "sass": "^1.57.1", + "typescript": "^4.9.5", + "vite": "^3.1.0", + "vite-plugin-svgr": "^2.2.2" + } +} diff --git a/app/dashboard/public/favicon/android-chrome-192x192.png b/app/dashboard/public/favicon/android-chrome-192x192.png new file mode 100644 index 0000000..b4cda80 Binary files /dev/null and b/app/dashboard/public/favicon/android-chrome-192x192.png differ diff --git a/app/dashboard/public/favicon/android-chrome-512x512.png b/app/dashboard/public/favicon/android-chrome-512x512.png new file mode 100644 index 0000000..44766a4 Binary files /dev/null and b/app/dashboard/public/favicon/android-chrome-512x512.png differ diff --git a/app/dashboard/public/favicon/apple-touch-icon.png b/app/dashboard/public/favicon/apple-touch-icon.png new file mode 100644 index 0000000..c6735c8 Binary files /dev/null and b/app/dashboard/public/favicon/apple-touch-icon.png differ diff --git a/app/dashboard/public/favicon/browserconfig.xml b/app/dashboard/public/favicon/browserconfig.xml new file mode 100644 index 0000000..c08fb32 --- /dev/null +++ b/app/dashboard/public/favicon/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #2b5797 + + + diff --git a/app/dashboard/public/favicon/favicon-16x16.png b/app/dashboard/public/favicon/favicon-16x16.png new file mode 100644 index 0000000..171d2b5 Binary files /dev/null and b/app/dashboard/public/favicon/favicon-16x16.png differ diff --git a/app/dashboard/public/favicon/favicon-32x32.png b/app/dashboard/public/favicon/favicon-32x32.png new file mode 100644 index 0000000..0a2366a Binary files /dev/null and b/app/dashboard/public/favicon/favicon-32x32.png differ diff --git a/app/dashboard/public/favicon/favicon.ico b/app/dashboard/public/favicon/favicon.ico new file mode 100644 index 0000000..904ad81 Binary files /dev/null and b/app/dashboard/public/favicon/favicon.ico differ diff --git a/app/dashboard/public/favicon/mstile-150x150.png b/app/dashboard/public/favicon/mstile-150x150.png new file mode 100644 index 0000000..d352655 Binary files /dev/null and b/app/dashboard/public/favicon/mstile-150x150.png differ diff --git a/app/dashboard/public/favicon/safari-pinned-tab.svg b/app/dashboard/public/favicon/safari-pinned-tab.svg new file mode 100644 index 0000000..d3a67fe --- /dev/null +++ b/app/dashboard/public/favicon/safari-pinned-tab.svg @@ -0,0 +1,36 @@ + + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + diff --git a/app/dashboard/public/favicon/site.webmanifest b/app/dashboard/public/favicon/site.webmanifest new file mode 100644 index 0000000..5eb5e44 --- /dev/null +++ b/app/dashboard/public/favicon/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/favicon/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/favicon/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/app/dashboard/public/locales/en.json b/app/dashboard/public/locales/en.json new file mode 100644 index 0000000..4d8e08a --- /dev/null +++ b/app/dashboard/public/locales/en.json @@ -0,0 +1,163 @@ +{ + "password": "Password", + "login": "Login", + "cancel": "Cancel", + "apply": "Apply", + "delete": "Delete", + "reset": "Reset", + "createUser": "Create User", + "username": "Username", + "expires": "Expires in {{time}}", + "expired": "Expired {{time}} ago", + "dateFormat": "MMMM d, yyy", + "inbound": "Inbound", + "login.loginYourAccount": "Login to your account", + "login.welcomeBack": "Welcome back, please enter your details", + "login.fieldRequired": "This field is required", + "header.hostSettings": "Host Settings", + "header.nodeSettings": "Node Settings", + "header.nodesUsage": "Nodes Usage", + "header.donation": "Donation", + "header.logout": "Log out", + "deleteUser.title": "Delete User", + "deleteUser.prompt": "Are you sure you want to delete {{username}}?", + "deleteUser.deleteSuccess": "{{username}} deleted successfully.", + "usersTable.status": "status", + "usersTable.dataUsage": "data usage", + "usersTable.noUserMatched": "It seems there is no user matched with what you are looking for", + "usersTable.noUser": "There is no user added to the system", + "usersTable.copyLink": "Copy Subscription Link", + "usersTable.copied": "Copied", + "usersTable.copyConfigs": "Copy Configs", + "usersTable.total": "Total", + "userDialog.dataLimit": "Data Limit", + "userDialog.periodicUsageReset": "Periodic Usage Reset", + "userDialog.warningNoProtocol": "Please select at least one protocol", + "userDialog.expiryDate": "Expiry Date", + "userDialog.note": "Note", + "userDialog.resetUsage": "Reset Usage", + "userDialog.usage": "Usage", + "userDialog.protocols": "Protocols", + "userDialog.services": "Services", + "userDialog.editUserTitle": "Edit user", + "userDialog.editUser": "Edit user", + "userDialog.userEdited": "User {{username}} edited.", + "userDialog.userCreated": "User {{username}} created.", + "userDialog.userAlreadyExists": "User already exists", + "userDialog.vmessDesc": "Fast and secure", + "userDialog.vlessDesc": "Lightweight, fast and secure", + "userDialog.trojanDesc": "Lightweight, secure and lightening fast", + "userDialog.shadowsocksDesc": "Fast and secure, but not efficient as others", + "userDialog.resetStrategyNo": "No", + "userDialog.resetStrategyDaily": "Daily", + "userDialog.resetStrategyWeekly": "Weekly", + "userDialog.resetStrategyMonthly": "Monthly", + "userDialog.resetStrategyAnnually": "Annually", + "userDialog.selectOneProtocol": "Please select at least one protocol", + "userDialog.optional": "optional", + "userDialog.method": "Method", + "userDialog.generatedByDefault": "Automatically generated by default", + "userDialog.hours": "Hours", + "userDialog.days": "Days", + "userDialog.weeks": "Weeks", + "userDialog.months": "Months", + "userDialog.relative": "Relative", + "userDialog.absolute": "Absolute", + "userDialog.custom": "Custom", + "userDialog.startDate": "Start date", + "userDialog.endDate": "End date", + "userDialog.revokeSubscription": "Revoke Subscription", + "revoke": "Revoke", + "userDialog.total": "Total: ", + "hostsDialog.title": "Using this setting, you are able to assign specific address for each inbound.", + "hostsDialog.desc": "Use these variables to make it dynamic", + "hostsDialog.username": "The username of the user", + "hostsDialog.dataUsage": "The current usage of the user", + "hostsDialog.remainingData": "Remaining data of the user", + "hostsDialog.dataLimit": "The usage limit of the user", + "hostsDialog.remainingDays": "Remaining days of the user", + "hostsDialog.expireDate": "Expiry date of the user", + "hostsDialog.jalaliExpireDate": "Expiry date of the user in solar calendar", + "hostsDialog.remainingTime": "Remaining time of the user", + "hostsDialog.statusEmoji": "User status as an emoji (✅,⌛️,🪫,❌,🔌)", + "hostsDialog.proxyProtocol": "Proxy protocol (e.g. VMess)", + "hostsDialog.proxyMethod": "Proxy transport method (e.g. ws)", + "hostsDialog.currentServer": "Current server ip address", + "hostsDialog.security": "Security Layer", + "hostsDialog.host": "Request Host", + "hostsDialog.port": "Port", + "hostsDialog.path": "Path", + "hostsDialog.sni": "SNI", + "hostsDialog.advancedOptions": "Advanced options", + "hostsDialog.addHost": "Add host", + "hostsDialog.savedSuccess": "Hosts saved successfully", + "hostsDialog.loading": "loading...", + "hostsDialog.apply": "Apply", + "hostsDialog.port.info": "By default, a host uses the default port of the inbound. You can set a custom port in case this host is a server that forwards traffic from a port that differs from your server's port. For example, the server may forward traffic from port 8443 to the default port of your inbound server.", + "hostsDialog.path.info": "Set a path for host users, useful behind a reverse proxy.", + "hostsDialog.sni.info": "By default, a host uses the default SNI of the inbound. You can set a custom SNI in case this host is a server that has a different SNI. For example, the server may receive traffic with a different SSL certificate, perform SSL termination, and forward it to your inbound server.", + "hostsDialog.host.info": "By default, if a request host is set in the Xray config, this host is used. However, you can set a custom request host here if needed.", + "hostsDialog.security.info": "If the middleware server of this host uses a different security layer than the inbound's default, you can set a custom security layer here.", + "hostsDialog.alpn": "ALPN", + "hostsDialog.fingerprint": "Fingerprint", + "hostsDialog.host.multiHost": "To set multiple addresses, separate them with , Each time an address is chosen randomly.", + "hostsDialog.host.wildcard": "Use * to generate a random string (works for wildcard domain names)", + "nodes.title": "Using Marzban-Node, you are able to scale up your connection quality by adding different nodes on different servers.", + "nodes.addNewMarzbanNode": "Add New Marzban Node", + "nodes.certificate": "Certificate", + "nodes.connection-hint": "To setup a Marzban Node, you need to set this certificate on the node to initialize a secure connection between main server and the node", + "nodes.download-certificate": "Download certificate", + "nodes.show-certificate": "Show certificate", + "nodes.hide-certificate": "Hide certificate", + "nodes.addHostForEveryInbound": "Add this node as a new host for every inbound", + "nodes.addNode": "Add Node", + "nodes.addNodeSuccess": "Node {{name}} added successfully", + "nodes.apply": "editNode", + "nodes.nodeName": "Name", + "nodes.nodeAddress": "Address", + "nodes.nodePort": "Port", + "nodes.nodeAPIPort": "API Port", + "nodes.editNode": "Update Node", + "nodes.reconnect": "Reconnect", + "nodes.reconnecting": "Reconnecting...", + "deleteNode.title": "Delete Node", + "deleteNode.prompt": "Are you sure you want to delete the {{name}} node?", + "deleteNode.deleteSuccess": "Node {{name}} removed successfully", + "users": "Users", + "active": "active", + "disabled": "disabled", + "activeUsers": "active users", + "dataUsage": "data usage", + "memoryUsage": "memory usage", + "itemsPerPage": "Items per page", + "previous": "Previous", + "next": "Next", + "createNewUser": "Create new user", + "search": "Search", + "resetAllUsage": "Reset All Usages", + "qrcodeDialog.sublink": "Subscribe Link", + "resetUserUsage.prompt": "Are you sure you want to reset {{username}}'s usage?", + "resetUserUsage.title": "Reset User Usage", + "resetUserUsage.success": "{{username}}'s usage has reset successfully.", + "resetUserUsage.error": "Usage reset failed, please try again.", + "revokeUserSub.prompt": "Are you sure you want to revoke {{username}}'s subscription?", + "revokeUserSub.title": "Revoke User Subscription", + "revokeUserSub.success": "{{username}}'s subscription has revoked successfully.", + "revokeUserSub.error": "Subscription revoke failed, please try again.", + "resetAllUsage.title": "Reset data usage for all users", + "resetAllUsage.prompt": "This action clears all of the users' data usage completely. Are you sure you want to reset all usage? THIS CANNOT BE UNDONE!", + "resetAllUsage.success": "All usage has reset successfully.", + "resetAllUsage.error": "Usage reset failed, please try again.", + "core.title": "Core Settings", + "core.socket.connecting": "Connecting...", + "core.socket.connected": "Connected", + "core.socket.not_connected": "Not Connected", + "core.socket.closed": "Closed", + "core.restarting": "Restarting...", + "core.restartCore": "Restart Core", + "core.save": "Save", + "core.logs": "Logs", + "core.configuration": "Configuration", + "core.generalErrorMessage": "Something went wrong, please check the configuration", + "core.successMessage": "Core settings updated successfully" +} diff --git a/app/dashboard/public/locales/fa.json b/app/dashboard/public/locales/fa.json new file mode 100644 index 0000000..795257e --- /dev/null +++ b/app/dashboard/public/locales/fa.json @@ -0,0 +1,160 @@ +{ + "password": "گذرواژه", + "login": "ورود", + "cancel": "لغو", + "apply": "تایید", + "delete": "حذف", + "reset": "بازنشانی", + "createUser": "افزودن کاربر", + "username": "نام کاربری", + "dateInfo.year": " سال", + "dateInfo.month": " ماه", + "dateInfo.day": " روز", + "dateInfo.hour": " ساعت", + "dateInfo.min": " دقیقه", + "expires": "پایان در {{time}}", + "expired": "{{time}} پیش به پایان رسیده", + "dateFormat": "MM/dd/yyyy", + "inbound": "ورودی", + "login.loginYourAccount": "وارد حساب خود شوید", + "login.welcomeBack": "خوش آمدید, لطفا اطلاعات خود را وارد کنید", + "login.fieldRequired": "This field is required", + "header.hostSettings": "تنظیمات هاست", + "header.nodeSettings": "تنظیمات گره‌ها", + "header.nodesUsage": "نمودار گره‌ها", + "header.donation": "کمک مالی", + "header.logout": "خروج", + "deleteUser.title": "حذف کاربر", + "deleteUser.prompt": "از حذف کاربر {{username}} مطمئن هستید?", + "deleteUser.deleteSuccess": "{{username}} با موفقیت حذف شد.", + "usersTable.status": "وضعیت", + "usersTable.dataUsage": "مصرف داده", + "usersTable.noUserMatched": "به‌نظر میرسه کاربری که جستجو کردید، وجود ندارد", + "usersTable.noUser": "کاربری افزوده نشده است", + "usersTable.copyLink": "کپی لینک اشتراک", + "usersTable.copied": "کپی شد", + "usersTable.copyConfigs": "تنظیمات کپی", + "usersTable.total": "مجموع", + "userDialog.dataLimit": "حد مصرف داده", + "userDialog.periodicUsageReset": "بازنشانی دوره‌ای مصرف", + "userDialog.warningNoProtocol": "لطفا حداقل یک پروتکل انتخاب کنید", + "userDialog.note": "توضیحات", + "userDialog.expiryDate": "تاریخ پایان", + "userDialog.resetUsage": "بازنشانی مصرف", + "userDialog.usage": "مصرف", + "userDialog.protocols": "پروتکل‌ها", + "userDialog.services": "سرویس ها", + "userDialog.editUserTitle": "ویرایش کاربر", + "userDialog.editUser": "ویرایش کاربر", + "userDialog.userEdited": "کاربر {{username}} ویرایش شد.", + "userDialog.userCreated": "کاربر {{username}} ساخته شد.", + "userDialog.userAlreadyExists": "کاربر وجود دارد", + "userDialog.vmessDesc": "سریع و امن", + "userDialog.vlessDesc": "سبک، سریع و امن", + "userDialog.trojanDesc": "سبک، امن و فوق‌العاده سریع", + "userDialog.shadowsocksDesc": "سریع و امن، اما کارآمد کمتر از بقیه", + "userDialog.resetStrategyNo": "خیر", + "userDialog.resetStrategyDaily": "روزانه", + "userDialog.resetStrategyWeekly": "هفتگی", + "userDialog.resetStrategyMonthly": "ماهانه", + "userDialog.resetStrategyAnnually": "سالانه", + "userDialog.selectOneProtocol": "لطفا حداقل یک پروتکل انتخاب کنید", + "userDialog.optional": "اختیاری", + "userDialog.method": "روش", + "userDialog.generatedByDefault": "پیش‌فرض ساخته می‌شود", + "userDialog.hours": "ساعات", + "userDialog.days": "روزها", + "userDialog.weeks": "هفته‌ها", + "userDialog.months": "ماه‌ها", + "userDialog.relative": "نسبی", + "userDialog.absolute": "مطلق", + "userDialog.custom": "انتخابی", + "userDialog.startDate": "تاریخ شروع", + "userDialog.endDate": "تاریخ پایان", + "userDialog.total": "مجموع: ", + "hostsDialog.title": "با انتخاب این تنظیمات، می‌توانید برای هر ورودی یک آدرس منحصر به فرد انتخاب کنید.", + "hostsDialog.desc": "برای ساخت نوشته پویا، از این متغیرها استفاده کنید", + "hostsDialog.username": "نام کاربری کاربر", + "hostsDialog.dataUsage": "مصرف کنونی کاربر", + "hostsDialog.remainingData": "حجم باقی‌مانده کاربر", + "hostsDialog.dataLimit": "حد مصرف کاربر", + "hostsDialog.remainingDays": "روزهای باقی مانده کاربر", + "hostsDialog.expireDate": "تاریخ انقضای کاربر به میلادی", + "hostsDialog.jalaliExpireDate": "تاریخ انقضای کاربر به شمسی", + "hostsDialog.remainingTime": "زمان باقی مانده کاربر", + "hostsDialog.statusEmoji": "وضعیت کاربر در قالب اموجی (✅,⌛️,🪫,❌,🔌)", + "hostsDialog.proxyProtocol": "پروتکل پروکسی (مانند VMess)", + "hostsDialog.proxyMethod": "روش انتقال پروکسی (مانند ws)", + "hostsDialog.currentServer": "IP کنونی سرور", + "hostsDialog.security": "لایه امنیت", + "hostsDialog.host": "هاست درخواست", + "hostsDialog.port": "پورت", + "hostsDialog.sni": "SNI", + "hostsDialog.advancedOptions": "تنظیمات پیشرفته", + "hostsDialog.addHost": "افزودن هاست", + "hostsDialog.savedSuccess": "هاست‌ها با موفقیت ذخیره شدند", + "hostsDialog.loading": "درحال بارگزاری...", + "hostsDialog.apply": "اعمال", + "hostsDialog.port.info": "به طور پیش‌فرض، هاست، از پورت پیش‌فرض ورودی استفاده میکند، در صورتی که این هاست ترافیک را از پورتی، متفاوت از پورت سرور، منتقل می‌کند، می‌توانید آن را تغییر دهید. برای مثال، ممکن از سرور ترافیک را از پورت 8443 به پورت پیش‌فرض سرور ورودی شما منتقل کند.", + "hostsDialog.sni.info": "به طور پیش‌فرض، هاست، از SNI پیش‌فرض ورودی استفاده میکند، در صورتی که این هاست یک SNI دیگری دارد، می‌توانید آن را تغییر دهید. برای مثال، ممکن است سرور ترافیک با SSL متفاوت را دریافت و منتقل کند.", + "hostsDialog.host.info": "به‌طور پیش‌فرض، اگر هاست درخواستی در پیکربندی *** تنظیم شده باشد، این هاست استفاده می‌شود. اما می‌توانید یک هاست درخواستی متفاوت در اینجا قرار دهید.", + "hostsDialog.security.info": "اگر میان‌افزار سرور این هاست، از لایه امنیتی متفاوتی از ورودی استفاده می‌کند، می‌توانید اینجا انتخاب کنید", + "hostsDialog.alpn": "ALPN", + "hostsDialog.fingerprint": "اثرانگشت", + "hostsDialog.host.multiHost": "برای تنظیم چند آدرس، با , از هم جدا کنید. هر دفعه آدرسی به صورت تصادفی قرار داده می‌شود.", + "hostsDialog.host.wildcard": "از * برای ساخت عبارت تصادفی استفاده کنید (برای نام‌های wildcard کار می‌کند)", + "nodes.title": "با استفاده از Marzban-Node, شما می‌توانید با افزودن گره‌های متفاوت در سرورهای متفاوت، کیفیت اتصال خود را بالاتر ببرید.", + "nodes.addNewMarzbanNode": "افزودن گره مرزبان", + "nodes.certificate": "گواهی", + "nodes.addHostForEveryInbound": "استفاده از این گره به عنوان میزبان تمام ورودی‌ها", + "nodes.addNode": "افزودن گره", + "nodes.addNodeSuccess": "گره {{name}} با موفقیت افزوده شد", + "nodes.apply": "ویرایش گره", + "nodes.nodeName": "نام", + "nodes.nodeAddress": "آدرس", + "nodes.nodePort": "پورت", + "nodes.nodeAPIPort": "پورت API", + "nodes.editNode": "ویرایش گره", + "nodes.reconnect": "اتصال مجدد", + "nodes.connection-hint": "برای راه اندازی یک گره جدید، لازم است گواهی زیر را روی گره تنظیم کنید تا یک اتصال امن بین سرور اصلی و گره ایجاد شود.", + "nodes.download-certificate": "دانلود گواهی", + "nodes.show-certificate": "نمایش دادن گواهی", + "nodes.hide-certificate": "مخفی کردن گواهی", + "nodes.reconnecting": "درحال اتصال مجدد...", + "deleteNode.title": "حذف گره", + "deleteNode.prompt": "از حذف گره {{name}} مطمئن هستید؟", + "deleteNode.deleteSuccess": "گره {{name}} با موفقیت حذف شد", + "active": "فعال", + "disabled": "غیر فعال", + "users": "کاربران", + "activeUsers": "کاربران فعال", + "dataUsage": "مصرف داده", + "memoryUsage": "مصرف حافظه", + "itemsPerPage": "تعداد در صفحه", + "previous": "قبلی", + "next": "بعدی", + "createNewUser": "ساخت کاربر", + "search": "جستجو", + "resetAllUsage": "بازنشانی کل مصرف", + "qrcodeDialog.sublink": "لینک اشتراک", + "resetUserUsage.prompt": "از بازنشانی مصرف {{username}} مطئمن هستید؟", + "resetUserUsage.title": "بازنشانی مصرف کاربر", + "resetUserUsage.success": "مصرف {{username}} با موفقیت بازنشانی شد.", + "resetUserUsage.error": "بازنشانی مصرف انجام نشد، دوباره تلاش کنید.", + "resetAllUsage.title": "بازنشانی مصرف تمام کاربران", + "resetAllUsage.prompt": "این عمل مصرف تمام کاربران را بازنشانی می‌کند. از این بازنشانی مطمئن هستید؟ این عمل قابل بازگشت نیست!", + "resetAllUsage.success": "مصرف کل با موفقیت بازنشانی شد.", + "resetAllUsage.error": "بازنشانی مصرف انجام نشد، دوباره تلاش کنید.", + "core.title": "تنظیمات هسته", + "core.socket.connecting": "در حال اتصال...", + "core.socket.connected": "متصل", + "core.socket.not_connected": "عدم اتصال", + "core.socket.closed": "بسته شده", + "core.restarting": "درحال اجرا مجدد...", + "core.restartCore": "اجرا مجدد هسته", + "core.save": "ذخیره", + "core.logs": "گزارش", + "core.configuration": "پیکربندی", + "core.generalErrorMessage": "مشکلی پیش آمده، لطفا پیکربندی را بررسی کنید", + "core.successMessage": "تنظیمات هسته با موفقیت ثبت شد" +} diff --git a/app/dashboard/public/locales/ru.json b/app/dashboard/public/locales/ru.json new file mode 100644 index 0000000..bdf9606 --- /dev/null +++ b/app/dashboard/public/locales/ru.json @@ -0,0 +1,159 @@ +{ + "password": "Пароль", + "login": "Вход", + "cancel": "Отмена", + "apply": "Применить", + "delete": "Удалить", + "reset": "Сбросить", + "createUser": "Создать", + "username": "Имя пользователя", + "expires": "Истекает через {{time}}", + "expired": "Истекло {{time}} назад", + "dateFormat": "MMMM d, yyy", + "inbound": "inbound", + "login.loginYourAccount": "Войдите в свой аккаунт", + "login.welcomeBack": "Пожалуйста, введите свои данные", + "login.fieldRequired": "Это поле обязательно для заполнения", + "header.hostSettings": "Настройки хоста", + "header.nodeSettings": "Настройки узлов", + "header.nodesUsage": "Использование узлов", + "header.donation": "Пожертвование", + "header.logout": "Выйти", + "deleteUser.title": "Удалить пользователя", + "deleteUser.prompt": "Вы уверены, что хотите удалить пользователя {{username}}?", + "deleteUser.deleteSuccess": "{{username}} успешно удален.", + "usersTable.status": "Статус", + "usersTable.dataUsage": "Расход трафика", + "usersTable.noUserMatched": "Похоже, нет пользователя, соответствующего вашему запросу", + "usersTable.noUser": "В системе нет созданных пользователей", + "usersTable.copyLink": "Скопировать ссылку на подписку", + "usersTable.copied": "Скопировано", + "usersTable.copyConfigs": "Скопировать конфигурации", + "usersTable.total": "Всего", + "userDialog.dataLimit": "Лимит трафика", + "userDialog.periodicUsageReset": "Период сброса трафика", + "userDialog.warningNoProtocol": "Пожалуйста, выберите хотя бы один протокол", + "userDialog.expiryDate": "Дата истечения срока", + "userDialog.note": "Примечание", + "userDialog.resetUsage": "Сбросить трафик", + "userDialog.usage": "Потребление", + "userDialog.protocols": "Протоколы", + "userDialog.services": "Услуги", + "userDialog.editUserTitle": "Редактировать пользователя", + "userDialog.editUser": "Редактировать", + "userDialog.userEdited": "Пользователь {{username}} изменен.", + "userDialog.userCreated": "Пользователь {{username}} создан.", + "userDialog.userAlreadyExists": "Пользователь уже существует", + "userDialog.vmessDesc": "Быстрый и безопасный", + "userDialog.vlessDesc": "Легковесный, быстрый и безопасный", + "userDialog.trojanDesc": "Легковесный, безопасный и быстрый", + "userDialog.shadowsocksDesc": "Быстрый и безопасный, но не такой эффективный, как другие", + "userDialog.resetStrategyNo": "Нет", + "userDialog.resetStrategyDaily": "Ежедневно", + "userDialog.resetStrategyWeekly": "Еженедельно", + "userDialog.resetStrategyMonthly": "Ежемесячно", + "userDialog.resetStrategyAnnually": "Ежегодно", + "userDialog.selectOneProtocol": "Пожалуйста, выберите хотя бы один протокол", + "userDialog.optional": "необязательно", + "userDialog.method": "Метод", + "userDialog.generatedByDefault": "по умолчанию", + "userDialog.hours": "Часы", + "userDialog.days": "Дни", + "userDialog.weeks": "Недели", + "userDialog.months": "Месяцы", + "userDialog.relative": "Относительно", + "userDialog.absolute": "Абсолютно", + "userDialog.custom": "Пользовательский", + "userDialog.startDate": "Дата начала", + "userDialog.endDate": "Дата окончания", + "userDialog.revokeSubscription": "Отозвать подписку", + "revoke": "Отозвать", + "userDialog.total": "Всего: ", + "hostsDialog.title": "Используя эту настройку, Вы можете настроить свои inbound.", + "hostsDialog.desc": "Используйте эти переменные, чтобы сделать его динамическим", + "hostsDialog.username": "Имя пользователя", + "hostsDialog.dataUsage": "Использованный трафик пользователя", + "hostsDialog.remainingData": "Оставшийся трафик пользователя", + "hostsDialog.dataLimit": "Лимит трафика пользователя", + "hostsDialog.remainingDays": "Оставшиеся дни пользователя", + "hostsDialog.expireDate": "Дата истечения срока пользователя", + "hostsDialog.jalaliExpireDate": "Дата истечения срока по солнечному календарю", + "hostsDialog.remainingTime": "Оставшееся время пользователя", + "hostsDialog.statusEmoji": "Статус пользователя в виде смайлика (✅,⌛️,🪫,❌,🔌)", + "hostsDialog.proxyProtocol": "Протокол прокси (например, VMess)", + "hostsDialog.proxyMethod": "Метод транспорта прокси (например, ws)", + "hostsDialog.currentServer": "Текущий IP-адрес сервера", + "hostsDialog.security": "Security Layer", + "hostsDialog.host": "Host", + "hostsDialog.port": "Port", + "hostsDialog.sni": "SNI", + "hostsDialog.advancedOptions": "Дополнительные опции", + "hostsDialog.addHost": "Добавить хост", + "hostsDialog.savedSuccess": "Хосты успешно сохранены", + "hostsDialog.loading": "загрузка...", + "hostsDialog.apply": "Применить", + "hostsDialog.port.info": "По умолчанию хост использует порт, значение которого обьявленно в inbound. Вы можете установить свое значение порта, если с него трафик перенаправляется на другой порт. Например, сервер может перенаправлять трафик с порта 443 на порт по умолчанию Вашего inbound", + "hostsDialog.sni.info": "По умолчанию хост использует SNI, значение которого обьявленно в inbound. Вы можете установить свое значение SNI, если этот хост содержит другие SNI. Например, сервер может принимать трафик с другим SSL-сертификатом, выполнять SSL-терминацию и перенаправлять его на ваш inbound.", + "hostsDialog.host.info": "По умолчанию, если в конфигурации XRAY задан запрашиваемый хост, то он и будет использоваться. Однако, если необходимо, вы можете установить здесь пользовательский запрашиваемый хост.", + "hostsDialog.security.info": "Если промежуточный сервер этого хоста использует другой security layer, отличный от security layer Вашего inbound по умолчанию, Вы можете установить его здесь", + "hostsDialog.alpn": "ALPN", + "hostsDialog.fingerprint": "Fingerprint", + "hostsDialog.host.multiHost": "Чтобы установить несколько адресов, разделяйте их с помощью ,. Каждый раз будет выбран случайный адрес.", + "hostsDialog.host.wildcard": "Используйте *, чтобы сгенерировать случайную строку (работает для wildcard доменов)", + "nodes.title": "Используя Marzban-Node, Вы можете масштабировать инфраструктуру, добавляя узлы на разных серверах.", + "nodes.addNewMarzbanNode": "Добавить новый узел Marzban", + "nodes.certificate": "Сертификат", + "nodes.addHostForEveryInbound": "Добавить этот узел как новый хост для каждого inbound", + "nodes.addNode": "Добавить узел", + "nodes.addNodeSuccess": "Узел {{name}} успешно добавлен", + "nodes.apply": "Настройки узла успешно обновлены", + "nodes.nodeName": "Имя", + "nodes.nodeAddress": "Адрес", + "nodes.nodePort": "Порт", + "nodes.nodeAPIPort": "API порт", + "nodes.editNode": "Редактировать узел", + "nodes.reconnect": "Переподключиться", + "nodes.connection-hint": "Для настройки узла Marzban, необходимо установить на нем данный сертификат, для инициализации безопасного соединения между главным сервером и узлом", + "nodes.download-certificate": "Скачать сертификат", + "nodes.show-certificate": "Показать сертификат", + "nodes.hide-certificate": "Скрыть сертификат", + "nodes.reconnecting": "Переподключение...", + "deleteNode.title": "Удалить узел", + "deleteNode.prompt": "Вы уверены, что хотите удалить узел {{name}}?", + "deleteNode.deleteSuccess": "Узел {{name}} успешно удален", + "users": "Пользователи", + "activeUsers": "Пользователи", + "dataUsage": "Трафик", + "memoryUsage": "Память", + "itemsPerPage": "Элементов на страницу", + "previous": "Назад", + "next": "Вперед", + "createNewUser": "Создать нового пользователя", + "search": "Поиск", + "resetAllUsage": "Сбросить расход трафика", + "qrcodeDialog.sublink": "Ссылка на подписку", + "resetUserUsage.prompt": "Вы уверены, что хотите сбросить расход трафика для пользователя {{username}}?", + "resetUserUsage.title": "Сбросить расход трафика пользователя", + "resetUserUsage.success": "Расход трафика пользователя {{username}} успешно сброшен.", + "resetUserUsage.error": "Сброс расхода не удался, пожалуйста, попробуйте еще раз.", + "revokeUserSub.prompt": "Вы уверены, что хотите отозвать подписку для пользователя {{username}}?", + "revokeUserSub.title": "Отозвать подписку пользователя", + "revokeUserSub.success": "Подписка пользователя {{username}} успешно отозвана.", + "revokeUserSub.error": "Отзыв подписки не удался, пожалуйста, попробуйте еще раз.", + "resetAllUsage.title": "Сбросить расход трафика для всех пользователей", + "resetAllUsage.prompt": "Это действие полностью очищает весь расход трафика пользователей. Вы уверены? ЭТО ДЕЙСТВИЕ НЕОБРАТИМО!", + "resetAllUsage.success": "Расход трафика успешно сброшен.", + "resetAllUsage.error": "Сброс расхода трафика не удался, пожалуйста, попробуйте еще раз.", + "core.title": "Основные настройки", + "core.socket.connecting": "Соединение...", + "core.socket.connected": "Подключено", + "core.socket.not_connected": "Не подключено", + "core.socket.closed": "Закрыто", + "core.restarting": "Перезагрузка...", + "core.restartCore": "Перезагрузить ядро", + "core.save": "Сохранить", + "core.logs": "Логи", + "core.configuration": "Конфигурация", + "core.generalErrorMessage": "Что-то пошло не так, пожалуйста, проверьте конфигурацию", + "core.successMessage": "Основные настройки успешно обновлены" +} diff --git a/app/dashboard/public/locales/zh.json b/app/dashboard/public/locales/zh.json new file mode 100644 index 0000000..fe14360 --- /dev/null +++ b/app/dashboard/public/locales/zh.json @@ -0,0 +1,136 @@ +{ + "password": "密码", + "login": "登录", + "cancel": "取消", + "apply": "应用", + "delete": "删除", + "reset": "重置", + "createUser": "创建用户", + "username": "用户名", + "expires": "{{time}}有效", + "expired": "{{time}}失效", + "dateFormat": "MM/dd/yyyy", + "inbound": "入站", + "login.loginYourAccount": "登录您的帐号", + "login.welcomeBack": "欢迎回来,请输入您的详细信息", + "login.fieldRequired": "此项必填", + "header.hostSettings": "设置", + "header.nodeSettings": "节点设置", + "header.nodesUsage": "节点统计", + "header.donation": "捐赠", + "header.logout": "退出", + "deleteUser.title": "删除用户", + "deleteUser.prompt": "您确定你要删除 {{username}}?", + "deleteUser.deleteSuccess": "{{username}} 删除成功。", + "usersTable.status": "状态", + "usersTable.dataUsage": "流量统计", + "usersTable.noUserMatched": "没有找到您搜索的用户", + "usersTable.noUser": "还没有添加任何用户", + "usersTable.copyLink": "复制订阅链接", + "usersTable.copied": "已复制", + "usersTable.copyConfigs": "复制配置", + "usersTable.total": "总共", + "userDialog.dataLimit": "流量限制", + "userDialog.periodicUsageReset": "定期重置流量", + "userDialog.expiryDate": "过期日期", + "userDialog.resetUsage": "重置流量", + "userDialog.usage": "流量详情", + "userDialog.protocols": "协议", + "userDialog.services": "服务", + "userDialog.editUserTitle": "用户编辑", + "userDialog.editUser": "修改", + "userDialog.userEdited": "已更新用户 {{username}}。", + "userDialog.userCreated": "成功创建用户 {{username}}。", + "userDialog.userAlreadyExists": "用户已存在", + "userDialog.vmessDesc": "快速且安全", + "userDialog.vlessDesc": "轻量、快速且安全", + "userDialog.trojanDesc": "轻量、安全且非常快", + "userDialog.shadowsocksDesc": "快速且安全, 但效率不如其它", + "userDialog.resetStrategyNo": "无", + "userDialog.resetStrategyDaily": "每天", + "userDialog.resetStrategyWeekly": "每周", + "userDialog.resetStrategyMonthly": "每月", + "userDialog.resetStrategyAnnually": "每年", + "userDialog.selectOneProtocol": "请至少选择一个协议", + "userDialog.optional": "可以为空", + "userDialog.method": "加密方式", + "userDialog.generatedByDefault": "默认自动生成", + "userDialog.hours": "小时", + "userDialog.days": "天", + "userDialog.weeks": "周", + "userDialog.months": "月", + "userDialog.relative": "相对时间", + "userDialog.absolute": "选择范围", + "userDialog.custom": "自定义", + "userDialog.startDate": "开始日期", + "userDialog.endDate": "结束日期", + "userDialog.total": "总共:", + "hostsDialog.title": "使用此设置,您可以为每个入站分配特定的地址。", + "hostsDialog.desc": "使用这些变量使其可以动态替换", + "hostsDialog.username": "用户的用户名", + "hostsDialog.dataUsage": "用户当前流量情况", + "hostsDialog.remainingData": "用户剩余流量情况", + "hostsDialog.dataLimit": "用户的流量限制", + "hostsDialog.remainingDays": "用户的剩余天数", + "hostsDialog.expireDate": "用户的有效期", + "hostsDialog.jalaliExpireDate": "用户阳历有效日期", + "hostsDialog.remainingTime": "用户剩余时间", + "hostsDialog.statusEmoji": "用户状态作为表情符号 (✅,⌛️,🪫,❌,🔌)", + "hostsDialog.proxyProtocol": "代理协议(例如 VMess)", + "hostsDialog.proxyMethod": "代理传输方法(例如 ws)", + "hostsDialog.currentServer": "当前服务器的 IP 地址", + "hostsDialog.security": "安全层", + "hostsDialog.host": "请求主机", + "hostsDialog.port": "端口", + "hostsDialog.sni": "SNI", + "hostsDialog.advancedOptions": "高级选项", + "hostsDialog.addHost": "添加主机", + "hostsDialog.savedSuccess": "设置保存成功", + "hostsDialog.loading": "加载中...", + "hostsDialog.apply": "保存", + "hostsDialog.port.info": "默认情况下,主机使用入站端口的默认端口。如果此主机是一个服务器,用于从与您的服务器端口不同的端口转发流量,则可以设置自定义端口。例如,服务器可能会将来自端口 8443 的流量转发到您入站服务器的默认端口。", + "hostsDialog.sni.info": "默认情况下,主机使用入站 SNI 的默认值。如果此主机是一个服务器且 SNI 不同,则可以设置自定义 SNI。例如,服务器可能会接收带有不同 SSL 证书的流量,执行 SSL 处理并将其转发到您的入站服务器。", + "hostsDialog.host.info": "默认情况下,如果在 Xray 配置中设置了请求主机,则使用该主机。但是,如果需要,您可以在此处设置自定义请求主机。", + "hostsDialog.security.info": "如果此主机的中间件服务器使用的安全层与入站默认值不同,则可以在此处设置自定义安全层。", + "hostsDialog.alpn": "ALPN", + "hostsDialog.fingerprint": "指纹", + "nodes.title": "使用 Marzban-Node,您可以通过在不同的服务器上添加不同的节点来提供多节点负载。", + "nodes.addNewMarzbanNode": "添加新的 Marzban 节点", + "nodes.certificate": "证书", + "nodes.addHostForEveryInbound": "为每个入站请求添加此节点作为新主机", + "nodes.addNode": "添加节点", + "nodes.addNodeSuccess": "节点 {{name}} 添加成功", + "nodes.editNode": "保存", + "nodes.nodeName": "名称", + "nodes.nodeAddress": "地址", + "nodes.nodePort": "端口", + "nodes.nodeAPIPort": "API 端口", + "nodes.reconnect": "重新连接", + "nodes.connection-hint": "要设置Marzban节点,您需要在节点上设置此证书以初始化主服务器和节点之间的安全连接", + "nodes.download-certificate": "下载证书", + "nodes.show-certificate": "如何证书", + "nodes.hide-certificate": "隐藏证书", + "nodes.reconnecting": "重连中...", + "deleteNode.title": "删除节点", + "deleteNode.prompt": "您确实要删除 {{name}} 节点吗?", + "deleteNode.deleteSuccess": "节点 {{name}} 删除成功", + "users": "用户", + "activeUsers": "活跃用户", + "dataUsage": "总流量", + "memoryUsage": "内存状态", + "itemsPerPage": "每页条数", + "previous": "上一页", + "next": "下一页", + "createNewUser": "创建新用户", + "search": "搜索", + "resetAllUsage": "重置所有统计", + "qrcodeDialog.sublink": "订阅链接", + "resetUserUsage.prompt": "您确定要重置 {{username}} 的流量统计吗?", + "resetUserUsage.title": "重置用户流量统计", + "resetUserUsage.success": "{{username}} 的流量统计重置完成。", + "resetUserUsage.error": "重置失败,请稍候再试", + "resetAllUsage.title": "重置所有用户的数据使用情况", + "resetAllUsage.prompt": "此操作将清除所有用户统计,您确定要执行此操作吗? 这不能被撤消!", + "resetAllUsage.success": "所有统计重置完成。", + "resetAllUsage.error": "重置失败,请稍候再试!" +} diff --git a/app/dashboard/src/App.tsx b/app/dashboard/src/App.tsx new file mode 100644 index 0000000..cadf145 --- /dev/null +++ b/app/dashboard/src/App.tsx @@ -0,0 +1,14 @@ +import "react-datepicker/dist/react-datepicker.css"; +import "react-loading-skeleton/dist/skeleton.css"; +import { RouterProvider } from "react-router-dom"; +import { router } from "./components/modules/Router"; + +function App() { + return ( +
+ +
+ ); +} + +export default App; diff --git a/app/dashboard/src/assets/add_file.svg b/app/dashboard/src/assets/add_file.svg new file mode 100644 index 0000000..6ddbc18 --- /dev/null +++ b/app/dashboard/src/assets/add_file.svg @@ -0,0 +1 @@ + diff --git a/app/dashboard/src/assets/logo.svg b/app/dashboard/src/assets/logo.svg new file mode 100644 index 0000000..6bf7ccf --- /dev/null +++ b/app/dashboard/src/assets/logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/dashboard/src/components/CoreSettingsModal.tsx b/app/dashboard/src/components/CoreSettingsModal.tsx new file mode 100644 index 0000000..66a8808 --- /dev/null +++ b/app/dashboard/src/components/CoreSettingsModal.tsx @@ -0,0 +1,340 @@ +import { + Badge, + Box, + Button, + chakra, + CircularProgress, + FormControl, + FormLabel, + HStack, + IconButton, + Modal, + ModalBody, + ModalCloseButton, + ModalContent, + ModalFooter, + ModalHeader, + ModalOverlay, + Text, + Tooltip, + useToast, +} from "@chakra-ui/react"; +import { + ArrowPathIcon, + ArrowsPointingInIcon, + ArrowsPointingOutIcon, + Cog6ToothIcon, +} from "@heroicons/react/24/outline"; +import { joinPaths } from "@remix-run/router"; +import classNames from "classnames"; +import { useCoreSettings } from "contexts/CoreSettingsContext"; +import { useDashboard } from "contexts/DashboardContext"; +import debounce from "lodash.debounce"; +import { FC, useCallback, useEffect, useRef, useState } from "react"; +import { Controller, useForm } from "react-hook-form"; +import { useTranslation } from "react-i18next"; +import { useMutation } from "react-query"; +import { ReadyState } from "react-use-websocket"; +import { useWebSocket } from "react-use-websocket/dist/lib/use-websocket"; +import { getAuthToken } from "utils/authStorage"; +import { Icon } from "./Icon"; +import { JsonEditor } from "./JsonEditor"; +import "./JsonEditor/themes.js"; + +export const MAX_NUMBER_OF_LOGS = 500; + +const UsageIcon = chakra(Cog6ToothIcon, { + baseStyle: { + w: 5, + h: 5, + }, +}); +export const ReloadIcon = chakra(ArrowPathIcon, { + baseStyle: { + w: 4, + h: 4, + }, +}); + +export const FullScreenIcon = chakra(ArrowsPointingOutIcon, { + baseStyle: { + w: 4, + h: 4, + }, +}); +export const ExitFullScreenIcon = chakra(ArrowsPointingInIcon, { + baseStyle: { + w: 3, + h: 3, + }, +}); + +const getStatus = (status: string) => { + return { + [ReadyState.CONNECTING]: "connecting", + [ReadyState.OPEN]: "connected", + [ReadyState.CLOSING]: "closed", + [ReadyState.CLOSED]: "closed", + [ReadyState.UNINSTANTIATED]: "closed", + }[status]; +}; + +const getWebsocketUrl = () => { + try { + let baseURL = new URL( + import.meta.env.VITE_BASE_API.startsWith("/") + ? window.location.origin + import.meta.env.VITE_BASE_API + : import.meta.env.VITE_BASE_API + ); + + return ( + (baseURL.protocol === "https:" ? "wss://" : "ws://") + + joinPaths([baseURL.host + baseURL.pathname, "/core/logs"]) + + "?interval=1&token=" + + getAuthToken() + ); + } catch (e) { + console.error("Unable to generate websocket url"); + console.error(e); + return null; + } +}; + +let logsTmp: string[] = []; +const CoreSettingModalContent: FC = () => { + const { isEditingCore } = useDashboard(); + const { + fetchCoreSettings, + updateConfig, + isLoading, + config, + isPostLoading, + version, + restartCore, + } = useCoreSettings(); + const logsDiv = useRef(null); + const [logs, setLogs] = useState([]); + const { t } = useTranslation(); + const toast = useToast(); + const form = useForm({ + defaultValues: { config: config || {} }, + }); + + useEffect(() => { + if (config) form.setValue("config", config); + }, [config]); + + useEffect(() => { + if (isEditingCore) fetchCoreSettings(); + }, [isEditingCore]); + "".startsWith; + const scrollShouldStayOnEnd = useRef(true); + const updateLogs = useCallback( + debounce((logs: string[]) => { + const isScrollOnEnd = + Math.abs( + (logsDiv.current?.scrollTop || 0) - + (logsDiv.current?.scrollHeight || 0) + + (logsDiv.current?.offsetHeight || 0) + ) < 10; + if (logsDiv.current && isScrollOnEnd) + scrollShouldStayOnEnd.current = true; + else scrollShouldStayOnEnd.current = false; + if (logs.length < 40) setLogs(logs); + }, 300), + [] + ); + + const { readyState } = useWebSocket(getWebsocketUrl(), { + onMessage: (e: any) => { + logsTmp.push(e.data); + if (logsTmp.length > MAX_NUMBER_OF_LOGS) + logsTmp = logsTmp.splice(0, logsTmp.length - MAX_NUMBER_OF_LOGS); + updateLogs([...logsTmp]); + }, + shouldReconnect: () => true, + reconnectAttempts: 10, + reconnectInterval: 1000, + }); + + useEffect(() => { + if (logsDiv.current && scrollShouldStayOnEnd.current) + logsDiv.current.scrollTop = logsDiv.current?.scrollHeight; + }, [logs]); + + useEffect(() => { + return () => { + logsTmp = []; + }; + }, []); + + const status = getStatus(readyState.toString()); + + const { mutate: handleRestartCore, isLoading: isRestarting } = + useMutation(restartCore); + + const handleOnSave = ({ config }: any) => { + updateConfig(config) + .then(() => { + toast({ + title: t("core.successMessage"), + status: "success", + isClosable: true, + position: "top", + duration: 3000, + }); + }) + .catch((e) => { + let message = t("core.generalErrorMessage"); + if (typeof e.response._data.detail === "object") + message = + e.response._data.detail[Object.keys(e.response._data.detail)[0]]; + if (typeof e.response._data.detail === "string") + message = e.response._data.detail; + + toast({ + title: message, + status: "error", + isClosable: true, + position: "top", + duration: 3000, + }); + }); + }; + const editorRef = useRef(null); + const [isFullScreen, setFullScreen] = useState(false); + const handleFullScreen = () => { + if (document.fullscreenElement) { + document.exitFullscreen(); + setFullScreen(false); + } else { + editorRef.current?.requestFullscreen(); + setFullScreen(true); + } + }; + return ( +
+ + + + + {t("core.configuration")}{" "} + {isLoading && } + + + + + {version && `v${version}`} + + + + + + ( + + )} + /> + + {!isFullScreen ? : } + + + + + + {t("core.logs")} + {t(`core.socket.${status}`)} + + + {logs.map((message, i) => ( + + {message} + + ))} + + + + + + + + + + + + + +
+ ); +}; +export const CoreSettingsModal: FC = () => { + const { isEditingCore } = useDashboard(); + const onClose = useDashboard.setState.bind(null, { isEditingCore: false }); + const { t } = useTranslation(); + + return ( + + + + + + + + + + {t("core.title")} + + + + + + + + ); +}; diff --git a/app/dashboard/src/components/DeleteNodeModal.tsx b/app/dashboard/src/components/DeleteNodeModal.tsx new file mode 100644 index 0000000..24e5c58 --- /dev/null +++ b/app/dashboard/src/components/DeleteNodeModal.tsx @@ -0,0 +1,95 @@ +import { + Button, + Modal, + ModalBody, + ModalCloseButton, + ModalContent, + ModalFooter, + ModalHeader, + ModalOverlay, + Spinner, + Text, + useToast, +} from "@chakra-ui/react"; +import { FetchNodesQueryKey, useNodes } from "contexts/NodesContext"; +import { FC } from "react"; +import { Trans, useTranslation } from "react-i18next"; +import { useMutation, useQueryClient } from "react-query"; +import { + generateErrorMessage, + generateSuccessMessage, +} from "utils/toastHandler"; +import { DeleteIcon, DeleteUserModalProps } from "./DeleteUserModal"; +import { Icon } from "./Icon"; + +export const DeleteNodeModal: FC = ({ + deleteCallback, +}) => { + const { deleteNode, deletingNode, setDeletingNode } = useNodes(); + const { t } = useTranslation(); + const toast = useToast(); + const queryClient = useQueryClient(); + const onClose = () => { + setDeletingNode(null); + }; + + const { isLoading, mutate: onDelete } = useMutation(deleteNode, { + onSuccess: () => { + generateSuccessMessage( + t("deleteNode.deleteSuccess", {name: deletingNode && deletingNode.name}), + toast + ); + setDeletingNode(null); + queryClient.invalidateQueries(FetchNodesQueryKey); + deleteCallback && deleteCallback(); + }, + onError: (e) => { + generateErrorMessage(e, toast); + }, + }); + + return ( + + + + + + + + + + + + {t("deleteNode.title")} + + {deletingNode && ( + + }}> + {t("deleteNode.prompt", {name: deletingNode.name})} + + + )} + + + + + + + + ); +}; diff --git a/app/dashboard/src/components/DeleteUserModal.tsx b/app/dashboard/src/components/DeleteUserModal.tsx new file mode 100644 index 0000000..76ac6f4 --- /dev/null +++ b/app/dashboard/src/components/DeleteUserModal.tsx @@ -0,0 +1,101 @@ +import { + Button, + chakra, + Modal, + ModalBody, + ModalCloseButton, + ModalContent, + ModalFooter, + ModalHeader, + ModalOverlay, + Spinner, + Text, + useToast, +} from "@chakra-ui/react"; +import { TrashIcon } from "@heroicons/react/24/outline"; +import { useDashboard } from "contexts/DashboardContext"; +import { FC, useState } from "react"; +import { Trans, useTranslation } from "react-i18next"; +import { Icon } from "./Icon"; + +export const DeleteIcon = chakra(TrashIcon, { + baseStyle: { + w: 5, + h: 5, + }, +}); + +export type DeleteUserModalProps = { + deleteCallback?: () => void; +}; + +export const DeleteUserModal: FC = () => { + const [loading, setLoading] = useState(false); + const { deletingUser: user, onDeletingUser, deleteUser } = useDashboard(); + const { t } = useTranslation(); + const toast = useToast(); + const onClose = () => { + onDeletingUser(null); + }; + const onDelete = () => { + if (user) { + setLoading(true); + deleteUser(user) + .then(() => { + toast({ + title: t("deleteUser.deleteSuccess", { username: user.username }), + status: "success", + isClosable: true, + position: "top", + duration: 3000, + }); + }) + .then(onClose) + .finally(setLoading.bind(null, false)); + } + }; + return ( + + + + + + + + + + + + {t("deleteUser.title")} + + {user && ( + + }}> + {t("deleteUser.prompt", { username: user.username })} + + + )} + + + + + + + + ); +}; diff --git a/app/dashboard/src/components/Filters.tsx b/app/dashboard/src/components/Filters.tsx new file mode 100644 index 0000000..33c6c00 --- /dev/null +++ b/app/dashboard/src/components/Filters.tsx @@ -0,0 +1,137 @@ +import { + BoxProps, + Button, + chakra, + Grid, + GridItem, + HStack, + IconButton, + Input, + InputGroup, + InputLeftElement, + InputRightElement, + Spinner, +} from "@chakra-ui/react"; +import { + ArrowPathIcon, + MagnifyingGlassIcon, + XMarkIcon, +} from "@heroicons/react/24/outline"; +import classNames from "classnames"; +import { useDashboard } from "contexts/DashboardContext"; +import debounce from "lodash.debounce"; +import React, { FC, useState } from "react"; +import { useTranslation } from "react-i18next"; + +const iconProps = { + baseStyle: { + w: 4, + h: 4, + }, +}; + +const SearchIcon = chakra(MagnifyingGlassIcon, iconProps); +const ClearIcon = chakra(XMarkIcon, iconProps); +export const ReloadIcon = chakra(ArrowPathIcon, iconProps); + +export type FilterProps = {} & BoxProps; +const setSearchField = debounce((username: string) => { + useDashboard.getState().onFilterChange({ + ...useDashboard.getState().filters, + offset: 0, + username, + }); +}, 300); + +export const Filters: FC = ({ ...props }) => { + const { loading, filters, onFilterChange, refetchUsers, onCreateUser } = + useDashboard(); + const { t } = useTranslation(); + const [search, setSearch] = useState(""); + const onChange = (e: React.ChangeEvent) => { + setSearch(e.target.value); + setSearchField(e.target.value); + }; + const clear = () => { + setSearch(""); + onFilterChange({ + ...filters, + offset: 0, + username: "", + }); + }; + return ( + + + + } /> + + + + {loading && } + {filters.username && filters.username.length > 0 && ( + + + + )} + + + + + + + + + + + + + ); +}; diff --git a/app/dashboard/src/components/Footer.tsx b/app/dashboard/src/components/Footer.tsx new file mode 100644 index 0000000..f96b531 --- /dev/null +++ b/app/dashboard/src/components/Footer.tsx @@ -0,0 +1,28 @@ +import { BoxProps, HStack, Link, Text } from "@chakra-ui/react"; +import { ORGANIZATION_URL, REPO_URL } from "constants/Project"; +import { useDashboard } from "contexts/DashboardContext"; +import { FC } from "react"; + +export const Footer: FC = (props) => { + const { version } = useDashboard(); + return ( + + + + Marzban + + {version ? ` (v${version}), ` : ", "} + Made with ❤️ in{" "} + + Gozargah + + + + ); +}; diff --git a/app/dashboard/src/components/Header.tsx b/app/dashboard/src/components/Header.tsx new file mode 100644 index 0000000..c42608f --- /dev/null +++ b/app/dashboard/src/components/Header.tsx @@ -0,0 +1,238 @@ +import { + Box, + chakra, + HStack, + IconButton, + Menu, + MenuButton, + MenuItem, + MenuList, + Text, + useColorMode, +} from "@chakra-ui/react"; +import { + ArrowLeftOnRectangleIcon, + Bars3Icon, + ChartPieIcon, + Cog6ToothIcon, + CurrencyDollarIcon, + DocumentMinusIcon, + LinkIcon, + MoonIcon, + SquaresPlusIcon, + SunIcon, +} from "@heroicons/react/24/outline"; +import { DONATION_URL, REPO_URL } from "constants/Project"; +import { useDashboard } from "contexts/DashboardContext"; +import differenceInDays from "date-fns/differenceInDays"; +import isValid from "date-fns/isValid"; +import { FC, ReactNode, useState } from "react"; +import GitHubButton from "react-github-btn"; +import { useTranslation } from "react-i18next"; +import { Link } from "react-router-dom"; +import { updateThemeColor } from "utils/themeColor"; +import { Language } from "./Language"; + +type HeaderProps = { + actions?: ReactNode; +}; +const iconProps = { + baseStyle: { + w: 4, + h: 4, + }, +}; + +const DarkIcon = chakra(MoonIcon, iconProps); +const LightIcon = chakra(SunIcon, iconProps); +const CoreSettingsIcon = chakra(Cog6ToothIcon, iconProps); +const SettingsIcon = chakra(Bars3Icon, iconProps); +const LogoutIcon = chakra(ArrowLeftOnRectangleIcon, iconProps); +const DonationIcon = chakra(CurrencyDollarIcon, iconProps); +const HostsIcon = chakra(LinkIcon, iconProps); +const NodesIcon = chakra(SquaresPlusIcon, iconProps); +const NodesUsageIcon = chakra(ChartPieIcon, iconProps); +const ResetUsageIcon = chakra(DocumentMinusIcon, iconProps); +const NotificationCircle = chakra(Box, { + baseStyle: { + bg: "yellow.500", + w: "2", + h: "2", + rounded: "full", + position: "absolute", + }, +}); + +const NOTIFICATION_KEY = "marzban-menu-notification"; + +export const shouldShowDonation = (): boolean => { + const date = localStorage.getItem(NOTIFICATION_KEY); + if (!date) return true; + try { + if (date && isValid(parseInt(date))) { + if (differenceInDays(new Date(), new Date(parseInt(date))) >= 7) + return true; + return false; + } + return true; + } catch (err) { + return true; + } +}; + +export const Header: FC = ({ actions }) => { + const { + onEditingHosts, + onResetAllUsage, + onEditingNodes, + onShowingNodesUsage, + } = useDashboard(); + const { t } = useTranslation(); + const { colorMode, toggleColorMode } = useColorMode(); + const [showDonationNotif, setShowDonationNotif] = useState( + shouldShowDonation() + ); + const gBtnColor = colorMode === "dark" ? "dark_dimmed" : colorMode; + + const handleOnClose = () => { + localStorage.setItem(NOTIFICATION_KEY, new Date().getTime().toString()); + setShowDonationNotif(false); + }; + + return ( + + + {t("users")} + + {showDonationNotif && ( + + )} + + + + + + + } + position="relative" + > + + } + onClick={onEditingHosts.bind(null, true)} + > + {t("header.hostSettings")} + + } + onClick={onEditingNodes.bind(null, true)} + > + {t("header.nodeSettings")} + + } + onClick={onShowingNodesUsage.bind(null, true)} + > + {t("header.nodesUsage")} + + } + onClick={onResetAllUsage.bind(null, true)} + > + {t("resetAllUsage")} + + + } + position="relative" + onClick={handleOnClose} + > + {t("header.donation")}{" "} + {showDonationNotif && ( + + )} + + + + }> + {t("header.logout")} + + + + + + { + useDashboard.setState({ isEditingCore: true }); + }} + > + + + + + + { + updateThemeColor(colorMode == "dark" ? "light" : "dark"); + toggleColorMode(); + }} + > + {colorMode === "light" ? : } + + + + + Star + + + + + + ); +}; diff --git a/app/dashboard/src/components/HostsDialog.tsx b/app/dashboard/src/components/HostsDialog.tsx new file mode 100644 index 0000000..a8b49fd --- /dev/null +++ b/app/dashboard/src/components/HostsDialog.tsx @@ -0,0 +1,906 @@ +import { + Accordion, + AccordionButton, + AccordionIcon, + AccordionItem, + AccordionPanel, + Badge, + Box, + Button, + Select as ChakraSelect, + FormControl, + FormErrorMessage, + FormLabel, + HStack, + IconButton, + InputGroup, + InputRightElement, + Modal, + ModalBody, + ModalCloseButton, + ModalContent, + ModalHeader, + ModalOverlay, + Popover, + PopoverArrow, + PopoverBody, + PopoverCloseButton, + PopoverContent, + PopoverTrigger, + Portal, + Text, + Tooltip, + VStack, + chakra, + useToast, +} from "@chakra-ui/react"; +import { InformationCircleIcon, LinkIcon } from "@heroicons/react/24/outline"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { + proxyALPN, + proxyFingerprint, + proxyHostSecurity, +} from "constants/Proxies"; +import { useHosts } from "contexts/HostsContext"; +import { FC, useEffect, useState } from "react"; +import { + FormProvider, + useFieldArray, + useForm, + useFormContext, +} from "react-hook-form"; +import { Trans, useTranslation } from "react-i18next"; +import "slick-carousel/slick/slick-theme.css"; +import "slick-carousel/slick/slick.css"; +import { z } from "zod"; +import { useDashboard } from "../contexts/DashboardContext"; +import { DeleteIcon } from "./DeleteUserModal"; +import { Icon } from "./Icon"; +import { Input as CustomInput } from "./Input"; + +const Select = chakra(ChakraSelect, { + baseStyle: { + bg: "white", + _dark: { + bg: "gray.700", + }, + }, +}); + +const Input = chakra(CustomInput, { + baseStyle: { + bg: "white", + _dark: { + bg: "gray.700", + }, + }, +}); + +const ModalIcon = chakra(LinkIcon, { + baseStyle: { + w: 5, + h: 5, + }, +}); + +const InfoIcon = chakra(InformationCircleIcon, { + baseStyle: { + w: 4, + h: 4, + color: "gray.400", + cursor: "pointer", + }, +}); + +const hostsSchema = z.record( + z.string().min(1), + z.array( + z.object({ + remark: z.string().min(1, "Remark is required"), + address: z.string().min(1, "Address is required"), + port: z + .string() + .or(z.number()) + .nullable() + .transform((value) => { + if (typeof value === "number") return value; + if (value !== null && !isNaN(parseInt(value))) + return Number(parseInt(value)); + return null; + }), + path: z.string().nullable(), + sni: z.string().nullable(), + host: z.string().nullable(), + security: z.string(), + alpn: z.string(), + fingerprint: z.string(), + }), + ), +); + +const Error = chakra(FormErrorMessage, { + baseStyle: { + color: "red.400", + display: "block", + textAlign: "left", + w: "100%", + }, +}); + +type AccordionInboundType = { + hostKey: string; + isOpen: boolean; + toggleAccordion: () => void; +}; + +const AccordionInbound: FC = ({ + hostKey, + isOpen, + toggleAccordion, +}) => { + const { inbounds } = useDashboard(); + const inbound = [...inbounds.values()] + .flat() + .filter((inbound) => inbound.tag === hostKey)[0]; + + const form = useFormContext>(); + const { + fields: hosts, + append: addHost, + remove: removeHost, + } = useFieldArray({ + control: form.control, + name: hostKey, + }); + const { errors } = form.formState; + const { t } = useTranslation(); + const accordionErrors = errors[hostKey]; + const handleAddHost = () => { + addHost({ + host: "", + sni: "", + port: null, + path: null, + address: "", + remark: "", + security: "inbound_default", + alpn: "", + fingerprint: "", + }); + }; + useEffect(() => { + if (accordionErrors && !isOpen) { + toggleAccordion(); + } + }, [accordionErrors]); + return ( + + + + {hostKey} + + + + + + {hosts.map((host, index) => ( + + + + + + + + + + + + + + + + + + + {t("hostsDialog.desc")} + + + {"{"}SERVER_IP{"}"} + {" "} + {t("hostsDialog.currentServer")} + + + + {"{"}USERNAME{"}"} + {" "} + {t("hostsDialog.username")} + + + + {"{"}DATA_USAGE{"}"} + {" "} + {t("hostsDialog.dataUsage")} + + + + {"{"}DATA_LEFT{"}"} + {" "} + {t("hostsDialog.remainingData")} + + + + {"{"}DATA_LIMIT{"}"} + {" "} + {t("hostsDialog.dataLimit")} + + + + {"{"}DAYS_LEFT{"}"} + {" "} + {t("hostsDialog.remainingDays")} + + + + {"{"}EXPIRE_DATE{"}"} + {" "} + {t("hostsDialog.expireDate")} + + + + {"{"}JALALI_EXPIRE_DATE{"}"} + {" "} + {t("hostsDialog.jalaliExpireDate")} + + + + {"{"}TIME_LEFT{"}"} + {" "} + {t("hostsDialog.remainingTime")} + + + + {"{"}STATUS_EMOJI{"}"} + {" "} + {t("hostsDialog.statusEmoji")} + + + + {"{"}PROTOCOL{"}"} + {" "} + {t("hostsDialog.proxyProtocol")} + + + + {"{"}TRANSPORT{"}"} + {" "} + {t("hostsDialog.proxyMethod")} + + + + + + + + + {accordionErrors && accordionErrors[index]?.remark && ( + {accordionErrors[index]?.remark?.message} + )} + + + + + + + + + + + + + + + + + + + {t("hostsDialog.desc")} + + + {"{"}SERVER_IP{"}"} + {" "} + {t("hostsDialog.currentServer")} + + + + {"{"}USERNAME{"}"} + {" "} + {t("hostsDialog.username")} + + + + {"{"}DATA_USAGE{"}"} + {" "} + {t("hostsDialog.dataUsage")} + + + + {"{"}DATA_LEFT{"}"} + {" "} + {t("hostsDialog.remainingData")} + + + + {"{"}DATA_LIMIT{"}"} + {" "} + {t("hostsDialog.dataLimit")} + + + + {"{"}DAYS_LEFT{"}"} + {" "} + {t("hostsDialog.remainingDays")} + + + + {"{"}EXPIRE_DATE{"}"} + {" "} + {t("hostsDialog.expireDate")} + + + + {"{"}JALALI_EXPIRE_DATE{"}"} + {" "} + {t("hostsDialog.jalaliExpireDate")} + + + + {"{"}TIME_LEFT{"}"} + {" "} + {t("hostsDialog.remainingTime")} + + + + {"{"}STATUS_EMOJI{"}"} + {" "} + {t("hostsDialog.statusEmoji")} + + + + {"{"}PROTOCOL{"}"} + {" "} + {t("hostsDialog.proxyProtocol")} + + + + {"{"}TRANSPORT{"}"} + {" "} + {t("hostsDialog.proxyMethod")} + + + + + + + + + {accordionErrors && accordionErrors[index]?.address && ( + {accordionErrors[index]?.address?.message} + )} + + + + + + + {t("hostsDialog.advancedOptions")} + + + + + + + + + + + + + + {t("hostsDialog.port")} + + + + + + + + + + {t("hostsDialog.port.info")} + + + + + + + + + + {t("hostsDialog.sni")} + + + + + + + + + + + {t("hostsDialog.sni.info")} + + + , + }} + /> + + + , + }} + /> + + + + + + + {accordionErrors && accordionErrors[index]?.sni && ( + {accordionErrors[index]?.sni?.message} + )} + + + + {t("hostsDialog.host")} + + + + + + + + + + + {t("hostsDialog.host.info")} + + + , + }} + /> + + + , + }} + /> + + + + + + + {accordionErrors && accordionErrors[index]?.host && ( + {accordionErrors[index]?.host?.message} + )} + + + + + {t("hostsDialog.path")} + + + + + + + + + + + {t("hostsDialog.path.info")} + + + + + + + {accordionErrors && accordionErrors[index]?.path && ( + {accordionErrors[index]?.path?.message} + )} + + + + + {t("hostsDialog.security")} + + + + + + + + + + + {t("hostsDialog.security.info")} + + + + + + + + + + + {t("hostsDialog.alpn")} + + + + + + + {t("hostsDialog.fingerprint")} + + + + + + + + + ))} + + + + + ); +}; + +export const HostsDialog: FC = () => { + const { isEditingHosts, onEditingHosts, refetchUsers, inbounds } = + useDashboard(); + const { isLoading, hosts, fetchHosts, isPostLoading, setHosts } = useHosts(); + const toast = useToast(); + const { t } = useTranslation(); + const [openAccordions, setOpenAccordions] = useState({}); + + useEffect(() => { + if (isEditingHosts) fetchHosts(); + }, [isEditingHosts]); + const form = useForm>({ + resolver: zodResolver(hostsSchema), + }); + + useEffect(() => { + if (hosts && isEditingHosts) { + form.reset(hosts); + } + }, [hosts]); + + const onClose = () => { + setOpenAccordions({}); + onEditingHosts(false); + }; + const handleFormSubmit = (hosts: z.infer) => { + setHosts(hosts) + .then(() => { + toast({ + title: t("hostsDialog.savedSuccess"), + status: "success", + isClosable: true, + position: "top", + duration: 3000, + }); + refetchUsers(); + }) + .catch((err) => { + if (err?.response?.status === 409 || err?.response?.status === 400) { + toast({ + title: err.response?._data?.detail, + status: "error", + isClosable: true, + position: "top", + duration: 3000, + }); + } + if (err?.response?.status === 422) { + Object.keys(err.response._data.detail).forEach((key) => { + toast({ + title: err.response._data.detail[key] + " (" + key + ")", + status: "error", + isClosable: true, + position: "top", + duration: 3000, + }); + }); + } + }); + }; + + const toggleAccordion = (index: number) => { + if (openAccordions[String(index)]) { + delete openAccordions[String(index)]; + } else openAccordions[String(index)] = {}; + + setOpenAccordions({ ...openAccordions }); + }; + + return ( + + + + + + + + + + + +
+ + {t("hostsDialog.title")} + + {isLoading && t("hostsDialog.loading")} + {!isLoading && + hosts && + (Object.keys(hosts).length > 0 ? ( + parseInt(i))} + > + + {Object.keys(hosts).map((hostKey, index) => { + return ( + toggleAccordion(index)} + isOpen={openAccordions[String(index)]} + key={hostKey} + hostKey={hostKey} + /> + ); + })} + + + ) : ( + "No inbound found. Please check your Xray config file." + ))} + + + + +
+
+
+
+
+ ); +}; diff --git a/app/dashboard/src/components/Icon.tsx b/app/dashboard/src/components/Icon.tsx new file mode 100644 index 0000000..ac1e44f --- /dev/null +++ b/app/dashboard/src/components/Icon.tsx @@ -0,0 +1,61 @@ +import { Box, Text } from "@chakra-ui/react"; +import { FC, PropsWithChildren } from "react"; + +export type IconType = { + color: string; +}; + +export const Icon: FC> = ({ children, color }) => { + return ( + + + {children} + + + ); +}; diff --git a/app/dashboard/src/components/Input.tsx b/app/dashboard/src/components/Input.tsx new file mode 100644 index 0000000..09c5976 --- /dev/null +++ b/app/dashboard/src/components/Input.tsx @@ -0,0 +1,188 @@ +import { + chakra, + FormControl, + FormErrorMessage, + FormLabel, + Input as ChakraInput, + InputGroup, + InputLeftAddon, + InputProps as ChakraInputProps, + InputRightAddon, + InputRightElement, + NumberDecrementStepper, + NumberIncrementStepper, + NumberInput, + NumberInputField, + NumberInputStepper +} from "@chakra-ui/react"; +import { XMarkIcon } from "@heroicons/react/24/outline"; +import classNames from "classnames"; +import React, { PropsWithChildren, ReactNode } from "react"; + +const ClearIcon = chakra(XMarkIcon, { + baseStyle: { + w: 4, + h: 4, + }, +}); + +export type InputProps = PropsWithChildren< + { + value?: string; + className?: string; + endAdornment?: ReactNode; + startAdornment?: ReactNode; + type?: string; + placeholder?: string; + onChange?: (e: any) => void; + onBlur?: (e: any) => void; + onClick?: (e: any) => void; + name?: string; + error?: string; + disabled?: boolean; + step?: number; + label?: string; + clearable?: boolean; + } & ChakraInputProps +>; + +export const Input = React.forwardRef( + ( + { + disabled, + step, + label, + className, + startAdornment, + endAdornment, + type = "text", + placeholder, + onChange, + onBlur, + name, + value, + onClick, + error, + clearable = false, + ...props + }, + ref + ) => { + const clear = () => { + if (onChange) + onChange({ + target: { + value: "", + name, + }, + }); + }; + const { size = "md" } = props; + const Component = type == "number" ? NumberInputField : ChakraInput; + const Wrapper = type == "number" ? NumberInput : React.Fragment; + const wrapperProps = + type == "number" + ? { + keepWithinRange: true, + precision: 5, + format: (value: string | number) => { + return isNaN(parseFloat(String(value))) + ? value + : Number(parseFloat(String(value)).toFixed(5)) === 0 + ? value + : Number(parseFloat(String(value)).toFixed(5)); + }, + min: 0, + step, + name, + type, + placeholder, + onChange: (v: any) => { + if (onChange) onChange(v); + }, + onBlur, + value, + onClick, + disabled, + flexGrow: 1, + size, + } + : {}; + return ( + + {label && {label}} + + {startAdornment && {startAdornment}} + + {/* @ts-ignore */} + + {type == "number" && ( + <> + + + + + + )} + + {endAdornment && ( + + {endAdornment} + + )} + {clearable && value && value.length && ( + + + + )} + + {!!error && {error}} + + ); + } +); diff --git a/app/dashboard/src/components/JsonEditor/index.tsx b/app/dashboard/src/components/JsonEditor/index.tsx new file mode 100644 index 0000000..16dcf09 --- /dev/null +++ b/app/dashboard/src/components/JsonEditor/index.tsx @@ -0,0 +1,57 @@ +import { Box, useColorMode } from "@chakra-ui/react"; +import JSONEditor, { JSONEditorMode, JSONEditorOptions } from "jsoneditor"; +import "jsoneditor/dist/jsoneditor.css"; +import { forwardRef, useEffect, useRef } from "react"; +import "./styles.css"; +import "./themes.js"; + +export type JSONEditorProps = { + onChange: (value: string) => void; + json: any; + mode?: JSONEditorMode; +}; +export const JsonEditor = forwardRef( + ({ json, onChange, mode = "code" }, ref) => { + const { colorMode } = useColorMode(); + const options: JSONEditorOptions = { + mode, + onChangeText: onChange, + statusBar: false, + mainMenuBar: false, + theme: colorMode === "dark" ? "ace/theme/nord_dark" : "ace/theme/dawn", + }; + + const jsonEditorContainer = useRef(null); + const jsonEditorRef = useRef(null); + + useEffect(() => { + jsonEditorRef.current = new JSONEditor( + jsonEditorContainer.current!, + options + ); + + return () => { + if (jsonEditorRef.current) jsonEditorRef.current.destroy(); + }; + }, []); + + useEffect(() => { + if (jsonEditorRef.current) jsonEditorRef.current.update(json); + }, [json]); + + return ( + + + + ); + } +); diff --git a/app/dashboard/src/components/JsonEditor/styles.css b/app/dashboard/src/components/JsonEditor/styles.css new file mode 100644 index 0000000..12010e4 --- /dev/null +++ b/app/dashboard/src/components/JsonEditor/styles.css @@ -0,0 +1,259 @@ +.ace_gutter-cell{ + padding-left: 20px; + padding-right: 16px !important; +} +.ace_editor, .jsoneditor{ + border-radius: 4px; +} +.ace_editor{ + min-height: 300px; +} +.jsoneditor { + border: 0; +} + +/* light theme */ +.ace-dawn .ace_gutter { + background: #ebebeb; + color: #333 +} + +.ace-dawn .ace_print-margin { + width: 1px; + background: #e8e8e8 +} + +.ace-dawn { + background-color: #F9F9F9; + color: #080808 +} + +.ace-dawn .ace_cursor { + color: #000000 +} + +.ace-dawn .ace_marker-layer .ace_selection { + background: rgba(39, 95, 255, 0.30) +} + +.ace-dawn.ace_multiselect .ace_selection.ace_start { + box-shadow: 0 0 3px 0px #F9F9F9; +} + +.ace-dawn .ace_marker-layer .ace_step { + background: rgb(255, 255, 0) +} + +.ace-dawn .ace_marker-layer .ace_bracket { + margin: -1px 0 0 -1px; + border: 1px solid rgba(75, 75, 126, 0.50) +} + +.ace-dawn .ace_marker-layer .ace_active-line { + background: rgba(36, 99, 180, 0.12) +} + +.ace-dawn .ace_gutter-active-line { + background-color : #dcdcdc +} + +.ace-dawn .ace_marker-layer .ace_selected-word { + border: 1px solid rgba(39, 95, 255, 0.30) +} + +.ace-dawn .ace_invisible { + color: rgba(75, 75, 126, 0.50) +} + +.ace-dawn .ace_keyword, +.ace-dawn .ace_meta { + color: #794938 +} + +.ace-dawn .ace_constant, +.ace-dawn .ace_constant.ace_character, +.ace-dawn .ace_constant.ace_character.ace_escape, +.ace-dawn .ace_constant.ace_other { + color: #811F24 +} + +.ace-dawn .ace_invalid.ace_illegal { + text-decoration: underline; + font-style: italic; + color: #F8F8F8; + background-color: #B52A1D +} + +.ace-dawn .ace_invalid.ace_deprecated { + text-decoration: underline; + font-style: italic; + color: #B52A1D +} + +.ace-dawn .ace_support { + color: #691C97 +} + +.ace-dawn .ace_support.ace_constant { + color: #B4371F +} + +.ace-dawn .ace_fold { + background-color: #794938; + border-color: #080808 +} + +.ace-dawn .ace_list, +.ace-dawn .ace_markup.ace_list, +.ace-dawn .ace_support.ace_function { + color: #693A17 +} + +.ace-dawn .ace_storage { + font-style: italic; + color: #A71D5D +} + +.ace-dawn .ace_string { + color: #0B6125 +} + +.ace-dawn .ace_string.ace_regexp { + color: #CF5628 +} + +.ace-dawn .ace_comment { + font-style: italic; + color: #5A525F +} + +.ace-dawn .ace_heading, +.ace-dawn .ace_markup.ace_heading { + color: #19356D +} + +.ace-dawn .ace_variable { + color: #234A97 +} + +.ace-dawn .ace_indent-guide { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLh/5+x/AAizA4hxNNsZAAAAAElFTkSuQmCC) right repeat-y +} + +.ace-dawn .ace_indent-guide-active { + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC") right repeat-y; +} + + +/* dark theme */ +.ace-nord-dark .ace_gutter { + color: #616e88; +} + +.ace-nord-dark .ace_print-margin { + width: 1px; + background: #4c566a; +} + +.ace-nord-dark { + background-color: #2e3440; + color: #d8dee9; +} + +.ace-nord-dark .ace_entity.ace_other.ace_attribute-name, +.ace-nord-dark .ace_storage { + color: #d8dee9; +} + +.ace-nord-dark .ace_cursor { + color: #d8dee9; +} + +.ace-nord-dark .ace_string.ace_regexp { + color: #bf616a; +} + +.ace-nord-dark .ace_marker-layer .ace_active-line { + background: #434c5ecc; +} +.ace-nord-dark .ace_marker-layer .ace_selection { + background: #434c5ecc; +} + +.ace-nord-dark.ace_multiselect .ace_selection.ace_start { + box-shadow: 0 0 3px 0px #2e3440; +} + +.ace-nord-dark .ace_marker-layer .ace_step { + background: #ebcb8b; +} + +.ace-nord-dark .ace_marker-layer .ace_bracket { + margin: -1px 0 0 -1px; + border: 1px solid #88c0d066; +} + +.ace-nord-dark .ace_gutter-active-line { + background-color: #434c5ecc; +} + +.ace-nord-dark .ace_marker-layer .ace_selected-word { + border: 1px solid #88c0d066; +} + +.ace-nord-dark .ace_invisible { + color: #4c566a; +} + +.ace-nord-dark .ace_keyword, +.ace-nord-dark .ace_meta, +.ace-nord-dark .ace_support.ace_class, +.ace-nord-dark .ace_support.ace_type { + color: #81a1c1; +} + +.ace-nord-dark .ace_constant.ace_character, +.ace-nord-dark .ace_constant.ace_other { + color: #d8dee9; +} + +.ace-nord-dark .ace_constant.ace_language { + color: #5e81ac; +} + +.ace-nord-dark .ace_constant.ace_escape { + color: #ebcB8b; +} + +.ace-nord-dark .ace_constant.ace_numeric { + color: #b48ead; +} + +.ace-nord-dark .ace_fold { + background-color: #4c566a; + border-color: #d8dee9; +} + +.ace-nord-dark .ace_entity.ace_name.ace_function, +.ace-nord-dark .ace_entity.ace_name.ace_tag, +.ace-nord-dark .ace_support.ace_function, +.ace-nord-dark .ace_variable, +.ace-nord-dark .ace_variable.ace_language { + color: #8fbcbb; +} + +.ace-nord-dark .ace_string { + color: #a3be8c; +} + +.ace-nord-dark .ace_comment { + color: #616e88; +} + +.ace-nord-dark .ace_indent-guide { + box-shadow: inset -1px 0 0 0 #434c5eb3; +} + +.ace-nord-dark .ace_indent-guide-active { + box-shadow: inset -1px 0 0 0 #8395b8b3; +} diff --git a/app/dashboard/src/components/JsonEditor/themes.js b/app/dashboard/src/components/JsonEditor/themes.js new file mode 100644 index 0000000..492ec8b --- /dev/null +++ b/app/dashboard/src/components/JsonEditor/themes.js @@ -0,0 +1,22 @@ +window.ace.define( + "ace/theme/nord_dark", + ["require", "exports", "module", "ace/lib/dom"], + (acequire, exports, module) => { + exports.isDark = true; + exports.cssClass = "ace-nord-dark"; + const dom = acequire("../lib/dom"); + dom.importCssString(exports.cssText, exports.cssClass); + } +); + +window.ace.define( + "ace/theme/dawn", + ["require", "exports", "module", "ace/lib/dom"], + (acequire, exports, module) => { + exports.isDark = false; + exports.cssClass = "ace-dawn"; + + const dom = acequire("../lib/dom"); + dom.importCssString(exports.cssText, exports.cssClass); + } +); diff --git a/app/dashboard/src/components/Language.tsx b/app/dashboard/src/components/Language.tsx new file mode 100644 index 0000000..aa6529e --- /dev/null +++ b/app/dashboard/src/components/Language.tsx @@ -0,0 +1,72 @@ +import { + chakra, + IconButton, + Menu, + MenuButton, + MenuItem, + MenuList, +} from "@chakra-ui/react"; +import { LanguageIcon } from "@heroicons/react/24/outline"; +import { FC, ReactNode } from "react"; +import { useTranslation } from "react-i18next"; + +type HeaderProps = { + actions?: ReactNode; +}; + +const LangIcon = chakra(LanguageIcon, { + baseStyle: { + w: 4, + h: 4, + }, +}); + +export const Language: FC = ({ actions }) => { + const { i18n } = useTranslation(); + + var changeLanguage = (lang: string) => { + i18n.changeLanguage(lang); + }; + + return ( + + } + position="relative" + /> + + changeLanguage("en")} + > + English + + changeLanguage("fa")} + > + فارسی + + changeLanguage("zh-cn")} + > + 简体中文 + + changeLanguage("ru")} + > + Русский + + + + ); +}; diff --git a/app/dashboard/src/components/NodesModal.tsx b/app/dashboard/src/components/NodesModal.tsx new file mode 100644 index 0000000..78446f3 --- /dev/null +++ b/app/dashboard/src/components/NodesModal.tsx @@ -0,0 +1,595 @@ +import { + Accordion, + AccordionButton, + AccordionIcon, + AccordionItem, + AccordionPanel, + Alert, + AlertDescription, + AlertIcon, + Badge, + Box, + Button, + ButtonProps, + chakra, + Checkbox, + Collapse, + FormControl, + FormLabel, + HStack, + IconButton, + Modal, + ModalBody, + ModalCloseButton, + ModalContent, + ModalHeader, + ModalOverlay, + Switch, + Text, + Tooltip, + useToast, + VStack, +} from "@chakra-ui/react"; +import { + EyeIcon, + EyeSlashIcon, + PlusIcon as HeroIconPlusIcon, + SquaresPlusIcon, +} from "@heroicons/react/24/outline"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { + FetchNodesQueryKey, + getNodeDefaultValues, + NodeSchema, + NodeType, + useNodes, + useNodesQuery, +} from "contexts/NodesContext"; +import { FC, ReactNode, useState } from "react"; +import { Controller, useForm, UseFormReturn } from "react-hook-form"; +import { useTranslation } from "react-i18next"; +import { + UseMutateFunction, + useMutation, + useQuery, + useQueryClient, +} from "react-query"; +import "slick-carousel/slick/slick-theme.css"; +import "slick-carousel/slick/slick.css"; +import { Status } from "types/User"; +import { + generateErrorMessage, + generateSuccessMessage, +} from "utils/toastHandler"; +import { useDashboard } from "../contexts/DashboardContext"; +import { DeleteNodeModal } from "./DeleteNodeModal"; +import { DeleteIcon } from "./DeleteUserModal"; +import { ReloadIcon } from "./Filters"; +import { Icon } from "./Icon"; +import { StatusBadge } from "./StatusBadge"; + +import { fetch } from "service/http"; +import { Input } from "./Input"; + +const CustomInput = chakra(Input, { + baseStyle: { + bg: "white", + _dark: { + bg: "gray.700", + }, + }, +}); + +const ModalIcon = chakra(SquaresPlusIcon, { + baseStyle: { + w: 5, + h: 5, + }, +}); + +const PlusIcon = chakra(HeroIconPlusIcon, { + baseStyle: { + w: 5, + h: 5, + strokeWidth: 2, + }, +}); + +type AccordionInboundType = { + toggleAccordion: () => void; + node: NodeType; +}; + +const NodeAccordion: FC = ({ toggleAccordion, node }) => { + const { updateNode, reconnectNode, setDeletingNode } = useNodes(); + const { t } = useTranslation(); + const queryClient = useQueryClient(); + const toast = useToast(); + const form = useForm({ + defaultValues: node, + resolver: zodResolver(NodeSchema), + }); + const handleDeleteNode = setDeletingNode.bind(null, node); + + const { isLoading, mutate } = useMutation(updateNode, { + onSuccess: () => { + generateSuccessMessage("Node updated successfully", toast); + queryClient.invalidateQueries(FetchNodesQueryKey); + }, + onError: (e) => { + generateErrorMessage(e, toast, form); + }, + }); + + const { isLoading: isReconnecting, mutate: reconnect } = useMutation( + reconnectNode.bind(null, node), + { + onSuccess: () => { + queryClient.invalidateQueries(FetchNodesQueryKey); + }, + } + ); + + const nodeStatus: Status = isReconnecting + ? "connecting" + : node.status + ? node.status + : "error"; + + return ( + + + + + {node.name} + + + {node.xray_version && ( + + + Xray {node.xray_version} + + + )} + {node.status && } + + + + + + + {nodeStatus === "error" && ( + + + + + {node.message} + + + + + + + )} + + + + + + + } + /> + + + ); +}; + +type AddNodeFormType = { + toggleAccordion: () => void; + resetAccordions: () => void; +}; + +const AddNodeForm: FC = ({ + toggleAccordion, + resetAccordions, +}) => { + const toast = useToast(); + const { t } = useTranslation(); + const queryClient = useQueryClient(); + const { addNode } = useNodes(); + const form = useForm({ + resolver: zodResolver(NodeSchema), + defaultValues: { + ...getNodeDefaultValues(), + add_as_new_host: true, + }, + }); + const { isLoading, mutate } = useMutation(addNode, { + onSuccess: () => { + generateSuccessMessage( + t("nodes.addNodeSuccess", { name: form.getValues("name") }), + toast + ); + queryClient.invalidateQueries(FetchNodesQueryKey); + form.reset(); + resetAccordions(); + }, + onError: (e) => { + generateErrorMessage(e, toast, form); + }, + }); + return ( + + + + {" "} + {t("nodes.addNewMarzbanNode")} + + + + + + + ); +}; + +type NodeFormType = FC<{ + form: UseFormReturn; + mutate: UseMutateFunction; + isLoading: boolean; + submitBtnText: string; + btnProps?: Partial; + btnLeftAdornment?: ReactNode; + addAsHost?: boolean; +}>; + +const NodeForm: NodeFormType = ({ + form, + mutate, + isLoading, + submitBtnText, + btnProps = {}, + btnLeftAdornment, + addAsHost = false, +}) => { + const { t } = useTranslation(); + const [showCertificate, setShowCertificate] = useState(false); + const { data: nodeSettings, isLoading: nodeSettingsLoading } = useQuery({ + queryKey: "node-settings", + queryFn: () => + fetch<{ + min_node_version: string; + certificate: string; + }>("/node/settings"), + }); + function selectText(node: HTMLElement) { + // @ts-ignore + if (document.body.createTextRange) { + // @ts-ignore + const range = document.body.createTextRange(); + range.moveToElementText(node); + range.select(); + } else if (window.getSelection) { + const selection = window.getSelection(); + const range = document.createRange(); + range.selectNodeContents(node); + selection!.removeAllRanges(); + selection!.addRange(range); + } else { + console.warn("Could not select text in node: Unsupported browser."); + } + } + + return ( +
mutate(v))}> + + {nodeSettings && nodeSettings.certificate && ( + + + {t("nodes.connection-hint")} + + + + + {!showCertificate ? ( + + ) : ( + + )} + + + + + { + selectText(e.target as HTMLElement); + }} + > + {nodeSettings.certificate} + + + + + )} + + + + + + + { + return ( + + + { + if (e.target.checked) { + field.onChange("connecting"); + } else { + field.onChange("disabled"); + } + }} + /> + + + ); + }} + /> + + + + + + + + + + + + + + {addAsHost && ( + + + {t("nodes.addHostForEveryInbound")} + + + )} + + {btnLeftAdornment} + + + +
+ ); +}; + +export const NodesDialog: FC = () => { + const { isEditingNodes, onEditingNodes } = useDashboard(); + const { t } = useTranslation(); + const [openAccordions, setOpenAccordions] = useState({}); + const { data: nodes, isLoading } = useNodesQuery(); + + const onClose = () => { + setOpenAccordions({}); + onEditingNodes(false); + }; + + const toggleAccordion = (index: number | string) => { + if (openAccordions[String(index)]) { + delete openAccordions[String(index)]; + } else openAccordions[String(index)] = {}; + + setOpenAccordions({ ...openAccordions }); + }; + + return ( + <> + + + + + + + + + + + + {t("nodes.title")} + + {isLoading && "loading..."} + + parseInt(i))} + > + + {!isLoading && + nodes && + nodes.map((node, index) => { + return ( + toggleAccordion(index)} + key={node.name} + node={node} + /> + ); + })} + + toggleAccordion((nodes || []).length)} + resetAccordions={() => setOpenAccordions({})} + /> + + + + + + setOpenAccordions({})} /> + + ); +}; diff --git a/app/dashboard/src/components/NodesUsage.tsx b/app/dashboard/src/components/NodesUsage.tsx new file mode 100644 index 0000000..45e376f --- /dev/null +++ b/app/dashboard/src/components/NodesUsage.tsx @@ -0,0 +1,114 @@ +import { + Box, + CircularProgress, + HStack, + Modal, + ModalBody, + ModalCloseButton, + ModalContent, + ModalFooter, + ModalHeader, + ModalOverlay, + Text, + VStack, + chakra, + useColorMode, +} from "@chakra-ui/react"; +import { ChartPieIcon } from "@heroicons/react/24/outline"; +import { FilterUsageType, useDashboard } from "contexts/DashboardContext"; +import { useNodes } from "contexts/NodesContext"; +import dayjs from "dayjs"; +import { FC, Suspense, useEffect, useState } from "react"; +import ReactApexChart from "react-apexcharts"; +import { useTranslation } from "react-i18next"; +import { Icon } from "./Icon"; +import { UsageFilter, createUsageConfig } from "./UsageFilter"; + +const UsageIcon = chakra(ChartPieIcon, { + baseStyle: { + w: 5, + h: 5, + }, +}); + +export type NodesUsageProps = {}; + +export const NodesUsage: FC = () => { + const { isShowingNodesUsage, onShowingNodesUsage } = useDashboard(); + const { fetchNodesUsage } = useNodes(); + const { t } = useTranslation(); + const [loading, setLoading] = useState(false); + const { colorMode } = useColorMode(); + + const usageTitle = t("userDialog.total"); + const [usage, setUsage] = useState(createUsageConfig(colorMode, usageTitle)); + const [usageFilter, setUsageFilter] = useState("1m"); + const fetchUsageWithFilter = (query: FilterUsageType) => { + fetchNodesUsage(query).then((data: any) => { + const labels = []; + const series = []; + for (const key in data.usages) { + const entry = data.usages[key]; + series.push(entry.uplink + entry.downlink); + labels.push(entry.node_name); + } + setUsage(createUsageConfig(colorMode, usageTitle, series, labels)); + }); + }; + + useEffect(() => { + if (isShowingNodesUsage) { + fetchUsageWithFilter({ + start: dayjs().utc().subtract(30, "day").format("YYYY-MM-DDTHH:00:00"), + }); + } + }, [isShowingNodesUsage]); + + const onClose = () => { + onShowingNodesUsage(false); + setUsageFilter("1m"); + }; + + const disabled = loading; + + return ( + + + + + + + + + + {t("header.nodesUsage")} + + + + + + + { + setUsageFilter(filter); + fetchUsageWithFilter(query); + }} + /> + + }> + + + + + + + + + ); +}; diff --git a/app/dashboard/src/components/OnlineBadge.tsx b/app/dashboard/src/components/OnlineBadge.tsx new file mode 100644 index 0000000..0c0e44e --- /dev/null +++ b/app/dashboard/src/components/OnlineBadge.tsx @@ -0,0 +1,31 @@ +import {FC} from "react"; + +type UserStatusProps = { + lastOnline?: string | null; +}; + +const convertDateFormat = (lastOnline: string | null | undefined): number | null => { + if (!lastOnline) { + return null; + } + + const date = new Date(lastOnline + "Z"); + return Math.floor(date.getTime() / 1000); +}; + +export const OnlineBadge: FC = ({lastOnline}) => { + const currentTimeInSeconds = Math.floor(Date.now() / 1000); + const unixTime = convertDateFormat(lastOnline); + + if (typeof lastOnline === 'undefined' || lastOnline === null) { + return
; + } + + const timeDifferenceInSeconds = unixTime ? currentTimeInSeconds - unixTime : Infinity; + + if (timeDifferenceInSeconds > 0 && timeDifferenceInSeconds <= 60) { + return
; + } + + return
; +}; \ No newline at end of file diff --git a/app/dashboard/src/components/OnlineStatus.tsx b/app/dashboard/src/components/OnlineStatus.tsx new file mode 100644 index 0000000..dfd8887 --- /dev/null +++ b/app/dashboard/src/components/OnlineStatus.tsx @@ -0,0 +1,43 @@ +import {FC} from "react"; +import {Text} from "@chakra-ui/react"; +import {relativeExpiryDate} from "utils/dateFormatter"; + +type UserStatusProps = { + lastOnline: string | null; +}; + +const convertDateFormat = (lastOnline: string | null): number | null => { + if (!lastOnline) { + return null; + } + + const date = new Date(lastOnline + "Z"); + return Math.floor(date.getTime() / 1000); +}; + +export const OnlineStatus: FC = ({lastOnline}) => { + const currentTimeInSeconds = Math.floor(Date.now() / 1000); + const unixTime = convertDateFormat(lastOnline); + + const timeDifferenceInSeconds = unixTime ? currentTimeInSeconds - unixTime : null; + const dateInfo = unixTime ? relativeExpiryDate(unixTime) : {status: "", time: "Not Connected Yet"}; + + return ( + + {timeDifferenceInSeconds && timeDifferenceInSeconds <= 60 + ? "Online" + : timeDifferenceInSeconds + ? `${dateInfo.time} ago` + : dateInfo.time} + + ); +}; \ No newline at end of file diff --git a/app/dashboard/src/components/Pagination.tsx b/app/dashboard/src/components/Pagination.tsx new file mode 100644 index 0000000..44efadf --- /dev/null +++ b/app/dashboard/src/components/Pagination.tsx @@ -0,0 +1,168 @@ +import { + Box, + Button, + ButtonGroup, + chakra, + HStack, + Select, + Text, +} from "@chakra-ui/react"; +import { + ArrowLongLeftIcon, + ArrowLongRightIcon, +} from "@heroicons/react/24/outline"; +import { useDashboard } from "contexts/DashboardContext"; +import { ChangeEvent, FC } from "react"; +import { useTranslation } from "react-i18next"; +import { setUsersPerPageLimitSize } from "utils/userPreferenceStorage"; + +const PrevIcon = chakra(ArrowLongLeftIcon, { + baseStyle: { + w: 4, + h: 4, + }, +}); +const NextIcon = chakra(ArrowLongRightIcon, { + baseStyle: { + w: 4, + h: 4, + }, +}); + +export type PaginationType = { + count: number; + perPage: number; + page: number; + onChange?: (page: number) => void; +}; + +const MINIMAL_PAGE_ITEM_COUNT = 5; + +/** + * Generate numeric page items around current page. + * - Always include first and last page + * - Add ellipsis if needed + */ +function generatePageItems(total: number, current: number, width: number) { + if (width < MINIMAL_PAGE_ITEM_COUNT) { + throw new Error( + `Must allow at least ${MINIMAL_PAGE_ITEM_COUNT} page items` + ); + } + if (width % 2 === 0) { + throw new Error(`Must allow odd number of page items`); + } + if (total < width) { + return [...new Array(total).keys()]; + } + const left = Math.max( + 0, + Math.min(total - width, current - Math.floor(width / 2)) + ); + const items: (string | number)[] = new Array(width); + for (let i = 0; i < width; i += 1) { + items[i] = i + left; + } + // replace non-ending items with placeholders + if (items[0] > 0) { + items[0] = 0; + items[1] = "prev-more"; + } + if (items[items.length - 1] < total - 1) { + items[items.length - 1] = total - 1; + items[items.length - 2] = "next-more"; + } + return items; +} + +export const Pagination: FC = () => { + const { + filters, + onFilterChange, + users: { total }, + } = useDashboard(); + const { limit: perPage, offset } = filters; + + const page = (offset || 0) / (perPage || 1); + const noPages = Math.ceil(total / (perPage || 1)); + const pages = generatePageItems(noPages, page, 7); + + const changePage = (page: number) => { + onFilterChange({ + ...filters, + offset: page * (perPage as number), + }); + }; + + const handlePageSizeChange = (e: ChangeEvent) => { + onFilterChange({ + ...filters, + limit: parseInt(e.target.value), + }); + setUsersPerPageLimitSize(e.target.value); + }; + + const { t } = useTranslation(); + + return ( + + + + + + {t("itemsPerPage")} + + + + + + + {pages.map((pageIndex) => { + if (typeof pageIndex === "string") + return ; + return ( + + ); + })} + + + + + ); +}; diff --git a/app/dashboard/src/components/QRCodeDialog.tsx b/app/dashboard/src/components/QRCodeDialog.tsx new file mode 100644 index 0000000..970e31a --- /dev/null +++ b/app/dashboard/src/components/QRCodeDialog.tsx @@ -0,0 +1,175 @@ +import { + Box, + chakra, + HStack, + IconButton, + Modal, + ModalBody, + ModalCloseButton, + ModalContent, + ModalHeader, + ModalOverlay, + Text, + VStack, +} from "@chakra-ui/react"; +import { + ChevronLeftIcon, + ChevronRightIcon, + QrCodeIcon, +} from "@heroicons/react/24/outline"; +import { QRCodeCanvas } from "qrcode.react"; +import { FC, useState } from "react"; +import { useTranslation } from "react-i18next"; +import Slider from "react-slick"; +import "slick-carousel/slick/slick-theme.css"; +import "slick-carousel/slick/slick.css"; +import { useDashboard } from "../contexts/DashboardContext"; +import { Icon } from "./Icon"; + +const QRCode = chakra(QRCodeCanvas); +const NextIcon = chakra(ChevronRightIcon, { + baseStyle: { + w: 6, + h: 6, + color: "gray.600", + _dark: { + color: "white", + }, + }, +}); +const PrevIcon = chakra(ChevronLeftIcon, { + baseStyle: { + w: 6, + h: 6, + color: "gray.600", + _dark: { + color: "white", + }, + }, +}); +const QRIcon = chakra(QrCodeIcon, { + baseStyle: { + w: 5, + h: 5, + }, +}); + +export const QRCodeDialog: FC = () => { + const { QRcodeLinks, setQRCode, setSubLink, subscribeUrl } = useDashboard(); + const isOpen = QRcodeLinks !== null; + const [index, setIndex] = useState(0); + const { t } = useTranslation(); + const onClose = () => { + setQRCode(null); + setSubLink(null); + }; + + const subscribeQrLink = String(subscribeUrl).startsWith("/") + ? window.location.origin + subscribeUrl + : String(subscribeUrl); + + return ( + + + + + + + + + + {QRcodeLinks && ( + + {subscribeUrl && ( + + + + {t("qrcodeDialog.sublink")} + + + )} + + setIndex(0)} + nextArrow={ + + + + } + prevArrow={ + + + + } + > + {QRcodeLinks.map((link, i) => { + return ( + + + + ); + })} + + + {index + 1} / {QRcodeLinks.length} + + + + )} + + + ); +}; diff --git a/app/dashboard/src/components/RadioGroup.tsx b/app/dashboard/src/components/RadioGroup.tsx new file mode 100644 index 0000000..38725dc --- /dev/null +++ b/app/dashboard/src/components/RadioGroup.tsx @@ -0,0 +1,537 @@ +import { + Accordion, + AccordionButton, + AccordionItem, + AccordionPanel, + Badge, + Box, + chakra, + Checkbox, + FormControl, + HStack, + IconButton, + Input, + Select, + SimpleGrid, + Text, + useCheckbox, + useCheckboxGroup, + UseRadioProps, + VStack, +} from "@chakra-ui/react"; +import { EllipsisVerticalIcon } from "@heroicons/react/24/outline"; +import { shadowsocksMethods, XTLSFlows } from "constants/Proxies"; +import { + InboundType, + ProtocolType, + useDashboard, +} from "contexts/DashboardContext"; +import { t } from "i18next"; +import { FC, forwardRef, PropsWithChildren, useState } from "react"; +import { + ControllerRenderProps, + useFormContext, + useWatch, +} from "react-hook-form"; + +const SettingsIcon = chakra(EllipsisVerticalIcon, { + baseStyle: { + strokeWidth: "2px", + w: 5, + h: 5, + }, +}); + +const InboundCard: FC< + PropsWithChildren +> = ({ inbound, ...props }) => { + const { getCheckboxProps, getInputProps, getLabelProps, htmlProps } = + useCheckbox(props); + const inputProps = getInputProps(); + return ( + + + + + + + {inbound.tag} ({inbound.network}) + + + + {inbound.tls && inbound.tls != "none" && ( + + {inbound.tls} + + )} + + + ); +}; + +const RadioCard: FC< + PropsWithChildren< + UseRadioProps & { + disabled?: boolean; + title: string; + description: string; + toggleAccordion: () => void; + isSelected: boolean; + } + > +> = ({ + disabled, + title, + description, + toggleAccordion, + isSelected, + ...props +}) => { + const form = useFormContext(); + const { inbounds } = useDashboard(); + const { getCheckboxProps, getInputProps, getLabelProps, htmlProps } = + useCheckbox(props); + + const inputProps = getInputProps(); + + const [inBoundDefaultValue] = useWatch({ + name: [`inbounds.${title}`], + control: form.control, + }); + + const { getCheckboxProps: getInboundCheckboxProps } = useCheckboxGroup({ + value: inBoundDefaultValue, + onChange: (selectedInbounds) => { + form.setValue(`inbounds.${title}`, selectedInbounds); + if (selectedInbounds.length === 0) { + const selected_proxies = form.getValues("selected_proxies"); + form.setValue( + `selected_proxies`, + selected_proxies.filter((p: string) => p !== title) + ); + toggleAccordion(); + } + }, + }); + + const isPartialSelected = + inBoundDefaultValue && + isSelected && + (useDashboard.getState().inbounds.get(title as ProtocolType) || []) + .length !== inBoundDefaultValue.length; + + const protocolHasInbound = + (useDashboard.getState().inbounds.get(title as ProtocolType) || []).length > + 0; + + const shouldBeDisabled = !isSelected && !protocolHasInbound; + + return ( + + + {isPartialSelected && ( + + )} + + svg": { + opacity: 1, + "&.checked": { + display: "block", + }, + "&.unchecked": { + display: "none", + }, + }, + "& p": { + opacity: 1, + }, + }} + __css={{ + "& > svg": { + opacity: 0.3, + "&.checked": { + display: "none", + }, + "&.unchecked": { + display: "block", + }, + }, + "& p": { + opacity: 0.8, + }, + }} + textTransform="capitalize" + px={3} + py={2} + fontWeight="medium" + {...getCheckboxProps()} + > + + + + + + + + {title} + + + {description} + + + + + + + {t("inbound")} + + {( + (inbounds.get(title as ProtocolType) as InboundType[]) || [] + ).map((inbound) => { + return ( + + ); + })} + + + {title === "vmess" && isSelected && ( + + + + ID + + + + + )} + {title === "vless" && isSelected && ( + + + + ID + + + + + + Flow + + + + + )} + {title === "trojan" && isSelected && ( + + + + {t("password")} + + + + + )} + {title === "shadowsocks" && isSelected && ( + + + + {t("password")} + + + + + + {t("userDialog.method")} + + + + + )} + + + + ); +}; + +export type RadioListType = { + title: string; + description: string; +}; + +export type RadioGroupProps = ControllerRenderProps & { + list: RadioListType[]; + disabled?: boolean; +}; + +export const RadioGroup = forwardRef( + ({ name, list, onChange, disabled, ...props }, ref) => { + const form = useFormContext(); + const [expandedAccordions, setExpandedAccordions] = useState([]); + + const toggleAccordion = (i: number) => { + if (expandedAccordions.includes(i)) + expandedAccordions.splice(expandedAccordions.indexOf(i), 1); + else expandedAccordions.push(i); + setExpandedAccordions([...expandedAccordions]); + }; + + const { getCheckboxProps } = useCheckboxGroup({ + value: props.value, + onChange: (value) => { + // active all inbounds when a proxy selected + const selectedItem = value.filter((el) => !props.value.includes(el)); + if (selectedItem[0]) { + form.setValue( + `inbounds.${selectedItem[0]}`, + useDashboard + .getState() + .inbounds.get(selectedItem[0] as ProtocolType) + ?.map((i) => i.tag) + ); + } + + setExpandedAccordions( + expandedAccordions.filter((i) => { + return value.find((title) => title === list[i].title); + }) + ); + + onChange({ + target: { + value, + name, + }, + }); + }, + }); + + return ( + + + {list.map((value, index) => { + return ( + v === value.title) + } + {...getCheckboxProps({ value: value.title })} + /> + ); + })} + + + ); + } +); diff --git a/app/dashboard/src/components/ResetAllUsageModal.tsx b/app/dashboard/src/components/ResetAllUsageModal.tsx new file mode 100644 index 0000000..82c0531 --- /dev/null +++ b/app/dashboard/src/components/ResetAllUsageModal.tsx @@ -0,0 +1,105 @@ +import { + Button, + chakra, + Modal, + ModalBody, + ModalCloseButton, + ModalContent, + ModalFooter, + ModalHeader, + ModalOverlay, + Spinner, + Text, + useToast, +} from "@chakra-ui/react"; +import { FC, useState } from "react"; +import { DocumentMinusIcon } from "@heroicons/react/24/outline"; +import { Icon } from "./Icon"; +import { useDashboard } from "contexts/DashboardContext"; +import { useTranslation } from "react-i18next"; + +export const ResetIcon = chakra(DocumentMinusIcon, { + baseStyle: { + w: 5, + h: 5, + }, +}); + +export type DeleteUserModalProps = {}; + +export const ResetAllUsageModal: FC = () => { + const [loading, setLoading] = useState(false); + const { isResetingAllUsage, onResetAllUsage, resetAllUsage } = useDashboard(); + const { t } = useTranslation(); + const toast = useToast(); + const onClose = () => { + onResetAllUsage(false); + }; + const onReset = () => { + setLoading(true); + resetAllUsage() + .then(() => { + toast({ + title: t("resetAllUsage.success"), + status: "success", + isClosable: true, + position: "top", + duration: 3000, + }); + }) + .catch(() => { + toast({ + title: t("resetAllUsage.error"), + status: "error", + isClosable: true, + position: "top", + duration: 3000, + }); + }) + .finally(() => { + setLoading(false); + }); + }; + return ( + + + + + + + + + + + + {t("resetAllUsage.title")} + + {isResetingAllUsage && ( + + {t("resetAllUsage.prompt")} + + )} + + + + + + + + ); +}; diff --git a/app/dashboard/src/components/ResetUserUsageModal.tsx b/app/dashboard/src/components/ResetUserUsageModal.tsx new file mode 100644 index 0000000..409f2a7 --- /dev/null +++ b/app/dashboard/src/components/ResetUserUsageModal.tsx @@ -0,0 +1,112 @@ +import { + Box, + Button, + chakra, + Modal, + ModalBody, + ModalCloseButton, + ModalContent, + ModalFooter, + ModalHeader, + ModalOverlay, + Spinner, + Text, + Toast, + useToast, +} from "@chakra-ui/react"; +import { FC, useEffect, useRef, useState } from "react"; +import { ArrowPathIcon } from "@heroicons/react/24/outline"; +import { Icon } from "./Icon"; +import { useDashboard } from "contexts/DashboardContext"; +import { useTranslation, Trans } from "react-i18next"; + +export const ResetIcon = chakra(ArrowPathIcon, { + baseStyle: { + w: 5, + h: 5, + }, +}); + +export type DeleteUserModalProps = {}; + +export const ResetUserUsageModal: FC = () => { + const [loading, setLoading] = useState(false); + const { resetUsageUser: user, resetDataUsage } = useDashboard(); + const { t } = useTranslation(); + const toast = useToast(); + const onClose = () => { + useDashboard.setState({ resetUsageUser: null }); + }; + const onReset = () => { + if (user) { + setLoading(true); + resetDataUsage(user) + .then(() => { + toast({ + title: t("resetUserUsage.success", {username: user.username}), + status: "success", + isClosable: true, + position: "top", + duration: 3000, + }); + }) + .catch(() => { + toast({ + title: t("resetUserUsage.error"), + status: "error", + isClosable: true, + position: "top", + duration: 3000, + }); + }) + .finally(() => { + setLoading(false); + }); + } + }; + return ( + + + + + + + + + + + + {t("resetUserUsage.title")} + + {user && ( + + }}> + {t("resetUserUsage.prompt", {username: user.username})} + + + )} + + + + + + + + ); +}; diff --git a/app/dashboard/src/components/RevokeSubscriptionModal.tsx b/app/dashboard/src/components/RevokeSubscriptionModal.tsx new file mode 100644 index 0000000..c510771 --- /dev/null +++ b/app/dashboard/src/components/RevokeSubscriptionModal.tsx @@ -0,0 +1,109 @@ +import { + Button, + chakra, + Modal, + ModalBody, + ModalCloseButton, + ModalContent, + ModalFooter, + ModalHeader, + ModalOverlay, + Spinner, + Text, + useToast, +} from "@chakra-ui/react"; +import { ArrowPathIcon } from "@heroicons/react/24/outline"; +import { useDashboard } from "contexts/DashboardContext"; +import { FC, useState } from "react"; +import { Trans, useTranslation } from "react-i18next"; +import { Icon } from "./Icon"; + +export const ResetIcon = chakra(ArrowPathIcon, { + baseStyle: { + w: 5, + h: 5, + }, +}); + +export type RevokeSubscriptionModalProps = {}; + +export const RevokeSubscriptionModal: FC = () => { + const [loading, setLoading] = useState(false); + const { revokeSubscriptionUser: user, revokeSubscription } = useDashboard(); + const { t } = useTranslation(); + const toast = useToast(); + const onClose = () => { + useDashboard.setState({ revokeSubscriptionUser: null }); + }; + const onReset = () => { + if (user) { + setLoading(true); + revokeSubscription(user) + .then(() => { + toast({ + title: t("revokeUserSub.success", { username: user.username }), + status: "success", + isClosable: true, + position: "top", + duration: 3000, + }); + }) + .catch(() => { + toast({ + title: t("revokeUserSub.error"), + status: "error", + isClosable: true, + position: "top", + duration: 3000, + }); + }) + .finally(() => { + setLoading(false); + }); + } + }; + return ( + + + + + + + + + + + + {t("revokeUserSub.title")} + + {user && ( + + }}> + {t("revokeUserSub.prompt", { username: user.username })} + + + )} + + + + + + + + ); +}; diff --git a/app/dashboard/src/components/ServicesSelectList.tsx b/app/dashboard/src/components/ServicesSelectList.tsx new file mode 100644 index 0000000..660834e --- /dev/null +++ b/app/dashboard/src/components/ServicesSelectList.tsx @@ -0,0 +1,132 @@ + +import { + Box, + chakra, + ChakraComponent, + Flex, + Spacer, + Stack, + Text, +} from "@chakra-ui/react"; +import { ServerStackIcon, UsersIcon } from "@heroicons/react/24/outline"; +import { + useDashboard, +} from "contexts/DashboardContext"; +import { FC, forwardRef, PropsWithChildren, useEffect, useState } from "react"; +import { + useFormContext, +} from "react-hook-form"; +import { Service } from "types/Service"; + +const ServiceIconBaseStyle = { + baseStyle: { + strokeWidth: "2px", + color: "primary.500", + w: 5, + h: 5, + mx: "6px", + }, +} + +const UsersServiceIcon = chakra(UsersIcon, ServiceIconBaseStyle); + +const InboundsServiceIcon = chakra(ServerStackIcon, ServiceIconBaseStyle); + +type ServicePropertyStatusProps = { + value: number; + StatusIcon: ChakraComponent; +} + +const ServicePropertyStatus: FC = ({ value, StatusIcon }) => { + const [valueState, _] = useState(value); + return ( + + + {valueState} + + ); +}; + +type CustomCheckboxProps = { + isChecked: boolean; + onChange: () => void; + service: Service; + value: string; +} + +const CustomCheckbox = forwardRef( + ({ isChecked, onChange, service, ...props }: CustomCheckboxProps, ref: Ref) => ( + + + {service.name} + + + + + / + + + + ) +); + + +interface ServicesSelectListProps { + list: Service[]; +} + +export const ServicesSelectList = forwardRef( + function({ list, ...props }, ref) { + const form = useFormContext(); + + const handleServiceToggle = (serviceId: number) => { + const currentServices = form.getValues('services'); + const isSelected = currentServices.includes(serviceId); + + let updatedServices; + + if (isSelected) { + updatedServices = currentServices.filter((id: number) => id !== serviceId); + } else { + updatedServices = [...currentServices, serviceId]; + } + + form.setValue('services', updatedServices, { shouldValidate: true }); + }; + + return ( + + {list.map((service: Service) => ( + + + handleServiceToggle(service.id)} + service={service} + value={String(service.id)} + /> + + + ))} + + ); + }); diff --git a/app/dashboard/src/components/Statistics.tsx b/app/dashboard/src/components/Statistics.tsx new file mode 100644 index 0000000..c783bfa --- /dev/null +++ b/app/dashboard/src/components/Statistics.tsx @@ -0,0 +1,195 @@ +import { Box, BoxProps, Card, chakra, HStack, Text } from "@chakra-ui/react"; +import { + ChartBarIcon, + ChartPieIcon, + UsersIcon, +} from "@heroicons/react/24/outline"; +import { useDashboard } from "contexts/DashboardContext"; +import { FC, PropsWithChildren, ReactElement, ReactNode } from "react"; +import { useTranslation } from "react-i18next"; +import { useQuery } from "react-query"; +import { fetch } from "service/http"; +import { formatBytes, numberWithCommas } from "utils/formatByte"; + +const TotalUsersIcon = chakra(UsersIcon, { + baseStyle: { + w: 5, + h: 5, + position: "relative", + zIndex: "2", + }, +}); + +const NetworkIcon = chakra(ChartBarIcon, { + baseStyle: { + w: 5, + h: 5, + position: "relative", + zIndex: "2", + }, +}); + +const MemoryIcon = chakra(ChartPieIcon, { + baseStyle: { + w: 5, + h: 5, + position: "relative", + zIndex: "2", + }, +}); + +type StatisticCardProps = { + title: string; + content: ReactNode; + icon: ReactElement; +}; + +const StatisticCard: FC> = ({ + title, + content, + icon, +}) => { + return ( + + + + {icon} + + + {title} + + + + {content} + + + ); +}; +export const StatisticsQueryKey = "statistics-query-key"; +export const Statistics: FC = (props) => { + const { version } = useDashboard(); + const { data: systemData } = useQuery({ + queryKey: StatisticsQueryKey, + queryFn: () => fetch("/system"), + refetchInterval: 5000, + onSuccess: ({ version: currentVersion }) => { + if (version !== currentVersion) + useDashboard.setState({ version: currentVersion }); + }, + }); + const { t } = useTranslation(); + return ( + + + {numberWithCommas(systemData.users_active)} + + / {numberWithCommas(systemData.total_user)} + + + ) + } + icon={} + /> + } + /> + + {formatBytes(systemData.mem_used, 1, true)[0]} + + {formatBytes(systemData.mem_used, 1, true)[1]} /{" "} + {formatBytes(systemData.mem_total, 1)} + + + ) + } + icon={} + /> + + ); +}; diff --git a/app/dashboard/src/components/StatusBadge.tsx b/app/dashboard/src/components/StatusBadge.tsx new file mode 100644 index 0000000..87c4da3 --- /dev/null +++ b/app/dashboard/src/components/StatusBadge.tsx @@ -0,0 +1,67 @@ +import { Badge, Text } from "@chakra-ui/react"; + +import { statusColors } from "constants/UserSettings"; +import { FC } from "react"; +import { useTranslation } from "react-i18next"; +import { Status as UserStatusType } from "types/User"; +import { relativeExpiryDate } from "utils/dateFormatter"; + +type UserStatusProps = { + expiryDate?: number | null; + status: UserStatusType; + compact?: boolean; + showDetail?: boolean; + extraText?: string | null; +}; +export const StatusBadge: FC = ({ + expiryDate, + status: userStatus, + compact = false, + showDetail = true, + extraText, +}) => { + const { t } = useTranslation(); + const dateInfo = relativeExpiryDate(expiryDate); + const Icon = statusColors[userStatus].icon; + return ( + <> + + + {showDetail && ( + + {userStatus} + {extraText && `: ${extraText}`} + + )} + + {showDetail && expiryDate && ( + + {t(dateInfo.status, { time: dateInfo.time })} + + )} + + ); +}; diff --git a/app/dashboard/src/components/Textarea.tsx b/app/dashboard/src/components/Textarea.tsx new file mode 100644 index 0000000..079b36a --- /dev/null +++ b/app/dashboard/src/components/Textarea.tsx @@ -0,0 +1,142 @@ +import { + chakra, + FormControl, + FormErrorMessage, + FormLabel, + InputGroup, + InputLeftAddon, + InputRightAddon, + InputRightElement, + Textarea as ChakraTextarea, + TextareaProps as ChakraTextareaProps, +} from "@chakra-ui/react"; +import { XMarkIcon } from "@heroicons/react/24/outline"; +import classNames from "classnames"; +import React, { PropsWithChildren, ReactNode } from "react"; + +const ClearIcon = chakra(XMarkIcon, { + baseStyle: { + w: 4, + h: 4, + }, +}); + +export type TextareaProps = PropsWithChildren< + { + value?: string; + className?: string; + endAdornment?: ReactNode; + startAdornment?: ReactNode; + type?: string; + placeholder?: string; + onChange?: (e: any) => void; + onBlur?: (e: any) => void; + onClick?: (e: any) => void; + name?: string; + error?: string; + disabled?: boolean; + step?: number; + label?: string; + clearable?: boolean; + } & ChakraTextareaProps +>; + +export const Textarea = React.forwardRef( + ( + { + disabled, + step, + label, + className, + startAdornment, + endAdornment, + placeholder, + onChange, + onBlur, + name, + value, + onClick, + error, + clearable = false, + ...props + }, + ref + ) => { + const clear = () => { + if (onChange) + onChange({ + target: { + value: "", + name, + }, + }); + }; + const { size = "md" } = props; + + return ( + + {label && {label}} + + {startAdornment && {startAdornment}} + {/* @ts-ignore */} + + {endAdornment && ( + + {endAdornment} + + )} + {clearable && value && value.length && ( + + + + )} + + {!!error && {error}} + + ); + } +); diff --git a/app/dashboard/src/components/UsageFilter.tsx b/app/dashboard/src/components/UsageFilter.tsx new file mode 100644 index 0000000..4a3d45a --- /dev/null +++ b/app/dashboard/src/components/UsageFilter.tsx @@ -0,0 +1,382 @@ +import { + Box, + ColorMode, + HStack, + Icon, + SimpleGrid, + Tab, + TabList, + TabPanel, + TabPanels, + Tabs, + Text, + UseRadioProps, + VStack, + useBreakpointValue, + useColorMode, + useDisclosure, + useOutsideClick, + useRadio, + useRadioGroup, +} from "@chakra-ui/react"; +import { CalendarIcon, ChevronRightIcon } from "@heroicons/react/24/outline"; +import { ApexOptions } from "apexcharts"; +import { FilterUsageType } from "contexts/DashboardContext"; +import dayjs, { ManipulateType } from "dayjs"; +import { FC, useRef, useState } from "react"; +import ReactDatePicker from "react-datepicker"; +import { useTranslation } from "react-i18next"; +import { generateDistinctColors } from "utils/color"; +import { formatBytes } from "utils/formatByte"; + +type DateType = Date | null; + +const FilterItem: FC = ({ + border, + ...props +}) => { + const { getInputProps, getRadioProps } = useRadio(props); + const fontSize = useBreakpointValue({ base: "xs", md: "sm" }); + return ( + + + + {props.children} + + + ); +}; + +export type UsageFilterProps = { + onChange: (filter: string, query: FilterUsageType) => void; + defaultValue: string; +}; + +export const UsageFilter: FC = ({ + onChange, + defaultValue, + ...props +}) => { + const { t, i18n } = useTranslation(); + const { colorMode } = useColorMode(); + + const filterOptions = useBreakpointValue({ + base: ["7h", "1d", "3d", "1w"], + md: ["7h", "1d", "3d", "1w", "1m", "3m"], + })!; + const filterOptionTypes = { + h: "hour", + d: "day", + w: "week", + m: "month", + y: "year", + }; + const customFilterOptions = useBreakpointValue({ + base: [ + { title: "hours", options: ["1h", "3h", "6h", "12h"] }, + { title: "days", options: ["1d", "2d", "3d", "4d"] }, + { title: "weeks", options: ["1w", "2w", "3w", "4w"] }, + { title: "months", options: ["1m", "2m", "3m", "6m"] }, + ], + md: [ + { title: "hours", options: ["1h", "2h", "3h", "6h", "8h", "12h"] }, + { title: "days", options: ["1d", "2d", "3d", "4d", "5d", "6d"] }, + { title: "weeks", options: ["1w", "2w", "3w", "4w"] }, + { title: "months", options: ["1m", "2m", "3m", "6m", "8m"] }, + ], + })!; + const { + getRootProps, + getRadioProps, + setValue: setDefaultFilter, + } = useRadioGroup({ + name: "filter", + defaultValue: defaultValue, + onChange: (value: string) => { + if (value === "custom") { + return; + } + + closeCustom(); + + if (filterOptions.indexOf(value) >= 0) { + setCustomLabel(t("userDialog.custom")); + setCustom(false); + } else { + setCustomLabel(t("userDialog.custom") + ` (${value})`); + setCustom(true); + } + + const num = Number(value.substring(0, value.length - 1)); + const unit = + filterOptionTypes[ + value[value.length - 1] as keyof typeof filterOptionTypes + ]; + onChange(value, { + start: dayjs() + .utc() + .subtract(num, unit as ManipulateType) + .format("YYYY-MM-DDTHH:00:00"), + }); + }, + }); + + const { + isOpen: isCustomOpen, + onOpen: openCustom, + onClose: closeCustom, + } = useDisclosure(); + const customRef = useRef(null); + useOutsideClick({ ref: customRef, handler: closeCustom }); + + const [customLabel, setCustomLabel] = useState(t("userDialog.custom")); + const [custom, setCustom] = useState(false); + const [tabIndex, setTabIndex] = useState(0); + + const monthsShown = useBreakpointValue({ base: 1, md: 2 }); + const fontSize = useBreakpointValue({ base: "xs", md: "sm" }); + const [startDate, setStartDate] = useState(null as DateType); + const [endDate, setEndDate] = useState(null as DateType); + const onDateChange = (dates: [DateType, DateType]) => { + const [start, end] = dates; + if (endDate && !end) { + setStartDate(null); + setEndDate(null); + } else { + setStartDate(start); + setEndDate(end); + if (start && end) { + closeCustom(); + onChange("custom", { + start: dayjs(start).format("YYYY-MM-DDT00:00:00"), + end: dayjs(end).format("YYYY-MM-DDT23:59:59"), + }); + } + } + }; + + return ( + + {tabIndex == 0 && ( + + {filterOptions.map((value) => { + return ( + + {value} + + ); + })} + { + setStartDate(null); + setEndDate(null); + openCustom(); + }} + cursor="pointer" + borderRadius="md" + w="full" + fontSize={fontSize} + px={3} + py={1} + bg={custom ? "primary.500" : "unset"} + color={custom ? "white" : "unset"} + borderColor={custom ? "primary.500" : "unset"} + > + + {customLabel} + + + + + )} + {tabIndex == 1 && ( + + + {startDate + ? dayjs(startDate).format("YYYY-MM-DD (00:00)") + : t("userDialog.startDate")} + + + + {endDate + ? dayjs(endDate).format("YYYY-MM-DD (23:59)") + : t("userDialog.endDate")} + + + + )} + + setTabIndex(index)}> + + {t("userDialog.relative")} + {t("userDialog.absolute")} + + + + + {customFilterOptions.map((row) => { + return ( + + + + {t("userDialog." + row.title)} + + {row.options.map((value: string) => { + return ( + + {value} + + ); + })} + + + ); + })} + + + + + + + + + + + ); +}; + +export function createUsageConfig( + colorMode: ColorMode, + title: string, + series: any = [], + labels: any = [] +) { + const total = formatBytes((series as [number]).reduce((t, c) => (t += c), 0)); + return { + series: series, + options: { + labels: labels, + chart: { + width: "100%", + height: "100%", + type: "donut", + animations: { + enabled: false, + }, + }, + title: { + text: `${title}${total}`, + align: "center", + style: { + fontWeight: "var(--chakra-fontWeights-medium)", + color: + colorMode === "dark" ? "var(--chakra-colors-gray-300)" : undefined, + }, + }, + legend: { + position: "bottom", + labels: { + colors: colorMode === "dark" ? "#CBD5E0" : undefined, + useSeriesColors: false, + }, + }, + stroke: { + width: 1, + colors: undefined, + }, + dataLabels: { + formatter: (val, { seriesIndex, w }) => { + return formatBytes(w.config.series[seriesIndex], 1); + }, + }, + tooltip: { + custom: ({ series, seriesIndex, dataPointIndex, w }) => { + const readable = formatBytes(series[seriesIndex], 1); + const total = Math.max( + (series as [number]).reduce((t, c) => (t += c)), + 1 + ); + const percent = + Math.round((series[seriesIndex] / total) * 1000) / 10 + "%"; + return ` +
+ ${w.config.labels[seriesIndex]}: ${percent}, ${readable} +
+ `; + }, + }, + colors: generateDistinctColors(series.length), + } as ApexOptions, + }; +} diff --git a/app/dashboard/src/components/UserDialog/DefaultValues.ts b/app/dashboard/src/components/UserDialog/DefaultValues.ts new file mode 100644 index 0000000..c9e83b7 --- /dev/null +++ b/app/dashboard/src/components/UserDialog/DefaultValues.ts @@ -0,0 +1,15 @@ + +import { FormType } from "./FormSchema"; + +export const getDefaultValues = (): FormType => { + + return { + services: [], + data_limit: 0, + expire: null, + username: "", + data_limit_reset_strategy: "no_reset", + status: "active", + note: "", + }; +}; diff --git a/app/dashboard/src/components/UserDialog/FormSchema.ts b/app/dashboard/src/components/UserDialog/FormSchema.ts new file mode 100644 index 0000000..5925567 --- /dev/null +++ b/app/dashboard/src/components/UserDialog/FormSchema.ts @@ -0,0 +1,22 @@ + +import { z } from "zod"; +import { UserCreate } from "types/User"; + +export type FormType = Pick; +export const schema = z.object({ + username: z.string().min(1, { message: "Username is required" }), + note: z.string().nullable(), + data_limit: z + .string() + .min(0, "The minimum number is 0") + .or(z.number()) + .nullable() + .transform((str) => { + if (str) return Number((parseFloat(String(str)) * 1073741824).toFixed(5)); + return 0; + }), + expire: z.number().nullable(), + data_limit_reset_strategy: z.string(), + status: z.string(), + services: z.array(z.number()).nonempty({ message: "At least one service is required" }), +}); diff --git a/app/dashboard/src/components/UserDialog/ModalFooter.tsx b/app/dashboard/src/components/UserDialog/ModalFooter.tsx new file mode 100644 index 0000000..15703bb --- /dev/null +++ b/app/dashboard/src/components/UserDialog/ModalFooter.tsx @@ -0,0 +1,107 @@ +import React from 'react'; +import { + Button, + Tooltip, + HStack, + IconButton, + Spinner, +} from "@chakra-ui/react"; +import { DeleteIcon } from "../DeleteUserModal"; +import { UserUsageIcon } from "./UserDialogIcons"; +import { useTranslation } from 'react-i18next'; +import { User } from 'types/User'; +import { ModalFooter } from '@chakra-ui/react'; + +interface UserDialogFooterProps { + isEditing: boolean; + onDeletingUser: (user: User) => void; + handleUsageToggle: () => void; + handleResetUsage: () => void; + handleRevokeSubscription: () => void; + loading: boolean; + editingUser: User | null; + onClose: () => void; +} + +export const UserDialogModalFooter: React.FC = ({ + isEditing, + onClose, editingUser, + onDeletingUser, + handleUsageToggle, + handleResetUsage, + handleRevokeSubscription, + loading, +}) => { + + const { t, i18n } = useTranslation(); + return ( + + + + + {isEditing && editingUser !== null && ( + <> + + { + onDeletingUser(editingUser); + onClose(); + }} + > + + + + + + + + + + + + )} + + + + + + + ); +}; diff --git a/app/dashboard/src/components/UserDialog/ModalHeader.tsx b/app/dashboard/src/components/UserDialog/ModalHeader.tsx new file mode 100644 index 0000000..baffafe --- /dev/null +++ b/app/dashboard/src/components/UserDialog/ModalHeader.tsx @@ -0,0 +1,18 @@ + +import { ChakraComponent, Text, HStack, ModalHeader } from "@chakra-ui/react"; +import { Icon } from "../Icon"; + +export const UserDialogModalHeader = ({ HeaderIcon, title }: { HeaderIcon: ChakraComponent, title: string }) => { + return ( + + + + {HeaderIcon && } + + + {title} + + + + ); +} diff --git a/app/dashboard/src/components/UserDialog/UserDialogIcons.ts b/app/dashboard/src/components/UserDialog/UserDialogIcons.ts new file mode 100644 index 0000000..e01db84 --- /dev/null +++ b/app/dashboard/src/components/UserDialog/UserDialogIcons.ts @@ -0,0 +1,28 @@ + +import { chakra } from "@chakra-ui/react"; +import { + ChartPieIcon, + PencilIcon, + UserPlusIcon, +} from "@heroicons/react/24/outline"; + +export const AddUserIcon = chakra(UserPlusIcon, { + baseStyle: { + w: 5, + h: 5, + }, +}); + +export const EditUserIcon = chakra(PencilIcon, { + baseStyle: { + w: 5, + h: 5, + }, +}); + +export const UserUsageIcon = chakra(ChartPieIcon, { + baseStyle: { + w: 5, + h: 5, + }, +}); diff --git a/app/dashboard/src/components/UserDialog/index.tsx b/app/dashboard/src/components/UserDialog/index.tsx new file mode 100644 index 0000000..27a93f1 --- /dev/null +++ b/app/dashboard/src/components/UserDialog/index.tsx @@ -0,0 +1,513 @@ +import { + Alert, + AlertIcon, + Box, + Collapse, + Flex, + FormControl, + FormErrorMessage, + FormHelperText, + FormLabel, + Grid, + GridItem, + HStack, + ModalBody, + ModalCloseButton, + ModalContent, + Modal, + Select, + Switch, + Textarea, + Tooltip, + VStack, + useColorMode, + useToast, + Spinner, + ModalOverlay, +} from "@chakra-ui/react"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { resetStrategy } from "constants/UserSettings"; +import { FilterUsageType, useDashboard } from "contexts/DashboardContext"; +import dayjs from "dayjs"; +import { FC, useEffect, useState } from "react"; +import ReactApexChart from "react-apexcharts"; +import ReactDatePicker from "react-datepicker"; +import { Controller, FormProvider, useForm, useWatch } from "react-hook-form"; +import { useTranslation } from "react-i18next"; +import { + User, + UserCreate, +} from "types/User"; +import { relativeExpiryDate } from "utils/dateFormatter"; +import { Input } from "../Input"; +import { ServicesSelectList } from "../ServicesSelectList"; +import { UsageFilter, createUsageConfig } from "../UsageFilter"; +import { AddUserIcon, EditUserIcon } from "./UserDialogIcons"; +import { DevTool } from "@hookform/devtools"; +import { UserDialogModalHeader } from "./ModalHeader"; +import { UserDialogModalFooter } from "./ModalFooter"; +import { getDefaultValues } from "./DefaultValues"; +import { schema, FormType } from "./FormSchema"; + + +const formatUser = (user: User): FormType => { + return { + ...user, + data_limit: user.data_limit + ? Number((user.data_limit / 1073741824).toFixed(5)) + : user.data_limit, + }; +}; + + +export type UserDialogProps = {}; + +export const UserDialog: FC = () => { + const { + editingUser, + isCreatingNewUser, + services, + onCreateUser, + editUser, + fetchUserUsage, + refetchServices, + onEditingUser, + createUser, + onDeletingUser, + } = useDashboard(); + const isEditing = !!editingUser; + const isOpen = isCreatingNewUser || isEditing; + const [loading, setLoading] = useState(false); + const [error, setError] = useState(""); + const toast = useToast(); + const { t, i18n } = useTranslation(); + + const { colorMode } = useColorMode(); + + const [usageVisible, setUsageVisible] = useState(false); + const handleUsageToggle = () => { + setUsageVisible((current) => !current); + }; + + const form = useForm({ + defaultValues: getDefaultValues(), + resolver: zodResolver(schema), + }); + + const [dataLimit] = useWatch({ + control: form.control, + name: ["data_limit"], + }); + + const usageTitle = t("userDialog.total"); + const [usage, setUsage] = useState(createUsageConfig(colorMode, usageTitle)); + const [usageFilter, setUsageFilter] = useState("1m"); + const fetchUsageWithFilter = (query: FilterUsageType) => { + fetchUserUsage(editingUser!, query).then((data: any) => { + const labels = []; + const series = []; + for (const key in data.usages) { + series.push(data.usages[key].used_traffic); + labels.push(data.usages[key].node_name); + } + setUsage(createUsageConfig(colorMode, usageTitle, series, labels)); + }); + }; + + useEffect(() => { + if (isOpen) { + refetchServices(); + } + }, [isOpen]); + + + useEffect(() => { + if (editingUser) { + form.reset(formatUser(editingUser)); + + fetchUsageWithFilter({ + start: dayjs().utc().subtract(30, "day").format("YYYY-MM-DDTHH:00:00"), + }); + } + }, [editingUser]); + + const submit = async (values: FormType) => { + setLoading(true); + const methods = { edited: editUser, created: createUser }; + const method = isEditing ? "edited" : "created"; + setError(null); + console.log('Form errors:', form.formState.errors); + + console.log("For Value", values); + const { services, username, ...rest } = values; + + let body: UserCreate = { + ...rest, + username, + services, + data_limit: values.data_limit, + data_limit_reset_strategy: + values.data_limit && values.data_limit > 0 + ? values.data_limit_reset_strategy + : "no_reset", + status: + values.status === "active" || values.status === "disabled" + ? values.status + : "active", + }; + + await methods[method](body) + .then(() => { + toast({ + title: t( + isEditing ? "userDialog.userEdited" : "userDialog.userCreated", + { username: values.username } + ), + status: "success", + isClosable: true, + position: "top", + duration: 3000, + }); + onClose(); + }) + .catch((err) => { + if (err?.response?.status === 409 || err?.response?.status === 400) + setError(err?.response?._data?.detail); + if (err?.response?.status === 422) { + Object.keys(err.response._data.detail).forEach((key) => { + setError(err?.response._data.detail[key] as string); + form.setError( + key as "services" | "username" | "data_limit" | "expire", + { + type: "custom", + message: err.response._data.detail[key], + } + ); + }); + } + }) + .finally(() => { + setLoading(false); + }); + }; + + const onClose = () => { + form.reset(getDefaultValues()); + onCreateUser(false); + onEditingUser(null); + setError(null); + setUsageVisible(false); + setUsageFilter("1m"); + }; + + const handleResetUsage = () => { + useDashboard.setState({ resetUsageUser: editingUser }); + }; + + const handleRevokeSubscription = () => { + useDashboard.setState({ revokeSubscriptionUser: editingUser }); + }; + + const disabled = loading; + + return ( + + + + +
+ + + + + + + + + {t("username")} + + + {isEditing && ( + + { + return ( + + + { + if (e.target.checked) { + field.onChange("active"); + } else { + field.onChange("disabled"); + } + }} + /> + + + ); + }} + /> + + )} + + + + {t("userDialog.dataLimit")} + { + return ( + + ); + }} + /> + + 0)} + animateOpacity + style={{ width: "100%" }} + > + + + {t("userDialog.periodicUsageReset")} + + { + return ( + + ); + }} + /> + + + + {t("userDialog.expiryDate")} + { + function createDateAsUTC(num: number) { + return dayjs( + dayjs(num * 1000).utc() + // .format("MMMM D, YYYY") // exception with: dayjs.locale(lng); + ).toDate(); + } + const { status, time } = relativeExpiryDate( + field.value + ); + return ( + <> + { + field.onChange({ + target: { + value: date + ? dayjs( + dayjs(date) + .set("hour", 23) + .set("minute", 59) + .set("second", 59) + ) + .utc() + .valueOf() / 1000 + : 0, + name: "expire", + }, + }); + }} + customInput={ + + } + /> + {field.value ? ( + + {t(status, { time: time })} + + ) : ( + "" + )} + + ); + }} + /> + + + + {t("userDialog.note")} +