diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 74df148511..b979196cc1 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,5 +1,5 @@ # continuous integration -/.github/workflows/ @lstein @blessedcoolant @hipsterusername +/.github/workflows/ @lstein @blessedcoolant @hipsterusername @ebr # documentation /docs/ @lstein @blessedcoolant @hipsterusername @Millu @@ -10,7 +10,7 @@ # installation and configuration /pyproject.toml @lstein @blessedcoolant @hipsterusername -/docker/ @lstein @blessedcoolant @hipsterusername +/docker/ @lstein @blessedcoolant @hipsterusername @ebr /scripts/ @ebr @lstein @hipsterusername /installer/ @lstein @ebr @hipsterusername /invokeai/assets @lstein @ebr @hipsterusername @@ -26,9 +26,7 @@ # front ends /invokeai/frontend/CLI @lstein @hipsterusername -/invokeai/frontend/install @lstein @ebr @hipsterusername +/invokeai/frontend/install @lstein @ebr @hipsterusername /invokeai/frontend/merge @lstein @blessedcoolant @hipsterusername /invokeai/frontend/training @lstein @blessedcoolant @hipsterusername /invokeai/frontend/web @psychedelicious @blessedcoolant @maryhipp @hipsterusername - - diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 02bc10df90..0f0b953be7 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -42,6 +42,21 @@ Please provide steps on how to test changes, any hardware or software specifications as well as any other pertinent information. --> +## Merge Plan + + + ## Added/updated tests? - [ ] Yes diff --git a/.github/workflows/build-container.yml b/.github/workflows/build-container.yml index 60eba4a297..74fcc02ab3 100644 --- a/.github/workflows/build-container.yml +++ b/.github/workflows/build-container.yml @@ -40,10 +40,14 @@ jobs: - name: Free up more disk space on the runner # https://github.com/actions/runner-images/issues/2840#issuecomment-1284059930 run: | + echo "----- Free space before cleanup" + df -h sudo rm -rf /usr/share/dotnet sudo rm -rf "$AGENT_TOOLSDIRECTORY" sudo swapoff /mnt/swapfile sudo rm -rf /mnt/swapfile + echo "----- Free space after cleanup" + df -h - name: Checkout uses: actions/checkout@v3 @@ -91,6 +95,7 @@ jobs: # password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build container + timeout-minutes: 40 id: docker_build uses: docker/build-push-action@v4 with: diff --git a/.github/workflows/lint-frontend.yml b/.github/workflows/lint-frontend.yml index de1e8866b2..a4e1bba428 100644 --- a/.github/workflows/lint-frontend.yml +++ b/.github/workflows/lint-frontend.yml @@ -22,12 +22,22 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Setup Node 18 - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: '18' - - uses: actions/checkout@v3 - - run: 'yarn install --frozen-lockfile' - - run: 'yarn run lint:tsc' - - run: 'yarn run lint:madge' - - run: 'yarn run lint:eslint' - - run: 'yarn run lint:prettier' + - name: Checkout + uses: actions/checkout@v4 + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: '8.12.1' + - name: Install dependencies + run: 'pnpm install --prefer-frozen-lockfile' + - name: Typescript + run: 'pnpm run lint:tsc' + - name: Madge + run: 'pnpm run lint:madge' + - name: ESLint + run: 'pnpm run lint:eslint' + - name: Prettier + run: 'pnpm run lint:prettier' diff --git a/.github/workflows/pypi-release.yml b/.github/workflows/pypi-release.yml index 5b7d2cd2fa..162cbe3427 100644 --- a/.github/workflows/pypi-release.yml +++ b/.github/workflows/pypi-release.yml @@ -1,13 +1,15 @@ name: PyPI Release on: - push: - paths: - - 'invokeai/version/invokeai_version.py' workflow_dispatch: + inputs: + publish_package: + description: 'Publish build on PyPi? [true/false]' + required: true + default: 'false' jobs: - release: + build-and-release: if: github.repository == 'invoke-ai/InvokeAI' runs-on: ubuntu-22.04 env: @@ -15,19 +17,43 @@ jobs: TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} TWINE_NON_INTERACTIVE: 1 steps: - - name: checkout sources - uses: actions/checkout@v3 + - name: Checkout + uses: actions/checkout@v4 - - name: install deps + - name: Setup Node 18 + uses: actions/setup-node@v4 + with: + node-version: '18' + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: '8.12.1' + + - name: Install frontend dependencies + run: pnpm install --prefer-frozen-lockfile + working-directory: invokeai/frontend/web + + - name: Build frontend + run: pnpm run build + working-directory: invokeai/frontend/web + + - name: Install python dependencies run: pip install --upgrade build twine - - name: build package + - name: Build python package run: python3 -m build - - name: check distribution + - name: Upload build as workflow artifact + uses: actions/upload-artifact@v4 + with: + name: dist + path: dist + + - name: Check distribution run: twine check dist/* - - name: check PyPI versions + - name: Check PyPI versions if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release/') run: | pip install --upgrade requests @@ -36,6 +62,6 @@ jobs: EXISTS=scripts.pypi_helper.local_on_pypi(); \ print(f'PACKAGE_EXISTS={EXISTS}')" >> $GITHUB_ENV - - name: upload package - if: env.PACKAGE_EXISTS == 'False' && env.TWINE_PASSWORD != '' + - name: Publish build on PyPi + if: env.PACKAGE_EXISTS == 'False' && env.TWINE_PASSWORD != '' && github.event.inputs.publish_package == 'true' run: twine upload dist/* diff --git a/.gitignore b/.gitignore index 2b99d137b1..29d27d78ed 100644 --- a/.gitignore +++ b/.gitignore @@ -16,7 +16,7 @@ __pycache__/ .Python build/ develop-eggs/ -# dist/ +dist/ downloads/ eggs/ .eggs/ @@ -187,3 +187,4 @@ installer/install.bat installer/install.sh installer/update.bat installer/update.sh +installer/InvokeAI-Installer/ diff --git a/Makefile b/Makefile index 24722e2264..10d7a257c5 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,20 @@ # simple Makefile with scripts that are otherwise hard to remember # to use, run from the repo root `make ` +default: help + +help: + @echo Developer commands: + @echo + @echo "ruff Run ruff, fixing any safely-fixable errors and formatting" + @echo "ruff-unsafe Run ruff, fixing all fixable errors and formatting" + @echo "mypy Run mypy using the config in pyproject.toml to identify type mismatches and other coding errors" + @echo "mypy-all Run mypy ignoring the config in pyproject.tom but still ignoring missing imports" + @echo "frontend-build Build the frontend in order to run on localhost:9090" + @echo "frontend-dev Run the frontend in developer mode on localhost:5173" + @echo "installer-zip Build the installer .zip file for the current version" + @echo "tag-release Tag the GitHub repository with the current version (use at release time only!)" + # Runs ruff, fixing any safely-fixable errors and formatting ruff: ruff check . --fix @@ -18,4 +32,21 @@ mypy: # Runs mypy, ignoring the config in pyproject.toml but still ignoring missing (untyped) imports # (many files are ignored by the config, so this is useful for checking all files) mypy-all: - mypy scripts/invokeai-web.py --config-file= --ignore-missing-imports \ No newline at end of file + mypy scripts/invokeai-web.py --config-file= --ignore-missing-imports + +# Build the frontend +frontend-build: + cd invokeai/frontend/web && pnpm build + +# Run the frontend in dev mode +frontend-dev: + cd invokeai/frontend/web && pnpm dev + +# Installer zip file +installer-zip: + cd installer && ./create_installer.sh + +# Tag the release +tag-release: + cd installer && ./tag_release.sh + diff --git a/README.md b/README.md index 582fb718b3..b1689af88a 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@
-![project hero](https://github.com/invoke-ai/InvokeAI/assets/31807370/1a917d94-e099-4fa1-a70f-7dd8d0691018) +![project hero](https://github.com/invoke-ai/InvokeAI/assets/31807370/6e3728c7-e90e-4711-905c-3b55844ff5be) -# Invoke AI - Generative AI for Professional Creatives -## Professional Creative Tools for Stable Diffusion, Custom-Trained Models, and more. - To learn more about Invoke AI, get started instantly, or implement our Business solutions, visit [invoke.ai](https://invoke.ai) +# Invoke - Professional Creative AI Tools for Visual Media +## To learn more about Invoke, or implement our Business solutions, visit [invoke.com](https://www.invoke.com/about) + [![discord badge]][discord link] @@ -56,7 +56,9 @@ the foundation for multiple commercial products.
-![canvas preview](https://github.com/invoke-ai/InvokeAI/raw/main/docs/assets/canvas_preview.png) + +![Highlighted Features - Canvas and Workflows](https://github.com/invoke-ai/InvokeAI/assets/31807370/708f7a82-084f-4860-bfbe-e2588c53548d) +
@@ -125,8 +127,8 @@ and go to http://localhost:9090. You must have Python 3.10 through 3.11 installed on your machine. Earlier or later versions are not supported. -Node.js also needs to be installed along with yarn (can be installed with -the command `npm install -g yarn` if needed) +Node.js also needs to be installed along with `pnpm` (can be installed with +the command `npm install -g pnpm` if needed) 1. Open a command-line window on your machine. The PowerShell is recommended for Windows. 2. Create a directory to install InvokeAI into. You'll need at least 15 GB of free space: @@ -270,7 +272,7 @@ upgrade script.** See the next section for a Windows recipe. 3. Select option [1] to upgrade to the latest release. 4. Once the upgrade is finished you will be returned to the launcher -menu. Select option [7] "Re-run the configure script to fix a broken +menu. Select option [6] "Re-run the configure script to fix a broken install or to complete a major upgrade". This will run the configure script against the v2.3 directory and diff --git a/docker/.env.sample b/docker/.env.sample index 98ad307c04..70ecee0338 100644 --- a/docker/.env.sample +++ b/docker/.env.sample @@ -2,14 +2,17 @@ ## Any environment variables supported by InvokeAI can be specified here, ## in addition to the examples below. -# INVOKEAI_ROOT is the path to a path on the local filesystem where InvokeAI will store data. +# HOST_INVOKEAI_ROOT is the path on the docker host's filesystem where InvokeAI will store data. # Outputs will also be stored here by default. -# This **must** be an absolute path. -INVOKEAI_ROOT= +# If relative, it will be relative to the docker directory in which the docker-compose.yml file is located +#HOST_INVOKEAI_ROOT=../../invokeai-data + +# INVOKEAI_ROOT is the path to the root of the InvokeAI repository within the container. +# INVOKEAI_ROOT=~/invokeai # Get this value from your HuggingFace account settings page. # HUGGING_FACE_HUB_TOKEN= ## optional variables specific to the docker setup. -# GPU_DRIVER=cuda # or rocm +# GPU_DRIVER=nvidia #| rocm # CONTAINER_UID=1000 diff --git a/docker/Dockerfile b/docker/Dockerfile index 6aa6a43a1a..c89a5773f7 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -59,14 +59,16 @@ RUN --mount=type=cache,target=/root/.cache/pip \ # #### Build the Web UI ------------------------------------ -FROM node:18 AS web-builder +FROM node:20-slim AS web-builder +ENV PNPM_HOME="/pnpm" +ENV PATH="$PNPM_HOME:$PATH" +RUN corepack enable + WORKDIR /build COPY invokeai/frontend/web/ ./ -RUN --mount=type=cache,target=/usr/lib/node_modules \ - npm install --include dev -RUN --mount=type=cache,target=/usr/lib/node_modules \ - yarn vite build - +RUN --mount=type=cache,target=/pnpm/store \ + pnpm install --frozen-lockfile +RUN npx vite build #### Runtime stage --------------------------------------- @@ -100,6 +102,8 @@ ENV INVOKEAI_SRC=/opt/invokeai ENV VIRTUAL_ENV=/opt/venv/invokeai ENV INVOKEAI_ROOT=/invokeai ENV PATH="$VIRTUAL_ENV/bin:$INVOKEAI_SRC:$PATH" +ENV CONTAINER_UID=${CONTAINER_UID:-1000} +ENV CONTAINER_GID=${CONTAINER_GID:-1000} # --link requires buldkit w/ dockerfile syntax 1.4 COPY --link --from=builder ${INVOKEAI_SRC} ${INVOKEAI_SRC} @@ -117,7 +121,7 @@ WORKDIR ${INVOKEAI_SRC} RUN cd /usr/lib/$(uname -p)-linux-gnu/pkgconfig/ && ln -sf opencv4.pc opencv.pc RUN python3 -c "from patchmatch import patch_match" -RUN mkdir -p ${INVOKEAI_ROOT} && chown -R 1000:1000 ${INVOKEAI_ROOT} +RUN mkdir -p ${INVOKEAI_ROOT} && chown -R ${CONTAINER_UID}:${CONTAINER_GID} ${INVOKEAI_ROOT} COPY docker/docker-entrypoint.sh ./ ENTRYPOINT ["/opt/invokeai/docker-entrypoint.sh"] diff --git a/docker/README.md b/docker/README.md index 4291ece25f..c2e26bb9e4 100644 --- a/docker/README.md +++ b/docker/README.md @@ -1,6 +1,14 @@ # InvokeAI Containerized -All commands are to be run from the `docker` directory: `cd docker` +All commands should be run within the `docker` directory: `cd docker` + +## Quickstart :rocket: + +On a known working Linux+Docker+CUDA (Nvidia) system, execute `./run.sh` in this directory. It will take a few minutes - depending on your internet speed - to install the core models. Once the application starts up, open `http://localhost:9090` in your browser to Invoke! + +For more configuration options (using an AMD GPU, custom root directory location, etc): read on. + +## Detailed setup #### Linux @@ -18,12 +26,12 @@ All commands are to be run from the `docker` directory: `cd docker` This is done via Docker Desktop preferences -## Quickstart +### Configure Invoke environment 1. Make a copy of `env.sample` and name it `.env` (`cp env.sample .env` (Mac/Linux) or `copy example.env .env` (Windows)). Make changes as necessary. Set `INVOKEAI_ROOT` to an absolute path to: a. the desired location of the InvokeAI runtime directory, or b. an existing, v3.0.0 compatible runtime directory. -1. `docker compose up` +1. Execute `run.sh` The image will be built automatically if needed. @@ -37,19 +45,21 @@ The runtime directory (holding models and outputs) will be created in the locati The Docker daemon on the system must be already set up to use the GPU. In case of Linux, this involves installing `nvidia-docker-runtime` and configuring the `nvidia` runtime as default. Steps will be different for AMD. Please see Docker documentation for the most up-to-date instructions for using your GPU with Docker. +To use an AMD GPU, set `GPU_DRIVER=rocm` in your `.env` file. + ## Customize -Check the `.env.sample` file. It contains some environment variables for running in Docker. Copy it, name it `.env`, and fill it in with your own values. Next time you run `docker compose up`, your custom values will be used. +Check the `.env.sample` file. It contains some environment variables for running in Docker. Copy it, name it `.env`, and fill it in with your own values. Next time you run `run.sh`, your custom values will be used. You can also set these values in `docker-compose.yml` directly, but `.env` will help avoid conflicts when code is updated. -Example (values are optional, but setting `INVOKEAI_ROOT` is highly recommended): +Values are optional, but setting `INVOKEAI_ROOT` is highly recommended. The default is `~/invokeai`. Example: ```bash INVOKEAI_ROOT=/Volumes/WorkDrive/invokeai HUGGINGFACE_TOKEN=the_actual_token CONTAINER_UID=1000 -GPU_DRIVER=cuda +GPU_DRIVER=nvidia ``` Any environment variables supported by InvokeAI can be set here - please see the [Configuration docs](https://invoke-ai.github.io/InvokeAI/features/CONFIGURATION/) for further detail. diff --git a/docker/build.sh b/docker/build.sh deleted file mode 100755 index 3b3875c15c..0000000000 --- a/docker/build.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash -set -e - -build_args="" - -[[ -f ".env" ]] && build_args=$(awk '$1 ~ /\=[^$]/ {print "--build-arg " $0 " "}' .env) - -echo "docker compose build args:" -echo $build_args - -docker compose build $build_args diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index f7e92d6bf5..c368eeb56d 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -2,23 +2,8 @@ version: '3.8' -services: - invokeai: +x-invokeai: &invokeai image: "local/invokeai:latest" - # edit below to run on a container runtime other than nvidia-container-runtime. - # not yet tested with rocm/AMD GPUs - # Comment out the "deploy" section to run on CPU only - deploy: - resources: - reservations: - devices: - - driver: nvidia - count: 1 - capabilities: [gpu] - # For AMD support, comment out the deploy section above and uncomment the devices section below: - #devices: - # - /dev/kfd:/dev/kfd - # - /dev/dri:/dev/dri build: context: .. dockerfile: docker/Dockerfile @@ -36,7 +21,9 @@ services: ports: - "${INVOKEAI_PORT:-9090}:9090" volumes: - - ${INVOKEAI_ROOT:-~/invokeai}:${INVOKEAI_ROOT:-/invokeai} + - type: bind + source: ${HOST_INVOKEAI_ROOT:-${INVOKEAI_ROOT:-~/invokeai}} + target: ${INVOKEAI_ROOT:-/invokeai} - ${HF_HOME:-~/.cache/huggingface}:${HF_HOME:-/invokeai/.cache/huggingface} # - ${INVOKEAI_MODELS_DIR:-${INVOKEAI_ROOT:-/invokeai/models}} # - ${INVOKEAI_MODELS_CONFIG_PATH:-${INVOKEAI_ROOT:-/invokeai/configs/models.yaml}} @@ -50,3 +37,27 @@ services: # - | # invokeai-model-install --yes --default-only --config_file ${INVOKEAI_ROOT}/config_custom.yaml # invokeai-nodes-web --host 0.0.0.0 + +services: + invokeai-nvidia: + <<: *invokeai + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: 1 + capabilities: [gpu] + + invokeai-cpu: + <<: *invokeai + profiles: + - cpu + + invokeai-rocm: + <<: *invokeai + devices: + - /dev/kfd:/dev/kfd + - /dev/dri:/dev/dri + profiles: + - rocm diff --git a/docker/run.sh b/docker/run.sh index 4b595b06df..409df508dd 100755 --- a/docker/run.sh +++ b/docker/run.sh @@ -1,11 +1,32 @@ #!/usr/bin/env bash -set -e +set -e -o pipefail -# This script is provided for backwards compatibility with the old docker setup. -# it doesn't do much aside from wrapping the usual docker compose CLI. +run() { + local scriptdir=$(dirname "${BASH_SOURCE[0]}") + cd "$scriptdir" || exit 1 -SCRIPTDIR=$(dirname "${BASH_SOURCE[0]}") -cd "$SCRIPTDIR" || exit 1 + local build_args="" + local profile="" -docker compose up -d -docker compose logs -f + touch .env + build_args=$(awk '$1 ~ /=[^$]/ && $0 !~ /^#/ {print "--build-arg " $0 " "}' .env) && + profile="$(awk -F '=' '/GPU_DRIVER/ {print $2}' .env)" + + [[ -z "$profile" ]] && profile="nvidia" + + local service_name="invokeai-$profile" + + if [[ ! -z "$build_args" ]]; then + printf "%s\n" "docker compose build args:" + printf "%s\n" "$build_args" + fi + + docker compose build $build_args + unset build_args + + printf "%s\n" "starting service $service_name" + docker compose --profile "$profile" up -d "$service_name" + docker compose logs -f +} + +run diff --git a/docs/assets/features/upscale-dialog.png b/docs/assets/features/upscale-dialog.png index 937bda9db3..fd91f90a65 100644 Binary files a/docs/assets/features/upscale-dialog.png and b/docs/assets/features/upscale-dialog.png differ diff --git a/docs/assets/invoke-web-server-1.png b/docs/assets/invoke-web-server-1.png index 1834bce32e..e1cf27a217 100644 Binary files a/docs/assets/invoke-web-server-1.png and b/docs/assets/invoke-web-server-1.png differ diff --git a/docs/assets/invoke_ai_banner.png b/docs/assets/invoke_ai_banner.png index af2c9b1323..74d23f514d 100644 Binary files a/docs/assets/invoke_ai_banner.png and b/docs/assets/invoke_ai_banner.png differ diff --git a/docs/assets/nodes/groupsconditioning.png b/docs/assets/nodes/groupsconditioning.png index cf38a00290..baaf2b44e0 100644 Binary files a/docs/assets/nodes/groupsconditioning.png and b/docs/assets/nodes/groupsconditioning.png differ diff --git a/docs/assets/nodes/groupscontrol.png b/docs/assets/nodes/groupscontrol.png index f2e3d43e7d..a38e4e4bba 100644 Binary files a/docs/assets/nodes/groupscontrol.png and b/docs/assets/nodes/groupscontrol.png differ diff --git a/docs/assets/nodes/groupsimgvae.png b/docs/assets/nodes/groupsimgvae.png index ae6967cab1..03ac8d1f4a 100644 Binary files a/docs/assets/nodes/groupsimgvae.png and b/docs/assets/nodes/groupsimgvae.png differ diff --git a/docs/assets/nodes/groupsiterate.png b/docs/assets/nodes/groupsiterate.png index 82ec8bf020..50b762099a 100644 Binary files a/docs/assets/nodes/groupsiterate.png and b/docs/assets/nodes/groupsiterate.png differ diff --git a/docs/assets/nodes/groupslora.png b/docs/assets/nodes/groupslora.png index 736aff5914..74ae8a7073 100644 Binary files a/docs/assets/nodes/groupslora.png and b/docs/assets/nodes/groupslora.png differ diff --git a/docs/assets/nodes/groupsmultigenseeding.png b/docs/assets/nodes/groupsmultigenseeding.png index b54ec2afb7..dcd64c7758 100644 Binary files a/docs/assets/nodes/groupsmultigenseeding.png and b/docs/assets/nodes/groupsmultigenseeding.png differ diff --git a/docs/assets/nodes/groupsnoise.png b/docs/assets/nodes/groupsnoise.png index c825e314ae..d95b7ba307 100644 Binary files a/docs/assets/nodes/groupsnoise.png and b/docs/assets/nodes/groupsnoise.png differ diff --git a/docs/assets/nodes/groupsrandseed.png b/docs/assets/nodes/groupsrandseed.png deleted file mode 100644 index 9b8bcfdb17..0000000000 Binary files a/docs/assets/nodes/groupsrandseed.png and /dev/null differ diff --git a/docs/assets/nodes/linearview.png b/docs/assets/nodes/linearview.png index 0dc28534e3..fb6b3efca0 100644 Binary files a/docs/assets/nodes/linearview.png and b/docs/assets/nodes/linearview.png differ diff --git a/docs/assets/nodes/workflow_library.png b/docs/assets/nodes/workflow_library.png new file mode 100644 index 0000000000..a17593d3b6 Binary files /dev/null and b/docs/assets/nodes/workflow_library.png differ diff --git a/docs/contributing/DOWNLOAD_QUEUE.md b/docs/contributing/DOWNLOAD_QUEUE.md new file mode 100644 index 0000000000..d43c670d2c --- /dev/null +++ b/docs/contributing/DOWNLOAD_QUEUE.md @@ -0,0 +1,277 @@ +# The InvokeAI Download Queue + +The DownloadQueueService provides a multithreaded parallel download +queue for arbitrary URLs, with queue prioritization, event handling, +and restart capabilities. + +## Simple Example + +``` +from invokeai.app.services.download import DownloadQueueService, TqdmProgress + +download_queue = DownloadQueueService() +for url in ['https://github.com/invoke-ai/InvokeAI/blob/main/invokeai/assets/a-painting-of-a-fire.png?raw=true', + 'https://github.com/invoke-ai/InvokeAI/blob/main/invokeai/assets/birdhouse.png?raw=true', + 'https://github.com/invoke-ai/InvokeAI/blob/main/invokeai/assets/missing.png', + 'https://civitai.com/api/download/models/152309?type=Model&format=SafeTensor', + ]: + + # urls start downloading as soon as download() is called + download_queue.download(source=url, + dest='/tmp/downloads', + on_progress=TqdmProgress().update + ) + +download_queue.join() # wait for all downloads to finish +for job in download_queue.list_jobs(): + print(job.model_dump_json(exclude_none=True, indent=4),"\n") +``` + +Output: + +``` +{ + "source": "https://github.com/invoke-ai/InvokeAI/blob/main/invokeai/assets/a-painting-of-a-fire.png?raw=true", + "dest": "/tmp/downloads", + "id": 0, + "priority": 10, + "status": "completed", + "download_path": "/tmp/downloads/a-painting-of-a-fire.png", + "job_started": "2023-12-04T05:34:41.742174", + "job_ended": "2023-12-04T05:34:42.592035", + "bytes": 666734, + "total_bytes": 666734 +} + +{ + "source": "https://github.com/invoke-ai/InvokeAI/blob/main/invokeai/assets/birdhouse.png?raw=true", + "dest": "/tmp/downloads", + "id": 1, + "priority": 10, + "status": "completed", + "download_path": "/tmp/downloads/birdhouse.png", + "job_started": "2023-12-04T05:34:41.741975", + "job_ended": "2023-12-04T05:34:42.652841", + "bytes": 774949, + "total_bytes": 774949 +} + +{ + "source": "https://github.com/invoke-ai/InvokeAI/blob/main/invokeai/assets/missing.png", + "dest": "/tmp/downloads", + "id": 2, + "priority": 10, + "status": "error", + "job_started": "2023-12-04T05:34:41.742079", + "job_ended": "2023-12-04T05:34:42.147625", + "bytes": 0, + "total_bytes": 0, + "error_type": "HTTPError(Not Found)", + "error": "Traceback (most recent call last):\n File \"/home/lstein/Projects/InvokeAI/invokeai/app/services/download/download_default.py\", line 182, in _download_next_item\n self._do_download(job)\n File \"/home/lstein/Projects/InvokeAI/invokeai/app/services/download/download_default.py\", line 206, in _do_download\n raise HTTPError(resp.reason)\nrequests.exceptions.HTTPError: Not Found\n" +} + +{ + "source": "https://civitai.com/api/download/models/152309?type=Model&format=SafeTensor", + "dest": "/tmp/downloads", + "id": 3, + "priority": 10, + "status": "completed", + "download_path": "/tmp/downloads/xl_more_art-full_v1.safetensors", + "job_started": "2023-12-04T05:34:42.147645", + "job_ended": "2023-12-04T05:34:43.735990", + "bytes": 719020768, + "total_bytes": 719020768 +} +``` + +## The API + +The default download queue is `DownloadQueueService`, an +implementation of ABC `DownloadQueueServiceBase`. It juggles multiple +background download requests and provides facilities for interrogating +and cancelling the requests. Access to a current or past download task +is mediated via `DownloadJob` objects which report the current status +of a job request + +### The Queue Object + +A default download queue is located in +`ApiDependencies.invoker.services.download_queue`. However, you can +create additional instances if you need to isolate your queue from the +main one. + +``` +queue = DownloadQueueService(event_bus=events) +``` + +`DownloadQueueService()` takes three optional arguments: + +| **Argument** | **Type** | **Default** | **Description** | +|----------------|-----------------|---------------|-----------------| +| `max_parallel_dl` | int | 5 | Maximum number of simultaneous downloads allowed | +| `event_bus` | EventServiceBase | None | System-wide FastAPI event bus for reporting download events | +| `requests_session` | requests.sessions.Session | None | An alternative requests Session object to use for the download | + +`max_parallel_dl` specifies how many download jobs are allowed to run +simultaneously. Each will run in a different thread of execution. + +`event_bus` is an EventServiceBase, typically the one created at +InvokeAI startup. If present, download events are periodically emitted +on this bus to allow clients to follow download progress. + +`requests_session` is a url library requests Session object. It is +used for testing. + +### The Job object + +The queue operates on a series of download job objects. These objects +specify the source and destination of the download, and keep track of +the progress of the download. + +The only job type currently implemented is `DownloadJob`, a pydantic object with the +following fields: + +| **Field** | **Type** | **Default** | **Description** | +|----------------|-----------------|---------------|-----------------| +| _Fields passed in at job creation time_ | +| `source` | AnyHttpUrl | | Where to download from | +| `dest` | Path | | Where to download to | +| `access_token` | str | | [optional] string containing authentication token for access | +| `on_start` | Callable | | [optional] callback when the download starts | +| `on_progress` | Callable | | [optional] callback called at intervals during download progress | +| `on_complete` | Callable | | [optional] callback called after successful download completion | +| `on_error` | Callable | | [optional] callback called after an error occurs | +| `id` | int | auto assigned | Job ID, an integer >= 0 | +| `priority` | int | 10 | Job priority. Lower priorities run before higher priorities | +| | +| _Fields updated over the course of the download task_ +| `status` | DownloadJobStatus| | Status code | +| `download_path` | Path | | Path to the location of the downloaded file | +| `job_started` | float | | Timestamp for when the job started running | +| `job_ended` | float | | Timestamp for when the job completed or errored out | +| `job_sequence` | int | | A counter that is incremented each time a model is dequeued | +| `bytes` | int | 0 | Bytes downloaded so far | +| `total_bytes` | int | 0 | Total size of the file at the remote site | +| `error_type` | str | | String version of the exception that caused an error during download | +| `error` | str | | String version of the traceback associated with an error | +| `cancelled` | bool | False | Set to true if the job was cancelled by the caller| + +When you create a job, you can assign it a `priority`. If multiple +jobs are queued, the job with the lowest priority runs first. + +Every job has a `source` and a `dest`. `source` is a pydantic.networks AnyHttpUrl object. +The `dest` is a path on the local filesystem that specifies the +destination for the downloaded object. Its semantics are +described below. + +When the job is submitted, it is assigned a numeric `id`. The id can +then be used to fetch the job object from the queue. + +The `status` field is updated by the queue to indicate where the job +is in its lifecycle. Values are defined in the string enum +`DownloadJobStatus`, a symbol available from +`invokeai.app.services.download_manager`. Possible values are: + +| **Value** | **String Value** | ** Description ** | +|--------------|---------------------|-------------------| +| `WAITING` | waiting | Job is on the queue but not yet running| +| `RUNNING` | running | The download is started | +| `COMPLETED` | completed | Job has finished its work without an error | +| `ERROR` | error | Job encountered an error and will not run again| + +`job_started` and `job_ended` indicate when the job +was started (using a python timestamp) and when it completed. + +In case of an error, the job's status will be set to `DownloadJobStatus.ERROR`, the text of the +Exception that caused the error will be placed in the `error_type` +field and the traceback that led to the error will be in `error`. + +A cancelled job will have status `DownloadJobStatus.ERROR` and an +`error_type` field of "DownloadJobCancelledException". In addition, +the job's `cancelled` property will be set to True. + +### Callbacks + +Download jobs can be associated with a series of callbacks, each with +the signature `Callable[["DownloadJob"], None]`. The callbacks are assigned +using optional arguments `on_start`, `on_progress`, `on_complete` and +`on_error`. When the corresponding event occurs, the callback wil be +invoked and passed the job. The callback will be run in a `try:` +context in the same thread as the download job. Any exceptions that +occur during execution of the callback will be caught and converted +into a log error message, thereby allowing the download to continue. + +#### `TqdmProgress` + +The `invokeai.app.services.download.download_default` module defines a +class named `TqdmProgress` which can be used as an `on_progress` +handler to display a completion bar in the console. Use as follows: + +``` +from invokeai.app.services.download import TqdmProgress + +download_queue.download(source='http://some.server.somewhere/some_file', + dest='/tmp/downloads', + on_progress=TqdmProgress().update + ) + +``` + +### Events + +If the queue was initialized with the InvokeAI event bus (the case +when using `ApiDependencies.invoker.services.download_queue`), then +download events will also be issued on the bus. The events are: + +* `download_started` -- This is issued when a job is taken off the +queue and a request is made to the remote server for the URL headers, but before any data +has been downloaded. The event payload will contain the keys `source` +and `download_path`. The latter contains the path that the URL will be +downloaded to. + +* `download_progress -- This is issued periodically as the download +runs. The payload contains the keys `source`, `download_path`, +`current_bytes` and `total_bytes`. The latter two fields can be +used to display the percent complete. + +* `download_complete` -- This is issued when the download completes +successfully. The payload contains the keys `source`, `download_path` +and `total_bytes`. + +* `download_error` -- This is issued when the download stops because +of an error condition. The payload contains the fields `error_type` +and `error`. The former is the text representation of the exception, +and the latter is a traceback showing where the error occurred. + +### Job control + +To create a job call the queue's `download()` method. You can list all +jobs using `list_jobs()`, fetch a single job by its with +`id_to_job()`, cancel a running job with `cancel_job()`, cancel all +running jobs with `cancel_all_jobs()`, and wait for all jobs to finish +with `join()`. + +#### job = queue.download(source, dest, priority, access_token) + +Create a new download job and put it on the queue, returning the +DownloadJob object. + +#### jobs = queue.list_jobs() + +Return a list of all active and inactive `DownloadJob`s. + +#### job = queue.id_to_job(id) + +Return the job corresponding to given ID. + +Return a list of all active and inactive `DownloadJob`s. + +#### queue.prune_jobs() + +Remove inactive (complete or errored) jobs from the listing returned +by `list_jobs()`. + +#### queue.join() + +Block until all pending jobs have run to completion or errored out. + diff --git a/docs/contributing/MODEL_MANAGER.md b/docs/contributing/MODEL_MANAGER.md index 9d06366a23..880c8b2480 100644 --- a/docs/contributing/MODEL_MANAGER.md +++ b/docs/contributing/MODEL_MANAGER.md @@ -10,40 +10,41 @@ model. These are the: tracks the type of the model, its provenance, and where it can be found on disk. -* _ModelLoadServiceBase_ Responsible for loading a model from disk - into RAM and VRAM and getting it ready for inference. - -* _DownloadQueueServiceBase_ A multithreaded downloader responsible - for downloading models from a remote source to disk. The download - queue has special methods for downloading repo_id folders from - Hugging Face, as well as discriminating among model versions in - Civitai, but can be used for arbitrary content. - * _ModelInstallServiceBase_ A service for installing models to disk. It uses `DownloadQueueServiceBase` to download models and their metadata, and `ModelRecordServiceBase` to store that information. It is also responsible for managing the InvokeAI `models` directory and its contents. + +* _ModelMetadataStore_ and _ModelMetaDataFetch_ Backend modules that + are able to retrieve metadata from online model repositories, + transform them into Pydantic models, and cache them to the InvokeAI + SQL database. + +* _DownloadQueueServiceBase_ + A multithreaded downloader responsible + for downloading models from a remote source to disk. The download + queue has special methods for downloading repo_id folders from + Hugging Face, as well as discriminating among model versions in + Civitai, but can be used for arbitrary content. + + * _ModelLoadServiceBase_ (**CURRENTLY UNDER DEVELOPMENT - NOT IMPLEMENTED**) + Responsible for loading a model from disk + into RAM and VRAM and getting it ready for inference. + ## Location of the Code -All four of these services can be found in +The four main services can be found in `invokeai/app/services` in the following directories: * `invokeai/app/services/model_records/` -* `invokeai/app/services/downloads/` -* `invokeai/app/services/model_loader/` * `invokeai/app/services/model_install/` - -With the exception of the install service, each of these is a thin -shell around a corresponding implementation located in -`invokeai/backend/model_manager`. The main difference between the -modules found in app services and those in the backend folder is that -the former add support for event reporting and are more tied to the -needs of the InvokeAI API. +* `invokeai/app/services/downloads/` +* `invokeai/app/services/model_loader/` (**under development**) Code related to the FastAPI web API can be found in -`invokeai/app/api/routers/models.py`. +`invokeai/app/api/routers/model_records.py`. *** @@ -165,10 +166,6 @@ of the fields, including `name`, `model_type` and `base_model`, are shared between `ModelConfigBase` and `ModelBase`, and this is a potential source of confusion. -** TO DO: ** The `ModelBase` code needs to be revised to reduce the -duplication of similar classes and to support using the `key` as the -primary model identifier. - ## Reading and Writing Model Configuration Records The `ModelRecordService` provides the ability to retrieve model @@ -362,7 +359,7 @@ model and pass its key to `get_model()`. Several methods allow you to create and update stored model config records. -#### add_model(key, config) -> ModelConfigBase: +#### add_model(key, config) -> AnyModelConfig: Given a key and a configuration, this will add the model's configuration record to the database. `config` can either be a subclass of @@ -386,138 +383,483 @@ fields to be updated. This will return an `AnyModelConfig` on success, or raise `InvalidModelConfigException` or `UnknownModelException` exceptions on failure. -***TO DO:*** Investigate why `update_model()` returns an -`AnyModelConfig` while `add_model()` returns a `ModelConfigBase`. - -### rename_model(key, new_name) -> ModelConfigBase: - -This is a special case of `update_model()` for the use case of -changing the model's name. It is broken out because there are cases in -which the InvokeAI application wants to synchronize the model's name -with its path in the `models` directory after changing the name, type -or base. However, when using the ModelRecordService directly, the call -is equivalent to: - -``` -store.rename_model(key, {'name': 'new_name'}) -``` - -***TO DO:*** Investigate why `rename_model()` is returning a -`ModelConfigBase` while `update_model()` returns a `AnyModelConfig`. - *** -## Let's get loaded, the lowdown on ModelLoadService +## Model installation -The `ModelLoadService` is responsible for loading a named model into -memory so that it can be used for inference. Despite the fact that it -does a lot under the covers, it is very straightforward to use. +The `ModelInstallService` class implements the +`ModelInstallServiceBase` abstract base class, and provides a one-stop +shop for all your model install needs. It provides the following +functionality: -An application-wide model loader is created at API initialization time -and stored in -`ApiDependencies.invoker.services.model_loader`. However, you can -create alternative instances if you wish. +- Registering a model config record for a model already located on the + local filesystem, without moving it or changing its path. + +- Installing a model alreadiy located on the local filesystem, by + moving it into the InvokeAI root directory under the + `models` folder (or wherever config parameter `models_dir` + specifies). + +- Probing of models to determine their type, base type and other key + information. + +- Interface with the InvokeAI event bus to provide status updates on + the download, installation and registration process. + +- Downloading a model from an arbitrary URL and installing it in + `models_dir`. + +- Special handling for Civitai model URLs which allow the user to + paste in a model page's URL or download link + +- Special handling for HuggingFace repo_ids to recursively download + the contents of the repository, paying attention to alternative + variants such as fp16. + +- Saving tags and other metadata about the model into the invokeai database + when fetching from a repo that provides that type of information, + (currently only Civitai and HuggingFace). + +### Initializing the installer -### Creating a ModelLoadService object +A default installer is created at InvokeAI api startup time and stored +in `ApiDependencies.invoker.services.model_install` and can +also be retrieved from an invocation's `context` argument with +`context.services.model_install`. -The class is defined in -`invokeai.app.services.model_loader_service`. It is initialized with -an InvokeAIAppConfig object, from which it gets configuration -information such as the user's desired GPU and precision, and with a -previously-created `ModelRecordServiceBase` object, from which it -loads the requested model's configuration information. - -Here is a typical initialization pattern: +In the event you wish to create a new installer, you may use the +following initialization pattern: ``` from invokeai.app.services.config import InvokeAIAppConfig -from invokeai.app.services.model_record_service import ModelRecordServiceBase -from invokeai.app.services.model_loader_service import ModelLoadService +from invokeai.app.services.model_records import ModelRecordServiceSQL +from invokeai.app.services.model_install import ModelInstallService +from invokeai.app.services.download import DownloadQueueService +from invokeai.app.services.shared.sqlite import SqliteDatabase +from invokeai.backend.util.logging import InvokeAILogger config = InvokeAIAppConfig.get_config() -store = ModelRecordServiceBase.open(config) -loader = ModelLoadService(config, store) +config.parse_args() + +logger = InvokeAILogger.get_logger(config=config) +db = SqliteDatabase(config, logger) +record_store = ModelRecordServiceSQL(db) +queue = DownloadQueueService() +queue.start() + +installer = ModelInstallService(app_config=config, + record_store=record_store, + download_queue=queue + ) +installer.start() ``` -Note that we are relying on the contents of the application -configuration to choose the implementation of -`ModelRecordServiceBase`. +The full form of `ModelInstallService()` takes the following +required parameters: -### get_model(key, [submodel_type], [context]) -> ModelInfo: +| **Argument** | **Type** | **Description** | +|------------------|------------------------------|------------------------------| +| `app_config` | InvokeAIAppConfig | InvokeAI app configuration object | +| `record_store` | ModelRecordServiceBase | Config record storage database | +| `download_queue` | DownloadQueueServiceBase | Download queue object | +| `metadata_store` | Optional[ModelMetadataStore] | Metadata storage object | +|`session` | Optional[requests.Session] | Swap in a different Session object (usually for debugging) | -*** TO DO: change to get_model(key, context=None, **kwargs) -The `get_model()` method, like its similarly-named cousin in -`ModelRecordService`, receives the unique key that identifies the -model. It loads the model into memory, gets the model ready for use, -and returns a `ModelInfo` object. +Once initialized, the installer will provide the following methods: -The optional second argument, `subtype` is a `SubModelType` string -enum, such as "vae". It is mandatory when used with a main model, and -is used to select which part of the main model to load. +#### install_job = installer.import_model() -The optional third argument, `context` can be provided by -an invocation to trigger model load event reporting. See below for +The `import_model()` method is the core of the installer. The +following illustrates basic usage: + +``` +from invokeai.app.services.model_install import ( + LocalModelSource, + HFModelSource, + URLModelSource, +) + +source1 = LocalModelSource(path='/opt/models/sushi.safetensors') # a local safetensors file +source2 = LocalModelSource(path='/opt/models/sushi_diffusers') # a local diffusers folder + +source3 = HFModelSource(repo_id='runwayml/stable-diffusion-v1-5') # a repo_id +source4 = HFModelSource(repo_id='runwayml/stable-diffusion-v1-5', subfolder='vae') # a subfolder within a repo_id +source5 = HFModelSource(repo_id='runwayml/stable-diffusion-v1-5', variant='fp16') # a named variant of a HF model + +source6 = URLModelSource(url='https://civitai.com/api/download/models/63006') # model located at a URL +source7 = URLModelSource(url='https://civitai.com/api/download/models/63006', access_token='letmein') # with an access token + +for source in [source1, source2, source3, source4, source5, source6, source7]: + install_job = installer.install_model(source) + +source2job = installer.wait_for_installs(timeout=120) +for source in sources: + job = source2job[source] + if job.complete: + model_config = job.config_out + model_key = model_config.key + print(f"{source} installed as {model_key}") + elif job.errored: + print(f"{source}: {job.error_type}.\nStack trace:\n{job.error}") + +``` + +As shown here, the `import_model()` method accepts a variety of +sources, including local safetensors files, local diffusers folders, +HuggingFace repo_ids with and without a subfolder designation, +Civitai model URLs and arbitrary URLs that point to checkpoint files +(but not to folders). + +Each call to `import_model()` return a `ModelInstallJob` job, +an object which tracks the progress of the install. + +If a remote model is requested, the model's files are downloaded in +parallel across a multiple set of threads using the download +queue. During the download process, the `ModelInstallJob` is updated +to provide status and progress information. After the files (if any) +are downloaded, the remainder of the installation runs in a single +serialized background thread. These are the model probing, file +copying, and config record database update steps. + +Multiple install jobs can be queued up. You may block until all +install jobs are completed (or errored) by calling the +`wait_for_installs()` method as shown in the code +example. `wait_for_installs()` will return a `dict` that maps the +requested source to its job. This object can be interrogated +to determine its status. If the job errored out, then the error type +and details can be recovered from `job.error_type` and `job.error`. + +The full list of arguments to `import_model()` is as follows: + +| **Argument** | **Type** | **Default** | **Description** | +|------------------|------------------------------|-------------|-------------------------------------------| +| `source` | ModelSource | None | The source of the model, Path, URL or repo_id | +| `config` | Dict[str, Any] | None | Override all or a portion of model's probed attributes | + +The next few sections describe the various types of ModelSource that +can be passed to `import_model()`. + +`config` can be used to override all or a portion of the configuration +attributes returned by the model prober. See the section below for details. -The returned `ModelInfo` object shares some fields in common with -`ModelConfigBase`, but is otherwise a completely different beast: -| **Field Name** | **Type** | **Description** | +#### LocalModelSource + +This is used for a model that is located on a locally-accessible Posix +filesystem, such as a local disk or networked fileshare. + + +| **Argument** | **Type** | **Default** | **Description** | +|------------------|------------------------------|-------------|-------------------------------------------| +| `path` | str | Path | None | Path to the model file or directory | +| `inplace` | bool | False | If set, the model file(s) will be left in their location; otherwise they will be copied into the InvokeAI root's `models` directory | + +#### URLModelSource + +This is used for a single-file model that is accessible via a URL. The +fields are: + +| **Argument** | **Type** | **Default** | **Description** | +|------------------|------------------------------|-------------|-------------------------------------------| +| `url` | AnyHttpUrl | None | The URL for the model file. | +| `access_token` | str | None | An access token needed to gain access to this file. | + +The `AnyHttpUrl` class can be imported from `pydantic.networks`. + +Ordinarily, no metadata is retrieved from these sources. However, +there is special-case code in the installer that looks for HuggingFace +and Civitai URLs and fetches the corresponding model metadata from +the corresponding repo. + +#### CivitaiModelSource + +This is used for a model that is hosted by the Civitai web site. + +| **Argument** | **Type** | **Default** | **Description** | +|------------------|------------------------------|-------------|-------------------------------------------| +| `version_id` | int | None | The ID of the particular version of the desired model. | +| `access_token` | str | None | An access token needed to gain access to a subscriber's-only model. | + +Civitai has two model IDs, both of which are integers. The `model_id` +corresponds to a collection of model versions that may different in +arbitrary ways, such as derivation from different checkpoint training +steps, SFW vs NSFW generation, pruned vs non-pruned, etc. The +`version_id` points to a specific version. Please use the latter. + +Some Civitai models require an access token to download. These can be +generated from the Civitai profile page of a logged-in +account. Somewhat annoyingly, if you fail to provide the access token +when downloading a model that needs it, Civitai generates a redirect +to a login page rather than a 403 Forbidden error. The installer +attempts to catch this event and issue an informative error +message. Otherwise you will get an "unrecognized model suffix" error +when the model prober tries to identify the type of the HTML login +page. + +#### HFModelSource + +HuggingFace has the most complicated `ModelSource` structure: + +| **Argument** | **Type** | **Default** | **Description** | +|------------------|------------------------------|-------------|-------------------------------------------| +| `repo_id` | str | None | The ID of the desired model. | +| `variant` | ModelRepoVariant | ModelRepoVariant('fp16') | The desired variant. | +| `subfolder` | Path | None | Look for the model in a subfolder of the repo. | +| `access_token` | str | None | An access token needed to gain access to a subscriber's-only model. | + + +The `repo_id` is the repository ID, such as `stabilityai/sdxl-turbo`. + +The `variant` is one of the various diffusers formats that HuggingFace +supports and is used to pick out from the hodgepodge of files that in +a typical HuggingFace repository the particular components needed for +a complete diffusers model. `ModelRepoVariant` is an enum that can be +imported from `invokeai.backend.model_manager` and has the following +values: + +| **Name** | **String Value** | +|----------------------------|---------------------------| +| ModelRepoVariant.DEFAULT | "default" | +| ModelRepoVariant.FP16 | "fp16" | +| ModelRepoVariant.FP32 | "fp32" | +| ModelRepoVariant.ONNX | "onnx" | +| ModelRepoVariant.OPENVINO | "openvino" | +| ModelRepoVariant.FLAX | "flax" | + +You can also pass the string forms to `variant` directly. Note that +InvokeAI may not be able to load and run all variants. At the current +time, specifying `ModelRepoVariant.DEFAULT` will retrieve model files +that are unqualified, e.g. `pytorch_model.safetensors` rather than +`pytorch_model.fp16.safetensors`. These are usually the 32-bit +safetensors forms of the model. + +If `subfolder` is specified, then the requested model resides in a +subfolder of the main model repository. This is typically used to +fetch and install VAEs. + +Some models require you to be registered with HuggingFace and logged +in. To download these files, you must provide an +`access_token`. Internally, if no access token is provided, then +`HfFolder.get_token()` will be called to fill it in with the cached +one. + + +#### Monitoring the install job process + +When you create an install job with `import_model()`, it launches the +download and installation process in the background and returns a +`ModelInstallJob` object for monitoring the process. + +The `ModelInstallJob` class has the following structure: + +| **Attribute** | **Type** | **Description** | |----------------|-----------------|------------------| -| `key` | str | The model key derived from the ModelRecordService database | -| `name` | str | Name of this model | -| `base_model` | BaseModelType | Base model for this model | -| `type` | ModelType or SubModelType | Either the model type (non-main) or the submodel type (main models)| -| `location` | Path or str | Location of the model on the filesystem | -| `precision` | torch.dtype | The torch.precision to use for inference | -| `context` | ModelCache.ModelLocker | A context class used to lock the model in VRAM while in use | +| `id` | `int` | Integer ID for this job | +| `status` | `InstallStatus` | An enum of [`waiting`, `downloading`, `running`, `completed`, `error` and `cancelled`]| +| `config_in` | `dict` | Overriding configuration values provided by the caller | +| `config_out` | `AnyModelConfig`| After successful completion, contains the configuration record written to the database | +| `inplace` | `boolean` | True if the caller asked to install the model in place using its local path | +| `source` | `ModelSource` | The local path, remote URL or repo_id of the model to be installed | +| `local_path` | `Path` | If a remote model, holds the path of the model after it is downloaded; if a local model, same as `source` | +| `error_type` | `str` | Name of the exception that led to an error status | +| `error` | `str` | Traceback of the error | -The types for `ModelInfo` and `SubModelType` can be imported from -`invokeai.app.services.model_loader_service`. -To use the model, you use the `ModelInfo` as a context manager using -the following pattern: +If the `event_bus` argument was provided, events will also be +broadcast to the InvokeAI event bus. The events will appear on the bus +as an event of type `EventServiceBase.model_event`, a timestamp and +the following event names: + +##### `model_install_downloading` + +For remote models only, `model_install_downloading` events will be issued at regular +intervals as the download progresses. The event's payload contains the +following keys: + +| **Key** | **Type** | **Description** | +|----------------|-----------|------------------| +| `source` | str | String representation of the requested source | +| `local_path` | str | String representation of the path to the downloading model (usually a temporary directory) | +| `bytes` | int | How many bytes downloaded so far | +| `total_bytes` | int | Total size of all the files that make up the model | +| `parts` | List[Dict]| Information on the progress of the individual files that make up the model | + + +The parts is a list of dictionaries that give information on each of +the components pieces of the download. The dictionary's keys are +`source`, `local_path`, `bytes` and `total_bytes`, and correspond to +the like-named keys in the main event. + +Note that downloading events will not be issued for local models, and +that downloading events occur *before* the running event. + +##### `model_install_running` + +`model_install_running` is issued when all the required downloads have completed (if applicable) and the +model probing, copying and registration process has now started. + +The payload will contain the key `source`. + +##### `model_install_completed` + +`model_install_completed` is issued once at the end of a successful +installation. The payload will contain the keys `source`, +`total_bytes` and `key`, where `key` is the ID under which the model +has been registered. + +##### `model_install_error` + +`model_install_error` is emitted if the installation process fails for +some reason. The payload will contain the keys `source`, `error_type` +and `error`. `error_type` is a short message indicating the nature of +the error, and `error` is the long traceback to help debug the +problem. + +##### `model_install_cancelled` + +`model_install_cancelled` is issued if the model installation is +cancelled, or if one or more of its files' downloads are +cancelled. The payload will contain `source`. + +##### Following the model status + +You may poll the `ModelInstallJob` object returned by `import_model()` +to ascertain the state of the install. The job status can be read from +the job's `status` attribute, an `InstallStatus` enum which has the +enumerated values `WAITING`, `DOWNLOADING`, `RUNNING`, `COMPLETED`, +`ERROR` and `CANCELLED`. + +For convenience, install jobs also provided the following boolean +properties: `waiting`, `downloading`, `running`, `complete`, `errored` +and `cancelled`, as well as `in_terminal_state`. The last will return +True if the job is in the complete, errored or cancelled states. + + +#### Model confguration and probing + +The install service uses the `invokeai.backend.model_manager.probe` +module during import to determine the model's type, base type, and +other configuration parameters. Among other things, it assigns a +default name and description for the model based on probed +fields. + +When downloading remote models is implemented, additional +configuration information, such as list of trigger terms, will be +retrieved from the HuggingFace and Civitai model repositories. + +The probed values can be overriden by providing a dictionary in the +optional `config` argument passed to `import_model()`. You may provide +overriding values for any of the model's configuration +attributes. Here is an example of setting the +`SchedulerPredictionType` and `name` for an sd-2 model: ``` -model_info = loader.get_model('f13dd932c0c35c22dcb8d6cda4203764', SubModelType('vae')) -with model_info as vae: - image = vae.decode(latents)[0] +install_job = installer.import_model( + source=HFModelSource(repo_id='stabilityai/stable-diffusion-2-1',variant='fp32'), + config=dict( + prediction_type=SchedulerPredictionType('v_prediction') + name='stable diffusion 2 base model', + ) + ) ``` -The `vae` model will stay locked in the GPU during the period of time -it is in the context manager's scope. +### Other installer methods -`get_model()` may raise any of the following exceptions: +This section describes additional methods provided by the installer class. -- `UnknownModelException` -- key not in database -- `ModelNotFoundException` -- key in database but model not found at path -- `InvalidModelException` -- the model is guilty of a variety of sins - -** TO DO: ** Resolve discrepancy between ModelInfo.location and -ModelConfig.path. +#### jobs = installer.wait_for_installs([timeout]) -### Emitting model loading events +Block until all pending installs are completed or errored and then +returns a list of completed jobs. The optional `timeout` argument will +return from the call if jobs aren't completed in the specified +time. An argument of 0 (the default) will block indefinitely. -When the `context` argument is passed to `get_model()`, it will -retrieve the invocation event bus from the passed `InvocationContext` -object to emit events on the invocation bus. The two events are -"model_load_started" and "model_load_completed". Both carry the -following payload: +#### jobs = installer.list_jobs() -``` -payload=dict( - queue_id=queue_id, - queue_item_id=queue_item_id, - queue_batch_id=queue_batch_id, - graph_execution_state_id=graph_execution_state_id, - model_key=model_key, - submodel=submodel, - hash=model_info.hash, - location=str(model_info.location), - precision=str(model_info.precision), -) -``` +Return a list of all active and complete `ModelInstallJobs`. + +#### jobs = installer.get_job_by_source(source) + +Return a list of `ModelInstallJob` corresponding to the indicated +model source. + +#### jobs = installer.get_job_by_id(id) + +Return a list of `ModelInstallJob` corresponding to the indicated +model id. + +#### jobs = installer.cancel_job(job) + +Cancel the indicated job. + +#### installer.prune_jobs + +Remove jobs that are in a terminal state (i.e. complete, errored or +cancelled) from the job list returned by `list_jobs()` and +`get_job()`. + +#### installer.app_config, installer.record_store, installer.event_bus + +Properties that provide access to the installer's `InvokeAIAppConfig`, +`ModelRecordServiceBase` and `EventServiceBase` objects. + +#### key = installer.register_path(model_path, config), key = installer.install_path(model_path, config) + +These methods bypass the download queue and directly register or +install the model at the indicated path, returning the unique ID for +the installed model. + +Both methods accept a Path object corresponding to a checkpoint or +diffusers folder, and an optional dict of config attributes to use to +override the values derived from model probing. + +The difference between `register_path()` and `install_path()` is that +the former creates a model configuration record without changing the +location of the model in the filesystem. The latter makes a copy of +the model inside the InvokeAI models directory before registering +it. + +#### installer.unregister(key) + +This will remove the model config record for the model at key, and is +equivalent to `installer.record_store.del_model(key)` + +#### installer.delete(key) + +This is similar to `unregister()` but has the additional effect of +conditionally deleting the underlying model file(s) if they reside +within the InvokeAI models directory + +#### installer.unconditionally_delete(key) + +This method is similar to `unregister()`, but also unconditionally +deletes the corresponding model weights file(s), regardless of whether +they are inside or outside the InvokeAI models hierarchy. + +#### List[str]=installer.scan_directory(scan_dir: Path, install: bool) + +This method will recursively scan the directory indicated in +`scan_dir` for new models and either install them in the models +directory or register them in place, depending on the setting of +`install` (default False). + +The return value is the list of keys of the new installed/registered +models. + +#### installer.sync_to_config() + +This method synchronizes models in the models directory and autoimport +directory to those in the `ModelConfigRecordService` database. New +models are registered and orphan models are unregistered. + +#### installer.start(invoker) + +The `start` method is called by the API intialization routines when +the API starts up. Its effect is to call `sync_to_config()` to +synchronize the model record store database with what's currently on +disk. *** @@ -558,7 +900,6 @@ following fields: | `job_started` | float | | Timestamp for when the job started running | | `job_ended` | float | | Timestamp for when the job completed or errored out | | `job_sequence` | int | | A counter that is incremented each time a model is dequeued | -| `preserve_partial_downloads`| bool | False | Resume partial downloads when relaunched. | | `error` | Exception | | A copy of the Exception that caused an error during download | When you create a job, you can assign it a `priority`. If multiple @@ -863,351 +1204,362 @@ other resources that it might have been using. This will start/pause/cancel all jobs that have been submitted to the queue and have not yet reached a terminal state. -## Model installation +*** -The `ModelInstallService` class implements the -`ModelInstallServiceBase` abstract base class, and provides a one-stop -shop for all your model install needs. It provides the following -functionality: +## This Meta be Good: Model Metadata Storage -- Registering a model config record for a model already located on the - local filesystem, without moving it or changing its path. - -- Installing a model alreadiy located on the local filesystem, by - moving it into the InvokeAI root directory under the - `models` folder (or wherever config parameter `models_dir` - specifies). - -- Downloading a model from an arbitrary URL and installing it in - `models_dir`. - -- Special handling for Civitai model URLs which allow the user to - paste in a model page's URL or download link. Any metadata provided - by Civitai, such as trigger terms, are captured and placed in the - model config record. - -- Special handling for HuggingFace repo_ids to recursively download - the contents of the repository, paying attention to alternative - variants such as fp16. - -- Probing of models to determine their type, base type and other key - information. - -- Interface with the InvokeAI event bus to provide status updates on - the download, installation and registration process. - -### Initializing the installer +The modules found under `invokeai.backend.model_manager.metadata` +provide a straightforward API for fetching model metadatda from online +repositories. Currently two repositories are supported: HuggingFace +and Civitai. However, the modules are easily extended for additional +repos, provided that they have defined APIs for metadata access. -A default installer is created at InvokeAI api startup time and stored -in `ApiDependencies.invoker.services.model_install_service` and can -also be retrieved from an invocation's `context` argument with -`context.services.model_install_service`. +Metadata comprises any descriptive information that is not essential +for getting the model to run. For example "author" is metadata, while +"type", "base" and "format" are not. The latter fields are part of the +model's config, as defined in `invokeai.backend.model_manager.config`. -In the event you wish to create a new installer, you may use the -following initialization pattern: +### Example Usage: + +``` +from invokeai.backend.model_manager.metadata import ( + AnyModelRepoMetadata, + CivitaiMetadataFetch, + CivitaiMetadata + ModelMetadataStore, +) +# to access the initialized sql database +from invokeai.app.api.dependencies import ApiDependencies + +civitai = CivitaiMetadataFetch() + +# fetch the metadata +model_metadata = civitai.from_url("https://civitai.com/models/215796") + +# get some common metadata fields +author = model_metadata.author +tags = model_metadata.tags + +# get some Civitai-specific fields +assert isinstance(model_metadata, CivitaiMetadata) + +trained_words = model_metadata.trained_words +base_model = model_metadata.base_model_trained_on +thumbnail = model_metadata.thumbnail_url + +# cache the metadata to the database using the key corresponding to +# an existing model config record in the `model_config` table +sql_cache = ModelMetadataStore(ApiDependencies.invoker.services.db) +sql_cache.add_metadata('fb237ace520b6716adc98bcb16e8462c', model_metadata) + +# now we can search the database by tag, author or model name +# matches will contain a list of model keys that match the search +matches = sql_cache.search_by_tag({"tool", "turbo"}) +``` + +### Structure of the Metadata objects + +There is a short class hierarchy of Metadata objects, all of which +descend from the Pydantic `BaseModel`. + +#### `ModelMetadataBase` + +This is the common base class for metadata: + +| **Field Name** | **Type** | **Description** | +|----------------|-----------------|------------------| +| `name` | str | Repository's name for the model | +| `author` | str | Model's author | +| `tags` | Set[str] | Model tags | + + +Note that the model config record also has a `name` field. It is +intended that the config record version be locally customizable, while +the metadata version is read-only. However, enforcing this is expected +to be part of the business logic. + +Descendents of the base add additional fields. + +#### `HuggingFaceMetadata` + +This descends from `ModelMetadataBase` and adds the following fields: + +| **Field Name** | **Type** | **Description** | +|----------------|-----------------|------------------| +| `type` | Literal["huggingface"] | Used for the discriminated union of metadata classes| +| `id` | str | HuggingFace repo_id | +| `tag_dict` | Dict[str, Any] | A dictionary of tag/value pairs provided in addition to `tags` | +| `last_modified`| datetime | Date of last commit of this model to the repo | +| `files` | List[Path] | List of the files in the model repo | + + +#### `CivitaiMetadata` + +This descends from `ModelMetadataBase` and adds the following fields: + +| **Field Name** | **Type** | **Description** | +|----------------|-----------------|------------------| +| `type` | Literal["civitai"] | Used for the discriminated union of metadata classes| +| `id` | int | Civitai model id | +| `version_name` | str | Name of this version of the model (distinct from model name) | +| `version_id` | int | Civitai model version id (distinct from model id) | +| `created` | datetime | Date this version of the model was created | +| `updated` | datetime | Date this version of the model was last updated | +| `published` | datetime | Date this version of the model was published to Civitai | +| `description` | str | Model description. Quite verbose and contains HTML tags | +| `version_description` | str | Model version description, usually describes changes to the model | +| `nsfw` | bool | Whether the model tends to generate NSFW content | +| `restrictions` | LicenseRestrictions | An object that describes what is and isn't allowed with this model | +| `trained_words`| Set[str] | Trigger words for this model, if any | +| `download_url` | AnyHttpUrl | URL for downloading this version of the model | +| `base_model_trained_on` | str | Name of the model that this version was trained on | +| `thumbnail_url` | AnyHttpUrl | URL to access a representative thumbnail image of the model's output | +| `weight_min` | int | For LoRA sliders, the minimum suggested weight to apply | +| `weight_max` | int | For LoRA sliders, the maximum suggested weight to apply | + +Note that `weight_min` and `weight_max` are not currently populated +and take the default values of (-1.0, +2.0). The issue is that these +values aren't part of the structured data but appear in the text +description. Some regular expression or LLM coding may be able to +extract these values. + +Also be aware that `base_model_trained_on` is free text and doesn't +correspond to our `ModelType` enum. + +`CivitaiMetadata` also defines some convenience properties relating to +licensing restrictions: `credit_required`, `allow_commercial_use`, +`allow_derivatives` and `allow_different_license`. + +#### `AnyModelRepoMetadata` + +This is a discriminated Union of `CivitaiMetadata` and +`HuggingFaceMetadata`. + +### Fetching Metadata from Online Repos + +The `HuggingFaceMetadataFetch` and `CivitaiMetadataFetch` classes will +retrieve metadata from their corresponding repositories and return +`AnyModelRepoMetadata` objects. Their base class +`ModelMetadataFetchBase` is an abstract class that defines two +methods: `from_url()` and `from_id()`. The former accepts the type of +model URLs that the user will try to cut and paste into the model +import form. The latter accepts a string ID in the format recognized +by the repository of choice. Both methods return an +`AnyModelRepoMetadata`. + +The base class also has a class method `from_json()` which will take +the JSON representation of a `ModelMetadata` object, validate it, and +return the corresponding `AnyModelRepoMetadata` object. + +When initializing one of the metadata fetching classes, you may +provide a `requests.Session` argument. This allows you to customize +the low-level HTTP fetch requests and is used, for instance, in the +testing suite to avoid hitting the internet. + +The HuggingFace and Civitai fetcher subclasses add additional +repo-specific fetching methods: + + +#### HuggingFaceMetadataFetch + +This overrides its base class `from_json()` method to return a +`HuggingFaceMetadata` object directly. + +#### CivitaiMetadataFetch + +This adds the following methods: + +`from_civitai_modelid()` This takes the ID of a model, finds the +default version of the model, and then retrieves the metadata for +that version, returning a `CivitaiMetadata` object directly. + +`from_civitai_versionid()` This takes the ID of a model version and +retrieves its metadata. Functionally equivalent to `from_id()`, the +only difference is that it returna a `CivitaiMetadata` object rather +than an `AnyModelRepoMetadata`. + + +### Metadata Storage + +The `ModelMetadataStore` provides a simple facility to store model +metadata in the `invokeai.db` database. The data is stored as a JSON +blob, with a few common fields (`name`, `author`, `tags`) broken out +to be searchable. + +When a metadata object is saved to the database, it is identified +using the model key, _and this key must correspond to an existing +model key in the model_config table_. There is a foreign key integrity +constraint between the `model_config.id` field and the +`model_metadata.id` field such that if you attempt to save metadata +under an unknown key, the attempt will result in an +`UnknownModelException`. Likewise, when a model is deleted from +`model_config`, the deletion of the corresponding metadata record will +be triggered. + +Tags are stored in a normalized fashion in the tables `model_tags` and +`tags`. Triggers keep the tag table in sync with the `model_metadata` +table. + +To create the storage object, initialize it with the InvokeAI +`SqliteDatabase` object. This is often done this way: + +``` +from invokeai.app.api.dependencies import ApiDependencies +metadata_store = ModelMetadataStore(ApiDependencies.invoker.services.db) +``` + +You can then access the storage with the following methods: + +#### `add_metadata(key, metadata)` + +Add the metadata using a previously-defined model key. + +There is currently no `delete_metadata()` method. The metadata will +persist until the matching config is deleted from the `model_config` +table. + +#### `get_metadata(key) -> AnyModelRepoMetadata` + +Retrieve the metadata corresponding to the model key. + +#### `update_metadata(key, new_metadata)` + +Update an existing metadata record with new metadata. + +#### `search_by_tag(tags: Set[str]) -> Set[str]` + +Given a set of tags, find models that are tagged with them. If +multiple tags are provided then a matching model must be tagged with +*all* the tags in the set. This method returns a set of model keys and +is intended to be used in conjunction with the `ModelRecordService`: + +``` +model_config_store = ApiDependencies.invoker.services.model_records +matches = metadata_store.search_by_tag({'license:other'}) +models = [model_config_store.get(x) for x in matches] +``` + +#### `search_by_name(name: str) -> Set[str] + +Find all model metadata records that have the given name and return a +set of keys to the corresponding model config objects. + +#### `search_by_author(author: str) -> Set[str] + +Find all model metadata records that have the given author and return +a set of keys to the corresponding model config objects. + +# The remainder of this documentation is provisional, pending implementation of the Load service + +## Let's get loaded, the lowdown on ModelLoadService + +The `ModelLoadService` is responsible for loading a named model into +memory so that it can be used for inference. Despite the fact that it +does a lot under the covers, it is very straightforward to use. + +An application-wide model loader is created at API initialization time +and stored in +`ApiDependencies.invoker.services.model_loader`. However, you can +create alternative instances if you wish. + +### Creating a ModelLoadService object + +The class is defined in +`invokeai.app.services.model_loader_service`. It is initialized with +an InvokeAIAppConfig object, from which it gets configuration +information such as the user's desired GPU and precision, and with a +previously-created `ModelRecordServiceBase` object, from which it +loads the requested model's configuration information. + +Here is a typical initialization pattern: ``` from invokeai.app.services.config import InvokeAIAppConfig -from invokeai.app.services.download_manager import DownloadQueueServive from invokeai.app.services.model_record_service import ModelRecordServiceBase +from invokeai.app.services.model_loader_service import ModelLoadService -config = InvokeAI.get_config() -queue = DownloadQueueService() +config = InvokeAIAppConfig.get_config() store = ModelRecordServiceBase.open(config) -installer = ModelInstallService(config=config, queue=queue, store=store) +loader = ModelLoadService(config, store) ``` -The full form of `ModelInstallService()` takes the following -parameters. Each parameter will default to a reasonable value, but it -is recommended that you set them explicitly as shown in the above example. +Note that we are relying on the contents of the application +configuration to choose the implementation of +`ModelRecordServiceBase`. -| **Argument** | **Type** | **Default** | **Description** | -|------------------|------------------------------|-------------|-------------------------------------------| -| `config` | InvokeAIAppConfig | Use system-wide config | InvokeAI app configuration object | -| `queue` | DownloadQueueServiceBase | Create a new download queue for internal use | Download queue | -| `store` | ModelRecordServiceBase | Use config to select the database to open | Config storage database | -| `event_bus` | EventServiceBase | None | An event bus to send download/install progress events to | -| `event_handlers` | List[DownloadEventHandler] | None | Event handlers for the download queue | +### get_model(key, [submodel_type], [context]) -> ModelInfo: -Note that if `store` is not provided, then the class will use -`ModelRecordServiceBase.open(config)` to select the database to use. +*** TO DO: change to get_model(key, context=None, **kwargs) -Once initialized, the installer will provide the following methods: +The `get_model()` method, like its similarly-named cousin in +`ModelRecordService`, receives the unique key that identifies the +model. It loads the model into memory, gets the model ready for use, +and returns a `ModelInfo` object. -#### install_job = installer.install_model() +The optional second argument, `subtype` is a `SubModelType` string +enum, such as "vae". It is mandatory when used with a main model, and +is used to select which part of the main model to load. -The `install_model()` method is the core of the installer. The -following illustrates basic usage: +The optional third argument, `context` can be provided by +an invocation to trigger model load event reporting. See below for +details. + +The returned `ModelInfo` object shares some fields in common with +`ModelConfigBase`, but is otherwise a completely different beast: + +| **Field Name** | **Type** | **Description** | +|----------------|-----------------|------------------| +| `key` | str | The model key derived from the ModelRecordService database | +| `name` | str | Name of this model | +| `base_model` | BaseModelType | Base model for this model | +| `type` | ModelType or SubModelType | Either the model type (non-main) or the submodel type (main models)| +| `location` | Path or str | Location of the model on the filesystem | +| `precision` | torch.dtype | The torch.precision to use for inference | +| `context` | ModelCache.ModelLocker | A context class used to lock the model in VRAM while in use | + +The types for `ModelInfo` and `SubModelType` can be imported from +`invokeai.app.services.model_loader_service`. + +To use the model, you use the `ModelInfo` as a context manager using +the following pattern: ``` -sources = [ - Path('/opt/models/sushi.safetensors'), # a local safetensors file - Path('/opt/models/sushi_diffusers/'), # a local diffusers folder - 'runwayml/stable-diffusion-v1-5', # a repo_id - 'runwayml/stable-diffusion-v1-5:vae', # a subfolder within a repo_id - 'https://civitai.com/api/download/models/63006', # a civitai direct download link - 'https://civitai.com/models/8765?modelVersionId=10638', # civitai model page - 'https://s3.amazon.com/fjacks/sd-3.safetensors', # arbitrary URL -] - -for source in sources: - install_job = installer.install_model(source) - -source2key = installer.wait_for_installs() -for source in sources: - model_key = source2key[source] - print(f"{source} installed as {model_key}") +model_info = loader.get_model('f13dd932c0c35c22dcb8d6cda4203764', SubModelType('vae')) +with model_info as vae: + image = vae.decode(latents)[0] ``` -As shown here, the `install_model()` method accepts a variety of -sources, including local safetensors files, local diffusers folders, -HuggingFace repo_ids with and without a subfolder designation, -Civitai model URLs and arbitrary URLs that point to checkpoint files -(but not to folders). +The `vae` model will stay locked in the GPU during the period of time +it is in the context manager's scope. -Each call to `install_model()` will return a `ModelInstallJob` job, a -subclass of `DownloadJobBase`. The install job has additional -install-specific fields described in the next section. +`get_model()` may raise any of the following exceptions: -Each install job will run in a series of background threads using -the object's download queue. You may block until all install jobs are -completed (or errored) by calling the `wait_for_installs()` method as -shown in the code example. `wait_for_installs()` will return a `dict` -that maps the requested source to the key of the installed model. In -the case that a model fails to download or install, its value in the -dict will be None. The actual cause of the error will be reported in -the corresponding job's `error` field. +- `UnknownModelException` -- key not in database +- `ModelNotFoundException` -- key in database but model not found at path +- `InvalidModelException` -- the model is guilty of a variety of sins + +** TO DO: ** Resolve discrepancy between ModelInfo.location and +ModelConfig.path. -Alternatively you may install event handlers and/or listen for events -on the InvokeAI event bus in order to monitor the progress of the -requested installs. +### Emitting model loading events -The full list of arguments to `model_install()` is as follows: - -| **Argument** | **Type** | **Default** | **Description** | -|------------------|------------------------------|-------------|-------------------------------------------| -| `source` | Union[str, Path, AnyHttpUrl] | | The source of the model, Path, URL or repo_id | -| `inplace` | bool | True | Leave a local model in its current location | -| `variant` | str | None | Desired variant, such as 'fp16' or 'onnx' (HuggingFace only) | -| `subfolder` | str | None | Repository subfolder (HuggingFace only) | -| `probe_override` | Dict[str, Any] | None | Override all or a portion of model's probed attributes | -| `metadata` | ModelSourceMetadata | None | Provide metadata that will be added to model's config | -| `access_token` | str | None | Provide authorization information needed to download | -| `priority` | int | 10 | Download queue priority for the job | - - -The `inplace` field controls how local model Paths are handled. If -True (the default), then the model is simply registered in its current -location by the installer's `ModelConfigRecordService`. Otherwise, the -model will be moved into the location specified by the `models_dir` -application configuration parameter. - -The `variant` field is used for HuggingFace repo_ids only. If -provided, the repo_id download handler will look for and download -tensors files that follow the convention for the selected variant: - -- "fp16" will select files named "*model.fp16.{safetensors,bin}" -- "onnx" will select files ending with the suffix ".onnx" -- "openvino" will select files beginning with "openvino_model" - -In the special case of the "fp16" variant, the installer will select -the 32-bit version of the files if the 16-bit version is unavailable. - -`subfolder` is used for HuggingFace repo_ids only. If provided, the -model will be downloaded from the designated subfolder rather than the -top-level repository folder. If a subfolder is attached to the repo_id -using the format `repo_owner/repo_name:subfolder`, then the subfolder -specified by the repo_id will override the subfolder argument. - -`probe_override` can be used to override all or a portion of the -attributes returned by the model prober. This can be used to overcome -cases in which automatic probing is unable to (correctly) determine -the model's attribute. The most common situation is the -`prediction_type` field for sd-2 (and rare sd-1) models. Here is an -example of how it works: +When the `context` argument is passed to `get_model()`, it will +retrieve the invocation event bus from the passed `InvocationContext` +object to emit events on the invocation bus. The two events are +"model_load_started" and "model_load_completed". Both carry the +following payload: ``` -install_job = installer.install_model( - source='stabilityai/stable-diffusion-2-1', - variant='fp16', - probe_override=dict( - prediction_type=SchedulerPredictionType('v_prediction') - ) - ) +payload=dict( + queue_id=queue_id, + queue_item_id=queue_item_id, + queue_batch_id=queue_batch_id, + graph_execution_state_id=graph_execution_state_id, + model_key=model_key, + submodel=submodel, + hash=model_info.hash, + location=str(model_info.location), + precision=str(model_info.precision), +) ``` -`metadata` allows you to attach custom metadata to the installed -model. See the next section for details. - -`priority` and `access_token` are passed to the download queue and -have the same effect as they do for the DownloadQueueServiceBase. - -#### Monitoring the install job process - -When you create an install job with `model_install()`, events will be -passed to the list of `DownloadEventHandlers` provided at installer -initialization time. Event handlers can also be added to individual -model install jobs by calling their `add_handler()` method as -described earlier for the `DownloadQueueService`. - -If the `event_bus` argument was provided, events will also be -broadcast to the InvokeAI event bus. The events will appear on the bus -as a singular event type named `model_event` with a payload of -`job`. You can then retrieve the job and check its status. - -** TO DO: ** consider breaking `model_event` into -`model_install_started`, `model_install_completed`, etc. The event bus -features have not yet been tested with FastAPI/websockets, and it may -turn out that the job object is not serializable. - -#### Model metadata and probing - -The install service has special handling for HuggingFace and Civitai -URLs that capture metadata from the source and include it in the model -configuration record. For example, fetching the Civitai model 8765 -will produce a config record similar to this (using YAML -representation): - -``` -5abc3ef8600b6c1cc058480eaae3091e: - path: sd-1/lora/to8contrast-1-5.safetensors - name: to8contrast-1-5 - base_model: sd-1 - model_type: lora - model_format: lycoris - key: 5abc3ef8600b6c1cc058480eaae3091e - hash: 5abc3ef8600b6c1cc058480eaae3091e - description: 'Trigger terms: to8contrast style' - author: theovercomer8 - license: allowCommercialUse=Sell; allowDerivatives=True; allowNoCredit=True - source: https://civitai.com/models/8765?modelVersionId=10638 - thumbnail_url: null - tags: - - model - - style - - portraits -``` - -For sources that do not provide model metadata, you can attach custom -fields by providing a `metadata` argument to `model_install()` using -an initialized `ModelSourceMetadata` object (available for import from -`model_install_service.py`): - -``` -from invokeai.app.services.model_install_service import ModelSourceMetadata -meta = ModelSourceMetadata( - name="my model", - author="Sushi Chef", - description="Highly customized model; trigger with 'sushi'," - license="mit", - thumbnail_url="http://s3.amazon.com/ljack/pics/sushi.png", - tags=list('sfw', 'food') - ) -install_job = installer.install_model( - source='sushi_chef/model3', - variant='fp16', - metadata=meta, - ) -``` - -It is not currently recommended to provide custom metadata when -installing from Civitai or HuggingFace source, as the metadata -provided by the source will overwrite the fields you provide. Instead, -after the model is installed you can use -`ModelRecordService.update_model()` to change the desired fields. - -** TO DO: ** Change the logic so that the caller's metadata fields take -precedence over those provided by the source. - - -#### Other installer methods - -This section describes additional, less-frequently-used attributes and -methods provided by the installer class. - -##### installer.wait_for_installs() - -This is equivalent to the `DownloadQueue` `join()` method. It will -block until all the active jobs in the install queue have reached a -terminal state (completed, errored or cancelled). - -##### installer.queue, installer.store, installer.config - -These attributes provide access to the `DownloadQueueServiceBase`, -`ModelConfigRecordServiceBase`, and `InvokeAIAppConfig` objects that -the installer uses. - -For example, to temporarily pause all pending installations, you can -do this: - -``` -installer.queue.pause_all_jobs() -``` -##### key = installer.register_path(model_path, overrides), key = installer.install_path(model_path, overrides) - -These methods bypass the download queue and directly register or -install the model at the indicated path, returning the unique ID for -the installed model. - -Both methods accept a Path object corresponding to a checkpoint or -diffusers folder, and an optional dict of attributes to use to -override the values derived from model probing. - -The difference between `register_path()` and `install_path()` is that -the former will not move the model from its current position, while -the latter will move it into the `models_dir` hierarchy. - -##### installer.unregister(key) - -This will remove the model config record for the model at key, and is -equivalent to `installer.store.unregister(key)` - -##### installer.delete(key) - -This is similar to `unregister()` but has the additional effect of -deleting the underlying model file(s) -- even if they were outside the -`models_dir` directory! - -##### installer.conditionally_delete(key) - -This method will call `unregister()` if the model identified by `key` -is outside the `models_dir` hierarchy, and call `delete()` if the -model is inside. - -#### List[str]=installer.scan_directory(scan_dir: Path, install: bool) - -This method will recursively scan the directory indicated in -`scan_dir` for new models and either install them in the models -directory or register them in place, depending on the setting of -`install` (default False). - -The return value is the list of keys of the new installed/registered -models. - -#### installer.scan_models_directory() - -This method scans the models directory for new models and registers -them in place. Models that are present in the -`ModelConfigRecordService` database whose paths are not found will be -unregistered. - -#### installer.sync_to_config() - -This method synchronizes models in the models directory and autoimport -directory to those in the `ModelConfigRecordService` database. New -models are registered and orphan models are unregistered. - -#### hash=installer.hash(model_path) - -This method is calls the fasthash algorithm on a model's Path -(either a file or a folder) to generate a unique ID based on the -contents of the model. - -##### installer.start(invoker) - -The `start` method is called by the API intialization routines when -the API starts up. Its effect is to call `sync_to_config()` to -synchronize the model record store database with what's currently on -disk. - -This method should not ordinarily be called manually. diff --git a/docs/contributing/contribution_guides/contributingToFrontend.md b/docs/contributing/contribution_guides/contributingToFrontend.md index d1f0fb7d38..b485fb9a8d 100644 --- a/docs/contributing/contribution_guides/contributingToFrontend.md +++ b/docs/contributing/contribution_guides/contributingToFrontend.md @@ -46,17 +46,18 @@ We encourage you to ping @psychedelicious and @blessedcoolant on [Discord](http ```bash node --version ``` -2. Install [yarn classic](https://classic.yarnpkg.com/lang/en/) and confirm it is installed by running this: + +2. Install [pnpm](https://pnpm.io/) and confirm it is installed by running this: ```bash -npm install --global yarn -yarn --version +npm install --global pnpm +pnpm --version ``` -From `invokeai/frontend/web/` run `yarn install` to get everything set up. +From `invokeai/frontend/web/` run `pnpm install` to get everything set up. Start everything in dev mode: 1. Ensure your virtual environment is running -2. Start the dev server: `yarn dev` +2. Start the dev server: `pnpm dev` 3. Start the InvokeAI Nodes backend: `python scripts/invokeai-web.py # run from the repo root` 4. Point your browser to the dev server address e.g. [http://localhost:5173/](http://localhost:5173/) @@ -72,4 +73,4 @@ For a number of technical and logistical reasons, we need to commit UI build art If you submit a PR, there is a good chance we will ask you to include a separate commit with a build of the app. -To build for production, run `yarn build`. \ No newline at end of file +To build for production, run `pnpm build`. diff --git a/docs/deprecated/2to3.md b/docs/deprecated/2to3.md new file mode 100644 index 0000000000..453ec8f6a1 --- /dev/null +++ b/docs/deprecated/2to3.md @@ -0,0 +1,53 @@ +## :octicons-log-16: Important Changes Since Version 2.3 + +### Nodes + +Behind the scenes, InvokeAI has been completely rewritten to support +"nodes," small unitary operations that can be combined into graphs to +form arbitrary workflows. For example, there is a prompt node that +processes the prompt string and feeds it to a text2latent node that +generates a latent image. The latents are then fed to a latent2image +node that translates the latent image into a PNG. + +The WebGUI has a node editor that allows you to graphically design and +execute custom node graphs. The ability to save and load graphs is +still a work in progress, but coming soon. + +### Command-Line Interface Retired + +All "invokeai" command-line interfaces have been retired as of version +3.4. + +To launch the Web GUI from the command-line, use the command +`invokeai-web` rather than the traditional `invokeai --web`. + +### ControlNet + +This version of InvokeAI features ControlNet, a system that allows you +to achieve exact poses for human and animal figures by providing a +model to follow. Full details are found in [ControlNet](features/CONTROLNET.md) + +### New Schedulers + +The list of schedulers has been completely revamped and brought up to date: + +| **Short Name** | **Scheduler** | **Notes** | +|----------------|---------------------------------|-----------------------------| +| **ddim** | DDIMScheduler | | +| **ddpm** | DDPMScheduler | | +| **deis** | DEISMultistepScheduler | | +| **lms** | LMSDiscreteScheduler | | +| **pndm** | PNDMScheduler | | +| **heun** | HeunDiscreteScheduler | original noise schedule | +| **heun_k** | HeunDiscreteScheduler | using karras noise schedule | +| **euler** | EulerDiscreteScheduler | original noise schedule | +| **euler_k** | EulerDiscreteScheduler | using karras noise schedule | +| **kdpm_2** | KDPM2DiscreteScheduler | | +| **kdpm_2_a** | KDPM2AncestralDiscreteScheduler | | +| **dpmpp_2s** | DPMSolverSinglestepScheduler | | +| **dpmpp_2m** | DPMSolverMultistepScheduler | original noise scnedule | +| **dpmpp_2m_k** | DPMSolverMultistepScheduler | using karras noise schedule | +| **unipc** | UniPCMultistepScheduler | CPU only | +| **lcm** | LCMScheduler | | + +Please see [3.0.0 Release Notes](https://github.com/invoke-ai/InvokeAI/releases/tag/v3.0.0) for further details. \ No newline at end of file diff --git a/docs/features/CONFIGURATION.md b/docs/features/CONFIGURATION.md index f83caf522d..f98037d968 100644 --- a/docs/features/CONFIGURATION.md +++ b/docs/features/CONFIGURATION.md @@ -154,14 +154,16 @@ groups in `invokeia.yaml`: ### Web Server -| Setting | Default Value | Description | -|----------|----------------|--------------| -| `host` | `localhost` | Name or IP address of the network interface that the web server will listen on | -| `port` | `9090` | Network port number that the web server will listen on | -| `allow_origins` | `[]` | A list of host names or IP addresses that are allowed to connect to the InvokeAI API in the format `['host1','host2',...]` | -| `allow_credentials` | `true` | Require credentials for a foreign host to access the InvokeAI API (don't change this) | -| `allow_methods` | `*` | List of HTTP methods ("GET", "POST") that the web server is allowed to use when accessing the API | -| `allow_headers` | `*` | List of HTTP headers that the web server will accept when accessing the API | +| Setting | Default Value | Description | +|---------------------|---------------|----------------------------------------------------------------------------------------------------------------------------| +| `host` | `localhost` | Name or IP address of the network interface that the web server will listen on | +| `port` | `9090` | Network port number that the web server will listen on | +| `allow_origins` | `[]` | A list of host names or IP addresses that are allowed to connect to the InvokeAI API in the format `['host1','host2',...]` | +| `allow_credentials` | `true` | Require credentials for a foreign host to access the InvokeAI API (don't change this) | +| `allow_methods` | `*` | List of HTTP methods ("GET", "POST") that the web server is allowed to use when accessing the API | +| `allow_headers` | `*` | List of HTTP headers that the web server will accept when accessing the API | +| `ssl_certfile` | null | Path to an SSL certificate file, used to enable HTTPS. | +| `ssl_keyfile` | null | Path to an SSL keyfile, if the key is not included in the certificate file. | The documentation for InvokeAI's API can be accessed by browsing to the following URL: [http://localhost:9090/docs]. diff --git a/docs/features/UNIFIED_CANVAS.md b/docs/features/UNIFIED_CANVAS.md index 9eada92708..476d2009be 100644 --- a/docs/features/UNIFIED_CANVAS.md +++ b/docs/features/UNIFIED_CANVAS.md @@ -229,29 +229,28 @@ clarity on the intent and common use cases we expect for utilizing them. currently being rendered by your browser into a merged copy of the image. This lowers the resource requirements and should improve performance. -### Seam Correction +### Compositing / Seam Correction When doing Inpainting or Outpainting, Invoke needs to merge the pixels generated -by Stable Diffusion into your existing image. To do this, the area around the -`seam` at the boundary between your image and the new generation is +by Stable Diffusion into your existing image. This is achieved through compositing - the area around the the boundary between your image and the new generation is automatically blended to produce a seamless output. In a fully automatic -process, a mask is generated to cover the seam, and then the area of the seam is +process, a mask is generated to cover the boundary, and then the area of the boundary is Inpainted. Although the default options should work well most of the time, sometimes it can -help to alter the parameters that control the seam Inpainting. A wider seam and -a blur setting of about 1/3 of the seam have been noted as producing -consistently strong results (e.g. 96 wide and 16 blur - adds up to 32 blur with -both sides). Seam strength of 0.7 is best for reducing hard seams. +help to alter the parameters that control the Compositing. A larger blur and +a blur setting have been noted as producing +consistently strong results . Strength of 0.7 is best for reducing hard seams. + +- **Mode** - What part of the image will have the the Compositing applied to it. + - **Mask edge** will apply Compositing to the edge of the masked area + - **Mask** will apply Compositing to the entire masked area + - **Unmasked** will apply Compositing to the entire image +- **Steps** - Number of generation steps that will occur during the Coherence Pass, similar to Denoising Steps. Higher step counts will generally have better results. +- **Strength** - How much noise is added for the Coherence Pass, similar to Denoising Strength. A strength of 0 will result in an unchanged image, while a strength of 1 will result in an image with a completely new area as defined by the Mode setting. +- **Blur** - Adjusts the pixel radius of the the mask. A larger blur radius will cause the mask to extend past the visibly masked area, while too small of a blur radius will result in a mask that is smaller than the visibly masked area. +- **Blur Method** - The method of blur applied to the masked area. -- **Seam Size** - The size of the seam masked area. Set higher to make a larger - mask around the seam. -- **Seam Blur** - The size of the blur that is applied on _each_ side of the - masked area. -- **Seam Strength** - The Image To Image Strength parameter used for the - Inpainting generation that is applied to the seam area. -- **Seam Steps** - The number of generation steps that should be used to Inpaint - the seam. ### Infill & Scaling diff --git a/docs/index.md b/docs/index.md index 124abf222d..1fdc063c46 100644 --- a/docs/index.md +++ b/docs/index.md @@ -18,7 +18,7 @@ title: Home width: 100%; max-width: 100%; height: 50px; - background-color: #448AFF; + background-color: #35A4DB; color: #fff; font-size: 16px; border: none; @@ -43,7 +43,7 @@ title: Home
-[![project logo](assets/invoke_ai_banner.png)](https://github.com/invoke-ai/InvokeAI) +[![project logo](https://github.com/invoke-ai/InvokeAI/assets/31807370/6e3728c7-e90e-4711-905c-3b55844ff5be)](https://github.com/invoke-ai/InvokeAI) [![discord badge]][discord link] @@ -145,60 +145,6 @@ Mac and Linux machines, and runs on GPU cards with as little as 4 GB of RAM. - [Guide to InvokeAI Runtime Settings](features/CONFIGURATION.md) - [Database Maintenance and other Command Line Utilities](features/UTILITIES.md) -## :octicons-log-16: Important Changes Since Version 2.3 - -### Nodes - -Behind the scenes, InvokeAI has been completely rewritten to support -"nodes," small unitary operations that can be combined into graphs to -form arbitrary workflows. For example, there is a prompt node that -processes the prompt string and feeds it to a text2latent node that -generates a latent image. The latents are then fed to a latent2image -node that translates the latent image into a PNG. - -The WebGUI has a node editor that allows you to graphically design and -execute custom node graphs. The ability to save and load graphs is -still a work in progress, but coming soon. - -### Command-Line Interface Retired - -All "invokeai" command-line interfaces have been retired as of version -3.4. - -To launch the Web GUI from the command-line, use the command -`invokeai-web` rather than the traditional `invokeai --web`. - -### ControlNet - -This version of InvokeAI features ControlNet, a system that allows you -to achieve exact poses for human and animal figures by providing a -model to follow. Full details are found in [ControlNet](features/CONTROLNET.md) - -### New Schedulers - -The list of schedulers has been completely revamped and brought up to date: - -| **Short Name** | **Scheduler** | **Notes** | -|----------------|---------------------------------|-----------------------------| -| **ddim** | DDIMScheduler | | -| **ddpm** | DDPMScheduler | | -| **deis** | DEISMultistepScheduler | | -| **lms** | LMSDiscreteScheduler | | -| **pndm** | PNDMScheduler | | -| **heun** | HeunDiscreteScheduler | original noise schedule | -| **heun_k** | HeunDiscreteScheduler | using karras noise schedule | -| **euler** | EulerDiscreteScheduler | original noise schedule | -| **euler_k** | EulerDiscreteScheduler | using karras noise schedule | -| **kdpm_2** | KDPM2DiscreteScheduler | | -| **kdpm_2_a** | KDPM2AncestralDiscreteScheduler | | -| **dpmpp_2s** | DPMSolverSinglestepScheduler | | -| **dpmpp_2m** | DPMSolverMultistepScheduler | original noise scnedule | -| **dpmpp_2m_k** | DPMSolverMultistepScheduler | using karras noise schedule | -| **unipc** | UniPCMultistepScheduler | CPU only | -| **lcm** | LCMScheduler | | - -Please see [3.0.0 Release Notes](https://github.com/invoke-ai/InvokeAI/releases/tag/v3.0.0) for further details. - ## :material-target: Troubleshooting Please check out our **[:material-frequently-asked-questions: diff --git a/docs/installation/020_INSTALL_MANUAL.md b/docs/installation/020_INSTALL_MANUAL.md index 0ddf1bca68..b395405ba3 100644 --- a/docs/installation/020_INSTALL_MANUAL.md +++ b/docs/installation/020_INSTALL_MANUAL.md @@ -293,6 +293,19 @@ manager, please follow these steps: ## Developer Install +!!! warning + + InvokeAI uses a SQLite database. By running on `main`, you accept responsibility for your database. This + means making regular backups (especially before pulling) and/or fixing it yourself in the event that a + PR introduces a schema change. + + If you don't need persistent backend storage, you can use an ephemeral in-memory database by setting + `use_memory_db: true` under `Path:` in your `invokeai.yaml` file. + + If this is untenable, you should run the application via the official installer or a manual install of the + python package from pypi. These releases will not break your database. + + If you have an interest in how InvokeAI works, or you would like to add features or bugfixes, you are encouraged to install the source code for InvokeAI. For this to work, you will need to install the @@ -388,3 +401,5 @@ environment variable INVOKEAI_ROOT to point to the installation directory. Note that if you run into problems with the Conda installation, the InvokeAI staff will **not** be able to help you out. Caveat Emptor! + +[dev-chat]: https://discord.com/channels/1020123559063990373/1049495067846524939 \ No newline at end of file diff --git a/docs/javascripts/init_kapa_widget.js b/docs/javascripts/init_kapa_widget.js new file mode 100644 index 0000000000..06885c464c --- /dev/null +++ b/docs/javascripts/init_kapa_widget.js @@ -0,0 +1,10 @@ +document.addEventListener("DOMContentLoaded", function () { + var script = document.createElement("script"); + script.src = "https://widget.kapa.ai/kapa-widget.bundle.js"; + script.setAttribute("data-website-id", "b5973bb1-476b-451e-8cf4-98de86745a10"); + script.setAttribute("data-project-name", "Invoke.AI"); + script.setAttribute("data-project-color", "#11213C"); + script.setAttribute("data-project-logo", "https://avatars.githubusercontent.com/u/113954515?s=280&v=4"); + script.async = true; + document.head.appendChild(script); +}); diff --git a/docs/nodes/NODES.md b/docs/nodes/NODES.md index f6496c09bb..b7f7aa82ad 100644 --- a/docs/nodes/NODES.md +++ b/docs/nodes/NODES.md @@ -6,10 +6,17 @@ If you're not familiar with Diffusion, take a look at our [Diffusion Overview.]( ## Features +### Workflow Library +The Workflow Library enables you to save workflows to the Invoke database, allowing you to easily creating, modify and share workflows as needed. + +A curated set of workflows are provided by default - these are designed to help explain important nodes' usage in the Workflow Editor. + +![workflow_library](../assets/nodes/workflow_library.png) + ### Linear View The Workflow Editor allows you to create a UI for your workflow, to make it easier to iterate on your generations. -To add an input to the Linear UI, right click on the input label and select "Add to Linear View". +To add an input to the Linear UI, right click on the **input label** and select "Add to Linear View". The Linear UI View will also be part of the saved workflow, allowing you share workflows and enable other to use them, regardless of complexity. @@ -30,7 +37,7 @@ Any node or input field can be renamed in the workflow editor. If the input fiel Nodes have a "Use Cache" option in their footer. This allows for performance improvements by using the previously cached values during the workflow processing. -## Important Concepts +## Important Nodes & Concepts There are several node grouping concepts that can be examined with a narrow focus. These (and other) groupings can be pieced together to make up functional graph setups, and are important to understanding how groups of nodes work together as part of a whole. Note that the screenshots below aren't examples of complete functioning node graphs (see Examples). @@ -56,7 +63,7 @@ The ImageToLatents node takes in a pixel image and a VAE and outputs a latents. It is common to want to use both the same seed (for continuity) and random seeds (for variety). To define a seed, simply enter it into the 'Seed' field on a noise node. Conversely, the RandomInt node generates a random integer between 'Low' and 'High', and can be used as input to the 'Seed' edge point on a noise node to randomize your seed. -![groupsrandseed](../assets/nodes/groupsrandseed.png) +![groupsrandseed](../assets/nodes/groupsnoise.png) ### ControlNet diff --git a/docs/nodes/communityNodes.md b/docs/nodes/communityNodes.md index f3b8af0425..6347461f54 100644 --- a/docs/nodes/communityNodes.md +++ b/docs/nodes/communityNodes.md @@ -13,7 +13,12 @@ If you'd prefer, you can also just download the whole node folder from the linke To use a community workflow, download the the `.json` node graph file and load it into Invoke AI via the **Load Workflow** button in the Workflow Editor. - Community Nodes + + [Adapters-Linked](#adapters-linked-nodes) + [Average Images](#average-images) + + [Clean Image Artifacts After Cut](#clean-image-artifacts-after-cut) + + [Close Color Mask](#close-color-mask) + + [Clothing Mask](#clothing-mask) + + [Contrast Limited Adaptive Histogram Equalization](#contrast-limited-adaptive-histogram-equalization) + [Depth Map from Wavefront OBJ](#depth-map-from-wavefront-obj) + [Film Grain](#film-grain) + [Generative Grammar-Based Prompt Nodes](#generative-grammar-based-prompt-nodes) @@ -22,16 +27,24 @@ To use a community workflow, download the the `.json` node graph file and load i + [Halftone](#halftone) + [Ideal Size](#ideal-size) + [Image and Mask Composition Pack](#image-and-mask-composition-pack) + + [Image Dominant Color](#image-dominant-color) + [Image to Character Art Image Nodes](#image-to-character-art-image-nodes) + [Image Picker](#image-picker) + + [Image Resize Plus](#image-resize-plus) + [Load Video Frame](#load-video-frame) + [Make 3D](#make-3d) + + [Mask Operations](#mask-operations) + [Match Histogram](#match-histogram) + + [Metadata-Linked](#metadata-linked-nodes) + + [Negative Image](#negative-image) + + [Nightmare Promptgen](#nightmare-promptgen) + [Oobabooga](#oobabooga) + [Prompt Tools](#prompt-tools) + [Remote Image](#remote-image) + + [Remove Background](#remove-background) + [Retroize](#retroize) + [Size Stepper Nodes](#size-stepper-nodes) + + [Simple Skin Detection](#simple-skin-detection) + [Text font to Image](#text-font-to-image) + [Thresholding](#thresholding) + [Unsharp Mask](#unsharp-mask) @@ -41,6 +54,19 @@ To use a community workflow, download the the `.json` node graph file and load i - [Help](#help) +-------------------------------- +### Adapters Linked Nodes + +**Description:** A set of nodes for linked adapters (ControlNet, IP-Adaptor & T2I-Adapter). This allows multiple adapters to be chained together without using a `collect` node which means it can be used inside an `iterate` node without any collecting on every iteration issues. + +- `ControlNet-Linked` - Collects ControlNet info to pass to other nodes. +- `IP-Adapter-Linked` - Collects IP-Adapter info to pass to other nodes. +- `T2I-Adapter-Linked` - Collects T2I-Adapter info to pass to other nodes. + +Note: These are inherited from the core nodes so any update to the core nodes should be reflected in these. + +**Node Link:** https://github.com/skunkworxdark/adapters-linked-nodes + -------------------------------- ### Average Images @@ -48,6 +74,46 @@ To use a community workflow, download the the `.json` node graph file and load i **Node Link:** https://github.com/JPPhoto/average-images-node +-------------------------------- +### Clean Image Artifacts After Cut + +Description: Removes residual artifacts after an image is separated from its background. + +Node Link: https://github.com/VeyDlin/clean-artifact-after-cut-node + +View: +
+ +-------------------------------- +### Close Color Mask + +Description: Generates a mask for images based on a closely matching color, useful for color-based selections. + +Node Link: https://github.com/VeyDlin/close-color-mask-node + +View: +
+ +-------------------------------- +### Clothing Mask + +Description: Employs a U2NET neural network trained for the segmentation of clothing items in images. + +Node Link: https://github.com/VeyDlin/clothing-mask-node + +View: +
+ +-------------------------------- +### Contrast Limited Adaptive Histogram Equalization + +Description: Enhances local image contrast using adaptive histogram equalization with contrast limiting. + +Node Link: https://github.com/VeyDlin/clahe-node + +View: +
+ -------------------------------- ### Depth Map from Wavefront OBJ @@ -164,6 +230,16 @@ This includes 15 Nodes:
+-------------------------------- +### Image Dominant Color + +Description: Identifies and extracts the dominant color from an image using k-means clustering. + +Node Link: https://github.com/VeyDlin/image-dominant-color-node + +View: +
+ -------------------------------- ### Image to Character Art Image Nodes @@ -185,6 +261,17 @@ This includes 15 Nodes: **Node Link:** https://github.com/JPPhoto/image-picker-node +-------------------------------- +### Image Resize Plus + +Description: Provides various image resizing options such as fill, stretch, fit, center, and crop. + +Node Link: https://github.com/VeyDlin/image-resize-plus-node + +View: +
+ + -------------------------------- ### Load Video Frame @@ -209,6 +296,16 @@ This includes 15 Nodes: +-------------------------------- +### Mask Operations + +Description: Offers logical operations (OR, SUB, AND) for combining and manipulating image masks. + +Node Link: https://github.com/VeyDlin/mask-operations-node + +View: +
+ -------------------------------- ### Match Histogram @@ -226,6 +323,37 @@ See full docs here: https://github.com/skunkworxdark/Prompt-tools-nodes/edit/mai +-------------------------------- +### Metadata Linked Nodes + +**Description:** A set of nodes for Metadata. Collect Metadata from within an `iterate` node & extract metadata from an image. + +- `Metadata Item Linked` - Allows collecting of metadata while within an iterate node with no need for a collect node or conversion to metadata node. +- `Metadata From Image` - Provides Metadata from an image. +- `Metadata To String` - Extracts a String value of a label from metadata. +- `Metadata To Integer` - Extracts an Integer value of a label from metadata. +- `Metadata To Float` - Extracts a Float value of a label from metadata. +- `Metadata To Scheduler` - Extracts a Scheduler value of a label from metadata. + +**Node Link:** https://github.com/skunkworxdark/metadata-linked-nodes + +-------------------------------- +### Negative Image + +Description: Creates a negative version of an image, effective for visual effects and mask inversion. + +Node Link: https://github.com/VeyDlin/negative-image-node + +View: +
+ +-------------------------------- +### Nightmare Promptgen + +**Description:** Nightmare Prompt Generator - Uses a local text generation model to create unique imaginative (but usually nightmarish) prompts for InvokeAI. By default, it allows you to choose from some gpt-neo models I finetuned on over 2500 of my own InvokeAI prompts in Compel format, but you're able to add your own, as well. Offers support for replacing any troublesome words with a random choice from list you can also define. + +**Node Link:** [https://github.com/gogurtenjoyer/nightmare-promptgen](https://github.com/gogurtenjoyer/nightmare-promptgen) + -------------------------------- ### Oobabooga @@ -289,6 +417,15 @@ See full docs here: https://github.com/skunkworxdark/Prompt-tools-nodes/edit/mai **Node Link:** https://github.com/fieldOfView/InvokeAI-remote_image +-------------------------------- +### Remove Background + +Description: An integration of the rembg package to remove backgrounds from images using multiple U2NET models. + +Node Link: https://github.com/VeyDlin/remove-background-node + +View: +
-------------------------------- ### Retroize @@ -301,6 +438,17 @@ See full docs here: https://github.com/skunkworxdark/Prompt-tools-nodes/edit/mai +-------------------------------- +### Simple Skin Detection + +Description: Detects skin in images based on predefined color thresholds. + +Node Link: https://github.com/VeyDlin/simple-skin-detection-node + +View: +
+ + -------------------------------- ### Size Stepper Nodes @@ -386,6 +534,7 @@ See full docs here: https://github.com/skunkworxdark/XYGrid_nodes/edit/main/READ + -------------------------------- ### Example Node Template diff --git a/docs/nodes/exampleWorkflows.md b/docs/nodes/exampleWorkflows.md index 17eea5677e..b52493f365 100644 --- a/docs/nodes/exampleWorkflows.md +++ b/docs/nodes/exampleWorkflows.md @@ -1,6 +1,6 @@ # Example Workflows -We've curated some example workflows for you to get started with Workflows in InvokeAI +We've curated some example workflows for you to get started with Workflows in InvokeAI! These can also be found in the Workflow Library, located in the Workflow Editor of Invoke. To use them, right click on your desired workflow, follow the link to GitHub and click the "⬇" button to download the raw file. You can then use the "Load Workflow" functionality in InvokeAI to load the workflow and start generating images! diff --git a/docs/other/CONTRIBUTORS.md b/docs/other/CONTRIBUTORS.md index f35db8919c..704f218027 100644 --- a/docs/other/CONTRIBUTORS.md +++ b/docs/other/CONTRIBUTORS.md @@ -215,6 +215,7 @@ We thank them for all of their time and hard work. - Robert Bolender - Robin Rombach - Rohan Barar +- rohinish404 - rpagliuca - rromb - Rupesh Sreeraman diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css new file mode 100644 index 0000000000..42a2cfe74a --- /dev/null +++ b/docs/stylesheets/extra.css @@ -0,0 +1,5 @@ +:root { + --md-primary-fg-color: #35A4DB; + --md-primary-fg-color--light: #35A4DB; + --md-primary-fg-color--dark: #35A4DB; + } \ No newline at end of file diff --git a/docs/workflows/ESRGAN_img2img_upscale_w_Canny_ControlNet.json b/docs/workflows/ESRGAN_img2img_upscale_w_Canny_ControlNet.json index 17222aa002..abde0cab76 100644 --- a/docs/workflows/ESRGAN_img2img_upscale_w_Canny_ControlNet.json +++ b/docs/workflows/ESRGAN_img2img_upscale_w_Canny_ControlNet.json @@ -1,27 +1,29 @@ { - "name": "ESRGAN img2img upscale w_ Canny ControlNet", + "id": "6bfa0b3a-7090-4cd9-ad2d-a4b8662b6e71", + "name": "ESRGAN Upscaling with Canny ControlNet", "author": "InvokeAI", "description": "Sample workflow for using Upscaling with ControlNet with SD1.5", "version": "1.0.1", "contact": "invoke@invoke.ai", - "tags": "tiled, upscale controlnet, default", + "tags": "upscale, controlnet, default", "notes": "", "exposedFields": [ { "nodeId": "d8ace142-c05f-4f1d-8982-88dc7473958d", "fieldName": "model" }, - { - "nodeId": "771bdf6a-0813-4099-a5d8-921a138754d4", - "fieldName": "image" - }, { "nodeId": "63b6ab7e-5b05-4d1b-a3b1-42d8e53ce16b", "fieldName": "prompt" + }, + { + "nodeId": "771bdf6a-0813-4099-a5d8-921a138754d4", + "fieldName": "image" } ], "meta": { - "version": "1.0.0" + "category": "default", + "version": "2.0.0" }, "nodes": [ { @@ -30,44 +32,56 @@ "data": { "id": "e8bf67fe-67de-4227-87eb-79e86afdfc74", "type": "compel", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "prompt": { "id": "5f762fae-d791-42d9-8ab5-2b830c33ff20", "name": "prompt", - "type": "string", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, "value": "" }, "clip": { "id": "8ac95f40-317d-4513-bbba-b99effd3b438", "name": "clip", - "type": "ClipField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } } }, "outputs": { "conditioning": { "id": "46c65b2b-c0b5-40c2-b183-74e9451c6d56", "name": "conditioning", - "type": "ConditioningField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 261, + "height": 256, "position": { - "x": 1261.0015571435993, - "y": 1513.9276360694537 + "x": 1250, + "y": 1500 } }, { @@ -76,13 +90,24 @@ "data": { "id": "d8ace142-c05f-4f1d-8982-88dc7473958d", "type": "main_model_loader", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "model": { "id": "b35ae88a-f2d2-43f6-958c-8c624391250f", "name": "model", - "type": "MainModelField", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MainModelField" + }, "value": { "model_name": "stable-diffusion-v1-5", "base_model": "sd-1", @@ -94,35 +119,40 @@ "unet": { "id": "02f243cb-c6e2-42c5-8be9-ef0519d54383", "name": "unet", - "type": "UNetField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "UNetField" + } }, "clip": { "id": "7762ed13-5b28-40f4-85f1-710942ceb92a", "name": "clip", - "type": "ClipField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } }, "vae": { "id": "69566153-1918-417d-a3bb-32e9e857ef6b", "name": "vae", - "type": "VaeField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 226, + "height": 227, "position": { - "x": 433.44132965778, - "y": 1419.9552496403696 + "x": 700, + "y": 1375 } }, { @@ -131,48 +161,64 @@ "data": { "id": "771bdf6a-0813-4099-a5d8-921a138754d4", "type": "image", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "image": { "id": "0f6d68a2-38bd-4f65-a112-0a256c7a2678", "name": "image", - "type": "ImageField", "fieldKind": "input", - "label": "" + "label": "Image To Upscale", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } } }, "outputs": { "image": { "id": "76f6f9b6-755b-4373-93fa-6a779998d2c8", "name": "image", - "type": "ImageField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } }, "width": { "id": "6858e46b-707c-444f-beda-9b5f4aecfdf8", "name": "width", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } }, "height": { "id": "421bdc6e-ecd1-4935-9665-d38ab8314f79", "name": "height", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, "height": 225, "position": { - "x": 11.612243766002848, - "y": 1989.909405085168 + "x": 375, + "y": 1900 } }, { @@ -181,35 +227,58 @@ "data": { "id": "f7564dd2-9539-47f2-ac13-190804461f4e", "type": "esrgan", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.3.0", + "nodePack": "invokeai", "inputs": { "metadata": { "id": "8fa0c7eb-5bd3-4575-98e7-72285c532504", "name": "metadata", - "type": "MetadataField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } }, "image": { "id": "3c949799-a504-41c9-b342-cff4b8146c48", "name": "image", - "type": "ImageField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } }, "model_name": { "id": "77cb4750-53d6-4c2c-bb5c-145981acbf17", "name": "model_name", - "type": "enum", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, "value": "RealESRGAN_x4plus.pth" }, "tile_size": { "id": "7787b3ad-46ee-4248-995f-bc740e1f988b", "name": "tile_size", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 400 } }, @@ -217,35 +286,40 @@ "image": { "id": "37e6308e-e926-4e07-b0db-4e8601f495d0", "name": "image", - "type": "ImageField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } }, "width": { "id": "c194d84a-fac7-4856-b646-d08477a5ad2b", "name": "width", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } }, "height": { "id": "b2a6206c-a9c8-4271-a055-0b93a7f7d505", "name": "height", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.1.0" + } }, "width": 320, - "height": 339, + "height": 340, "position": { - "x": 436.07457889056195, - "y": 1967.3109314112623 + "x": 775, + "y": 1900 } }, { @@ -254,35 +328,58 @@ "data": { "id": "1d887701-df21-4966-ae6e-a7d82307d7bd", "type": "canny_image_processor", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.2.0", + "nodePack": "invokeai", "inputs": { "metadata": { "id": "52c877c8-25d9-4949-8518-f536fcdd152d", "name": "metadata", - "type": "MetadataField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } }, "image": { "id": "e0af11fe-4f95-4193-a599-cf40b6a963f5", "name": "image", - "type": "ImageField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } }, "low_threshold": { "id": "ab775f7b-f556-4298-a9d6-2274f3a6c77c", "name": "low_threshold", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 100 }, "high_threshold": { "id": "9e58b615-06e4-417f-b0d8-63f1574cd174", "name": "high_threshold", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 200 } }, @@ -290,35 +387,40 @@ "image": { "id": "61feb8bf-95c9-4634-87e2-887fc43edbdf", "name": "image", - "type": "ImageField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } }, "width": { "id": "9e203e41-73f7-4cfa-bdca-5040e5e60c55", "name": "width", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } }, "height": { "id": "ec7d99dc-0d82-4495-a759-6423808bff1c", "name": "height", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 339, + "height": 340, "position": { - "x": 1221.7155516160597, - "y": 1971.0099052871012 + "x": 1200, + "y": 1900 } }, { @@ -327,63 +429,98 @@ "data": { "id": "ca1d020c-89a8-4958-880a-016d28775cfa", "type": "controlnet", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.1.0", + "nodePack": "invokeai", "inputs": { "image": { "id": "2973c126-e301-4595-a7dc-d6e1729ccdbf", "name": "image", - "type": "ImageField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } }, "control_model": { "id": "4bb4d987-8491-4839-b41b-6e2f546fe2d0", "name": "control_model", - "type": "ControlNetModelField", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ControlNetModelField" + }, "value": { - "model_name": "sd-controlnet-canny", + "model_name": "canny", "base_model": "sd-1" } }, "control_weight": { "id": "a3cf387a-b58f-4058-858f-6a918efac609", "name": "control_weight", - "type": "FloatPolymorphic", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "FloatField" + }, "value": 1 }, "begin_step_percent": { "id": "e0614f69-8a58-408b-9238-d3a44a4db4e0", "name": "begin_step_percent", - "type": "float", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, "value": 0 }, "end_step_percent": { "id": "ac683539-b6ed-4166-9294-2040e3ede206", "name": "end_step_percent", - "type": "float", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, "value": 1 }, "control_mode": { "id": "f00b21de-cbd7-4901-8efc-e7134a2dc4c8", "name": "control_mode", - "type": "enum", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, "value": "balanced" }, "resize_mode": { "id": "cafb60ee-3959-4d57-a06c-13b83be6ea4f", "name": "resize_mode", - "type": "enum", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, "value": "just_resize" } }, @@ -391,23 +528,20 @@ "control": { "id": "dfb88dd1-12bf-4034-9268-e726f894c131", "name": "control", - "type": "ControlField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ControlField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 508, + "height": 511, "position": { - "x": 1681.7783532660528, - "y": 1845.0516454465633 + "x": 1650, + "y": 1900 } }, { @@ -416,37 +550,60 @@ "data": { "id": "f50624ce-82bf-41d0-bdf7-8aab11a80d48", "type": "noise", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.1", + "nodePack": "invokeai", "inputs": { "seed": { "id": "f76b0e01-b601-423f-9b5f-ab7a1f10fe82", "name": "seed", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 0 }, "width": { "id": "eec326d6-710c-45de-a25c-95704c80d7e2", "name": "width", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 512 }, "height": { "id": "2794a27d-5337-43ca-95d9-41b673642c94", "name": "height", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 512 }, "use_cpu": { "id": "ae7654e3-979e-44a1-8968-7e3199e91e66", "name": "use_cpu", - "type": "boolean", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, "value": true } }, @@ -454,35 +611,40 @@ "noise": { "id": "8b6dc166-4ead-4124-8ac9-529814b0cbb9", "name": "noise", - "type": "LatentsField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } }, "width": { "id": "e3fe3940-a277-4838-a448-5f81f2a7d99d", "name": "width", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } }, "height": { "id": "48ecd6ef-c216-40d5-9d1b-d37bd00c82e7", "name": "height", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } } - }, - "label": "", - "isOpen": false, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, "height": 32, "position": { - "x": 1660.5387878479382, - "y": 1664.7391082353483 + "x": 1650, + "y": 1775 } }, { @@ -491,141 +653,221 @@ "data": { "id": "c3737554-8d87-48ff-a6f8-e71d2867f434", "type": "denoise_latents", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.5.0", + "nodePack": "invokeai", "inputs": { "positive_conditioning": { "id": "e127084b-72f5-4fe4-892b-84f34f88bce9", "name": "positive_conditioning", - "type": "ConditioningField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } }, "negative_conditioning": { "id": "72cde4ee-55de-4d3e-9057-74e741c04e20", "name": "negative_conditioning", - "type": "ConditioningField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } }, "noise": { "id": "747f7023-1c19-465b-bec8-1d9695dd3505", "name": "noise", - "type": "LatentsField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } }, "steps": { "id": "80860292-633c-46f2-83d0-60d0029b65d2", "name": "steps", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 10 }, "cfg_scale": { "id": "ebc71e6f-9148-4f12-b455-5e1f179d1c3a", "name": "cfg_scale", - "type": "FloatPolymorphic", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "FloatField" + }, "value": 7.5 }, "denoising_start": { "id": "ced44b8f-3bad-4c34-8113-13bc0faed28a", "name": "denoising_start", - "type": "float", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, "value": 0 }, "denoising_end": { "id": "79bf4b77-3502-4f72-ba8b-269c4c3c5c72", "name": "denoising_end", - "type": "float", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, "value": 1 }, "scheduler": { "id": "ed56e2b8-f477-41a2-b9f5-f15f4933ae65", "name": "scheduler", - "type": "Scheduler", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "SchedulerField" + }, "value": "euler" }, "unet": { "id": "146b790c-b08e-437c-a2e1-e393c2c1c41a", "name": "unet", - "type": "UNetField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "UNetField" + } }, "control": { "id": "75ed3df1-d261-4b8e-a89b-341c4d7161fb", "name": "control", - "type": "ControlPolymorphic", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "ControlField" + } }, "ip_adapter": { "id": "eab9a61d-9b64-44d3-8d90-4686f5887cb0", "name": "ip_adapter", - "type": "IPAdapterPolymorphic", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "IPAdapterField" + } }, "t2i_adapter": { "id": "2dc8d637-58fd-4069-ad33-85c32d958b7b", "name": "t2i_adapter", - "type": "T2IAdapterPolymorphic", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "T2IAdapterField" + } + }, + "cfg_rescale_multiplier": { + "id": "391e5010-e402-4380-bb46-e7edaede3512", + "name": "cfg_rescale_multiplier", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 }, "latents": { "id": "6767e40a-97c6-4487-b3c9-cad1c150bf9f", "name": "latents", - "type": "LatentsField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } }, "denoise_mask": { "id": "6251efda-d97d-4ff1-94b5-8cc6b458c184", "name": "denoise_mask", - "type": "DenoiseMaskField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "DenoiseMaskField" + } } }, "outputs": { "latents": { "id": "4e7986a4-dff2-4448-b16b-1af477b81f8b", "name": "latents", - "type": "LatentsField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } }, "width": { "id": "dad525dd-d2f8-4f07-8c8d-51f2a3c5456e", "name": "width", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } }, "height": { "id": "af03a089-4739-40c6-8b48-25d458d63c2f", "name": "height", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.4.0" + } }, "width": 320, - "height": 646, + "height": 705, "position": { "x": 2128.740065979906, "y": 1232.6219060454753 @@ -637,42 +879,69 @@ "data": { "id": "3ed9b2ef-f4ec-40a7-94db-92e63b583ec0", "type": "l2i", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": false, + "useCache": true, + "version": "1.2.0", + "nodePack": "invokeai", "inputs": { "metadata": { "id": "9f7a1a9f-7861-4f09-874b-831af89b7474", "name": "metadata", - "type": "MetadataField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } }, "latents": { "id": "a5b42432-8ee7-48cd-b61c-b97be6e490a2", "name": "latents", - "type": "LatentsField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } }, "vae": { "id": "890de106-e6c3-4c2c-8d67-b368def64894", "name": "vae", - "type": "VaeField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } }, "tiled": { "id": "b8e5a2ca-5fbc-49bd-ad4c-ea0e109d46e3", "name": "tiled", - "type": "boolean", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, "value": false }, "fp32": { "id": "fdaf6264-4593-4bd2-ac71-8a0acff261af", "name": "fp32", - "type": "boolean", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, "value": false } }, @@ -680,29 +949,34 @@ "image": { "id": "94c5877d-6c78-4662-a836-8a84fc75d0a0", "name": "image", - "type": "ImageField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } }, "width": { "id": "2a854e42-1616-42f5-b9ef-7b73c40afc1d", "name": "width", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } }, "height": { "id": "dd649053-1433-4f31-90b3-8bb103efc5b1", "name": "height", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": false, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, "height": 267, @@ -717,35 +991,58 @@ "data": { "id": "5ca498a4-c8c8-4580-a396-0c984317205d", "type": "i2l", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "image": { "id": "9e6c4010-0f79-4587-9062-29d9a8f96b3b", "name": "image", - "type": "ImageField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } }, "vae": { "id": "b9ed2ec4-e8e3-4d69-8a42-27f2d983bcd6", "name": "vae", - "type": "VaeField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } }, "tiled": { "id": "bb48d10b-2440-4c46-b835-646ae5ebc013", "name": "tiled", - "type": "boolean", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, "value": false }, "fp32": { "id": "1048612c-c0f4-4abf-a684-0045e7d158f8", "name": "fp32", - "type": "boolean", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, "value": false } }, @@ -753,35 +1050,40 @@ "latents": { "id": "55301367-0578-4dee-8060-031ae13c7bf8", "name": "latents", - "type": "LatentsField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } }, "width": { "id": "2eb65690-1f20-4070-afbd-1e771b9f8ca9", "name": "width", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } }, "height": { "id": "d5bf64c7-c30f-43b8-9bc2-95e7718c1bdc", "name": "height", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 325, + "height": 32, "position": { - "x": 848.091172736516, - "y": 1618.7467772496016 + "x": 1650, + "y": 1675 } }, { @@ -790,175 +1092,273 @@ "data": { "id": "63b6ab7e-5b05-4d1b-a3b1-42d8e53ce16b", "type": "compel", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "prompt": { "id": "5f762fae-d791-42d9-8ab5-2b830c33ff20", "name": "prompt", - "type": "string", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, "value": "" }, "clip": { "id": "8ac95f40-317d-4513-bbba-b99effd3b438", "name": "clip", - "type": "ClipField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } } }, "outputs": { "conditioning": { "id": "46c65b2b-c0b5-40c2-b183-74e9451c6d56", "name": "conditioning", - "type": "ConditioningField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 261, + "height": 256, "position": { - "x": 1280.0309709777139, - "y": 1213.3027983934699 + "x": 1250, + "y": 1200 + } + }, + { + "id": "eb8f6f8a-c7b1-4914-806e-045ee2717a35", + "type": "invocation", + "data": { + "id": "eb8f6f8a-c7b1-4914-806e-045ee2717a35", + "type": "rand_int", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": false, + "version": "1.0.0", + "inputs": { + "low": { + "id": "2118026f-1c64-41fa-ab6b-7532410f60ae", + "name": "low", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "high": { + "id": "c12f312a-fdfd-4aca-9aa6-4c99bc70bd63", + "name": "high", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 2147483647 + } + }, + "outputs": { + "value": { + "id": "75552bad-6212-4ae7-96a7-68e666acea4c", + "name": "value", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "width": 320, + "height": 32, + "position": { + "x": 1650, + "y": 1600 } } ], "edges": [ { - "source": "771bdf6a-0813-4099-a5d8-921a138754d4", - "sourceHandle": "image", - "target": "f7564dd2-9539-47f2-ac13-190804461f4e", - "targetHandle": "image", + "id": "5ca498a4-c8c8-4580-a396-0c984317205d-f50624ce-82bf-41d0-bdf7-8aab11a80d48-collapsed", + "source": "5ca498a4-c8c8-4580-a396-0c984317205d", + "target": "f50624ce-82bf-41d0-bdf7-8aab11a80d48", + "type": "collapsed" + }, + { + "id": "eb8f6f8a-c7b1-4914-806e-045ee2717a35-f50624ce-82bf-41d0-bdf7-8aab11a80d48-collapsed", + "source": "eb8f6f8a-c7b1-4914-806e-045ee2717a35", + "target": "f50624ce-82bf-41d0-bdf7-8aab11a80d48", + "type": "collapsed" + }, + { "id": "reactflow__edge-771bdf6a-0813-4099-a5d8-921a138754d4image-f7564dd2-9539-47f2-ac13-190804461f4eimage", - "type": "default" + "source": "771bdf6a-0813-4099-a5d8-921a138754d4", + "target": "f7564dd2-9539-47f2-ac13-190804461f4e", + "type": "default", + "sourceHandle": "image", + "targetHandle": "image" }, { - "source": "f7564dd2-9539-47f2-ac13-190804461f4e", - "sourceHandle": "image", - "target": "1d887701-df21-4966-ae6e-a7d82307d7bd", - "targetHandle": "image", "id": "reactflow__edge-f7564dd2-9539-47f2-ac13-190804461f4eimage-1d887701-df21-4966-ae6e-a7d82307d7bdimage", - "type": "default" - }, - { - "source": "5ca498a4-c8c8-4580-a396-0c984317205d", - "sourceHandle": "width", - "target": "f50624ce-82bf-41d0-bdf7-8aab11a80d48", - "targetHandle": "width", - "id": "reactflow__edge-5ca498a4-c8c8-4580-a396-0c984317205dwidth-f50624ce-82bf-41d0-bdf7-8aab11a80d48width", - "type": "default" - }, - { - "source": "5ca498a4-c8c8-4580-a396-0c984317205d", - "sourceHandle": "height", - "target": "f50624ce-82bf-41d0-bdf7-8aab11a80d48", - "targetHandle": "height", - "id": "reactflow__edge-5ca498a4-c8c8-4580-a396-0c984317205dheight-f50624ce-82bf-41d0-bdf7-8aab11a80d48height", - "type": "default" - }, - { - "source": "f50624ce-82bf-41d0-bdf7-8aab11a80d48", - "sourceHandle": "noise", - "target": "c3737554-8d87-48ff-a6f8-e71d2867f434", - "targetHandle": "noise", - "id": "reactflow__edge-f50624ce-82bf-41d0-bdf7-8aab11a80d48noise-c3737554-8d87-48ff-a6f8-e71d2867f434noise", - "type": "default" - }, - { - "source": "5ca498a4-c8c8-4580-a396-0c984317205d", - "sourceHandle": "latents", - "target": "c3737554-8d87-48ff-a6f8-e71d2867f434", - "targetHandle": "latents", - "id": "reactflow__edge-5ca498a4-c8c8-4580-a396-0c984317205dlatents-c3737554-8d87-48ff-a6f8-e71d2867f434latents", - "type": "default" - }, - { - "source": "e8bf67fe-67de-4227-87eb-79e86afdfc74", - "sourceHandle": "conditioning", - "target": "c3737554-8d87-48ff-a6f8-e71d2867f434", - "targetHandle": "negative_conditioning", - "id": "reactflow__edge-e8bf67fe-67de-4227-87eb-79e86afdfc74conditioning-c3737554-8d87-48ff-a6f8-e71d2867f434negative_conditioning", - "type": "default" - }, - { - "source": "63b6ab7e-5b05-4d1b-a3b1-42d8e53ce16b", - "sourceHandle": "conditioning", - "target": "c3737554-8d87-48ff-a6f8-e71d2867f434", - "targetHandle": "positive_conditioning", - "id": "reactflow__edge-63b6ab7e-5b05-4d1b-a3b1-42d8e53ce16bconditioning-c3737554-8d87-48ff-a6f8-e71d2867f434positive_conditioning", - "type": "default" - }, - { - "source": "d8ace142-c05f-4f1d-8982-88dc7473958d", - "sourceHandle": "clip", - "target": "63b6ab7e-5b05-4d1b-a3b1-42d8e53ce16b", - "targetHandle": "clip", - "id": "reactflow__edge-d8ace142-c05f-4f1d-8982-88dc7473958dclip-63b6ab7e-5b05-4d1b-a3b1-42d8e53ce16bclip", - "type": "default" - }, - { - "source": "d8ace142-c05f-4f1d-8982-88dc7473958d", - "sourceHandle": "clip", - "target": "e8bf67fe-67de-4227-87eb-79e86afdfc74", - "targetHandle": "clip", - "id": "reactflow__edge-d8ace142-c05f-4f1d-8982-88dc7473958dclip-e8bf67fe-67de-4227-87eb-79e86afdfc74clip", - "type": "default" - }, - { - "source": "1d887701-df21-4966-ae6e-a7d82307d7bd", - "sourceHandle": "image", - "target": "ca1d020c-89a8-4958-880a-016d28775cfa", - "targetHandle": "image", - "id": "reactflow__edge-1d887701-df21-4966-ae6e-a7d82307d7bdimage-ca1d020c-89a8-4958-880a-016d28775cfaimage", - "type": "default" - }, - { - "source": "ca1d020c-89a8-4958-880a-016d28775cfa", - "sourceHandle": "control", - "target": "c3737554-8d87-48ff-a6f8-e71d2867f434", - "targetHandle": "control", - "id": "reactflow__edge-ca1d020c-89a8-4958-880a-016d28775cfacontrol-c3737554-8d87-48ff-a6f8-e71d2867f434control", - "type": "default" - }, - { - "source": "c3737554-8d87-48ff-a6f8-e71d2867f434", - "sourceHandle": "latents", - "target": "3ed9b2ef-f4ec-40a7-94db-92e63b583ec0", - "targetHandle": "latents", - "id": "reactflow__edge-c3737554-8d87-48ff-a6f8-e71d2867f434latents-3ed9b2ef-f4ec-40a7-94db-92e63b583ec0latents", - "type": "default" - }, - { - "source": "d8ace142-c05f-4f1d-8982-88dc7473958d", - "sourceHandle": "vae", - "target": "3ed9b2ef-f4ec-40a7-94db-92e63b583ec0", - "targetHandle": "vae", - "id": "reactflow__edge-d8ace142-c05f-4f1d-8982-88dc7473958dvae-3ed9b2ef-f4ec-40a7-94db-92e63b583ec0vae", - "type": "default" - }, - { "source": "f7564dd2-9539-47f2-ac13-190804461f4e", + "target": "1d887701-df21-4966-ae6e-a7d82307d7bd", + "type": "default", "sourceHandle": "image", - "target": "5ca498a4-c8c8-4580-a396-0c984317205d", - "targetHandle": "image", - "id": "reactflow__edge-f7564dd2-9539-47f2-ac13-190804461f4eimage-5ca498a4-c8c8-4580-a396-0c984317205dimage", - "type": "default" + "targetHandle": "image" }, { - "source": "d8ace142-c05f-4f1d-8982-88dc7473958d", - "sourceHandle": "unet", + "id": "reactflow__edge-5ca498a4-c8c8-4580-a396-0c984317205dwidth-f50624ce-82bf-41d0-bdf7-8aab11a80d48width", + "source": "5ca498a4-c8c8-4580-a396-0c984317205d", + "target": "f50624ce-82bf-41d0-bdf7-8aab11a80d48", + "type": "default", + "sourceHandle": "width", + "targetHandle": "width" + }, + { + "id": "reactflow__edge-5ca498a4-c8c8-4580-a396-0c984317205dheight-f50624ce-82bf-41d0-bdf7-8aab11a80d48height", + "source": "5ca498a4-c8c8-4580-a396-0c984317205d", + "target": "f50624ce-82bf-41d0-bdf7-8aab11a80d48", + "type": "default", + "sourceHandle": "height", + "targetHandle": "height" + }, + { + "id": "reactflow__edge-f50624ce-82bf-41d0-bdf7-8aab11a80d48noise-c3737554-8d87-48ff-a6f8-e71d2867f434noise", + "source": "f50624ce-82bf-41d0-bdf7-8aab11a80d48", "target": "c3737554-8d87-48ff-a6f8-e71d2867f434", - "targetHandle": "unet", + "type": "default", + "sourceHandle": "noise", + "targetHandle": "noise" + }, + { + "id": "reactflow__edge-5ca498a4-c8c8-4580-a396-0c984317205dlatents-c3737554-8d87-48ff-a6f8-e71d2867f434latents", + "source": "5ca498a4-c8c8-4580-a396-0c984317205d", + "target": "c3737554-8d87-48ff-a6f8-e71d2867f434", + "type": "default", + "sourceHandle": "latents", + "targetHandle": "latents" + }, + { + "id": "reactflow__edge-e8bf67fe-67de-4227-87eb-79e86afdfc74conditioning-c3737554-8d87-48ff-a6f8-e71d2867f434negative_conditioning", + "source": "e8bf67fe-67de-4227-87eb-79e86afdfc74", + "target": "c3737554-8d87-48ff-a6f8-e71d2867f434", + "type": "default", + "sourceHandle": "conditioning", + "targetHandle": "negative_conditioning" + }, + { + "id": "reactflow__edge-63b6ab7e-5b05-4d1b-a3b1-42d8e53ce16bconditioning-c3737554-8d87-48ff-a6f8-e71d2867f434positive_conditioning", + "source": "63b6ab7e-5b05-4d1b-a3b1-42d8e53ce16b", + "target": "c3737554-8d87-48ff-a6f8-e71d2867f434", + "type": "default", + "sourceHandle": "conditioning", + "targetHandle": "positive_conditioning" + }, + { + "id": "reactflow__edge-d8ace142-c05f-4f1d-8982-88dc7473958dclip-63b6ab7e-5b05-4d1b-a3b1-42d8e53ce16bclip", + "source": "d8ace142-c05f-4f1d-8982-88dc7473958d", + "target": "63b6ab7e-5b05-4d1b-a3b1-42d8e53ce16b", + "type": "default", + "sourceHandle": "clip", + "targetHandle": "clip" + }, + { + "id": "reactflow__edge-d8ace142-c05f-4f1d-8982-88dc7473958dclip-e8bf67fe-67de-4227-87eb-79e86afdfc74clip", + "source": "d8ace142-c05f-4f1d-8982-88dc7473958d", + "target": "e8bf67fe-67de-4227-87eb-79e86afdfc74", + "type": "default", + "sourceHandle": "clip", + "targetHandle": "clip" + }, + { + "id": "reactflow__edge-1d887701-df21-4966-ae6e-a7d82307d7bdimage-ca1d020c-89a8-4958-880a-016d28775cfaimage", + "source": "1d887701-df21-4966-ae6e-a7d82307d7bd", + "target": "ca1d020c-89a8-4958-880a-016d28775cfa", + "type": "default", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-ca1d020c-89a8-4958-880a-016d28775cfacontrol-c3737554-8d87-48ff-a6f8-e71d2867f434control", + "source": "ca1d020c-89a8-4958-880a-016d28775cfa", + "target": "c3737554-8d87-48ff-a6f8-e71d2867f434", + "type": "default", + "sourceHandle": "control", + "targetHandle": "control" + }, + { + "id": "reactflow__edge-c3737554-8d87-48ff-a6f8-e71d2867f434latents-3ed9b2ef-f4ec-40a7-94db-92e63b583ec0latents", + "source": "c3737554-8d87-48ff-a6f8-e71d2867f434", + "target": "3ed9b2ef-f4ec-40a7-94db-92e63b583ec0", + "type": "default", + "sourceHandle": "latents", + "targetHandle": "latents" + }, + { + "id": "reactflow__edge-d8ace142-c05f-4f1d-8982-88dc7473958dvae-3ed9b2ef-f4ec-40a7-94db-92e63b583ec0vae", + "source": "d8ace142-c05f-4f1d-8982-88dc7473958d", + "target": "3ed9b2ef-f4ec-40a7-94db-92e63b583ec0", + "type": "default", + "sourceHandle": "vae", + "targetHandle": "vae" + }, + { + "id": "reactflow__edge-f7564dd2-9539-47f2-ac13-190804461f4eimage-5ca498a4-c8c8-4580-a396-0c984317205dimage", + "source": "f7564dd2-9539-47f2-ac13-190804461f4e", + "target": "5ca498a4-c8c8-4580-a396-0c984317205d", + "type": "default", + "sourceHandle": "image", + "targetHandle": "image" + }, + { "id": "reactflow__edge-d8ace142-c05f-4f1d-8982-88dc7473958dunet-c3737554-8d87-48ff-a6f8-e71d2867f434unet", - "type": "default" + "source": "d8ace142-c05f-4f1d-8982-88dc7473958d", + "target": "c3737554-8d87-48ff-a6f8-e71d2867f434", + "type": "default", + "sourceHandle": "unet", + "targetHandle": "unet" + }, + { + "id": "reactflow__edge-d8ace142-c05f-4f1d-8982-88dc7473958dvae-5ca498a4-c8c8-4580-a396-0c984317205dvae", + "source": "d8ace142-c05f-4f1d-8982-88dc7473958d", + "target": "5ca498a4-c8c8-4580-a396-0c984317205d", + "type": "default", + "sourceHandle": "vae", + "targetHandle": "vae" + }, + { + "id": "reactflow__edge-eb8f6f8a-c7b1-4914-806e-045ee2717a35value-f50624ce-82bf-41d0-bdf7-8aab11a80d48seed", + "source": "eb8f6f8a-c7b1-4914-806e-045ee2717a35", + "target": "f50624ce-82bf-41d0-bdf7-8aab11a80d48", + "type": "default", + "sourceHandle": "value", + "targetHandle": "seed" } ] } \ No newline at end of file diff --git a/docs/workflows/Face_Detailer_with_IP-Adapter_and_Canny.json b/docs/workflows/Face_Detailer_with_IP-Adapter_and_Canny.json index 3ef8d720f8..6f392d6a7b 100644 --- a/docs/workflows/Face_Detailer_with_IP-Adapter_and_Canny.json +++ b/docs/workflows/Face_Detailer_with_IP-Adapter_and_Canny.json @@ -1,10 +1,11 @@ { - "name": "Face Detailer with IP-Adapter & Canny", - "author": "@kosmoskatten", - "description": "A workflow to automatically improve faces in an image using IP-Adapter and Canny ControlNet. ", - "version": "0.1.0", - "contact": "@kosmoskatten via Discord", - "tags": "face, detailer, SD1.5", + "id": "972fc0e9-a13f-4658-86b9-aef100d124ba", + "name": "Face Detailer with IP-Adapter & Canny (See Note)", + "author": "kosmoskatten", + "description": "A workflow to add detail to and improve faces. This workflow is most effective when used with a model that creates realistic outputs. For best results, use this image as the blur mask: https://i.imgur.com/Gxi61zP.png", + "version": "1.0.0", + "contact": "invoke@invoke.ai", + "tags": "face detailer, IP-Adapter, Canny", "notes": "", "exposedFields": [ { @@ -15,6 +16,10 @@ "nodeId": "64712037-92e8-483f-9f6e-87588539c1b8", "fieldName": "value" }, + { + "nodeId": "77da4e4d-5778-4469-8449-ffed03d54bdb", + "fieldName": "radius" + }, { "nodeId": "f0de6c44-4515-4f79-bcc0-dee111bcfe31", "fieldName": "value" @@ -22,10 +27,15 @@ { "nodeId": "2c9bc2a6-6c03-4861-aad4-db884a7682f8", "fieldName": "image" + }, + { + "nodeId": "c59e815c-1f3a-4e2b-b6b8-66f4b005e955", + "fieldName": "image" } ], "meta": { - "version": "1.0.0" + "category": "default", + "version": "2.0.0" }, "nodes": [ { @@ -34,44 +44,169 @@ "data": { "id": "44f2c190-eb03-460d-8d11-a94d13b33f19", "type": "compel", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "prompt": { "id": "916b229a-38e1-45a2-a433-cca97495b143", "name": "prompt", - "type": "string", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, "value": "" }, "clip": { "id": "ae9aeb1a-4ebd-4bc3-b6e6-a8c9adca01f6", "name": "clip", - "type": "ClipField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } } }, "outputs": { "conditioning": { "id": "4d59bad1-99a9-43e2-bdb4-7a0f3dd5b787", "name": "conditioning", - "type": "ConditioningField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } } - }, + } + }, + "width": 320, + "height": 256, + "position": { + "x": 2575, + "y": -250 + } + }, + { + "id": "c59e815c-1f3a-4e2b-b6b8-66f4b005e955", + "type": "invocation", + "data": { + "id": "c59e815c-1f3a-4e2b-b6b8-66f4b005e955", + "type": "img_resize", "label": "", "isOpen": true, "notes": "", - "embedWorkflow": false, "isIntermediate": true, "useCache": true, - "version": "1.0.0" + "version": "1.2.0", + "nodePack": "invokeai", + "inputs": { + "metadata": { + "id": "48ff6f70-380c-4e19-acf7-91063cfff8a8", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "image": { + "id": "2a348a03-07a3-4a97-93c8-46051045b32f", + "name": "image", + "fieldKind": "input", + "label": "Blur Mask", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "6b95969c-ca73-4b54-815d-7aae305a67bd", + "name": "width", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + }, + "height": { + "id": "af83c526-c730-4a34-8f73-80f443fecc05", + "name": "height", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + }, + "resample_mode": { + "id": "43f7d6b5-ebe0-43c4-bf5d-8fb7fdc40a3f", + "name": "resample_mode", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, + "value": "lanczos" + } + }, + "outputs": { + "image": { + "id": "e492b013-615d-4dfd-b0d8-7df7b5ba9a9d", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "05f829b3-c253-495a-b1ad-9906c0833e49", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "65d5d662-2527-4f3c-8a87-0a7d9d4486de", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } }, "width": 320, - "height": 261, + "height": 397, "position": { - "x": 3176.5748307120457, - "y": -605.7792243912572 + "x": 4675, + "y": 625 } }, { @@ -80,15 +215,26 @@ "data": { "id": "2c9bc2a6-6c03-4861-aad4-db884a7682f8", "type": "image", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "image": { "id": "729c571b-d5a0-4b53-8f50-5e11eb744f66", "name": "image", - "type": "ImageField", "fieldKind": "input", - "label": "Original Image", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + }, "value": { - "image_name": "013a13e0-3af3-4fd8-8e6e-9dafb658e0bb.png" + "image_name": "42a524fd-ed77-46e2-b52f-40375633f357.png" } } }, @@ -96,35 +242,332 @@ "image": { "id": "3632a144-58d6-4447-bafc-e4f7d6ca96bf", "name": "image", - "type": "ImageField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } }, "width": { "id": "30faefcc-81a1-445b-a3fe-0110ceb56772", "name": "width", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } }, "height": { "id": "d173d225-849a-4498-a75d-ba17210dbd3e", "name": "height", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } } - }, + } + }, + "width": 320, + "height": 489, + "position": { + "x": 2050, + "y": -75 + } + }, + { + "id": "9ae34718-a17d-401d-9859-086896c29fca", + "type": "invocation", + "data": { + "id": "9ae34718-a17d-401d-9859-086896c29fca", + "type": "face_off", "label": "", "isOpen": true, "notes": "", - "embedWorkflow": false, "isIntermediate": true, "useCache": true, - "version": "1.0.0" + "version": "1.2.0", + "nodePack": "invokeai", + "inputs": { + "metadata": { + "id": "0144d549-b04a-49c2-993f-9ecb2695191a", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "image": { + "id": "9c580dec-a958-43a4-9aa0-7ab9491c56a0", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "face_id": { + "id": "1ee762e1-810f-46f7-a591-ecd28abff85b", + "name": "face_id", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "minimum_confidence": { + "id": "74d2bae8-7ac5-4f8f-afb7-1efc76ed72a0", + "name": "minimum_confidence", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0.5 + }, + "x_offset": { + "id": "f1c1489d-cbbb-45d2-ba94-e150fc5ce24d", + "name": "x_offset", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 + }, + "y_offset": { + "id": "6621377a-7e29-4841-aa47-aa7d438662f9", + "name": "y_offset", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 + }, + "padding": { + "id": "0414c830-1be8-48cd-b0c8-6de10b099029", + "name": "padding", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 64 + }, + "chunk": { + "id": "22eba30a-c68a-4e5f-8f97-315830959b04", + "name": "chunk", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": false + } + }, + "outputs": { + "image": { + "id": "7d8fa807-0e9c-4d6a-a85a-388bd0cb5166", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "048361ca-314c-44a4-8b6e-ca4917e3468f", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "7b721071-63e5-4d54-9607-9fa2192163a8", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "mask": { + "id": "a9c6194a-3dbd-4b18-af04-a85a9498f04e", + "name": "mask", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "x": { + "id": "d072582c-2db5-430b-9e50-b50277baa7d5", + "name": "x", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "y": { + "id": "40624813-e55d-42d7-bc14-dea48ccfd9c8", + "name": "y", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } }, "width": 320, - "height": 225, + "height": 657, "position": { - "x": 1787.0260885895482, - "y": 171.61158302175093 + "x": 2575, + "y": 200 + } + }, + { + "id": "50a8db6a-3796-4522-8547-53275efa4e7d", + "type": "invocation", + "data": { + "id": "50a8db6a-3796-4522-8547-53275efa4e7d", + "type": "img_resize", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.2.0", + "nodePack": "invokeai", + "inputs": { + "metadata": { + "id": "6bf91925-e22e-4bcb-90e4-f8ac32ddff36", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "image": { + "id": "65af3f4e-7a89-4df4-8ba9-377af1701d16", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "1f036fee-77f3-480f-b690-089b27616ab8", + "name": "width", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + }, + "height": { + "id": "0c703b6e-e91a-4cd7-8b9e-b97865f76793", + "name": "height", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + }, + "resample_mode": { + "id": "ed77cf71-94cb-4da4-b536-75cb7aad8e54", + "name": "resample_mode", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, + "value": "lanczos" + } + }, + "outputs": { + "image": { + "id": "0d9e437b-6a08-45e1-9a55-ef03ae28e616", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "7c56c704-b4e5-410f-bb62-cd441ddb454f", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "45e12e17-7f25-46bd-a804-4384ec6b98cc", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "width": 320, + "height": 32, + "position": { + "x": 3000, + "y": 0 } }, { @@ -133,35 +576,58 @@ "data": { "id": "de8b1a48-a2e4-42ca-90bb-66058bffd534", "type": "i2l", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "image": { "id": "6c4d2827-4995-49d4-94ce-0ba0541d8839", "name": "image", - "type": "ImageField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } }, "vae": { "id": "9d6e3ab6-b6a4-45ac-ad75-0a96efba4c2f", "name": "vae", - "type": "VaeField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } }, "tiled": { "id": "9c258141-a75d-4ffd-bce5-f3fb3d90b720", "name": "tiled", - "type": "boolean", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, "value": false }, "fp32": { "id": "2235cc48-53c9-4e8a-a74a-ed41c61f2993", "name": "fp32", - "type": "boolean", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, "value": true } }, @@ -169,35 +635,266 @@ "latents": { "id": "8eb9293f-8f43-4c0c-b0fb-8c4db1200f87", "name": "latents", - "type": "LatentsField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } }, "width": { "id": "ce493959-d308-423c-b0f5-db05912e0318", "name": "width", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } }, "height": { "id": "827bf290-94fb-455f-a970-f98ba8800eac", "name": "height", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } } - }, + } + }, + "width": 320, + "height": 32, + "position": { + "x": 3100, + "y": -275 + } + }, + { + "id": "bd06261d-a74a-4d1f-8374-745ed6194bc2", + "type": "invocation", + "data": { + "id": "bd06261d-a74a-4d1f-8374-745ed6194bc2", + "type": "denoise_latents", "label": "", "isOpen": true, "notes": "", - "embedWorkflow": false, "isIntermediate": true, "useCache": true, - "version": "1.0.0" + "version": "1.5.0", + "nodePack": "invokeai", + "inputs": { + "positive_conditioning": { + "id": "673e4094-448b-4c59-ab05-d05b29b3e07f", + "name": "positive_conditioning", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + }, + "negative_conditioning": { + "id": "3b3bac27-7e8a-4c4e-8b5b-c5231125302a", + "name": "negative_conditioning", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + }, + "noise": { + "id": "d7c20d11-fbfb-4613-ba58-bf00307e53be", + "name": "noise", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "steps": { + "id": "e4af3bea-dae4-403f-8cec-6cb66fa888ce", + "name": "steps", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 80 + }, + "cfg_scale": { + "id": "9ec125bb-6819-4970-89fe-fe09e6b96885", + "name": "cfg_scale", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "FloatField" + }, + "value": 3 + }, + "denoising_start": { + "id": "7190b40d-9467-4238-b180-0d19065258e2", + "name": "denoising_start", + "fieldKind": "input", + "label": "Original Image Percent", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0.2 + }, + "denoising_end": { + "id": "c033f2d4-b60a-4a25-8a88-7852b556657a", + "name": "denoising_end", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 1 + }, + "scheduler": { + "id": "bb043b8a-a119-4b2a-bb88-8afb364bdcc1", + "name": "scheduler", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "SchedulerField" + }, + "value": "dpmpp_2m_sde_k" + }, + "unet": { + "id": "16d7688a-fc80-405c-aa55-a8ba2a1efecb", + "name": "unet", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "UNetField" + } + }, + "control": { + "id": "d0225ede-7d03-405d-b5b4-97c07d9b602b", + "name": "control", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "ControlField" + } + }, + "ip_adapter": { + "id": "6fbe0a17-6b85-4d3e-835d-0e23d3040bf4", + "name": "ip_adapter", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IPAdapterField" + } + }, + "t2i_adapter": { + "id": "2e4e1e6e-0278-47e3-a464-1a51760a9411", + "name": "t2i_adapter", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "T2IAdapterField" + } + }, + "cfg_rescale_multiplier": { + "id": "c9703a2e-4178-493c-90b9-81325a83a5ec", + "name": "cfg_rescale_multiplier", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 + }, + "latents": { + "id": "b2527e78-6f55-4274-aaa0-8fef1c928faa", + "name": "latents", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "denoise_mask": { + "id": "cceec5a4-d3e9-4cff-a1e1-b5b62cb12588", + "name": "denoise_mask", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "DenoiseMaskField" + } + } + }, + "outputs": { + "latents": { + "id": "6eca0515-4357-40be-ac8d-f84eb927dc31", + "name": "latents", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "width": { + "id": "14453d1c-6202-4377-811c-88ac9c024e77", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "0e0e04dc-4158-4461-b0ba-6c6af16e863c", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } }, "width": 320, - "height": 325, + "height": 705, "position": { - "x": 3165.534313998739, - "y": -261.54699233490976 + "x": 4597.554345564559, + "y": -265.6421598623905 } }, { @@ -206,37 +903,60 @@ "data": { "id": "35623411-ba3a-4eaa-91fd-1e0fda0a5b42", "type": "noise", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.1", + "nodePack": "invokeai", "inputs": { "seed": { "id": "c6b5bc5e-ef09-4f9c-870e-1110a0f5017f", "name": "seed", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 123451234 }, "width": { "id": "7bdd24b6-4f14-4d0a-b8fc-9b24145b4ba9", "name": "width", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 512 }, "height": { "id": "dc15bf97-b8d5-49c6-999b-798b33679418", "name": "height", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 512 }, "use_cpu": { "id": "00626297-19dd-4989-9688-e8d527c9eacf", "name": "use_cpu", - "type": "boolean", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, "value": true } }, @@ -244,35 +964,152 @@ "noise": { "id": "2915f8ae-0f6e-4f26-8541-0ebf477586b6", "name": "noise", - "type": "LatentsField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } }, "width": { "id": "26587461-a24a-434d-9ae5-8d8f36fea221", "name": "width", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } }, "height": { "id": "335d08fc-8bf1-4393-8902-2c579f327b51", "name": "height", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } } - }, + } + }, + "width": 320, + "height": 32, + "position": { + "x": 4025, + "y": -175 + } + }, + { + "id": "2224ed72-2453-4252-bd89-3085240e0b6f", + "type": "invocation", + "data": { + "id": "2224ed72-2453-4252-bd89-3085240e0b6f", + "type": "l2i", "label": "", "isOpen": true, "notes": "", - "embedWorkflow": false, - "isIntermediate": true, + "isIntermediate": false, "useCache": true, - "version": "1.0.0" + "version": "1.2.0", + "nodePack": "invokeai", + "inputs": { + "metadata": { + "id": "2f077d6f-579e-4399-9986-3feabefa9ade", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "latents": { + "id": "568a1537-dc7c-44f5-8a87-3571b0528b85", + "name": "latents", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "vae": { + "id": "392c3757-ad3a-46af-8d76-9724ca30aad8", + "name": "vae", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } + }, + "tiled": { + "id": "90f98601-c05d-453e-878b-18e23cc222b4", + "name": "tiled", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": false + }, + "fp32": { + "id": "6be5cad7-dd41-4f83-98e7-124a6ad1728d", + "name": "fp32", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": true + } + }, + "outputs": { + "image": { + "id": "6f90a4f5-42dd-472a-8f30-403bcbc16531", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "4d1c8a66-35fc-40e9-a7a9-d8604a247d33", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "e668cfb3-aedc-4032-94c9-b8add1fbaacf", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } }, "width": 320, - "height": 389, + "height": 267, "position": { - "x": 4101.873817022418, - "y": -826.2333237957032 + "x": 4980.1395106966565, + "y": -255.9158921745602 } }, { @@ -281,36 +1118,59 @@ "data": { "id": "2974e5b3-3d41-4b6f-9953-cd21e8f3a323", "type": "lscale", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "latents": { "id": "79e8f073-ddc3-416e-b818-6ef8ec73cc07", "name": "latents", - "type": "LatentsField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } }, "scale_factor": { "id": "23f78d24-72df-4bde-8d3c-8593ce507205", "name": "scale_factor", - "type": "float", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, "value": 1.5 }, "mode": { "id": "4ab30c38-57d3-480d-8b34-918887e92340", "name": "mode", - "type": "enum", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, "value": "bilinear" }, "antialias": { "id": "22b39171-0003-44f0-9c04-d241581d2a39", "name": "antialias", - "type": "boolean", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, "value": true } }, @@ -318,35 +1178,288 @@ "latents": { "id": "f6d71aef-6251-4d51-afa8-f692a72bfd1f", "name": "latents", - "type": "LatentsField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } }, "width": { "id": "8db4cf33-5489-4887-a5f6-5e926d959c40", "name": "width", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } }, "height": { "id": "74e1ec7c-50b6-4e97-a7b8-6602e6d78c08", "name": "height", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } } - }, + } + }, + "width": 320, + "height": 32, + "position": { + "x": 3075, + "y": -175 + } + }, + { + "id": "a7d14545-aa09-4b96-bfc5-40c009af9110", + "type": "invocation", + "data": { + "id": "a7d14545-aa09-4b96-bfc5-40c009af9110", + "type": "img_paste", "label": "", "isOpen": true, "notes": "", - "embedWorkflow": false, - "isIntermediate": true, + "isIntermediate": false, "useCache": true, - "version": "1.0.0" + "version": "1.2.0", + "nodePack": "invokeai", + "inputs": { + "metadata": { + "id": "159f5a3c-4b47-46dd-b8fe-450455ee3dcf", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "base_image": { + "id": "445cfacf-5042-49ae-a63e-c19f21f90b1d", + "name": "base_image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "image": { + "id": "c292948b-8efd-4f5c-909d-d902cfd1509a", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "mask": { + "id": "8b7bc7e9-35b5-45bc-9b8c-e15e92ab4d74", + "name": "mask", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "x": { + "id": "0694ba58-07bc-470b-80b5-9c7a99b64607", + "name": "x", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "y": { + "id": "40f8b20b-f804-4ec2-9622-285726f7665f", + "name": "y", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "crop": { + "id": "8a09a132-c07e-4cfb-8ec2-7093dc063f99", + "name": "crop", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": false + } + }, + "outputs": { + "image": { + "id": "4a96ec78-d4b6-435f-b5a3-6366cbfcfba7", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "c1ee69c7-6ca0-4604-abc9-b859f4178421", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "6c198681-5f16-4526-8e37-0bf000962acd", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } }, "width": 320, - "height": 332, + "height": 504, "position": { - "x": 3693.9622528252976, - "y": -448.17155148430743 + "x": 6000, + "y": -200 + } + }, + { + "id": "ff8c23dc-da7c-45b7-b5c9-d984b12f02ef", + "type": "invocation", + "data": { + "id": "ff8c23dc-da7c-45b7-b5c9-d984b12f02ef", + "type": "img_resize", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.2.0", + "nodePack": "invokeai", + "inputs": { + "metadata": { + "id": "afbbb112-60e4-44c8-bdfd-30f48d58b236", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "image": { + "id": "2a348a03-07a3-4a97-93c8-46051045b32f", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "6b95969c-ca73-4b54-815d-7aae305a67bd", + "name": "width", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + }, + "height": { + "id": "af83c526-c730-4a34-8f73-80f443fecc05", + "name": "height", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + }, + "resample_mode": { + "id": "43f7d6b5-ebe0-43c4-bf5d-8fb7fdc40a3f", + "name": "resample_mode", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, + "value": "lanczos" + } + }, + "outputs": { + "image": { + "id": "e492b013-615d-4dfd-b0d8-7df7b5ba9a9d", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "05f829b3-c253-495a-b1ad-9906c0833e49", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "65d5d662-2527-4f3c-8a87-0a7d9d4486de", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "width": 320, + "height": 397, + "position": { + "x": 5500, + "y": -225 } }, { @@ -355,13 +1468,24 @@ "data": { "id": "cdfa5ab0-b3e2-43ed-85bb-2ac4aa83bc05", "type": "float", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "value": { "id": "d5d8063d-44f6-4e20-b557-2f4ce093c7ef", "name": "value", - "type": "float", "fieldKind": "input", "label": "Orignal Image Percentage", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, "value": 0.4 } }, @@ -369,23 +1493,20 @@ "value": { "id": "562416a4-0d75-48aa-835e-5e2d221dfbb7", "name": "value", - "type": "float", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 161, + "height": 32, "position": { - "x": 3709.006050756633, - "y": -84.77200251095934 + "x": 4025, + "y": -75 } }, { @@ -394,13 +1515,24 @@ "data": { "id": "64712037-92e8-483f-9f6e-87588539c1b8", "type": "float", + "label": "CFG Main", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "value": { "id": "750358d5-251d-4fe6-a673-2cde21995da2", "name": "value", - "type": "float", "fieldKind": "input", "label": "CFG Main", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, "value": 6 } }, @@ -408,23 +1540,20 @@ "value": { "id": "eea7f6d2-92e4-4581-b555-64a44fda2be9", "name": "value", - "type": "float", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + } } - }, - "label": "CFG Main", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 161, + "height": 32, "position": { - "x": 4064.218597371266, - "y": 221.28424598733164 + "x": 4025, + "y": 75 } }, { @@ -433,21 +1562,36 @@ "data": { "id": "c865f39f-f830-4ed7-88a5-e935cfe050a9", "type": "rand_int", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": false, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "low": { "id": "31e29709-9f19-45b0-a2de-fdee29a50393", "name": "low", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 0 }, "high": { "id": "d47d875c-509d-4fa3-9112-e335d3144a17", "name": "high", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 2147483647 } }, @@ -455,23 +1599,20 @@ "value": { "id": "15b8d1ea-d2ac-4b3a-9619-57bba9a6da75", "name": "value", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": false, - "version": "1.0.0" + } }, "width": 320, - "height": 218, + "height": 32, "position": { - "x": 3662.7851649243958, - "y": -784.114001413615 + "x": 4025, + "y": -275 } }, { @@ -480,15 +1621,26 @@ "data": { "id": "76ea1e31-eabe-4080-935e-e74ce20e2805", "type": "main_model_loader", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "model": { "id": "54e737f9-2547-4bd9-a607-733d02f0c990", "name": "model", - "type": "MainModelField", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MainModelField" + }, "value": { - "model_name": "stable-diffusion-v1-5", + "model_name": "epicrealism_naturalSinRC1VAE", "base_model": "sd-1", "model_type": "main" } @@ -498,35 +1650,40 @@ "unet": { "id": "3483ea21-f0b3-4422-894b-36c5d7701365", "name": "unet", - "type": "UNetField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "UNetField" + } }, "clip": { "id": "dddd055f-5c1b-4e61-977b-6393da9006fa", "name": "clip", - "type": "ClipField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } }, "vae": { "id": "879893b4-3415-4879-8dff-aa1727ef5e63", "name": "vae", - "type": "VaeField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 226, + "height": 227, "position": { - "x": 2517.1672231749144, - "y": -751.385499561434 + "x": 2050, + "y": -525 } }, { @@ -535,44 +1692,153 @@ "data": { "id": "f4d15b64-c4a6-42a5-90fc-e4ed07a0ca65", "type": "compel", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "prompt": { "id": "916b229a-38e1-45a2-a433-cca97495b143", "name": "prompt", - "type": "string", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, "value": "" }, "clip": { "id": "ae9aeb1a-4ebd-4bc3-b6e6-a8c9adca01f6", "name": "clip", - "type": "ClipField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } } }, "outputs": { "conditioning": { "id": "4d59bad1-99a9-43e2-bdb4-7a0f3dd5b787", "name": "conditioning", - "type": "ConditioningField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } } - }, + } + }, + "width": 320, + "height": 256, + "position": { + "x": 2550, + "y": -525 + } + }, + { + "id": "22b750db-b85e-486b-b278-ac983e329813", + "type": "invocation", + "data": { + "id": "22b750db-b85e-486b-b278-ac983e329813", + "type": "ip_adapter", "label": "", "isOpen": true, "notes": "", - "embedWorkflow": false, "isIntermediate": true, "useCache": true, - "version": "1.0.0" + "version": "1.1.0", + "nodePack": "invokeai", + "inputs": { + "image": { + "id": "088a126c-ab1d-4c7a-879a-c1eea09eac8e", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "ip_adapter_model": { + "id": "f2ac529f-f778-4a12-af12-0c7e449de17a", + "name": "ip_adapter_model", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IPAdapterModelField" + }, + "value": { + "model_name": "ip_adapter_plus_face_sd15", + "base_model": "sd-1" + } + }, + "weight": { + "id": "ddb4a7cb-607d-47e8-b46b-cc1be27ebde0", + "name": "weight", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0.5 + }, + "begin_step_percent": { + "id": "1807371f-b56c-4777-baa2-de71e21f0b80", + "name": "begin_step_percent", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 + }, + "end_step_percent": { + "id": "4ea8e4dc-9cd7-445e-9b32-8934c652381b", + "name": "end_step_percent", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0.8 + } + }, + "outputs": { + "ip_adapter": { + "id": "739b5fed-d813-4611-8f87-1dded25a7619", + "name": "ip_adapter", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IPAdapterField" + } + } + } }, "width": 320, - "height": 261, + "height": 396, "position": { - "x": 3174.140478653321, - "y": -874.0896905277255 + "x": 3575, + "y": -200 } }, { @@ -581,63 +1847,98 @@ "data": { "id": "f60b6161-8f26-42f6-89ff-545e6011e501", "type": "controlnet", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.1.0", + "nodePack": "invokeai", "inputs": { "image": { "id": "96434c75-abd8-4b73-ab82-0b358e4735bf", "name": "image", - "type": "ImageField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } }, "control_model": { "id": "21551ac2-ee50-4fe8-b06c-5be00680fb5c", "name": "control_model", - "type": "ControlNetModelField", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ControlNetModelField" + }, "value": { - "model_name": "sd-controlnet-canny", + "model_name": "canny", "base_model": "sd-1" } }, "control_weight": { "id": "1dacac0a-b985-4bdf-b4b5-b960f4cff6ed", "name": "control_weight", - "type": "FloatPolymorphic", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "FloatField" + }, "value": 0.5 }, "begin_step_percent": { "id": "b2a3f128-7fc1-4c12-acc8-540f013c856b", "name": "begin_step_percent", - "type": "float", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, "value": 0 }, "end_step_percent": { "id": "0e701834-f7ba-4a6e-b9cb-6d4aff5dacd8", "name": "end_step_percent", - "type": "float", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, "value": 0.5 }, "control_mode": { "id": "f9a5f038-ae80-4b6e-8a48-362a2c858299", "name": "control_mode", - "type": "enum", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, "value": "balanced" }, "resize_mode": { "id": "5369dd44-a708-4b66-8182-fea814d2a0ae", "name": "resize_mode", - "type": "enum", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, "value": "just_resize" } }, @@ -645,23 +1946,411 @@ "control": { "id": "f470a1af-7b68-4849-a144-02bc345fd810", "name": "control", - "type": "ControlField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ControlField" + } } - }, + } + }, + "width": 320, + "height": 511, + "position": { + "x": 3950, + "y": 150 + } + }, + { + "id": "8fe598c6-d447-44fa-a165-4975af77d080", + "type": "invocation", + "data": { + "id": "8fe598c6-d447-44fa-a165-4975af77d080", + "type": "canny_image_processor", "label": "", "isOpen": true, "notes": "", - "embedWorkflow": false, "isIntermediate": true, "useCache": true, - "version": "1.0.0" + "version": "1.2.0", + "nodePack": "invokeai", + "inputs": { + "metadata": { + "id": "855f4575-309a-4810-bd02-7c4a04e0efc8", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "image": { + "id": "7d2695fa-a617-431a-bc0e-69ac7c061651", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "low_threshold": { + "id": "ceb37a49-c989-4afa-abbf-49b6e52ef663", + "name": "low_threshold", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 100 + }, + "high_threshold": { + "id": "6ec118f8-ca6c-4be7-9951-6eee58afbc1b", + "name": "high_threshold", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 200 + } + }, + "outputs": { + "image": { + "id": "264bcaaf-d185-43ce-9e1a-b6f707140c0c", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "0d374d8e-d5c7-49be-9057-443e32e45048", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "fa892b68-6135-4598-a765-e79cd5c6e3f6", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } }, "width": 320, - "height": 508, + "height": 340, "position": { - "x": 3926.9358191964657, - "y": 538.0129522372209 + "x": 3519.4131037388597, + "y": 576.7946795840575 + } + }, + { + "id": "4bd4ae80-567f-4366-b8c6-3bb06f4fb46a", + "type": "invocation", + "data": { + "id": "4bd4ae80-567f-4366-b8c6-3bb06f4fb46a", + "type": "img_scale", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.2.0", + "nodePack": "invokeai", + "inputs": { + "metadata": { + "id": "46fc750e-7dda-4145-8f72-be88fb93f351", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "image": { + "id": "f7f41bb3-9a5a-4022-b671-0acc2819f7c3", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "scale_factor": { + "id": "1ae95574-f725-4cbc-bb78-4c9db240f78a", + "name": "scale_factor", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 1.5 + }, + "resample_mode": { + "id": "0756e37d-3d01-4c2c-9364-58e8978b04a2", + "name": "resample_mode", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, + "value": "bicubic" + } + }, + "outputs": { + "image": { + "id": "2729e697-cacc-4874-94bf-3aee5c18b5f9", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "d9551981-cbd3-419a-bcb9-5b50600e8c18", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "3355c99e-cdc6-473b-a7c6-a9d1dcc941e5", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "width": 320, + "height": 340, + "position": { + "x": 3079.916484101321, + "y": 151.0148192064986 + } + }, + { + "id": "381d5b6a-f044-48b0-bc07-6138fbfa8dfc", + "type": "invocation", + "data": { + "id": "381d5b6a-f044-48b0-bc07-6138fbfa8dfc", + "type": "mask_combine", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.2.0", + "nodePack": "invokeai", + "inputs": { + "metadata": { + "id": "061ea794-2494-429e-bfdd-5fbd2c7eeb99", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "mask1": { + "id": "446c6c99-9cb5-4035-a452-ab586ef4ede9", + "name": "mask1", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "mask2": { + "id": "ebbe37b8-8bf3-4520-b6f5-631fe2d05d66", + "name": "mask2", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + } + }, + "outputs": { + "image": { + "id": "7c33cfae-ea9a-4572-91ca-40fc4112369f", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "7410c10c-3060-44a9-b399-43555c3e1156", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "3eb74c96-ae3e-4091-b027-703428244fdf", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "width": 320, + "height": 283, + "position": { + "x": 5450, + "y": 250 + } + }, + { + "id": "77da4e4d-5778-4469-8449-ffed03d54bdb", + "type": "invocation", + "data": { + "id": "77da4e4d-5778-4469-8449-ffed03d54bdb", + "type": "img_blur", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.2.0", + "nodePack": "invokeai", + "inputs": { + "metadata": { + "id": "755d4fa2-a520-4837-a3da-65e1f479e6e6", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "image": { + "id": "a4786d7d-9593-4f5f-830b-d94bb0e42bca", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "radius": { + "id": "e1c9afa0-4d41-4664-b560-e1e85f467267", + "name": "radius", + "fieldKind": "input", + "label": "Mask Blue", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 150 + }, + "blur_type": { + "id": "f6231886-0981-444b-bd26-24674f87e7cb", + "name": "blur_type", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, + "value": "gaussian" + } + }, + "outputs": { + "image": { + "id": "20c7bcfc-269d-4119-8b45-6c59dd4005d7", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "37e228ef-cb59-4477-b18f-343609d7bb4e", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "2de6080e-8bc3-42cd-bb8a-afd72f082df4", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "width": 320, + "height": 340, + "position": { + "x": 5000, + "y": 300 } }, { @@ -670,13 +2359,24 @@ "data": { "id": "f0de6c44-4515-4f79-bcc0-dee111bcfe31", "type": "float", + "label": "Face Detail Scale", + "isOpen": false, + "notes": "The image is cropped to the face and scaled to 512x512. This value can scale even more. Best result with value between 1-2.\n\n1 = 512\n2 = 1024\n\n", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "value": { "id": "9b51a26f-af3c-4caa-940a-5183234b1ed7", "name": "value", - "type": "float", "fieldKind": "input", "label": "Face Detail Scale", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, "value": 1.5 } }, @@ -684,1349 +2384,547 @@ "value": { "id": "c7c87b77-c149-4e9c-8ed1-beb1ba013055", "name": "value", - "type": "float", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + } } - }, - "label": "Face Detail Scale", - "isOpen": true, - "notes": "The image is cropped to the face and scaled to 512x512. This value can scale even more. Best result with value between 1-2.\n\n1 = 512\n2 = 1024\n\n", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 161, + "height": 32, "position": { - "x": 2505.1027422955735, - "y": -447.7244534284996 + "x": 2550, + "y": 125 } }, { - "id": "e41c9dcc-a460-439a-85f3-eb18c74d9411", + "id": "a6482723-4e0a-4e40-98c0-b20622bf5f16", "type": "invocation", "data": { - "id": "e41c9dcc-a460-439a-85f3-eb18c74d9411", - "type": "denoise_latents", - "inputs": { - "noise": { - "id": "2223c30c-e3ef-4a2b-9ae8-31f9f2b38f68", - "name": "noise", - "type": "LatentsField", - "fieldKind": "input", - "label": "" - }, - "steps": { - "id": "09c2a8c9-0771-4e35-b674-26633fe5d740", - "name": "steps", - "type": "integer", - "fieldKind": "input", - "label": "", - "value": 10 - }, - "cfg_scale": { - "id": "dcef4b34-926f-46c1-9e57-c6401f1ac901", - "name": "cfg_scale", - "type": "FloatPolymorphic", - "fieldKind": "input", - "label": "", - "value": 7.5 - }, - "denoising_start": { - "id": "efb48776-93b4-4a1b-9b9e-ea173720850d", - "name": "denoising_start", - "type": "float", - "fieldKind": "input", - "label": "", - "value": 0 - }, - "denoising_end": { - "id": "acedd753-b95c-4c23-91a8-398bc85f03cb", - "name": "denoising_end", - "type": "float", - "fieldKind": "input", - "label": "", - "value": 1 - }, - "scheduler": { - "id": "d6aedf09-ad0e-433f-9d70-fcf43303840d", - "name": "scheduler", - "type": "Scheduler", - "fieldKind": "input", - "label": "", - "value": "euler" - }, - "control": { - "id": "f83850ba-d6d6-4ba9-9f41-424427a005f4", - "name": "control", - "type": "ControlPolymorphic", - "fieldKind": "input", - "label": "" - }, - "ip_adapter": { - "id": "6e42ab48-8eaf-4d05-ba5e-0b7d7667249d", - "name": "ip_adapter", - "type": "IPAdapterPolymorphic", - "fieldKind": "input", - "label": "" - }, - "t2i_adapter": { - "id": "32c2f9c1-ae8a-4f9b-9e06-30debb6b1190", - "name": "t2i_adapter", - "type": "T2IAdapterPolymorphic", - "fieldKind": "input", - "label": "" - }, - "latents": { - "id": "79479fdb-82b6-4b7f-8a4a-e658c2ff0d2f", - "name": "latents", - "type": "LatentsField", - "fieldKind": "input", - "label": "" - }, - "denoise_mask": { - "id": "c76b77a3-bcde-4425-bfdd-638becefb4ba", - "name": "denoise_mask", - "type": "DenoiseMaskField", - "fieldKind": "input", - "label": "" - }, - "positive_conditioning": { - "id": "f14ea66a-5e7b-400b-a835-049286aa0c82", - "name": "positive_conditioning", - "type": "ConditioningField", - "fieldKind": "input", - "label": "" - }, - "negative_conditioning": { - "id": "ce94941f-9e4e-41f4-b33f-1d6907919964", - "name": "negative_conditioning", - "type": "ConditioningField", - "fieldKind": "input", - "label": "" - }, - "unet": { - "id": "290f45fa-1543-4e41-ab6f-63e139556dfc", - "name": "unet", - "type": "UNetField", - "fieldKind": "input", - "label": "" - } - }, - "outputs": { - "latents": { - "id": "ab8a8305-e6e7-4569-956c-02d5d0fa2989", - "name": "latents", - "type": "LatentsField", - "fieldKind": "output" - }, - "width": { - "id": "161773a7-4e7b-44b6-98d9-f565036f190b", - "name": "width", - "type": "integer", - "fieldKind": "output" - }, - "height": { - "id": "4fe54d15-d9b9-4fd0-b8ac-a1b2a11f3243", - "name": "height", - "type": "integer", - "fieldKind": "output" - } - }, + "id": "a6482723-4e0a-4e40-98c0-b20622bf5f16", + "type": "face_mask_detection", "label": "", "isOpen": true, "notes": "", - "embedWorkflow": false, "isIntermediate": true, "useCache": true, - "version": "1.3.0" - }, - "width": 320, - "height": 646, - "position": { - "x": 4482.62568856733, - "y": -385.4092574423216 - } - }, - { - "id": "1bb5d85c-fc4d-41ed-94c6-88559f497491", - "type": "invocation", - "data": { - "id": "1bb5d85c-fc4d-41ed-94c6-88559f497491", - "type": "face_off", + "version": "1.2.0", "inputs": { "metadata": { - "id": "6ad02931-9067-43e3-bc2b-29ce5388b317", + "id": "44e1fca6-3f06-4698-9562-6743c1f7a739", "name": "metadata", - "type": "MetadataField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } }, "image": { - "id": "01e0d368-7712-4c5b-8f73-18d3d3459d82", + "id": "65ba4653-8c35-403d-838b-ddac075e4118", "name": "image", - "type": "ImageField", - "fieldKind": "input", - "label": "" - }, - "face_id": { - "id": "563cd209-2adf-4249-97df-0d13818ae057", - "name": "face_id", - "type": "integer", "fieldKind": "input", "label": "", - "value": 0 + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "face_ids": { + "id": "630e86e5-3041-47c4-8864-b8ee71ec7da5", + "name": "face_ids", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "" }, "minimum_confidence": { - "id": "2cb09928-911c-43d7-8cbb-be13aed8f9a4", + "id": "8c4aef57-90c6-4904-9113-7189db1357c9", "name": "minimum_confidence", - "type": "float", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, "value": 0.5 }, "x_offset": { - "id": "80d5fa06-a719-454f-9641-8ca5e2889d2d", + "id": "2d409495-4aee-41e2-9688-f37fb6add537", "name": "x_offset", - "type": "float", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, "value": 0 }, "y_offset": { - "id": "ff03fe44-26d1-4d8b-a012-3e05c918d56f", + "id": "de3c1e68-6962-4520-b672-989afff1d2a1", "name": "y_offset", - "type": "float", - "fieldKind": "input", - "label": "", - "value": 0 - }, - "padding": { - "id": "05db8638-24f4-4a0a-9040-ae9beabd194b", - "name": "padding", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, "value": 0 }, "chunk": { - "id": "d6a556b3-f1c7-480b-b1a2-e9441a3bb344", + "id": "9a11971a-0759-4782-902a-8300070d8861", "name": "chunk", - "type": "boolean", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": false + }, + "invert_mask": { + "id": "2abecba7-35d0-4cc4-9732-769e97d34c75", + "name": "invert_mask", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, "value": false } }, "outputs": { "image": { - "id": "963b445d-a35f-476b-b164-c61a35b86ef1", + "id": "af33585c-5451-4738-b1da-7ff83afdfbf8", "name": "image", - "type": "ImageField", - "fieldKind": "output" - }, - "width": { - "id": "fa64b386-f45f-4979-8004-c1cf21b83d9c", - "name": "width", - "type": "integer", - "fieldKind": "output" - }, - "height": { - "id": "bf7711ec-7788-4d9b-9abf-8cc0638f264d", - "name": "height", - "type": "integer", - "fieldKind": "output" - }, - "mask": { - "id": "c6dcf700-e903-4c9e-bd84-94f169c6d04c", - "name": "mask", - "type": "ImageField", - "fieldKind": "output" - }, - "x": { - "id": "d4993748-913b-4490-b71f-9400c1fe9f2d", - "name": "x", - "type": "integer", - "fieldKind": "output" - }, - "y": { - "id": "af9c4994-4f1b-4715-aa44-6c5b21274af4", - "name": "y", - "type": "integer", - "fieldKind": "output" - } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.2" - }, - "width": 320, - "height": 656, - "position": { - "x": 2414.612131259088, - "y": 291.78659156828013 - } - }, - { - "id": "e3383c2f-828e-4b9c-94bb-9f10de86cc7f", - "type": "invocation", - "data": { - "id": "e3383c2f-828e-4b9c-94bb-9f10de86cc7f", - "type": "img_resize", - "inputs": { - "metadata": { - "id": "01bd4648-7c80-497c-823d-48ad41ce1cd2", - "name": "metadata", - "type": "MetadataField", - "fieldKind": "input", - "label": "" - }, - "image": { - "id": "1893f2cc-344a-4f15-8f01-85ba99da518b", - "name": "image", - "type": "ImageField", - "fieldKind": "input", - "label": "" - }, - "width": { - "id": "123d1849-df1b-4e36-8329-f45235f857cf", - "name": "width", - "type": "integer", - "fieldKind": "input", - "label": "", - "value": 512 - }, - "height": { - "id": "ebdf1684-abe5-42e1-b16e-797ffdfee7a2", - "name": "height", - "type": "integer", - "fieldKind": "input", - "label": "", - "value": 512 - }, - "resample_mode": { - "id": "e83edb34-9391-4830-a1fb-fe0e0f5087bd", - "name": "resample_mode", - "type": "enum", - "fieldKind": "input", - "label": "", - "value": "bicubic" - } - }, - "outputs": { - "image": { - "id": "0c369a81-bdd3-4b4c-9626-95ce47375ed1", - "name": "image", - "type": "ImageField", - "fieldKind": "output" - }, - "width": { - "id": "560d5588-8df8-41e8-aa69-fb8c95cdb4e2", - "name": "width", - "type": "integer", - "fieldKind": "output" - }, - "height": { - "id": "2b04576b-7b22-4b2a-9fb6-57c1fd86a506", - "name": "height", - "type": "integer", - "fieldKind": "output" - } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" - }, - "width": 320, - "height": 396, - "position": { - "x": 2447.826252430936, - "y": -201.68035155632666 - } - }, - { - "id": "60343212-208e-4ec5-97c4-df78e30a3066", - "type": "invocation", - "data": { - "id": "60343212-208e-4ec5-97c4-df78e30a3066", - "type": "img_scale", - "inputs": { - "metadata": { - "id": "607e3b73-c76e-477e-8479-8130d3a25028", - "name": "metadata", - "type": "MetadataField", - "fieldKind": "input", - "label": "" - }, - "image": { - "id": "b04d11ba-cc0c-48d5-ab9e-f3958a5e8839", - "name": "image", - "type": "ImageField", - "fieldKind": "input", - "label": "" - }, - "scale_factor": { - "id": "79656494-c8c0-4096-b25a-628d9c37f071", - "name": "scale_factor", - "type": "float", - "fieldKind": "input", - "label": "", - "value": 2 - }, - "resample_mode": { - "id": "92176f78-e21a-4085-884d-c66c7135c714", - "name": "resample_mode", - "type": "enum", - "fieldKind": "input", - "label": "", - "value": "bicubic" - } - }, - "outputs": { - "image": { - "id": "2321a8bf-3f55-470d-afe3-b8760240d59a", - "name": "image", - "type": "ImageField", - "fieldKind": "output" - }, - "width": { - "id": "62005d4a-7961-439c-9357-9de5fc53b51b", - "name": "width", - "type": "integer", - "fieldKind": "output" - }, - "height": { - "id": "3f0a7f7f-ea40-48de-8b1b-8570595e94ef", - "name": "height", - "type": "integer", - "fieldKind": "output" - } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" - }, - "width": 320, - "height": 339, - "position": { - "x": 3007.7214378992408, - "y": 211.12372586521934 - } - }, - { - "id": "07099eb0-9d58-4e0b-82f8-3063c3af2689", - "type": "invocation", - "data": { - "id": "07099eb0-9d58-4e0b-82f8-3063c3af2689", - "type": "canny_image_processor", - "inputs": { - "metadata": { - "id": "7d38d9d6-029b-4de6-aabf-5aa46c508291", - "name": "metadata", - "type": "MetadataField", - "fieldKind": "input", - "label": "" - }, - "image": { - "id": "656409a8-aa89-4ecb-bb6c-8d5e612aa814", - "name": "image", - "type": "ImageField", - "fieldKind": "input", - "label": "" - }, - "low_threshold": { - "id": "1879f7c5-dd3a-4770-a260-b18111577e63", - "name": "low_threshold", - "type": "integer", - "fieldKind": "input", - "label": "", - "value": 100 - }, - "high_threshold": { - "id": "b84b6aad-cb83-40d3-85a6-e18dc440d89b", - "name": "high_threshold", - "type": "integer", - "fieldKind": "input", - "label": "", - "value": 200 - } - }, - "outputs": { - "image": { - "id": "98e8c22c-43cb-41a3-9e8c-c4fdc3cbe749", - "name": "image", - "type": "ImageField", - "fieldKind": "output" - }, - "width": { - "id": "a8eaa116-2bc1-4dab-84bf-4e21c6e14296", - "name": "width", - "type": "integer", - "fieldKind": "output" - }, - "height": { - "id": "ddab1f63-c0c8-4ff7-9124-f0c6cdda81f8", - "name": "height", - "type": "integer", - "fieldKind": "output" - } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" - }, - "width": 320, - "height": 339, - "position": { - "x": 3444.7466139600724, - "y": 586.5162666396674 - } - }, - { - "id": "a50af8a0-7b7e-4cb8-a116-89f2d83f33ed", - "type": "invocation", - "data": { - "id": "a50af8a0-7b7e-4cb8-a116-89f2d83f33ed", - "type": "ip_adapter", - "inputs": { - "image": { - "id": "1cee5c9b-8d23-4b11-a699-5919c86a972f", - "name": "image", - "type": "ImagePolymorphic", - "fieldKind": "input", - "label": "" - }, - "ip_adapter_model": { - "id": "3ca282f7-be7c-44a1-8a5a-94afdecae0ae", - "name": "ip_adapter_model", - "type": "IPAdapterModelField", - "fieldKind": "input", - "label": "", - "value": { - "model_name": "ip_adapter_plus_face_sd15", - "base_model": "sd-1" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" } }, - "weight": { - "id": "eee84151-d5a0-4970-a984-9b0c26e3a58a", - "name": "weight", - "type": "float", - "fieldKind": "input", - "label": "", - "value": 1 - }, - "begin_step_percent": { - "id": "0ed4cc66-5688-4554-9f2b-acf0a33415a1", - "name": "begin_step_percent", - "type": "float", - "fieldKind": "input", - "label": "", - "value": 0 - }, - "end_step_percent": { - "id": "9544971a-8963-43da-abf4-0920781209ca", - "name": "end_step_percent", - "type": "float", - "fieldKind": "input", - "label": "", - "value": 1 - } - }, - "outputs": { - "ip_adapter": { - "id": "03814df3-0117-434e-b35b-7902fc519e80", - "name": "ip_adapter", - "type": "IPAdapterField", - "fieldKind": "output" - } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.1.0" - }, - "width": 320, - "height": 394, - "position": { - "x": 3486.4422814170716, - "y": 112.39273647258193 - } - }, - { - "id": "03df59d0-a061-430c-a76f-5a4cf3e14378", - "type": "invocation", - "data": { - "id": "03df59d0-a061-430c-a76f-5a4cf3e14378", - "type": "img_resize", - "inputs": { - "metadata": { - "id": "9fbe66f2-700c-457a-ab06-434a8f8169e9", - "name": "metadata", - "type": "MetadataField", - "fieldKind": "input", - "label": "" - }, - "image": { - "id": "37914278-90ba-4095-8c13-067a90a256cc", - "name": "image", - "type": "ImageField", - "fieldKind": "input", - "label": "" - }, "width": { - "id": "9d2b22b0-0a2a-4da8-aec0-c50f419bd134", + "id": "52cec0bd-d2e5-4514-8ebf-1c0d8bd1b81d", "name": "width", - "type": "integer", - "fieldKind": "input", - "label": "", - "value": 512 + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } }, "height": { - "id": "d5590b6b-96c3-4d7d-b472-56269515e1ad", + "id": "05edbbc8-99df-42e0-9b9b-de7b555e44cc", "name": "height", - "type": "integer", - "fieldKind": "input", - "label": "", - "value": 512 - }, - "resample_mode": { - "id": "975d601c-8801-4881-b138-a43afccb89e9", - "name": "resample_mode", - "type": "enum", - "fieldKind": "input", - "label": "", - "value": "bicubic" - } - }, - "outputs": { - "image": { - "id": "75099113-a677-4a05-96a6-e680c00c2c01", - "name": "image", - "type": "ImageField", - "fieldKind": "output" - }, - "width": { - "id": "15132cfa-f46d-44df-9272-0b5abdd101b2", - "name": "width", - "type": "integer", - "fieldKind": "output" - }, - "height": { - "id": "0f80c001-cee0-4a20-92a4-3a7b01130ffe", - "name": "height", - "type": "integer", - "fieldKind": "output" - } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" - }, - "width": 320, - "height": 396, - "position": { - "x": 4423.278808515647, - "y": 350.94607680079463 - } - }, - { - "id": "8bb08a28-0a64-4da9-9bf4-4526ea40f437", - "type": "invocation", - "data": { - "id": "8bb08a28-0a64-4da9-9bf4-4526ea40f437", - "type": "img_blur", - "inputs": { - "metadata": { - "id": "ccbff6e7-4138-462c-bc2f-ea14bda4faa8", - "name": "metadata", - "type": "MetadataField", - "fieldKind": "input", - "label": "" - }, - "image": { - "id": "1c47e5ea-4f6e-4608-a15a-2eed4052d895", - "name": "image", - "type": "ImageField", - "fieldKind": "input", - "label": "" - }, - "radius": { - "id": "646349d2-25ac-49ac-9aa9-bcd78a3362ab", - "name": "radius", - "type": "float", - "fieldKind": "input", - "label": "", - "value": 8 - }, - "blur_type": { - "id": "0d3c8ada-0743-4f73-a29a-b359022b3745", - "name": "blur_type", - "type": "enum", - "fieldKind": "input", - "label": "", - "value": "gaussian" - } - }, - "outputs": { - "image": { - "id": "f775bed9-bb8e-47b1-b08a-cfb9a5d2501d", - "name": "image", - "type": "ImageField", - "fieldKind": "output" - }, - "width": { - "id": "1ec74094-1181-41cb-9a11-6f93e4997913", - "name": "width", - "type": "integer", - "fieldKind": "output" - }, - "height": { - "id": "7b91bdb5-27c0-4cee-8005-854675c2dedd", - "name": "height", - "type": "integer", - "fieldKind": "output" - } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" - }, - "width": 320, - "height": 339, - "position": { - "x": 4876.996101782848, - "y": 349.1456113513215 - } - }, - { - "id": "227f0e19-3a4e-44f0-9f52-a8591b719bbe", - "type": "invocation", - "data": { - "id": "227f0e19-3a4e-44f0-9f52-a8591b719bbe", - "type": "mask_combine", - "inputs": { - "metadata": { - "id": "39eb7bba-0668-4349-9093-6aede07bec66", - "name": "metadata", - "type": "MetadataField", - "fieldKind": "input", - "label": "" - }, - "mask1": { - "id": "0ee7c237-b775-4470-8061-29eee0b1c9ae", - "name": "mask1", - "type": "ImageField", - "fieldKind": "input", - "label": "" - }, - "mask2": { - "id": "6231f048-0165-4bb8-b468-446f71b882bb", - "name": "mask2", - "type": "ImageField", - "fieldKind": "input", - "label": "" - } - }, - "outputs": { - "image": { - "id": "321dde14-3a6d-4606-af05-477e92735a14", - "name": "image", - "type": "ImageField", - "fieldKind": "output" - }, - "width": { - "id": "0801ee9e-a19b-46ca-b919-747e81323aa9", - "name": "width", - "type": "integer", - "fieldKind": "output" - }, - "height": { - "id": "7d2614d3-3ac8-44f0-9726-b1591057670f", - "name": "height", - "type": "integer", - "fieldKind": "output" - } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" - }, - "width": 320, - "height": 282, - "position": { - "x": 5346.9175840953085, - "y": 374.352127643944 - } - }, - { - "id": "0d05a218-0208-4038-a3e7-867bd9367593", - "type": "invocation", - "data": { - "id": "0d05a218-0208-4038-a3e7-867bd9367593", - "type": "l2i", - "inputs": { - "metadata": { - "id": "a2f3806c-f4ea-41f2-b213-c049197bbeb4", - "name": "metadata", - "type": "MetadataField", - "fieldKind": "input", - "label": "" - }, - "latents": { - "id": "e5a25c64-bafe-4fae-b066-21062f18582c", - "name": "latents", - "type": "LatentsField", - "fieldKind": "input", - "label": "" - }, - "vae": { - "id": "af671339-cc72-4fab-8908-1ede72ffbe23", - "name": "vae", - "type": "VaeField", - "fieldKind": "input", - "label": "" - }, - "tiled": { - "id": "a5d71aea-2e23-4517-be62-948fc70f0cfa", - "name": "tiled", - "type": "boolean", - "fieldKind": "input", - "label": "", - "value": false - }, - "fp32": { - "id": "c2b8897e-67cb-43a5-a448-834ea9ce0ba0", - "name": "fp32", - "type": "boolean", - "fieldKind": "input", - "label": "", - "value": false - } - }, - "outputs": { - "image": { - "id": "93f1ba9e-5cfe-4282-91ed-fc5b586d3961", - "name": "image", - "type": "ImageField", - "fieldKind": "output" - }, - "width": { - "id": "8f844f95-9ee6-469d-9706-9b48fb616a23", - "name": "width", - "type": "integer", - "fieldKind": "output" - }, - "height": { - "id": "bac22e85-9bdd-468d-b3e3-a94325ea2f85", - "name": "height", - "type": "integer", - "fieldKind": "output" - } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" - }, - "width": 320, - "height": 267, - "position": { - "x": 4966.928144382504, - "y": -294.018133443524 - } - }, - { - "id": "db4981fd-e6eb-42b3-910b-b15443fa863d", - "type": "invocation", - "data": { - "id": "db4981fd-e6eb-42b3-910b-b15443fa863d", - "type": "img_resize", - "inputs": { - "metadata": { - "id": "37f62260-8cf9-443d-8838-8acece688821", - "name": "metadata", - "type": "MetadataField", - "fieldKind": "input", - "label": "" - }, - "image": { - "id": "9e95616d-2079-4d48-bb7d-b641b4cd1d69", - "name": "image", - "type": "ImageField", - "fieldKind": "input", - "label": "" - }, - "width": { - "id": "96cc2cac-69e8-40f8-9e0e-b23ee7db9e08", - "name": "width", - "type": "integer", - "fieldKind": "input", - "label": "", - "value": 512 - }, - "height": { - "id": "eb9b8960-6f63-43be-aba5-2c165a46bfcf", - "name": "height", - "type": "integer", - "fieldKind": "input", - "label": "", - "value": 512 - }, - "resample_mode": { - "id": "bafe9aef-0e59-49d3-97bf-00df38dd7e11", - "name": "resample_mode", - "type": "enum", - "fieldKind": "input", - "label": "", - "value": "bicubic" - } - }, - "outputs": { - "image": { - "id": "9f3e1433-5ab1-4c2e-8adb-aafcc051054b", - "name": "image", - "type": "ImageField", - "fieldKind": "output" - }, - "width": { - "id": "a8433208-ea4a-417e-a1ac-6fa4ca8a6537", - "name": "width", - "type": "integer", - "fieldKind": "output" - }, - "height": { - "id": "29bceb69-05a9-463a-b003-75e337ad5be0", - "name": "height", - "type": "integer", - "fieldKind": "output" - } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" - }, - "width": 320, - "height": 396, - "position": { - "x": 5379.153347937034, - "y": -198.406964558253 - } - }, - { - "id": "ab1387b7-6b00-4e20-acae-2ca2c1597896", - "type": "invocation", - "data": { - "id": "ab1387b7-6b00-4e20-acae-2ca2c1597896", - "type": "img_paste", - "inputs": { - "metadata": { - "id": "91fa397b-cadb-42ca-beee-e9437f6ddd3d", - "name": "metadata", - "type": "MetadataField", - "fieldKind": "input", - "label": "" - }, - "base_image": { - "id": "d2073c40-9299-438f-ab7b-b9fe85f5550d", - "name": "base_image", - "type": "ImageField", - "fieldKind": "input", - "label": "" - }, - "image": { - "id": "c880fd54-a830-4f16-a1fe-c07d8ecd5d96", - "name": "image", - "type": "ImageField", - "fieldKind": "input", - "label": "" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } }, "mask": { - "id": "a8ae99d0-7e67-4064-9f34-4c4cebfcdca9", + "id": "cf928567-3e05-42dd-9591-0d3d942034f8", "name": "mask", - "type": "ImageField", - "fieldKind": "input", - "label": "" - }, - "x": { - "id": "bd874e6d-ec17-496e-864a-0a6f613ef3f2", - "name": "x", - "type": "integer", - "fieldKind": "input", - "label": "", - "value": 0 - }, - "y": { - "id": "8fcb1a55-3275-448a-8571-f93909468cdc", - "name": "y", - "type": "integer", - "fieldKind": "input", - "label": "", - "value": 0 - }, - "crop": { - "id": "54fad883-e0d8-46e8-a933-7bac0e8977eb", - "name": "crop", - "type": "boolean", - "fieldKind": "input", - "label": "", - "value": false + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } } - }, - "outputs": { - "image": { - "id": "c9e38cb4-daad-4ed2-87e1-cf36cc4fccc4", - "name": "image", - "type": "ImageField", - "fieldKind": "output" - }, - "width": { - "id": "93832b00-1691-475d-a04b-277598ca33e0", - "name": "width", - "type": "integer", - "fieldKind": "output" - }, - "height": { - "id": "9e57e4da-e349-4356-956f-b50f41f7f19b", - "name": "height", - "type": "integer", - "fieldKind": "output" - } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": false, - "useCache": true, - "version": "1.0.1" + } }, "width": 320, - "height": 504, + "height": 585, "position": { - "x": 6054.981342632396, - "y": -107.76717121720509 + "x": 4300, + "y": 600 } } ], "edges": [ { + "id": "50a8db6a-3796-4522-8547-53275efa4e7d-de8b1a48-a2e4-42ca-90bb-66058bffd534-collapsed", + "source": "50a8db6a-3796-4522-8547-53275efa4e7d", + "target": "de8b1a48-a2e4-42ca-90bb-66058bffd534", + "type": "collapsed" + }, + { + "id": "f0de6c44-4515-4f79-bcc0-dee111bcfe31-2974e5b3-3d41-4b6f-9953-cd21e8f3a323-collapsed", + "source": "f0de6c44-4515-4f79-bcc0-dee111bcfe31", + "target": "2974e5b3-3d41-4b6f-9953-cd21e8f3a323", + "type": "collapsed" + }, + { + "id": "de8b1a48-a2e4-42ca-90bb-66058bffd534-2974e5b3-3d41-4b6f-9953-cd21e8f3a323-collapsed", "source": "de8b1a48-a2e4-42ca-90bb-66058bffd534", - "sourceHandle": "latents", "target": "2974e5b3-3d41-4b6f-9953-cd21e8f3a323", - "targetHandle": "latents", - "id": "reactflow__edge-de8b1a48-a2e4-42ca-90bb-66058bffd534latents-2974e5b3-3d41-4b6f-9953-cd21e8f3a323latents", - "type": "default" + "type": "collapsed" }, { + "id": "2974e5b3-3d41-4b6f-9953-cd21e8f3a323-35623411-ba3a-4eaa-91fd-1e0fda0a5b42-collapsed", "source": "2974e5b3-3d41-4b6f-9953-cd21e8f3a323", - "sourceHandle": "width", "target": "35623411-ba3a-4eaa-91fd-1e0fda0a5b42", - "targetHandle": "width", - "id": "reactflow__edge-2974e5b3-3d41-4b6f-9953-cd21e8f3a323width-35623411-ba3a-4eaa-91fd-1e0fda0a5b42width", - "type": "default" - }, - { - "source": "2974e5b3-3d41-4b6f-9953-cd21e8f3a323", - "sourceHandle": "height", - "target": "35623411-ba3a-4eaa-91fd-1e0fda0a5b42", - "targetHandle": "height", - "id": "reactflow__edge-2974e5b3-3d41-4b6f-9953-cd21e8f3a323height-35623411-ba3a-4eaa-91fd-1e0fda0a5b42height", - "type": "default" + "type": "collapsed" }, { + "id": "c865f39f-f830-4ed7-88a5-e935cfe050a9-35623411-ba3a-4eaa-91fd-1e0fda0a5b42-collapsed", "source": "c865f39f-f830-4ed7-88a5-e935cfe050a9", - "sourceHandle": "value", "target": "35623411-ba3a-4eaa-91fd-1e0fda0a5b42", - "targetHandle": "seed", - "id": "reactflow__edge-c865f39f-f830-4ed7-88a5-e935cfe050a9value-35623411-ba3a-4eaa-91fd-1e0fda0a5b42seed", - "type": "default" + "type": "collapsed" }, { - "source": "76ea1e31-eabe-4080-935e-e74ce20e2805", - "sourceHandle": "clip", - "target": "f4d15b64-c4a6-42a5-90fc-e4ed07a0ca65", - "targetHandle": "clip", - "id": "reactflow__edge-76ea1e31-eabe-4080-935e-e74ce20e2805clip-f4d15b64-c4a6-42a5-90fc-e4ed07a0ca65clip", - "type": "default" + "id": "reactflow__edge-2c9bc2a6-6c03-4861-aad4-db884a7682f8image-9ae34718-a17d-401d-9859-086896c29fcaimage", + "source": "2c9bc2a6-6c03-4861-aad4-db884a7682f8", + "target": "9ae34718-a17d-401d-9859-086896c29fca", + "type": "default", + "sourceHandle": "image", + "targetHandle": "image" }, { - "source": "76ea1e31-eabe-4080-935e-e74ce20e2805", - "sourceHandle": "vae", - "target": "de8b1a48-a2e4-42ca-90bb-66058bffd534", - "targetHandle": "vae", - "id": "reactflow__edge-76ea1e31-eabe-4080-935e-e74ce20e2805vae-de8b1a48-a2e4-42ca-90bb-66058bffd534vae", - "type": "default" - }, - { - "source": "76ea1e31-eabe-4080-935e-e74ce20e2805", - "sourceHandle": "clip", - "target": "44f2c190-eb03-460d-8d11-a94d13b33f19", - "targetHandle": "clip", - "id": "reactflow__edge-76ea1e31-eabe-4080-935e-e74ce20e2805clip-44f2c190-eb03-460d-8d11-a94d13b33f19clip", - "type": "default" - }, - { - "source": "f0de6c44-4515-4f79-bcc0-dee111bcfe31", - "sourceHandle": "value", - "target": "2974e5b3-3d41-4b6f-9953-cd21e8f3a323", - "targetHandle": "scale_factor", - "id": "reactflow__edge-f0de6c44-4515-4f79-bcc0-dee111bcfe31value-2974e5b3-3d41-4b6f-9953-cd21e8f3a323scale_factor", - "type": "default" - }, - { - "source": "2974e5b3-3d41-4b6f-9953-cd21e8f3a323", - "sourceHandle": "latents", - "target": "e41c9dcc-a460-439a-85f3-eb18c74d9411", - "targetHandle": "latents", - "id": "reactflow__edge-2974e5b3-3d41-4b6f-9953-cd21e8f3a323latents-e41c9dcc-a460-439a-85f3-eb18c74d9411latents", - "type": "default" - }, - { - "source": "f4d15b64-c4a6-42a5-90fc-e4ed07a0ca65", - "sourceHandle": "conditioning", - "target": "e41c9dcc-a460-439a-85f3-eb18c74d9411", - "targetHandle": "positive_conditioning", - "id": "reactflow__edge-f4d15b64-c4a6-42a5-90fc-e4ed07a0ca65conditioning-e41c9dcc-a460-439a-85f3-eb18c74d9411positive_conditioning", - "type": "default" - }, - { - "source": "44f2c190-eb03-460d-8d11-a94d13b33f19", - "sourceHandle": "conditioning", - "target": "e41c9dcc-a460-439a-85f3-eb18c74d9411", - "targetHandle": "negative_conditioning", - "id": "reactflow__edge-44f2c190-eb03-460d-8d11-a94d13b33f19conditioning-e41c9dcc-a460-439a-85f3-eb18c74d9411negative_conditioning", - "type": "default" - }, - { - "source": "76ea1e31-eabe-4080-935e-e74ce20e2805", - "sourceHandle": "unet", - "target": "e41c9dcc-a460-439a-85f3-eb18c74d9411", - "targetHandle": "unet", - "id": "reactflow__edge-76ea1e31-eabe-4080-935e-e74ce20e2805unet-e41c9dcc-a460-439a-85f3-eb18c74d9411unet", - "type": "default" - }, - { - "source": "f60b6161-8f26-42f6-89ff-545e6011e501", - "sourceHandle": "control", - "target": "e41c9dcc-a460-439a-85f3-eb18c74d9411", - "targetHandle": "control", - "id": "reactflow__edge-f60b6161-8f26-42f6-89ff-545e6011e501control-e41c9dcc-a460-439a-85f3-eb18c74d9411control", - "type": "default" - }, - { - "source": "64712037-92e8-483f-9f6e-87588539c1b8", - "sourceHandle": "value", - "target": "e41c9dcc-a460-439a-85f3-eb18c74d9411", - "targetHandle": "cfg_scale", - "id": "reactflow__edge-64712037-92e8-483f-9f6e-87588539c1b8value-e41c9dcc-a460-439a-85f3-eb18c74d9411cfg_scale", - "type": "default" + "id": "reactflow__edge-9ae34718-a17d-401d-9859-086896c29fcaimage-50a8db6a-3796-4522-8547-53275efa4e7dimage", + "source": "9ae34718-a17d-401d-9859-086896c29fca", + "target": "50a8db6a-3796-4522-8547-53275efa4e7d", + "type": "default", + "sourceHandle": "image", + "targetHandle": "image" }, { + "id": "reactflow__edge-35623411-ba3a-4eaa-91fd-1e0fda0a5b42noise-bd06261d-a74a-4d1f-8374-745ed6194bc2noise", "source": "35623411-ba3a-4eaa-91fd-1e0fda0a5b42", + "target": "bd06261d-a74a-4d1f-8374-745ed6194bc2", + "type": "default", "sourceHandle": "noise", - "target": "e41c9dcc-a460-439a-85f3-eb18c74d9411", - "targetHandle": "noise", - "id": "reactflow__edge-35623411-ba3a-4eaa-91fd-1e0fda0a5b42noise-e41c9dcc-a460-439a-85f3-eb18c74d9411noise", - "type": "default" + "targetHandle": "noise" }, { - "source": "cdfa5ab0-b3e2-43ed-85bb-2ac4aa83bc05", - "sourceHandle": "value", - "target": "e41c9dcc-a460-439a-85f3-eb18c74d9411", - "targetHandle": "denoising_start", - "id": "reactflow__edge-cdfa5ab0-b3e2-43ed-85bb-2ac4aa83bc05value-e41c9dcc-a460-439a-85f3-eb18c74d9411denoising_start", - "type": "default" - }, - { - "source": "2c9bc2a6-6c03-4861-aad4-db884a7682f8", - "sourceHandle": "image", - "target": "1bb5d85c-fc4d-41ed-94c6-88559f497491", - "targetHandle": "image", - "id": "reactflow__edge-2c9bc2a6-6c03-4861-aad4-db884a7682f8image-1bb5d85c-fc4d-41ed-94c6-88559f497491image", - "type": "default" - }, - { - "source": "1bb5d85c-fc4d-41ed-94c6-88559f497491", - "sourceHandle": "image", - "target": "e3383c2f-828e-4b9c-94bb-9f10de86cc7f", - "targetHandle": "image", - "id": "reactflow__edge-1bb5d85c-fc4d-41ed-94c6-88559f497491image-e3383c2f-828e-4b9c-94bb-9f10de86cc7fimage", - "type": "default" - }, - { - "source": "e3383c2f-828e-4b9c-94bb-9f10de86cc7f", - "sourceHandle": "image", - "target": "de8b1a48-a2e4-42ca-90bb-66058bffd534", - "targetHandle": "image", - "id": "reactflow__edge-e3383c2f-828e-4b9c-94bb-9f10de86cc7fimage-de8b1a48-a2e4-42ca-90bb-66058bffd534image", - "type": "default" - }, - { - "source": "e3383c2f-828e-4b9c-94bb-9f10de86cc7f", - "sourceHandle": "image", - "target": "60343212-208e-4ec5-97c4-df78e30a3066", - "targetHandle": "image", - "id": "reactflow__edge-e3383c2f-828e-4b9c-94bb-9f10de86cc7fimage-60343212-208e-4ec5-97c4-df78e30a3066image", - "type": "default" - }, - { - "source": "f0de6c44-4515-4f79-bcc0-dee111bcfe31", - "sourceHandle": "value", - "target": "60343212-208e-4ec5-97c4-df78e30a3066", - "targetHandle": "scale_factor", - "id": "reactflow__edge-f0de6c44-4515-4f79-bcc0-dee111bcfe31value-60343212-208e-4ec5-97c4-df78e30a3066scale_factor", - "type": "default" - }, - { - "source": "60343212-208e-4ec5-97c4-df78e30a3066", - "sourceHandle": "image", - "target": "07099eb0-9d58-4e0b-82f8-3063c3af2689", - "targetHandle": "image", - "id": "reactflow__edge-60343212-208e-4ec5-97c4-df78e30a3066image-07099eb0-9d58-4e0b-82f8-3063c3af2689image", - "type": "default" - }, - { - "source": "07099eb0-9d58-4e0b-82f8-3063c3af2689", - "sourceHandle": "image", - "target": "f60b6161-8f26-42f6-89ff-545e6011e501", - "targetHandle": "image", - "id": "reactflow__edge-07099eb0-9d58-4e0b-82f8-3063c3af2689image-f60b6161-8f26-42f6-89ff-545e6011e501image", - "type": "default" - }, - { - "source": "60343212-208e-4ec5-97c4-df78e30a3066", - "sourceHandle": "image", - "target": "a50af8a0-7b7e-4cb8-a116-89f2d83f33ed", - "targetHandle": "image", - "id": "reactflow__edge-60343212-208e-4ec5-97c4-df78e30a3066image-a50af8a0-7b7e-4cb8-a116-89f2d83f33edimage", - "type": "default" - }, - { - "source": "a50af8a0-7b7e-4cb8-a116-89f2d83f33ed", - "sourceHandle": "ip_adapter", - "target": "e41c9dcc-a460-439a-85f3-eb18c74d9411", - "targetHandle": "ip_adapter", - "id": "reactflow__edge-a50af8a0-7b7e-4cb8-a116-89f2d83f33edip_adapter-e41c9dcc-a460-439a-85f3-eb18c74d9411ip_adapter", - "type": "default" - }, - { - "source": "1bb5d85c-fc4d-41ed-94c6-88559f497491", - "sourceHandle": "width", - "target": "03df59d0-a061-430c-a76f-5a4cf3e14378", - "targetHandle": "width", - "id": "reactflow__edge-1bb5d85c-fc4d-41ed-94c6-88559f497491width-03df59d0-a061-430c-a76f-5a4cf3e14378width", - "type": "default" - }, - { - "source": "1bb5d85c-fc4d-41ed-94c6-88559f497491", - "sourceHandle": "height", - "target": "03df59d0-a061-430c-a76f-5a4cf3e14378", - "targetHandle": "height", - "id": "reactflow__edge-1bb5d85c-fc4d-41ed-94c6-88559f497491height-03df59d0-a061-430c-a76f-5a4cf3e14378height", - "type": "default" - }, - { - "source": "1bb5d85c-fc4d-41ed-94c6-88559f497491", - "sourceHandle": "mask", - "target": "8bb08a28-0a64-4da9-9bf4-4526ea40f437", - "targetHandle": "image", - "id": "reactflow__edge-1bb5d85c-fc4d-41ed-94c6-88559f497491mask-8bb08a28-0a64-4da9-9bf4-4526ea40f437image", - "type": "default" - }, - { - "source": "8bb08a28-0a64-4da9-9bf4-4526ea40f437", - "sourceHandle": "image", - "target": "227f0e19-3a4e-44f0-9f52-a8591b719bbe", - "targetHandle": "mask1", - "id": "reactflow__edge-8bb08a28-0a64-4da9-9bf4-4526ea40f437image-227f0e19-3a4e-44f0-9f52-a8591b719bbemask1", - "type": "default" - }, - { - "source": "03df59d0-a061-430c-a76f-5a4cf3e14378", - "sourceHandle": "image", - "target": "227f0e19-3a4e-44f0-9f52-a8591b719bbe", - "targetHandle": "mask2", - "id": "reactflow__edge-03df59d0-a061-430c-a76f-5a4cf3e14378image-227f0e19-3a4e-44f0-9f52-a8591b719bbemask2", - "type": "default" - }, - { - "source": "e41c9dcc-a460-439a-85f3-eb18c74d9411", + "id": "reactflow__edge-de8b1a48-a2e4-42ca-90bb-66058bffd534latents-2974e5b3-3d41-4b6f-9953-cd21e8f3a323latents", + "source": "de8b1a48-a2e4-42ca-90bb-66058bffd534", + "target": "2974e5b3-3d41-4b6f-9953-cd21e8f3a323", + "type": "default", "sourceHandle": "latents", - "target": "0d05a218-0208-4038-a3e7-867bd9367593", - "targetHandle": "latents", - "id": "reactflow__edge-e41c9dcc-a460-439a-85f3-eb18c74d9411latents-0d05a218-0208-4038-a3e7-867bd9367593latents", - "type": "default" + "targetHandle": "latents" }, { - "source": "0d05a218-0208-4038-a3e7-867bd9367593", - "sourceHandle": "image", - "target": "db4981fd-e6eb-42b3-910b-b15443fa863d", - "targetHandle": "image", - "id": "reactflow__edge-0d05a218-0208-4038-a3e7-867bd9367593image-db4981fd-e6eb-42b3-910b-b15443fa863dimage", - "type": "default" + "id": "reactflow__edge-2974e5b3-3d41-4b6f-9953-cd21e8f3a323latents-bd06261d-a74a-4d1f-8374-745ed6194bc2latents", + "source": "2974e5b3-3d41-4b6f-9953-cd21e8f3a323", + "target": "bd06261d-a74a-4d1f-8374-745ed6194bc2", + "type": "default", + "sourceHandle": "latents", + "targetHandle": "latents" }, { - "source": "db4981fd-e6eb-42b3-910b-b15443fa863d", - "sourceHandle": "image", - "target": "ab1387b7-6b00-4e20-acae-2ca2c1597896", - "targetHandle": "image", - "id": "reactflow__edge-db4981fd-e6eb-42b3-910b-b15443fa863dimage-ab1387b7-6b00-4e20-acae-2ca2c1597896image", - "type": "default" + "id": "reactflow__edge-2974e5b3-3d41-4b6f-9953-cd21e8f3a323width-35623411-ba3a-4eaa-91fd-1e0fda0a5b42width", + "source": "2974e5b3-3d41-4b6f-9953-cd21e8f3a323", + "target": "35623411-ba3a-4eaa-91fd-1e0fda0a5b42", + "type": "default", + "sourceHandle": "width", + "targetHandle": "width" }, { + "id": "reactflow__edge-2974e5b3-3d41-4b6f-9953-cd21e8f3a323height-35623411-ba3a-4eaa-91fd-1e0fda0a5b42height", + "source": "2974e5b3-3d41-4b6f-9953-cd21e8f3a323", + "target": "35623411-ba3a-4eaa-91fd-1e0fda0a5b42", + "type": "default", + "sourceHandle": "height", + "targetHandle": "height" + }, + { + "id": "reactflow__edge-2c9bc2a6-6c03-4861-aad4-db884a7682f8image-a7d14545-aa09-4b96-bfc5-40c009af9110base_image", "source": "2c9bc2a6-6c03-4861-aad4-db884a7682f8", + "target": "a7d14545-aa09-4b96-bfc5-40c009af9110", + "type": "default", "sourceHandle": "image", - "target": "ab1387b7-6b00-4e20-acae-2ca2c1597896", - "targetHandle": "base_image", - "id": "reactflow__edge-2c9bc2a6-6c03-4861-aad4-db884a7682f8image-ab1387b7-6b00-4e20-acae-2ca2c1597896base_image", - "type": "default" + "targetHandle": "base_image" }, { - "source": "227f0e19-3a4e-44f0-9f52-a8591b719bbe", + "id": "reactflow__edge-2224ed72-2453-4252-bd89-3085240e0b6fimage-ff8c23dc-da7c-45b7-b5c9-d984b12f02efimage", + "source": "2224ed72-2453-4252-bd89-3085240e0b6f", + "target": "ff8c23dc-da7c-45b7-b5c9-d984b12f02ef", + "type": "default", "sourceHandle": "image", - "target": "ab1387b7-6b00-4e20-acae-2ca2c1597896", - "targetHandle": "mask", - "id": "reactflow__edge-227f0e19-3a4e-44f0-9f52-a8591b719bbeimage-ab1387b7-6b00-4e20-acae-2ca2c1597896mask", - "type": "default" + "targetHandle": "image" + }, + { + "id": "reactflow__edge-9ae34718-a17d-401d-9859-086896c29fcawidth-ff8c23dc-da7c-45b7-b5c9-d984b12f02efwidth", + "source": "9ae34718-a17d-401d-9859-086896c29fca", + "target": "ff8c23dc-da7c-45b7-b5c9-d984b12f02ef", + "type": "default", + "sourceHandle": "width", + "targetHandle": "width" + }, + { + "id": "reactflow__edge-9ae34718-a17d-401d-9859-086896c29fcaheight-ff8c23dc-da7c-45b7-b5c9-d984b12f02efheight", + "source": "9ae34718-a17d-401d-9859-086896c29fca", + "target": "ff8c23dc-da7c-45b7-b5c9-d984b12f02ef", + "type": "default", + "sourceHandle": "height", + "targetHandle": "height" + }, + { + "id": "reactflow__edge-9ae34718-a17d-401d-9859-086896c29fcax-a7d14545-aa09-4b96-bfc5-40c009af9110x", + "source": "9ae34718-a17d-401d-9859-086896c29fca", + "target": "a7d14545-aa09-4b96-bfc5-40c009af9110", + "type": "default", + "sourceHandle": "x", + "targetHandle": "x" + }, + { + "id": "reactflow__edge-9ae34718-a17d-401d-9859-086896c29fcay-a7d14545-aa09-4b96-bfc5-40c009af9110y", + "source": "9ae34718-a17d-401d-9859-086896c29fca", + "target": "a7d14545-aa09-4b96-bfc5-40c009af9110", + "type": "default", + "sourceHandle": "y", + "targetHandle": "y" + }, + { + "id": "reactflow__edge-50a8db6a-3796-4522-8547-53275efa4e7dimage-de8b1a48-a2e4-42ca-90bb-66058bffd534image", + "source": "50a8db6a-3796-4522-8547-53275efa4e7d", + "target": "de8b1a48-a2e4-42ca-90bb-66058bffd534", + "type": "default", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-cdfa5ab0-b3e2-43ed-85bb-2ac4aa83bc05value-bd06261d-a74a-4d1f-8374-745ed6194bc2denoising_start", + "source": "cdfa5ab0-b3e2-43ed-85bb-2ac4aa83bc05", + "target": "bd06261d-a74a-4d1f-8374-745ed6194bc2", + "type": "default", + "sourceHandle": "value", + "targetHandle": "denoising_start" + }, + { + "id": "reactflow__edge-64712037-92e8-483f-9f6e-87588539c1b8value-bd06261d-a74a-4d1f-8374-745ed6194bc2cfg_scale", + "source": "64712037-92e8-483f-9f6e-87588539c1b8", + "target": "bd06261d-a74a-4d1f-8374-745ed6194bc2", + "type": "default", + "sourceHandle": "value", + "targetHandle": "cfg_scale" + }, + { + "id": "reactflow__edge-9ae34718-a17d-401d-9859-086896c29fcawidth-c59e815c-1f3a-4e2b-b6b8-66f4b005e955width", + "source": "9ae34718-a17d-401d-9859-086896c29fca", + "target": "c59e815c-1f3a-4e2b-b6b8-66f4b005e955", + "type": "default", + "sourceHandle": "width", + "targetHandle": "width" + }, + { + "id": "reactflow__edge-9ae34718-a17d-401d-9859-086896c29fcaheight-c59e815c-1f3a-4e2b-b6b8-66f4b005e955height", + "source": "9ae34718-a17d-401d-9859-086896c29fca", + "target": "c59e815c-1f3a-4e2b-b6b8-66f4b005e955", + "type": "default", + "sourceHandle": "height", + "targetHandle": "height" + }, + { + "id": "reactflow__edge-ff8c23dc-da7c-45b7-b5c9-d984b12f02efimage-a7d14545-aa09-4b96-bfc5-40c009af9110image", + "source": "ff8c23dc-da7c-45b7-b5c9-d984b12f02ef", + "target": "a7d14545-aa09-4b96-bfc5-40c009af9110", + "type": "default", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-bd06261d-a74a-4d1f-8374-745ed6194bc2latents-2224ed72-2453-4252-bd89-3085240e0b6flatents", + "source": "bd06261d-a74a-4d1f-8374-745ed6194bc2", + "target": "2224ed72-2453-4252-bd89-3085240e0b6f", + "type": "default", + "sourceHandle": "latents", + "targetHandle": "latents" + }, + { + "id": "reactflow__edge-c865f39f-f830-4ed7-88a5-e935cfe050a9value-35623411-ba3a-4eaa-91fd-1e0fda0a5b42seed", + "source": "c865f39f-f830-4ed7-88a5-e935cfe050a9", + "target": "35623411-ba3a-4eaa-91fd-1e0fda0a5b42", + "type": "default", + "sourceHandle": "value", + "targetHandle": "seed" + }, + { + "id": "reactflow__edge-76ea1e31-eabe-4080-935e-e74ce20e2805clip-f4d15b64-c4a6-42a5-90fc-e4ed07a0ca65clip", + "source": "76ea1e31-eabe-4080-935e-e74ce20e2805", + "target": "f4d15b64-c4a6-42a5-90fc-e4ed07a0ca65", + "type": "default", + "sourceHandle": "clip", + "targetHandle": "clip" + }, + { + "id": "reactflow__edge-76ea1e31-eabe-4080-935e-e74ce20e2805vae-de8b1a48-a2e4-42ca-90bb-66058bffd534vae", + "source": "76ea1e31-eabe-4080-935e-e74ce20e2805", + "target": "de8b1a48-a2e4-42ca-90bb-66058bffd534", + "type": "default", + "sourceHandle": "vae", + "targetHandle": "vae" + }, + { + "id": "reactflow__edge-f4d15b64-c4a6-42a5-90fc-e4ed07a0ca65conditioning-bd06261d-a74a-4d1f-8374-745ed6194bc2positive_conditioning", + "source": "f4d15b64-c4a6-42a5-90fc-e4ed07a0ca65", + "target": "bd06261d-a74a-4d1f-8374-745ed6194bc2", + "type": "default", + "sourceHandle": "conditioning", + "targetHandle": "positive_conditioning" + }, + { + "id": "reactflow__edge-44f2c190-eb03-460d-8d11-a94d13b33f19conditioning-bd06261d-a74a-4d1f-8374-745ed6194bc2negative_conditioning", + "source": "44f2c190-eb03-460d-8d11-a94d13b33f19", + "target": "bd06261d-a74a-4d1f-8374-745ed6194bc2", + "type": "default", + "sourceHandle": "conditioning", + "targetHandle": "negative_conditioning" + }, + { + "id": "reactflow__edge-76ea1e31-eabe-4080-935e-e74ce20e2805unet-bd06261d-a74a-4d1f-8374-745ed6194bc2unet", + "source": "76ea1e31-eabe-4080-935e-e74ce20e2805", + "target": "bd06261d-a74a-4d1f-8374-745ed6194bc2", + "type": "default", + "sourceHandle": "unet", + "targetHandle": "unet" + }, + { + "id": "reactflow__edge-76ea1e31-eabe-4080-935e-e74ce20e2805vae-2224ed72-2453-4252-bd89-3085240e0b6fvae", + "source": "76ea1e31-eabe-4080-935e-e74ce20e2805", + "target": "2224ed72-2453-4252-bd89-3085240e0b6f", + "type": "default", + "sourceHandle": "vae", + "targetHandle": "vae" + }, + { + "id": "reactflow__edge-76ea1e31-eabe-4080-935e-e74ce20e2805clip-44f2c190-eb03-460d-8d11-a94d13b33f19clip", + "source": "76ea1e31-eabe-4080-935e-e74ce20e2805", + "target": "44f2c190-eb03-460d-8d11-a94d13b33f19", + "type": "default", + "sourceHandle": "clip", + "targetHandle": "clip" + }, + { + "id": "reactflow__edge-22b750db-b85e-486b-b278-ac983e329813ip_adapter-bd06261d-a74a-4d1f-8374-745ed6194bc2ip_adapter", + "source": "22b750db-b85e-486b-b278-ac983e329813", + "target": "bd06261d-a74a-4d1f-8374-745ed6194bc2", + "type": "default", + "sourceHandle": "ip_adapter", + "targetHandle": "ip_adapter" + }, + { + "id": "reactflow__edge-50a8db6a-3796-4522-8547-53275efa4e7dimage-4bd4ae80-567f-4366-b8c6-3bb06f4fb46aimage", + "source": "50a8db6a-3796-4522-8547-53275efa4e7d", + "target": "4bd4ae80-567f-4366-b8c6-3bb06f4fb46a", + "type": "default", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-4bd4ae80-567f-4366-b8c6-3bb06f4fb46aimage-22b750db-b85e-486b-b278-ac983e329813image", + "source": "4bd4ae80-567f-4366-b8c6-3bb06f4fb46a", + "target": "22b750db-b85e-486b-b278-ac983e329813", + "type": "default", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-8fe598c6-d447-44fa-a165-4975af77d080image-f60b6161-8f26-42f6-89ff-545e6011e501image", + "source": "8fe598c6-d447-44fa-a165-4975af77d080", + "target": "f60b6161-8f26-42f6-89ff-545e6011e501", + "type": "default", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-4bd4ae80-567f-4366-b8c6-3bb06f4fb46aimage-8fe598c6-d447-44fa-a165-4975af77d080image", + "source": "4bd4ae80-567f-4366-b8c6-3bb06f4fb46a", + "target": "8fe598c6-d447-44fa-a165-4975af77d080", + "type": "default", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-f60b6161-8f26-42f6-89ff-545e6011e501control-bd06261d-a74a-4d1f-8374-745ed6194bc2control", + "source": "f60b6161-8f26-42f6-89ff-545e6011e501", + "target": "bd06261d-a74a-4d1f-8374-745ed6194bc2", + "type": "default", + "sourceHandle": "control", + "targetHandle": "control" + }, + { + "id": "reactflow__edge-c59e815c-1f3a-4e2b-b6b8-66f4b005e955image-381d5b6a-f044-48b0-bc07-6138fbfa8dfcmask2", + "source": "c59e815c-1f3a-4e2b-b6b8-66f4b005e955", + "target": "381d5b6a-f044-48b0-bc07-6138fbfa8dfc", + "type": "default", + "sourceHandle": "image", + "targetHandle": "mask2" + }, + { + "id": "reactflow__edge-381d5b6a-f044-48b0-bc07-6138fbfa8dfcimage-a7d14545-aa09-4b96-bfc5-40c009af9110mask", + "source": "381d5b6a-f044-48b0-bc07-6138fbfa8dfc", + "target": "a7d14545-aa09-4b96-bfc5-40c009af9110", + "type": "default", + "sourceHandle": "image", + "targetHandle": "mask" + }, + { + "id": "reactflow__edge-77da4e4d-5778-4469-8449-ffed03d54bdbimage-381d5b6a-f044-48b0-bc07-6138fbfa8dfcmask1", + "source": "77da4e4d-5778-4469-8449-ffed03d54bdb", + "target": "381d5b6a-f044-48b0-bc07-6138fbfa8dfc", + "type": "default", + "sourceHandle": "image", + "targetHandle": "mask1" + }, + { + "id": "reactflow__edge-9ae34718-a17d-401d-9859-086896c29fcamask-77da4e4d-5778-4469-8449-ffed03d54bdbimage", + "source": "9ae34718-a17d-401d-9859-086896c29fca", + "target": "77da4e4d-5778-4469-8449-ffed03d54bdb", + "type": "default", + "sourceHandle": "mask", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-f0de6c44-4515-4f79-bcc0-dee111bcfe31value-2974e5b3-3d41-4b6f-9953-cd21e8f3a323scale_factor", + "source": "f0de6c44-4515-4f79-bcc0-dee111bcfe31", + "target": "2974e5b3-3d41-4b6f-9953-cd21e8f3a323", + "type": "default", + "sourceHandle": "value", + "targetHandle": "scale_factor" + }, + { + "id": "reactflow__edge-f0de6c44-4515-4f79-bcc0-dee111bcfe31value-4bd4ae80-567f-4366-b8c6-3bb06f4fb46ascale_factor", + "source": "f0de6c44-4515-4f79-bcc0-dee111bcfe31", + "target": "4bd4ae80-567f-4366-b8c6-3bb06f4fb46a", + "type": "default", + "sourceHandle": "value", + "targetHandle": "scale_factor" + }, + { + "id": "reactflow__edge-2c9bc2a6-6c03-4861-aad4-db884a7682f8image-a6482723-4e0a-4e40-98c0-b20622bf5f16image", + "source": "2c9bc2a6-6c03-4861-aad4-db884a7682f8", + "target": "a6482723-4e0a-4e40-98c0-b20622bf5f16", + "type": "default", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-a6482723-4e0a-4e40-98c0-b20622bf5f16image-c59e815c-1f3a-4e2b-b6b8-66f4b005e955image", + "source": "a6482723-4e0a-4e40-98c0-b20622bf5f16", + "target": "c59e815c-1f3a-4e2b-b6b8-66f4b005e955", + "type": "default", + "sourceHandle": "image", + "targetHandle": "image" } ] } \ No newline at end of file diff --git a/docs/workflows/Multi_ControlNet_Canny_and_Depth.json b/docs/workflows/Multi_ControlNet_Canny_and_Depth.json index 09c9ff72ea..70dc204772 100644 --- a/docs/workflows/Multi_ControlNet_Canny_and_Depth.json +++ b/docs/workflows/Multi_ControlNet_Canny_and_Depth.json @@ -1,9 +1,10 @@ { + "id": "1e385b84-86f8-452e-9697-9e5abed20518", "name": "Multi ControlNet (Canny & Depth)", - "author": "Millu", + "author": "InvokeAI", "description": "A sample workflow using canny & depth ControlNets to guide the generation process. ", - "version": "0.1.0", - "contact": "millun@invoke.ai", + "version": "1.0.0", + "contact": "invoke@invoke.ai", "tags": "ControlNet, canny, depth", "notes": "", "exposedFields": [ @@ -29,7 +30,8 @@ } ], "meta": { - "version": "1.0.0" + "category": "default", + "version": "2.0.0" }, "nodes": [ { @@ -38,48 +40,64 @@ "data": { "id": "8e860e51-5045-456e-bf04-9a62a2a5c49e", "type": "image", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "image": { "id": "189c8adf-68cc-4774-a729-49da89f6fdf1", "name": "image", - "type": "ImageField", "fieldKind": "input", - "label": "Depth Input Image" + "label": "Depth Input Image", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } } }, "outputs": { "image": { "id": "1a31cacd-9d19-4f32-b558-c5e4aa39ce73", "name": "image", - "type": "ImageField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } }, "width": { "id": "12f298fd-1d11-4cca-9426-01240f7ec7cf", "name": "width", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } }, "height": { "id": "c47dabcb-44e8-40c9-992d-81dca59f598e", "name": "height", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, "height": 225, "position": { - "x": 3617.163483500202, - "y": 40.5529847930888 + "x": 3625, + "y": -75 } }, { @@ -88,63 +106,98 @@ "data": { "id": "a33199c2-8340-401e-b8a2-42ffa875fc1c", "type": "controlnet", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.1.0", + "nodePack": "invokeai", "inputs": { "image": { "id": "4e0a3172-d3c2-4005-a84c-fa12a404f8a0", "name": "image", - "type": "ImageField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } }, "control_model": { "id": "8cb2d998-4086-430a-8b13-94cbc81e3ca3", "name": "control_model", - "type": "ControlNetModelField", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ControlNetModelField" + }, "value": { - "model_name": "sd-controlnet-depth", + "model_name": "depth", "base_model": "sd-1" } }, "control_weight": { "id": "5e32bd8a-9dc8-42d8-9bcc-c2b0460c0b0f", "name": "control_weight", - "type": "FloatPolymorphic", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "FloatField" + }, "value": 1 }, "begin_step_percent": { "id": "c258a276-352a-416c-8358-152f11005c0c", "name": "begin_step_percent", - "type": "float", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, "value": 0 }, "end_step_percent": { "id": "43001125-0d70-4f87-8e79-da6603ad6c33", "name": "end_step_percent", - "type": "float", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, "value": 1 }, "control_mode": { "id": "d2f14561-9443-4374-9270-e2f05007944e", "name": "control_mode", - "type": "enum", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, "value": "balanced" }, "resize_mode": { "id": "727ee7d3-8bf6-4c7d-8b8a-43546b3b59cd", "name": "resize_mode", - "type": "enum", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, "value": "just_resize" } }, @@ -152,20 +205,17 @@ "control": { "id": "b034aa0f-4d0d-46e4-b5e3-e25a9588d087", "name": "control", - "type": "ControlField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ControlField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 508, + "height": 511, "position": { "x": 4477.604342844504, "y": -49.39005411272677 @@ -177,44 +227,56 @@ "data": { "id": "273e3f96-49ea-4dc5-9d5b-9660390f14e1", "type": "compel", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "prompt": { "id": "7c2c4771-2161-4d77-aced-ff8c4b3f1c15", "name": "prompt", - "type": "string", "fieldKind": "input", "label": "Negative Prompt", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, "value": "" }, "clip": { "id": "06d59e91-9cca-411d-bf05-86b099b3e8f7", "name": "clip", - "type": "ClipField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } } }, "outputs": { "conditioning": { "id": "858bc33c-134c-4bf6-8855-f943e1d26f14", "name": "conditioning", - "type": "ConditioningField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 261, + "height": 256, "position": { - "x": 4444.706437017514, - "y": -924.0715320874991 + "x": 4075, + "y": -825 } }, { @@ -223,13 +285,24 @@ "data": { "id": "54486974-835b-4d81-8f82-05f9f32ce9e9", "type": "main_model_loader", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "model": { "id": "f4a915a5-593e-4b6d-9198-c78eb5cefaed", "name": "model", - "type": "MainModelField", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MainModelField" + }, "value": { "model_name": "stable-diffusion-v1-5", "base_model": "sd-1", @@ -241,35 +314,40 @@ "unet": { "id": "ee24fb16-da38-4c66-9fbc-e8f296ed40d2", "name": "unet", - "type": "UNetField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "UNetField" + } }, "clip": { "id": "f3fb0524-8803-41c1-86db-a61a13ee6a33", "name": "clip", - "type": "ClipField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } }, "vae": { "id": "5c4878a8-b40f-44ab-b146-1c1f42c860b3", "name": "vae", - "type": "VaeField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 226, + "height": 227, "position": { - "x": 3837.096149678291, - "y": -1050.015351148365 + "x": 3600, + "y": -1000 } }, { @@ -278,44 +356,56 @@ "data": { "id": "7ce68934-3419-42d4-ac70-82cfc9397306", "type": "compel", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "prompt": { "id": "7c2c4771-2161-4d77-aced-ff8c4b3f1c15", "name": "prompt", - "type": "string", "fieldKind": "input", "label": "Positive Prompt", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, "value": "" }, "clip": { "id": "06d59e91-9cca-411d-bf05-86b099b3e8f7", "name": "clip", - "type": "ClipField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } } }, "outputs": { "conditioning": { "id": "858bc33c-134c-4bf6-8855-f943e1d26f14", "name": "conditioning", - "type": "ConditioningField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 261, + "height": 256, "position": { - "x": 4449.356038911986, - "y": -1201.659695420063 + "x": 4075, + "y": -1125 } }, { @@ -324,63 +414,98 @@ "data": { "id": "d204d184-f209-4fae-a0a1-d152800844e1", "type": "controlnet", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.1.0", + "nodePack": "invokeai", "inputs": { "image": { "id": "4e0a3172-d3c2-4005-a84c-fa12a404f8a0", "name": "image", - "type": "ImageField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } }, "control_model": { "id": "8cb2d998-4086-430a-8b13-94cbc81e3ca3", "name": "control_model", - "type": "ControlNetModelField", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ControlNetModelField" + }, "value": { - "model_name": "sd-controlnet-canny", + "model_name": "canny", "base_model": "sd-1" } }, "control_weight": { "id": "5e32bd8a-9dc8-42d8-9bcc-c2b0460c0b0f", "name": "control_weight", - "type": "FloatPolymorphic", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "FloatField" + }, "value": 1 }, "begin_step_percent": { "id": "c258a276-352a-416c-8358-152f11005c0c", "name": "begin_step_percent", - "type": "float", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, "value": 0 }, "end_step_percent": { "id": "43001125-0d70-4f87-8e79-da6603ad6c33", "name": "end_step_percent", - "type": "float", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, "value": 1 }, "control_mode": { "id": "d2f14561-9443-4374-9270-e2f05007944e", "name": "control_mode", - "type": "enum", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, "value": "balanced" }, "resize_mode": { "id": "727ee7d3-8bf6-4c7d-8b8a-43546b3b59cd", "name": "resize_mode", - "type": "enum", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, "value": "just_resize" } }, @@ -388,20 +513,17 @@ "control": { "id": "b034aa0f-4d0d-46e4-b5e3-e25a9588d087", "name": "control", - "type": "ControlField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ControlField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 508, + "height": 511, "position": { "x": 4479.68542130465, "y": -618.4221638099414 @@ -413,48 +535,64 @@ "data": { "id": "c4b23e64-7986-40c4-9cad-46327b12e204", "type": "image", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "image": { "id": "189c8adf-68cc-4774-a729-49da89f6fdf1", "name": "image", - "type": "ImageField", "fieldKind": "input", - "label": "Canny Input Image" + "label": "Canny Input Image", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } } }, "outputs": { "image": { "id": "1a31cacd-9d19-4f32-b558-c5e4aa39ce73", "name": "image", - "type": "ImageField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } }, "width": { "id": "12f298fd-1d11-4cca-9426-01240f7ec7cf", "name": "width", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } }, "height": { "id": "c47dabcb-44e8-40c9-992d-81dca59f598e", "name": "height", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, "height": 225, "position": { - "x": 3593.7474460420153, - "y": -538.1200472386865 + "x": 3625, + "y": -425 } }, { @@ -463,36 +601,43 @@ "data": { "id": "ca4d5059-8bfb-447f-b415-da0faba5a143", "type": "collect", + "label": "ControlNet Collection", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", "inputs": { "item": { "id": "b16ae602-8708-4b1b-8d4f-9e0808d429ab", "name": "item", - "type": "CollectionItem", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "CollectionItemField" + } } }, "outputs": { "collection": { "id": "d8987dd8-dec8-4d94-816a-3e356af29884", "name": "collection", - "type": "Collection", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": true, + "isCollectionOrScalar": false, + "name": "CollectionField" + } } - }, - "label": "ControlNet Collection", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, "height": 104, "position": { - "x": 4866.191497139488, - "y": -299.0538619537037 + "x": 4875, + "y": -575 } }, { @@ -501,35 +646,58 @@ "data": { "id": "018b1214-c2af-43a7-9910-fb687c6726d7", "type": "midas_depth_image_processor", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.2.0", + "nodePack": "invokeai", "inputs": { "metadata": { "id": "77f91980-c696-4a18-a9ea-6e2fc329a747", "name": "metadata", - "type": "MetadataField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } }, "image": { "id": "50710a20-2af5-424d-9d17-aa08167829c6", "name": "image", - "type": "ImageField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } }, "a_mult": { "id": "f3b26f9d-2498-415e-9c01-197a8d06c0a5", "name": "a_mult", - "type": "float", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, "value": 2 }, "bg_th": { "id": "4b1eb3ae-9d4a-47d6-b0ed-da62501e007f", "name": "bg_th", - "type": "float", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, "value": 0.1 } }, @@ -537,35 +705,40 @@ "image": { "id": "b4ed637c-c4a0-4fdd-a24e-36d6412e4ccf", "name": "image", - "type": "ImageField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } }, "width": { "id": "6bf9b609-d72c-4239-99bd-390a73cc3a9c", "name": "width", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } }, "height": { "id": "3e8aef09-cf44-4e3e-a490-d3c9e7b23119", "name": "height", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 339, + "height": 340, "position": { - "x": 4054.229311491893, - "y": -31.611411056365725 + "x": 4100, + "y": -75 } }, { @@ -574,35 +747,58 @@ "data": { "id": "c826ba5e-9676-4475-b260-07b85e88753c", "type": "canny_image_processor", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.2.0", + "nodePack": "invokeai", "inputs": { "metadata": { "id": "08331ea6-99df-4e61-a919-204d9bfa8fb2", "name": "metadata", - "type": "MetadataField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } }, "image": { "id": "33a37284-06ac-459c-ba93-1655e4f69b2d", "name": "image", - "type": "ImageField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } }, "low_threshold": { "id": "21ec18a3-50c5-4ba1-9642-f921744d594f", "name": "low_threshold", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 100 }, "high_threshold": { "id": "ebeab271-a5ff-4c88-acfd-1d0271ab6ed4", "name": "high_threshold", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 200 } }, @@ -610,32 +806,37 @@ "image": { "id": "c0caadbf-883f-4cb4-a62d-626b9c81fc4e", "name": "image", - "type": "ImageField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } }, "width": { "id": "df225843-8098-49c0-99d1-3b0b6600559f", "name": "width", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } }, "height": { "id": "e4abe0de-aa16-41f3-9cd7-968b49db5da3", "name": "height", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 339, + "height": 340, "position": { "x": 4095.757337055795, "y": -455.63440891935863 @@ -647,42 +848,69 @@ "data": { "id": "9db25398-c869-4a63-8815-c6559341ef12", "type": "l2i", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": false, + "useCache": true, + "version": "1.2.0", + "nodePack": "invokeai", "inputs": { "metadata": { "id": "2f269793-72e5-4ff3-b76c-fab4f93e983f", "name": "metadata", - "type": "MetadataField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } }, "latents": { "id": "4aaedd3b-cc77-420c-806e-c7fa74ec4cdf", "name": "latents", - "type": "LatentsField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } }, "vae": { "id": "432b066a-2462-4d18-83d9-64620b72df45", "name": "vae", - "type": "VaeField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } }, "tiled": { "id": "61f86e0f-7c46-40f8-b3f5-fe2f693595ca", "name": "tiled", - "type": "boolean", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, "value": false }, "fp32": { "id": "39b6c89a-37ef-4a7e-9509-daeca49d5092", "name": "fp32", - "type": "boolean", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, "value": false } }, @@ -690,35 +918,40 @@ "image": { "id": "6204e9b0-61dd-4250-b685-2092ba0e28e6", "name": "image", - "type": "ImageField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } }, "width": { "id": "b4140649-8d5d-4d2d-bfa6-09e389ede5f9", "name": "width", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } }, "height": { "id": "f3a0c0c8-fc24-4646-8be1-ed8cdd140828", "name": "height", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": false, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, "height": 267, "position": { - "x": 5678.726701377887, - "y": -351.6792416734579 + "x": 5675, + "y": -825 } }, { @@ -727,259 +960,521 @@ "data": { "id": "ac481b7f-08bf-4a9d-9e0c-3a82ea5243ce", "type": "denoise_latents", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.5.0", + "nodePack": "invokeai", "inputs": { "positive_conditioning": { "id": "869cd309-c238-444b-a1a0-5021f99785ba", "name": "positive_conditioning", - "type": "ConditioningField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } }, "negative_conditioning": { "id": "343447b4-1e37-4e9e-8ac7-4d04864066af", "name": "negative_conditioning", - "type": "ConditioningField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } }, "noise": { "id": "b556571e-0cf9-4e03-8cfc-5caad937d957", "name": "noise", - "type": "LatentsField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } }, "steps": { "id": "a3b3d2de-9308-423e-b00d-c209c3e6e808", "name": "steps", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 10 }, "cfg_scale": { "id": "b13c50a4-ec7e-4579-b0ef-2fe5df2605ea", "name": "cfg_scale", - "type": "FloatPolymorphic", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "FloatField" + }, "value": 7.5 }, "denoising_start": { "id": "57d5d755-f58f-4347-b991-f0bca4a0ab29", "name": "denoising_start", - "type": "float", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, "value": 0 }, "denoising_end": { "id": "323e78a6-880a-4d73-a62c-70faff965aa6", "name": "denoising_end", - "type": "float", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, "value": 1 }, "scheduler": { "id": "c25fdc17-a089-43ac-953e-067c45d5c76b", "name": "scheduler", - "type": "Scheduler", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "SchedulerField" + }, "value": "euler" }, "unet": { "id": "6cde662b-e633-4569-b6b4-ec87c52c9c11", "name": "unet", - "type": "UNetField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "UNetField" + } }, "control": { "id": "276a4df9-bb26-4505-a4d3-a94e18c7b541", "name": "control", - "type": "ControlPolymorphic", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "ControlField" + } }, "ip_adapter": { "id": "48d40c51-b5e2-4457-a428-eef0696695e8", "name": "ip_adapter", - "type": "IPAdapterPolymorphic", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "IPAdapterField" + } }, "t2i_adapter": { "id": "75dd8af2-e7d7-48b4-a574-edd9f6e686ad", "name": "t2i_adapter", - "type": "T2IAdapterPolymorphic", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "T2IAdapterField" + } + }, + "cfg_rescale_multiplier": { + "id": "b90460cf-d0c9-4676-8909-2e8e22dc8ee5", + "name": "cfg_rescale_multiplier", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 }, "latents": { "id": "9223d67b-1dd7-4b34-a45f-ed0a725d9702", "name": "latents", - "type": "LatentsField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } }, "denoise_mask": { "id": "4ee99177-6923-4b7f-8fe0-d721dd7cb05b", "name": "denoise_mask", - "type": "DenoiseMaskField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "DenoiseMaskField" + } } }, "outputs": { "latents": { "id": "7fb4e326-a974-43e8-9ee7-2e3ab235819d", "name": "latents", - "type": "LatentsField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } }, "width": { "id": "6bb8acd0-8973-4195-a095-e376385dc705", "name": "width", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } }, "height": { "id": "795dea52-1c7d-4e64-99f7-2f60ec6e3ab9", "name": "height", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.4.0" + } }, "width": 320, - "height": 646, + "height": 705, "position": { "x": 5274.672987098195, "y": -823.0752416664332 } + }, + { + "id": "2e77a0a1-db6a-47a2-a8bf-1e003be6423b", + "type": "invocation", + "data": { + "id": "2e77a0a1-db6a-47a2-a8bf-1e003be6423b", + "type": "noise", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.1", + "inputs": { + "seed": { + "id": "96d7667a-9c56-4fb4-99db-868e2f08e874", + "name": "seed", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "width": { + "id": "1ce644ea-c9bf-48c5-9822-bdec0d2895c5", + "name": "width", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + }, + "height": { + "id": "26d68b53-8a04-4db7-b0f8-57c9bddc0e49", + "name": "height", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + }, + "use_cpu": { + "id": "cf8fb92e-2a8e-4cd5-baf5-4011e0ddfa22", + "name": "use_cpu", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": true + } + }, + "outputs": { + "noise": { + "id": "d9cb9305-6b3a-49a9-b27c-00fb3a58b85c", + "name": "noise", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "width": { + "id": "4ff28d00-ceee-42b8-90e7-f5e5a518376d", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "a6314b9c-346a-4aa6-9260-626ed46c060a", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "width": 320, + "height": 32, + "position": { + "x": 4875, + "y": -675 + } + }, + { + "id": "8b260b4d-3fd6-44d4-b1be-9f0e43c628ce", + "type": "invocation", + "data": { + "id": "8b260b4d-3fd6-44d4-b1be-9f0e43c628ce", + "type": "rand_int", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": false, + "version": "1.0.0", + "inputs": { + "low": { + "id": "a190ad12-a6bd-499b-a82a-100e09fe9aa4", + "name": "low", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "high": { + "id": "a085063f-b9ba-46f2-a21b-c46c321949aa", + "name": "high", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 2147483647 + } + }, + "outputs": { + "value": { + "id": "a15aff56-4874-47fe-be32-d66745ed2ab5", + "name": "value", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "width": 320, + "height": 32, + "position": { + "x": 4875, + "y": -750 + } } ], "edges": [ { - "source": "54486974-835b-4d81-8f82-05f9f32ce9e9", - "sourceHandle": "clip", - "target": "7ce68934-3419-42d4-ac70-82cfc9397306", - "targetHandle": "clip", + "id": "8b260b4d-3fd6-44d4-b1be-9f0e43c628ce-2e77a0a1-db6a-47a2-a8bf-1e003be6423b-collapsed", + "source": "8b260b4d-3fd6-44d4-b1be-9f0e43c628ce", + "target": "2e77a0a1-db6a-47a2-a8bf-1e003be6423b", + "type": "collapsed" + }, + { "id": "reactflow__edge-54486974-835b-4d81-8f82-05f9f32ce9e9clip-7ce68934-3419-42d4-ac70-82cfc9397306clip", - "type": "default" - }, - { "source": "54486974-835b-4d81-8f82-05f9f32ce9e9", + "target": "7ce68934-3419-42d4-ac70-82cfc9397306", + "type": "default", "sourceHandle": "clip", - "target": "273e3f96-49ea-4dc5-9d5b-9660390f14e1", - "targetHandle": "clip", + "targetHandle": "clip" + }, + { "id": "reactflow__edge-54486974-835b-4d81-8f82-05f9f32ce9e9clip-273e3f96-49ea-4dc5-9d5b-9660390f14e1clip", - "type": "default" + "source": "54486974-835b-4d81-8f82-05f9f32ce9e9", + "target": "273e3f96-49ea-4dc5-9d5b-9660390f14e1", + "type": "default", + "sourceHandle": "clip", + "targetHandle": "clip" }, { - "source": "a33199c2-8340-401e-b8a2-42ffa875fc1c", - "sourceHandle": "control", - "target": "ca4d5059-8bfb-447f-b415-da0faba5a143", - "targetHandle": "item", "id": "reactflow__edge-a33199c2-8340-401e-b8a2-42ffa875fc1ccontrol-ca4d5059-8bfb-447f-b415-da0faba5a143item", - "type": "default" - }, - { - "source": "d204d184-f209-4fae-a0a1-d152800844e1", - "sourceHandle": "control", + "source": "a33199c2-8340-401e-b8a2-42ffa875fc1c", "target": "ca4d5059-8bfb-447f-b415-da0faba5a143", - "targetHandle": "item", + "type": "default", + "sourceHandle": "control", + "targetHandle": "item" + }, + { "id": "reactflow__edge-d204d184-f209-4fae-a0a1-d152800844e1control-ca4d5059-8bfb-447f-b415-da0faba5a143item", - "type": "default" + "source": "d204d184-f209-4fae-a0a1-d152800844e1", + "target": "ca4d5059-8bfb-447f-b415-da0faba5a143", + "type": "default", + "sourceHandle": "control", + "targetHandle": "item" }, { - "source": "8e860e51-5045-456e-bf04-9a62a2a5c49e", - "sourceHandle": "image", - "target": "018b1214-c2af-43a7-9910-fb687c6726d7", - "targetHandle": "image", "id": "reactflow__edge-8e860e51-5045-456e-bf04-9a62a2a5c49eimage-018b1214-c2af-43a7-9910-fb687c6726d7image", - "type": "default" + "source": "8e860e51-5045-456e-bf04-9a62a2a5c49e", + "target": "018b1214-c2af-43a7-9910-fb687c6726d7", + "type": "default", + "sourceHandle": "image", + "targetHandle": "image" }, { - "source": "018b1214-c2af-43a7-9910-fb687c6726d7", - "sourceHandle": "image", - "target": "a33199c2-8340-401e-b8a2-42ffa875fc1c", - "targetHandle": "image", "id": "reactflow__edge-018b1214-c2af-43a7-9910-fb687c6726d7image-a33199c2-8340-401e-b8a2-42ffa875fc1cimage", - "type": "default" + "source": "018b1214-c2af-43a7-9910-fb687c6726d7", + "target": "a33199c2-8340-401e-b8a2-42ffa875fc1c", + "type": "default", + "sourceHandle": "image", + "targetHandle": "image" }, { - "source": "c4b23e64-7986-40c4-9cad-46327b12e204", - "sourceHandle": "image", - "target": "c826ba5e-9676-4475-b260-07b85e88753c", - "targetHandle": "image", "id": "reactflow__edge-c4b23e64-7986-40c4-9cad-46327b12e204image-c826ba5e-9676-4475-b260-07b85e88753cimage", - "type": "default" - }, - { - "source": "c826ba5e-9676-4475-b260-07b85e88753c", + "source": "c4b23e64-7986-40c4-9cad-46327b12e204", + "target": "c826ba5e-9676-4475-b260-07b85e88753c", + "type": "default", "sourceHandle": "image", - "target": "d204d184-f209-4fae-a0a1-d152800844e1", - "targetHandle": "image", + "targetHandle": "image" + }, + { "id": "reactflow__edge-c826ba5e-9676-4475-b260-07b85e88753cimage-d204d184-f209-4fae-a0a1-d152800844e1image", - "type": "default" + "source": "c826ba5e-9676-4475-b260-07b85e88753c", + "target": "d204d184-f209-4fae-a0a1-d152800844e1", + "type": "default", + "sourceHandle": "image", + "targetHandle": "image" }, { - "source": "54486974-835b-4d81-8f82-05f9f32ce9e9", - "sourceHandle": "vae", - "target": "9db25398-c869-4a63-8815-c6559341ef12", - "targetHandle": "vae", "id": "reactflow__edge-54486974-835b-4d81-8f82-05f9f32ce9e9vae-9db25398-c869-4a63-8815-c6559341ef12vae", - "type": "default" - }, - { - "source": "ac481b7f-08bf-4a9d-9e0c-3a82ea5243ce", - "sourceHandle": "latents", - "target": "9db25398-c869-4a63-8815-c6559341ef12", - "targetHandle": "latents", - "id": "reactflow__edge-ac481b7f-08bf-4a9d-9e0c-3a82ea5243celatents-9db25398-c869-4a63-8815-c6559341ef12latents", - "type": "default" - }, - { - "source": "ca4d5059-8bfb-447f-b415-da0faba5a143", - "sourceHandle": "collection", - "target": "ac481b7f-08bf-4a9d-9e0c-3a82ea5243ce", - "targetHandle": "control", - "id": "reactflow__edge-ca4d5059-8bfb-447f-b415-da0faba5a143collection-ac481b7f-08bf-4a9d-9e0c-3a82ea5243cecontrol", - "type": "default" - }, - { "source": "54486974-835b-4d81-8f82-05f9f32ce9e9", - "sourceHandle": "unet", + "target": "9db25398-c869-4a63-8815-c6559341ef12", + "type": "default", + "sourceHandle": "vae", + "targetHandle": "vae" + }, + { + "id": "reactflow__edge-ac481b7f-08bf-4a9d-9e0c-3a82ea5243celatents-9db25398-c869-4a63-8815-c6559341ef12latents", + "source": "ac481b7f-08bf-4a9d-9e0c-3a82ea5243ce", + "target": "9db25398-c869-4a63-8815-c6559341ef12", + "type": "default", + "sourceHandle": "latents", + "targetHandle": "latents" + }, + { + "id": "reactflow__edge-ca4d5059-8bfb-447f-b415-da0faba5a143collection-ac481b7f-08bf-4a9d-9e0c-3a82ea5243cecontrol", + "source": "ca4d5059-8bfb-447f-b415-da0faba5a143", "target": "ac481b7f-08bf-4a9d-9e0c-3a82ea5243ce", - "targetHandle": "unet", + "type": "default", + "sourceHandle": "collection", + "targetHandle": "control" + }, + { "id": "reactflow__edge-54486974-835b-4d81-8f82-05f9f32ce9e9unet-ac481b7f-08bf-4a9d-9e0c-3a82ea5243ceunet", - "type": "default" + "source": "54486974-835b-4d81-8f82-05f9f32ce9e9", + "target": "ac481b7f-08bf-4a9d-9e0c-3a82ea5243ce", + "type": "default", + "sourceHandle": "unet", + "targetHandle": "unet" }, { - "source": "273e3f96-49ea-4dc5-9d5b-9660390f14e1", - "sourceHandle": "conditioning", - "target": "ac481b7f-08bf-4a9d-9e0c-3a82ea5243ce", - "targetHandle": "negative_conditioning", "id": "reactflow__edge-273e3f96-49ea-4dc5-9d5b-9660390f14e1conditioning-ac481b7f-08bf-4a9d-9e0c-3a82ea5243cenegative_conditioning", - "type": "default" + "source": "273e3f96-49ea-4dc5-9d5b-9660390f14e1", + "target": "ac481b7f-08bf-4a9d-9e0c-3a82ea5243ce", + "type": "default", + "sourceHandle": "conditioning", + "targetHandle": "negative_conditioning" }, { - "source": "7ce68934-3419-42d4-ac70-82cfc9397306", - "sourceHandle": "conditioning", - "target": "ac481b7f-08bf-4a9d-9e0c-3a82ea5243ce", - "targetHandle": "positive_conditioning", "id": "reactflow__edge-7ce68934-3419-42d4-ac70-82cfc9397306conditioning-ac481b7f-08bf-4a9d-9e0c-3a82ea5243cepositive_conditioning", - "type": "default" + "source": "7ce68934-3419-42d4-ac70-82cfc9397306", + "target": "ac481b7f-08bf-4a9d-9e0c-3a82ea5243ce", + "type": "default", + "sourceHandle": "conditioning", + "targetHandle": "positive_conditioning" + }, + { + "id": "reactflow__edge-2e77a0a1-db6a-47a2-a8bf-1e003be6423bnoise-ac481b7f-08bf-4a9d-9e0c-3a82ea5243cenoise", + "source": "2e77a0a1-db6a-47a2-a8bf-1e003be6423b", + "target": "ac481b7f-08bf-4a9d-9e0c-3a82ea5243ce", + "type": "default", + "sourceHandle": "noise", + "targetHandle": "noise" + }, + { + "id": "reactflow__edge-8b260b4d-3fd6-44d4-b1be-9f0e43c628cevalue-2e77a0a1-db6a-47a2-a8bf-1e003be6423bseed", + "source": "8b260b4d-3fd6-44d4-b1be-9f0e43c628ce", + "target": "2e77a0a1-db6a-47a2-a8bf-1e003be6423b", + "type": "default", + "sourceHandle": "value", + "targetHandle": "seed" } ] } \ No newline at end of file diff --git a/docs/workflows/Prompt_from_File.json b/docs/workflows/Prompt_from_File.json index 0a273d3b50..08e76fd793 100644 --- a/docs/workflows/Prompt_from_File.json +++ b/docs/workflows/Prompt_from_File.json @@ -1,9 +1,9 @@ { "name": "Prompt from File", "author": "InvokeAI", - "description": "Sample workflow using prompt from file capabilities of InvokeAI ", + "description": "Sample workflow using Prompt from File node", "version": "0.1.0", - "contact": "millun@invoke.ai", + "contact": "invoke@invoke.ai", "tags": "text2image, prompt from file, default", "notes": "", "exposedFields": [ @@ -17,8 +17,10 @@ } ], "meta": { - "version": "1.0.0" + "category": "default", + "version": "2.0.0" }, + "id": "d1609af5-eb0a-4f73-b573-c9af96a8d6bf", "nodes": [ { "id": "c2eaf1ba-5708-4679-9e15-945b8b432692", @@ -26,44 +28,56 @@ "data": { "id": "c2eaf1ba-5708-4679-9e15-945b8b432692", "type": "compel", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "prompt": { "id": "dcdf3f6d-9b96-4bcd-9b8d-f992fefe4f62", "name": "prompt", - "type": "string", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, "value": "" }, "clip": { "id": "3f1981c9-d8a9-42eb-a739-4f120eb80745", "name": "clip", - "type": "ClipField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } } }, "outputs": { "conditioning": { "id": "46205e6c-c5e2-44cb-9c82-1cd20b95674a", "name": "conditioning", - "type": "ConditioningField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 261, + "height": 32, "position": { - "x": 1177.3417789657444, - "y": -102.0924766641035 + "x": 925, + "y": -200 } }, { @@ -72,45 +86,72 @@ "data": { "id": "1b7e0df8-8589-4915-a4ea-c0088f15d642", "type": "prompt_from_file", + "label": "Prompts from File", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.1", + "nodePack": "invokeai", "inputs": { "file_path": { "id": "37e37684-4f30-4ec8-beae-b333e550f904", "name": "file_path", - "type": "string", "fieldKind": "input", "label": "Prompts File Path", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, "value": "" }, "pre_prompt": { "id": "7de02feb-819a-4992-bad3-72a30920ddea", "name": "pre_prompt", - "type": "string", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, "value": "" }, "post_prompt": { "id": "95f191d8-a282-428e-bd65-de8cb9b7513a", "name": "post_prompt", - "type": "string", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, "value": "" }, "start_line": { "id": "efee9a48-05ab-4829-8429-becfa64a0782", "name": "start_line", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 1 }, "max_prompts": { "id": "abebb428-3d3d-49fd-a482-4e96a16fff08", "name": "max_prompts", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 1 } }, @@ -118,23 +159,20 @@ "collection": { "id": "77d5d7f1-9877-4ab1-9a8c-33e9ffa9abf3", "name": "collection", - "type": "StringCollection", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": true, + "isCollectionOrScalar": false, + "name": "StringField" + } } - }, - "label": "Prompts from File", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 589, + "height": 580, "position": { - "x": 394.181884547075, - "y": -423.5345157864633 + "x": 475, + "y": -400 } }, { @@ -143,37 +181,63 @@ "data": { "id": "1b89067c-3f6b-42c8-991f-e3055789b251", "type": "iterate", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.1.0", "inputs": { "collection": { "id": "4c564bf8-5ed6-441e-ad2c-dda265d5785f", "name": "collection", - "type": "Collection", "fieldKind": "input", "label": "", - "value": [] + "type": { + "isCollection": true, + "isCollectionOrScalar": false, + "name": "CollectionField" + } } }, "outputs": { "item": { "id": "36340f9a-e7a5-4afa-b4b5-313f4e292380", "name": "item", - "type": "CollectionItem", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "CollectionItemField" + } + }, + "index": { + "id": "1beca95a-2159-460f-97ff-c8bab7d89336", + "name": "index", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "total": { + "id": "ead597b8-108e-4eda-88a8-5c29fa2f8df9", + "name": "total", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 104, + "height": 32, "position": { - "x": 792.8735298060233, - "y": -432.6964953027252 + "x": 925, + "y": -400 } }, { @@ -182,13 +246,24 @@ "data": { "id": "d6353b7f-b447-4e17-8f2e-80a88c91d426", "type": "main_model_loader", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "model": { "id": "3f264259-3418-47d5-b90d-b6600e36ae46", "name": "model", - "type": "MainModelField", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MainModelField" + }, "value": { "model_name": "stable-diffusion-v1-5", "base_model": "sd-1", @@ -200,35 +275,40 @@ "unet": { "id": "8e182ea2-9d0a-4c02-9407-27819288d4b5", "name": "unet", - "type": "UNetField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "UNetField" + } }, "clip": { "id": "d67d9d30-058c-46d5-bded-3d09d6d1aa39", "name": "clip", - "type": "ClipField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } }, "vae": { "id": "89641601-0429-4448-98d5-190822d920d8", "name": "vae", - "type": "VaeField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 226, + "height": 227, "position": { - "x": -47.66201354137797, - "y": -299.218193067033 + "x": 0, + "y": -375 } }, { @@ -237,44 +317,56 @@ "data": { "id": "fc9d0e35-a6de-4a19-84e1-c72497c823f6", "type": "compel", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "prompt": { "id": "dcdf3f6d-9b96-4bcd-9b8d-f992fefe4f62", "name": "prompt", - "type": "string", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, "value": "" }, "clip": { "id": "3f1981c9-d8a9-42eb-a739-4f120eb80745", "name": "clip", - "type": "ClipField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } } }, "outputs": { "conditioning": { "id": "46205e6c-c5e2-44cb-9c82-1cd20b95674a", "name": "conditioning", - "type": "ConditioningField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 261, + "height": 32, "position": { - "x": 1175.0187896425462, - "y": -420.64289413577114 + "x": 925, + "y": -275 } }, { @@ -283,37 +375,60 @@ "data": { "id": "0eb5f3f5-1b91-49eb-9ef0-41d67c7eae77", "type": "noise", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.1", + "nodePack": "invokeai", "inputs": { "seed": { "id": "b722d84a-eeee-484f-bef2-0250c027cb67", "name": "seed", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 0 }, "width": { "id": "d5f8ce11-0502-4bfc-9a30-5757dddf1f94", "name": "width", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 512 }, "height": { "id": "f187d5ff-38a5-4c3f-b780-fc5801ef34af", "name": "height", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 512 }, "use_cpu": { "id": "12f112b8-8b76-4816-b79e-662edc9f9aa5", "name": "use_cpu", - "type": "boolean", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, "value": true } }, @@ -321,35 +436,40 @@ "noise": { "id": "08576ad1-96d9-42d2-96ef-6f5c1961933f", "name": "noise", - "type": "LatentsField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } }, "width": { "id": "f3e1f94a-258d-41ff-9789-bd999bd9f40d", "name": "width", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } }, "height": { "id": "6cefc357-4339-415e-a951-49b9c2be32f4", "name": "height", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 389, + "height": 32, "position": { - "x": 809.1964864135837, - "y": 183.2735123359796 + "x": 925, + "y": 25 } }, { @@ -358,21 +478,36 @@ "data": { "id": "dfc20e07-7aef-4fc0-a3a1-7bf68ec6a4e5", "type": "rand_int", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": false, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "low": { "id": "b9fc6cf1-469c-4037-9bf0-04836965826f", "name": "low", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 0 }, "high": { "id": "06eac725-0f60-4ba2-b8cd-7ad9f757488c", "name": "high", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 2147483647 } }, @@ -380,23 +515,20 @@ "value": { "id": "df08c84e-7346-4e92-9042-9e5cb773aaff", "name": "value", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": false, - "version": "1.0.0" + } }, "width": 320, - "height": 218, + "height": 32, "position": { - "x": 354.19913145404166, - "y": 301.86324846905165 + "x": 925, + "y": -50 } }, { @@ -405,42 +537,69 @@ "data": { "id": "491ec988-3c77-4c37-af8a-39a0c4e7a2a1", "type": "l2i", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.2.0", + "nodePack": "invokeai", "inputs": { "metadata": { "id": "022e4b33-562b-438d-b7df-41c3fd931f40", "name": "metadata", - "type": "MetadataField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } }, "latents": { "id": "67cb6c77-a394-4a66-a6a9-a0a7dcca69ec", "name": "latents", - "type": "LatentsField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } }, "vae": { "id": "7b3fd9ad-a4ef-4e04-89fa-3832a9902dbd", "name": "vae", - "type": "VaeField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } }, "tiled": { "id": "5ac5680d-3add-4115-8ec0-9ef5bb87493b", "name": "tiled", - "type": "boolean", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, "value": false }, "fp32": { "id": "db8297f5-55f8-452f-98cf-6572c2582152", "name": "fp32", - "type": "boolean", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, "value": false } }, @@ -448,29 +607,34 @@ "image": { "id": "d8778d0c-592a-4960-9280-4e77e00a7f33", "name": "image", - "type": "ImageField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } }, "width": { "id": "c8b0a75a-f5de-4ff2-9227-f25bb2b97bec", "name": "width", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } }, "height": { "id": "83c05fbf-76b9-49ab-93c4-fa4b10e793e4", "name": "height", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, "height": 267, @@ -485,141 +649,221 @@ "data": { "id": "2fb1577f-0a56-4f12-8711-8afcaaaf1d5e", "type": "denoise_latents", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.5.0", + "nodePack": "invokeai", "inputs": { "positive_conditioning": { "id": "751fb35b-3f23-45ce-af1c-053e74251337", "name": "positive_conditioning", - "type": "ConditioningField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } }, "negative_conditioning": { "id": "b9dc06b6-7481-4db1-a8c2-39d22a5eacff", "name": "negative_conditioning", - "type": "ConditioningField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } }, "noise": { "id": "6e15e439-3390-48a4-8031-01e0e19f0e1d", "name": "noise", - "type": "LatentsField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } }, "steps": { "id": "bfdfb3df-760b-4d51-b17b-0abb38b976c2", "name": "steps", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 10 }, "cfg_scale": { "id": "47770858-322e-41af-8494-d8b63ed735f3", "name": "cfg_scale", - "type": "FloatPolymorphic", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "FloatField" + }, "value": 7.5 }, "denoising_start": { "id": "2ba78720-ee02-4130-a348-7bc3531f790b", "name": "denoising_start", - "type": "float", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, "value": 0 }, "denoising_end": { "id": "a874dffb-d433-4d1a-9f59-af4367bb05e4", "name": "denoising_end", - "type": "float", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, "value": 1 }, "scheduler": { "id": "36e021ad-b762-4fe4-ad4d-17f0291c40b2", "name": "scheduler", - "type": "Scheduler", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "SchedulerField" + }, "value": "euler" }, "unet": { "id": "98d3282d-f9f6-4b5e-b9e8-58658f1cac78", "name": "unet", - "type": "UNetField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "UNetField" + } }, "control": { "id": "f2ea3216-43d5-42b4-887f-36e8f7166d53", "name": "control", - "type": "ControlPolymorphic", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "ControlField" + } }, "ip_adapter": { "id": "d0780610-a298-47c8-a54e-70e769e0dfe2", "name": "ip_adapter", - "type": "IPAdapterPolymorphic", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "IPAdapterField" + } }, "t2i_adapter": { "id": "fdb40970-185e-4ea8-8bb5-88f06f91f46a", "name": "t2i_adapter", - "type": "T2IAdapterPolymorphic", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "T2IAdapterField" + } + }, + "cfg_rescale_multiplier": { + "id": "3af2d8c5-de83-425c-a100-49cb0f1f4385", + "name": "cfg_rescale_multiplier", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 }, "latents": { "id": "e05b538a-1b5a-4aa5-84b1-fd2361289a81", "name": "latents", - "type": "LatentsField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } }, "denoise_mask": { "id": "463a419e-df30-4382-8ffb-b25b25abe425", "name": "denoise_mask", - "type": "DenoiseMaskField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "DenoiseMaskField" + } } }, "outputs": { "latents": { "id": "559ee688-66cf-4139-8b82-3d3aa69995ce", "name": "latents", - "type": "LatentsField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } }, "width": { "id": "0b4285c2-e8b9-48e5-98f6-0a49d3f98fd2", "name": "width", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } }, "height": { "id": "8b0881b9-45e5-47d5-b526-24b6661de0ee", "name": "height", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.4.0" + } }, "width": 320, - "height": 646, + "height": 705, "position": { "x": 1570.9941088179146, "y": -407.6505491604564 @@ -628,92 +872,104 @@ ], "edges": [ { - "source": "1b7e0df8-8589-4915-a4ea-c0088f15d642", - "sourceHandle": "collection", - "target": "1b89067c-3f6b-42c8-991f-e3055789b251", - "targetHandle": "collection", - "id": "reactflow__edge-1b7e0df8-8589-4915-a4ea-c0088f15d642collection-1b89067c-3f6b-42c8-991f-e3055789b251collection", - "type": "default" - }, - { - "source": "d6353b7f-b447-4e17-8f2e-80a88c91d426", - "sourceHandle": "clip", - "target": "fc9d0e35-a6de-4a19-84e1-c72497c823f6", - "targetHandle": "clip", - "id": "reactflow__edge-d6353b7f-b447-4e17-8f2e-80a88c91d426clip-fc9d0e35-a6de-4a19-84e1-c72497c823f6clip", - "type": "default" - }, - { + "id": "1b89067c-3f6b-42c8-991f-e3055789b251-fc9d0e35-a6de-4a19-84e1-c72497c823f6-collapsed", "source": "1b89067c-3f6b-42c8-991f-e3055789b251", - "sourceHandle": "item", "target": "fc9d0e35-a6de-4a19-84e1-c72497c823f6", - "targetHandle": "prompt", - "id": "reactflow__edge-1b89067c-3f6b-42c8-991f-e3055789b251item-fc9d0e35-a6de-4a19-84e1-c72497c823f6prompt", - "type": "default" - }, - { - "source": "d6353b7f-b447-4e17-8f2e-80a88c91d426", - "sourceHandle": "clip", - "target": "c2eaf1ba-5708-4679-9e15-945b8b432692", - "targetHandle": "clip", - "id": "reactflow__edge-d6353b7f-b447-4e17-8f2e-80a88c91d426clip-c2eaf1ba-5708-4679-9e15-945b8b432692clip", - "type": "default" + "type": "collapsed" }, { + "id": "dfc20e07-7aef-4fc0-a3a1-7bf68ec6a4e5-0eb5f3f5-1b91-49eb-9ef0-41d67c7eae77-collapsed", "source": "dfc20e07-7aef-4fc0-a3a1-7bf68ec6a4e5", - "sourceHandle": "value", "target": "0eb5f3f5-1b91-49eb-9ef0-41d67c7eae77", - "targetHandle": "seed", + "type": "collapsed" + }, + { + "id": "reactflow__edge-1b7e0df8-8589-4915-a4ea-c0088f15d642collection-1b89067c-3f6b-42c8-991f-e3055789b251collection", + "source": "1b7e0df8-8589-4915-a4ea-c0088f15d642", + "target": "1b89067c-3f6b-42c8-991f-e3055789b251", + "type": "default", + "sourceHandle": "collection", + "targetHandle": "collection" + }, + { + "id": "reactflow__edge-d6353b7f-b447-4e17-8f2e-80a88c91d426clip-fc9d0e35-a6de-4a19-84e1-c72497c823f6clip", + "source": "d6353b7f-b447-4e17-8f2e-80a88c91d426", + "target": "fc9d0e35-a6de-4a19-84e1-c72497c823f6", + "type": "default", + "sourceHandle": "clip", + "targetHandle": "clip" + }, + { + "id": "reactflow__edge-1b89067c-3f6b-42c8-991f-e3055789b251item-fc9d0e35-a6de-4a19-84e1-c72497c823f6prompt", + "source": "1b89067c-3f6b-42c8-991f-e3055789b251", + "target": "fc9d0e35-a6de-4a19-84e1-c72497c823f6", + "type": "default", + "sourceHandle": "item", + "targetHandle": "prompt" + }, + { + "id": "reactflow__edge-d6353b7f-b447-4e17-8f2e-80a88c91d426clip-c2eaf1ba-5708-4679-9e15-945b8b432692clip", + "source": "d6353b7f-b447-4e17-8f2e-80a88c91d426", + "target": "c2eaf1ba-5708-4679-9e15-945b8b432692", + "type": "default", + "sourceHandle": "clip", + "targetHandle": "clip" + }, + { "id": "reactflow__edge-dfc20e07-7aef-4fc0-a3a1-7bf68ec6a4e5value-0eb5f3f5-1b91-49eb-9ef0-41d67c7eae77seed", - "type": "default" + "source": "dfc20e07-7aef-4fc0-a3a1-7bf68ec6a4e5", + "target": "0eb5f3f5-1b91-49eb-9ef0-41d67c7eae77", + "type": "default", + "sourceHandle": "value", + "targetHandle": "seed" }, { - "source": "fc9d0e35-a6de-4a19-84e1-c72497c823f6", - "sourceHandle": "conditioning", - "target": "2fb1577f-0a56-4f12-8711-8afcaaaf1d5e", - "targetHandle": "positive_conditioning", "id": "reactflow__edge-fc9d0e35-a6de-4a19-84e1-c72497c823f6conditioning-2fb1577f-0a56-4f12-8711-8afcaaaf1d5epositive_conditioning", - "type": "default" - }, - { - "source": "c2eaf1ba-5708-4679-9e15-945b8b432692", + "source": "fc9d0e35-a6de-4a19-84e1-c72497c823f6", + "target": "2fb1577f-0a56-4f12-8711-8afcaaaf1d5e", + "type": "default", "sourceHandle": "conditioning", - "target": "2fb1577f-0a56-4f12-8711-8afcaaaf1d5e", - "targetHandle": "negative_conditioning", + "targetHandle": "positive_conditioning" + }, + { "id": "reactflow__edge-c2eaf1ba-5708-4679-9e15-945b8b432692conditioning-2fb1577f-0a56-4f12-8711-8afcaaaf1d5enegative_conditioning", - "type": "default" + "source": "c2eaf1ba-5708-4679-9e15-945b8b432692", + "target": "2fb1577f-0a56-4f12-8711-8afcaaaf1d5e", + "type": "default", + "sourceHandle": "conditioning", + "targetHandle": "negative_conditioning" }, { - "source": "0eb5f3f5-1b91-49eb-9ef0-41d67c7eae77", - "sourceHandle": "noise", - "target": "2fb1577f-0a56-4f12-8711-8afcaaaf1d5e", - "targetHandle": "noise", "id": "reactflow__edge-0eb5f3f5-1b91-49eb-9ef0-41d67c7eae77noise-2fb1577f-0a56-4f12-8711-8afcaaaf1d5enoise", - "type": "default" - }, - { - "source": "d6353b7f-b447-4e17-8f2e-80a88c91d426", - "sourceHandle": "unet", + "source": "0eb5f3f5-1b91-49eb-9ef0-41d67c7eae77", "target": "2fb1577f-0a56-4f12-8711-8afcaaaf1d5e", - "targetHandle": "unet", + "type": "default", + "sourceHandle": "noise", + "targetHandle": "noise" + }, + { "id": "reactflow__edge-d6353b7f-b447-4e17-8f2e-80a88c91d426unet-2fb1577f-0a56-4f12-8711-8afcaaaf1d5eunet", - "type": "default" - }, - { - "source": "2fb1577f-0a56-4f12-8711-8afcaaaf1d5e", - "sourceHandle": "latents", - "target": "491ec988-3c77-4c37-af8a-39a0c4e7a2a1", - "targetHandle": "latents", - "id": "reactflow__edge-2fb1577f-0a56-4f12-8711-8afcaaaf1d5elatents-491ec988-3c77-4c37-af8a-39a0c4e7a2a1latents", - "type": "default" - }, - { "source": "d6353b7f-b447-4e17-8f2e-80a88c91d426", - "sourceHandle": "vae", + "target": "2fb1577f-0a56-4f12-8711-8afcaaaf1d5e", + "type": "default", + "sourceHandle": "unet", + "targetHandle": "unet" + }, + { + "id": "reactflow__edge-2fb1577f-0a56-4f12-8711-8afcaaaf1d5elatents-491ec988-3c77-4c37-af8a-39a0c4e7a2a1latents", + "source": "2fb1577f-0a56-4f12-8711-8afcaaaf1d5e", "target": "491ec988-3c77-4c37-af8a-39a0c4e7a2a1", - "targetHandle": "vae", + "type": "default", + "sourceHandle": "latents", + "targetHandle": "latents" + }, + { "id": "reactflow__edge-d6353b7f-b447-4e17-8f2e-80a88c91d426vae-491ec988-3c77-4c37-af8a-39a0c4e7a2a1vae", - "type": "default" + "source": "d6353b7f-b447-4e17-8f2e-80a88c91d426", + "target": "491ec988-3c77-4c37-af8a-39a0c4e7a2a1", + "type": "default", + "sourceHandle": "vae", + "targetHandle": "vae" } ] } \ No newline at end of file diff --git a/docs/workflows/SDXL_Text_to_Image.json b/docs/workflows/SDXL_Text_to_Image.json index af11731703..ef7810c153 100644 --- a/docs/workflows/SDXL_Text_to_Image.json +++ b/docs/workflows/SDXL_Text_to_Image.json @@ -7,138 +7,283 @@ "tags": "text2image, SDXL, default", "notes": "", "exposedFields": [ + { + "nodeId": "ade2c0d3-0384-4157-b39b-29ce429cfa15", + "fieldName": "value" + }, + { + "nodeId": "719dabe8-8297-4749-aea1-37be301cd425", + "fieldName": "value" + }, { "nodeId": "30d3289c-773c-4152-a9d2-bd8a99c8fd22", "fieldName": "model" }, { - "nodeId": "faf965a4-7530-427b-b1f3-4ba6505c2a08", - "fieldName": "prompt" - }, - { - "nodeId": "faf965a4-7530-427b-b1f3-4ba6505c2a08", - "fieldName": "style" - }, - { - "nodeId": "3193ad09-a7c2-4bf4-a3a9-1c61cc33a204", - "fieldName": "prompt" - }, - { - "nodeId": "3193ad09-a7c2-4bf4-a3a9-1c61cc33a204", - "fieldName": "style" + "nodeId": "0093692f-9cf4-454d-a5b8-62f0e3eb3bb8", + "fieldName": "vae_model" } ], "meta": { - "version": "1.0.0" + "category": "default", + "version": "2.0.0" }, "nodes": [ + { + "id": "3774ec24-a69e-4254-864c-097d07a6256f", + "type": "invocation", + "data": { + "id": "3774ec24-a69e-4254-864c-097d07a6256f", + "type": "string_join", + "label": "Positive Style Concat", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "inputs": { + "string_left": { + "id": "8d84be5c-4a96-46ad-a92c-eaf6fcae4a69", + "name": "string_left", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "" + }, + "string_right": { + "id": "c8e2a881-f675-4c6b-865b-a0892473b750", + "name": "string_right", + "fieldKind": "input", + "label": "Positive Style Concat", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "" + } + }, + "outputs": { + "value": { + "id": "196fad08-73ea-4fe5-8cc3-b55fd3cf40e5", + "name": "value", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + } + } + } + }, + "width": 320, + "height": 32, + "position": { + "x": 750, + "y": -225 + } + }, + { + "id": "719dabe8-8297-4749-aea1-37be301cd425", + "type": "invocation", + "data": { + "id": "719dabe8-8297-4749-aea1-37be301cd425", + "type": "string", + "label": "Negative Prompt", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "inputs": { + "value": { + "id": "744a5f7c-6e3a-4fbc-ac66-ba0cf8559eeb", + "name": "value", + "fieldKind": "input", + "label": "Negative Prompt", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "photograph" + } + }, + "outputs": { + "value": { + "id": "3e0ddf7a-a5de-4dad-b726-5d0cb4e0baa6", + "name": "value", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + } + } + } + }, + "width": 320, + "height": 258, + "position": { + "x": 750, + "y": -125 + } + }, { "id": "3193ad09-a7c2-4bf4-a3a9-1c61cc33a204", "type": "invocation", "data": { "id": "3193ad09-a7c2-4bf4-a3a9-1c61cc33a204", "type": "sdxl_compel_prompt", + "label": "SDXL Negative Compel Prompt", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "prompt": { "id": "5a6889e6-95cb-462f-8f4a-6b93ae7afaec", "name": "prompt", - "type": "string", "fieldKind": "input", "label": "Negative Prompt", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, "value": "" }, "style": { "id": "f240d0e6-3a1c-4320-af23-20ebb707c276", "name": "style", - "type": "string", "fieldKind": "input", "label": "Negative Style", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, "value": "" }, "original_width": { "id": "05af07b0-99a0-4a68-8ad2-697bbdb7fc7e", "name": "original_width", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 1024 }, "original_height": { "id": "2c771996-a998-43b7-9dd3-3792664d4e5b", "name": "original_height", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 1024 }, "crop_top": { "id": "66519dca-a151-4e3e-ae1f-88f1f9877bde", "name": "crop_top", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 0 }, "crop_left": { "id": "349cf2e9-f3d0-4e16-9ae2-7097d25b6a51", "name": "crop_left", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 0 }, "target_width": { "id": "44499347-7bd6-4a73-99d6-5a982786db05", "name": "target_width", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 1024 }, "target_height": { "id": "fda359b0-ab80-4f3c-805b-c9f61319d7d2", "name": "target_height", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 1024 }, "clip": { "id": "b447adaf-a649-4a76-a827-046a9fc8d89b", "name": "clip", - "type": "ClipField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } }, "clip2": { "id": "86ee4e32-08f9-4baa-9163-31d93f5c0187", "name": "clip2", - "type": "ClipField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } } }, "outputs": { "conditioning": { "id": "7c10118e-7b4e-4911-b98e-d3ba6347dfd0", "name": "conditioning", - "type": "ConditioningField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } } - }, - "label": "SDXL Negative Compel Prompt", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 793, + "height": 32, "position": { - "x": 1275, - "y": -350 + "x": 750, + "y": 200 } }, { @@ -147,37 +292,60 @@ "data": { "id": "55705012-79b9-4aac-9f26-c0b10309785b", "type": "noise", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.1", + "nodePack": "invokeai", "inputs": { "seed": { "id": "6431737c-918a-425d-a3b4-5d57e2f35d4d", "name": "seed", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 0 }, "width": { "id": "38fc5b66-fe6e-47c8-bba9-daf58e454ed7", "name": "width", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 1024 }, "height": { "id": "16298330-e2bf-4872-a514-d6923df53cbb", "name": "height", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 1024 }, "use_cpu": { "id": "c7c436d3-7a7a-4e76-91e4-c6deb271623c", "name": "use_cpu", - "type": "boolean", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, "value": true } }, @@ -185,35 +353,40 @@ "noise": { "id": "50f650dc-0184-4e23-a927-0497a96fe954", "name": "noise", - "type": "LatentsField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } }, "width": { "id": "bb8a452b-133d-42d1-ae4a-3843d7e4109a", "name": "width", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } }, "height": { "id": "35cfaa12-3b8b-4b7a-a884-327ff3abddd9", "name": "height", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } } - }, - "label": "", - "isOpen": false, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 32, + "height": 388, "position": { - "x": 1650, - "y": -300 + "x": 375, + "y": 0 } }, { @@ -222,21 +395,36 @@ "data": { "id": "ea94bc37-d995-4a83-aa99-4af42479f2f2", "type": "rand_int", + "label": "Random Seed", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": false, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "low": { "id": "3ec65a37-60ba-4b6c-a0b2-553dd7a84b84", "name": "low", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 0 }, "high": { "id": "085f853a-1a5f-494d-8bec-e4ba29a3f2d1", "name": "high", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 2147483647 } }, @@ -244,23 +432,20 @@ "value": { "id": "812ade4d-7699-4261-b9fc-a6c9d2ab55ee", "name": "value", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } } - }, - "label": "Random Seed", - "isOpen": false, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": false, - "version": "1.0.0" + } }, "width": 320, "height": 32, "position": { - "x": 1650, - "y": -350 + "x": 375, + "y": -50 } }, { @@ -269,59 +454,75 @@ "data": { "id": "30d3289c-773c-4152-a9d2-bd8a99c8fd22", "type": "sdxl_model_loader", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "model": { "id": "39f9e799-bc95-4318-a200-30eed9e60c42", "name": "model", - "type": "SDXLMainModelField", "fieldKind": "input", "label": "", - "value": { - "model_name": "stable-diffusion-xl-base-1-0", - "base_model": "sdxl", - "model_type": "main" - } + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "SDXLMainModelField" + }, + "value": null } }, "outputs": { "unet": { "id": "2626a45e-59aa-4609-b131-2d45c5eaed69", "name": "unet", - "type": "UNetField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "UNetField" + } }, "clip": { "id": "7c9c42fa-93d5-4639-ab8b-c4d9b0559baf", "name": "clip", - "type": "ClipField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } }, "clip2": { "id": "0dafddcf-a472-49c1-a47c-7b8fab4c8bc9", "name": "clip2", - "type": "ClipField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } }, "vae": { "id": "ee6a6997-1b3c-4ff3-99ce-1e7bfba2750c", "name": "vae", - "type": "VaeField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 258, + "height": 257, "position": { - "x": 475, - "y": 25 + "x": 375, + "y": -500 } }, { @@ -330,107 +531,151 @@ "data": { "id": "faf965a4-7530-427b-b1f3-4ba6505c2a08", "type": "sdxl_compel_prompt", + "label": "SDXL Positive Compel Prompt", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "prompt": { "id": "5a6889e6-95cb-462f-8f4a-6b93ae7afaec", "name": "prompt", - "type": "string", "fieldKind": "input", "label": "Positive Prompt", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, "value": "" }, "style": { "id": "f240d0e6-3a1c-4320-af23-20ebb707c276", "name": "style", - "type": "string", "fieldKind": "input", "label": "Positive Style", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, "value": "" }, "original_width": { "id": "05af07b0-99a0-4a68-8ad2-697bbdb7fc7e", "name": "original_width", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 1024 }, "original_height": { "id": "2c771996-a998-43b7-9dd3-3792664d4e5b", "name": "original_height", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 1024 }, "crop_top": { "id": "66519dca-a151-4e3e-ae1f-88f1f9877bde", "name": "crop_top", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 0 }, "crop_left": { "id": "349cf2e9-f3d0-4e16-9ae2-7097d25b6a51", "name": "crop_left", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 0 }, "target_width": { "id": "44499347-7bd6-4a73-99d6-5a982786db05", "name": "target_width", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 1024 }, "target_height": { "id": "fda359b0-ab80-4f3c-805b-c9f61319d7d2", "name": "target_height", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 1024 }, "clip": { "id": "b447adaf-a649-4a76-a827-046a9fc8d89b", "name": "clip", - "type": "ClipField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } }, "clip2": { "id": "86ee4e32-08f9-4baa-9163-31d93f5c0187", "name": "clip2", - "type": "ClipField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } } }, "outputs": { "conditioning": { "id": "7c10118e-7b4e-4911-b98e-d3ba6347dfd0", "name": "conditioning", - "type": "ConditioningField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } } - }, - "label": "SDXL Positive Compel Prompt", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 793, + "height": 32, "position": { - "x": 900, - "y": -350 + "x": 750, + "y": -175 } }, { @@ -439,42 +684,69 @@ "data": { "id": "63e91020-83b2-4f35-b174-ad9692aabb48", "type": "l2i", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": false, + "useCache": false, + "version": "1.2.0", + "nodePack": "invokeai", "inputs": { "metadata": { "id": "88971324-3fdb-442d-b8b7-7612478a8622", "name": "metadata", - "type": "MetadataField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } }, "latents": { "id": "da0e40cb-c49f-4fa5-9856-338b91a65f6b", "name": "latents", - "type": "LatentsField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } }, "vae": { "id": "ae5164ce-1710-4ec5-a83a-6113a0d1b5c0", "name": "vae", - "type": "VaeField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } }, "tiled": { "id": "2ccfd535-1a7b-4ecf-84db-9430a64fb3d7", "name": "tiled", - "type": "boolean", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, "value": false }, "fp32": { "id": "64f07d5a-54a2-429c-8c5b-0c2a3a8e5cd5", "name": "fp32", - "type": "boolean", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, "value": false } }, @@ -482,35 +754,40 @@ "image": { "id": "9b281eaa-6504-407d-a5ca-1e5e8020a4bf", "name": "image", - "type": "ImageField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } }, "width": { "id": "98e545f3-b53b-490d-b94d-bed9418ccc75", "name": "width", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } }, "height": { "id": "4a74bd43-d7f7-4c7f-bb3b-d09bb2992c46", "name": "height", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": false, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 267, + "height": 266, "position": { - "x": 2112.5626808057173, - "y": -174.24042139280238 + "x": 1475, + "y": -500 } }, { @@ -519,233 +796,525 @@ "data": { "id": "50a36525-3c0a-4cc5-977c-e4bfc3fd6dfb", "type": "denoise_latents", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.5.0", + "nodePack": "invokeai", "inputs": { "positive_conditioning": { "id": "29b73dfa-a06e-4b4a-a844-515b9eb93a81", "name": "positive_conditioning", - "type": "ConditioningField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } }, "negative_conditioning": { "id": "a81e6f5b-f4de-4919-b483-b6e2f067465a", "name": "negative_conditioning", - "type": "ConditioningField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } }, "noise": { "id": "4ba06bb7-eb45-4fb9-9984-31001b545587", "name": "noise", - "type": "LatentsField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } }, "steps": { "id": "36ee8a45-ca69-44bc-9bc3-aa881e6045c0", "name": "steps", - "type": "integer", "fieldKind": "input", "label": "", - "value": 10 + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 32 }, "cfg_scale": { "id": "2a2024e0-a736-46ec-933c-c1c1ebe96943", "name": "cfg_scale", - "type": "FloatPolymorphic", "fieldKind": "input", "label": "", - "value": 7.5 + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "FloatField" + }, + "value": 6 }, "denoising_start": { "id": "be219d5e-41b7-430a-8fb5-bc21a31ad219", "name": "denoising_start", - "type": "float", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, "value": 0 }, "denoising_end": { "id": "3adfb7ae-c9f7-4a40-b6e0-4c2050bd1a99", "name": "denoising_end", - "type": "float", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, "value": 1 }, "scheduler": { "id": "14423e0d-7215-4ee0-b065-f9e95eaa8d7d", "name": "scheduler", - "type": "Scheduler", "fieldKind": "input", "label": "", - "value": "euler" + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "SchedulerField" + }, + "value": "dpmpp_2m_sde_k" }, "unet": { "id": "e73bbf98-6489-492b-b83c-faed215febac", "name": "unet", - "type": "UNetField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "UNetField" + } }, "control": { "id": "dab351b3-0c86-4ea5-9782-4e8edbfb0607", "name": "control", - "type": "ControlPolymorphic", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "ControlField" + } }, "ip_adapter": { "id": "192daea0-a90a-43cc-a2ee-0114a8e90318", "name": "ip_adapter", - "type": "IPAdapterPolymorphic", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "IPAdapterField" + } }, "t2i_adapter": { "id": "ee386a55-d4c7-48c1-ac57-7bc4e3aada7a", "name": "t2i_adapter", - "type": "T2IAdapterPolymorphic", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "T2IAdapterField" + } + }, + "cfg_rescale_multiplier": { + "id": "106bbe8d-e641-4034-9a39-d4e82c298da1", + "name": "cfg_rescale_multiplier", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 }, "latents": { "id": "3a922c6a-3d8c-4c9e-b3ec-2f4d81cda077", "name": "latents", - "type": "LatentsField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } }, "denoise_mask": { "id": "cd7ce032-835f-495f-8b45-d57272f33132", "name": "denoise_mask", - "type": "DenoiseMaskField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "DenoiseMaskField" + } } }, "outputs": { "latents": { "id": "6260b84f-8361-470a-98d8-5b22a45c2d8c", "name": "latents", - "type": "LatentsField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } }, "width": { "id": "aede0ecf-25b6-46be-aa30-b77f79715deb", "name": "width", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } }, "height": { "id": "519abf62-d475-48ef-ab8f-66136bc0e499", "name": "height", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } } - }, + } + }, + "width": 320, + "height": 702, + "position": { + "x": 1125, + "y": -500 + } + }, + { + "id": "0093692f-9cf4-454d-a5b8-62f0e3eb3bb8", + "type": "invocation", + "data": { + "id": "0093692f-9cf4-454d-a5b8-62f0e3eb3bb8", + "type": "vae_loader", "label": "", "isOpen": true, "notes": "", - "embedWorkflow": false, "isIntermediate": true, "useCache": true, - "version": "1.4.0" + "version": "1.0.0", + "inputs": { + "vae_model": { + "id": "28a17000-b629-49c6-b945-77c591cf7440", + "name": "vae_model", + "fieldKind": "input", + "label": "VAE (use the FP16 model)", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VAEModelField" + }, + "value": null + } + }, + "outputs": { + "vae": { + "id": "a34892b6-ba6d-44eb-8a68-af1f40a84186", + "name": "vae", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } + } + } }, "width": 320, - "height": 646, + "height": 161, "position": { - "x": 1642.955772577545, - "y": -230.2485847594651 + "x": 375, + "y": -225 + } + }, + { + "id": "ade2c0d3-0384-4157-b39b-29ce429cfa15", + "type": "invocation", + "data": { + "id": "ade2c0d3-0384-4157-b39b-29ce429cfa15", + "type": "string", + "label": "Positive Prompt", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "inputs": { + "value": { + "id": "744a5f7c-6e3a-4fbc-ac66-ba0cf8559eeb", + "name": "value", + "fieldKind": "input", + "label": "Positive Prompt", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "Super cute tiger cub, fierce, traditional chinese watercolor" + } + }, + "outputs": { + "value": { + "id": "3e0ddf7a-a5de-4dad-b726-5d0cb4e0baa6", + "name": "value", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + } + } + } + }, + "width": 320, + "height": 258, + "position": { + "x": 750, + "y": -500 + } + }, + { + "id": "ad8fa655-3a76-43d0-9c02-4d7644dea650", + "type": "invocation", + "data": { + "id": "ad8fa655-3a76-43d0-9c02-4d7644dea650", + "type": "string_join", + "label": "Negative Style Concat", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "inputs": { + "string_left": { + "id": "8d84be5c-4a96-46ad-a92c-eaf6fcae4a69", + "name": "string_left", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "" + }, + "string_right": { + "id": "c8e2a881-f675-4c6b-865b-a0892473b750", + "name": "string_right", + "fieldKind": "input", + "label": "Negative Style Prompt", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "" + } + }, + "outputs": { + "value": { + "id": "196fad08-73ea-4fe5-8cc3-b55fd3cf40e5", + "name": "value", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + } + } + } + }, + "width": 320, + "height": 32, + "position": { + "x": 750, + "y": 150 } } ], "edges": [ { - "source": "ea94bc37-d995-4a83-aa99-4af42479f2f2", - "target": "55705012-79b9-4aac-9f26-c0b10309785b", - "id": "ea94bc37-d995-4a83-aa99-4af42479f2f2-55705012-79b9-4aac-9f26-c0b10309785b-collapsed", + "id": "3774ec24-a69e-4254-864c-097d07a6256f-faf965a4-7530-427b-b1f3-4ba6505c2a08-collapsed", + "source": "3774ec24-a69e-4254-864c-097d07a6256f", + "target": "faf965a4-7530-427b-b1f3-4ba6505c2a08", + "type": "collapsed" + }, + { + "id": "ad8fa655-3a76-43d0-9c02-4d7644dea650-3193ad09-a7c2-4bf4-a3a9-1c61cc33a204-collapsed", + "source": "ad8fa655-3a76-43d0-9c02-4d7644dea650", + "target": "3193ad09-a7c2-4bf4-a3a9-1c61cc33a204", "type": "collapsed" }, { - "source": "ea94bc37-d995-4a83-aa99-4af42479f2f2", - "sourceHandle": "value", - "target": "55705012-79b9-4aac-9f26-c0b10309785b", - "targetHandle": "seed", "id": "reactflow__edge-ea94bc37-d995-4a83-aa99-4af42479f2f2value-55705012-79b9-4aac-9f26-c0b10309785bseed", - "type": "default" + "source": "ea94bc37-d995-4a83-aa99-4af42479f2f2", + "target": "55705012-79b9-4aac-9f26-c0b10309785b", + "type": "default", + "sourceHandle": "value", + "targetHandle": "seed" }, { - "source": "30d3289c-773c-4152-a9d2-bd8a99c8fd22", - "sourceHandle": "clip", - "target": "faf965a4-7530-427b-b1f3-4ba6505c2a08", - "targetHandle": "clip", "id": "reactflow__edge-30d3289c-773c-4152-a9d2-bd8a99c8fd22clip-faf965a4-7530-427b-b1f3-4ba6505c2a08clip", - "type": "default" - }, - { "source": "30d3289c-773c-4152-a9d2-bd8a99c8fd22", - "sourceHandle": "clip2", "target": "faf965a4-7530-427b-b1f3-4ba6505c2a08", - "targetHandle": "clip2", - "id": "reactflow__edge-30d3289c-773c-4152-a9d2-bd8a99c8fd22clip2-faf965a4-7530-427b-b1f3-4ba6505c2a08clip2", - "type": "default" - }, - { - "source": "30d3289c-773c-4152-a9d2-bd8a99c8fd22", + "type": "default", "sourceHandle": "clip", - "target": "3193ad09-a7c2-4bf4-a3a9-1c61cc33a204", - "targetHandle": "clip", - "id": "reactflow__edge-30d3289c-773c-4152-a9d2-bd8a99c8fd22clip-3193ad09-a7c2-4bf4-a3a9-1c61cc33a204clip", - "type": "default" + "targetHandle": "clip" }, { + "id": "reactflow__edge-30d3289c-773c-4152-a9d2-bd8a99c8fd22clip2-faf965a4-7530-427b-b1f3-4ba6505c2a08clip2", "source": "30d3289c-773c-4152-a9d2-bd8a99c8fd22", + "target": "faf965a4-7530-427b-b1f3-4ba6505c2a08", + "type": "default", "sourceHandle": "clip2", + "targetHandle": "clip2" + }, + { + "id": "reactflow__edge-30d3289c-773c-4152-a9d2-bd8a99c8fd22clip-3193ad09-a7c2-4bf4-a3a9-1c61cc33a204clip", + "source": "30d3289c-773c-4152-a9d2-bd8a99c8fd22", "target": "3193ad09-a7c2-4bf4-a3a9-1c61cc33a204", - "targetHandle": "clip2", + "type": "default", + "sourceHandle": "clip", + "targetHandle": "clip" + }, + { "id": "reactflow__edge-30d3289c-773c-4152-a9d2-bd8a99c8fd22clip2-3193ad09-a7c2-4bf4-a3a9-1c61cc33a204clip2", - "type": "default" + "source": "30d3289c-773c-4152-a9d2-bd8a99c8fd22", + "target": "3193ad09-a7c2-4bf4-a3a9-1c61cc33a204", + "type": "default", + "sourceHandle": "clip2", + "targetHandle": "clip2" }, { - "source": "30d3289c-773c-4152-a9d2-bd8a99c8fd22", - "sourceHandle": "vae", - "target": "63e91020-83b2-4f35-b174-ad9692aabb48", - "targetHandle": "vae", - "id": "reactflow__edge-30d3289c-773c-4152-a9d2-bd8a99c8fd22vae-63e91020-83b2-4f35-b174-ad9692aabb48vae", - "type": "default" - }, - { - "source": "30d3289c-773c-4152-a9d2-bd8a99c8fd22", - "sourceHandle": "unet", - "target": "50a36525-3c0a-4cc5-977c-e4bfc3fd6dfb", - "targetHandle": "unet", "id": "reactflow__edge-30d3289c-773c-4152-a9d2-bd8a99c8fd22unet-50a36525-3c0a-4cc5-977c-e4bfc3fd6dfbunet", - "type": "default" + "source": "30d3289c-773c-4152-a9d2-bd8a99c8fd22", + "target": "50a36525-3c0a-4cc5-977c-e4bfc3fd6dfb", + "type": "default", + "sourceHandle": "unet", + "targetHandle": "unet" }, { - "source": "faf965a4-7530-427b-b1f3-4ba6505c2a08", - "sourceHandle": "conditioning", - "target": "50a36525-3c0a-4cc5-977c-e4bfc3fd6dfb", - "targetHandle": "positive_conditioning", "id": "reactflow__edge-faf965a4-7530-427b-b1f3-4ba6505c2a08conditioning-50a36525-3c0a-4cc5-977c-e4bfc3fd6dfbpositive_conditioning", - "type": "default" - }, - { - "source": "3193ad09-a7c2-4bf4-a3a9-1c61cc33a204", + "source": "faf965a4-7530-427b-b1f3-4ba6505c2a08", + "target": "50a36525-3c0a-4cc5-977c-e4bfc3fd6dfb", + "type": "default", "sourceHandle": "conditioning", - "target": "50a36525-3c0a-4cc5-977c-e4bfc3fd6dfb", - "targetHandle": "negative_conditioning", - "id": "reactflow__edge-3193ad09-a7c2-4bf4-a3a9-1c61cc33a204conditioning-50a36525-3c0a-4cc5-977c-e4bfc3fd6dfbnegative_conditioning", - "type": "default" + "targetHandle": "positive_conditioning" }, { - "source": "55705012-79b9-4aac-9f26-c0b10309785b", - "sourceHandle": "noise", + "id": "reactflow__edge-3193ad09-a7c2-4bf4-a3a9-1c61cc33a204conditioning-50a36525-3c0a-4cc5-977c-e4bfc3fd6dfbnegative_conditioning", + "source": "3193ad09-a7c2-4bf4-a3a9-1c61cc33a204", "target": "50a36525-3c0a-4cc5-977c-e4bfc3fd6dfb", - "targetHandle": "noise", + "type": "default", + "sourceHandle": "conditioning", + "targetHandle": "negative_conditioning" + }, + { "id": "reactflow__edge-55705012-79b9-4aac-9f26-c0b10309785bnoise-50a36525-3c0a-4cc5-977c-e4bfc3fd6dfbnoise", - "type": "default" + "source": "55705012-79b9-4aac-9f26-c0b10309785b", + "target": "50a36525-3c0a-4cc5-977c-e4bfc3fd6dfb", + "type": "default", + "sourceHandle": "noise", + "targetHandle": "noise" + }, + { + "id": "reactflow__edge-50a36525-3c0a-4cc5-977c-e4bfc3fd6dfblatents-63e91020-83b2-4f35-b174-ad9692aabb48latents", + "source": "50a36525-3c0a-4cc5-977c-e4bfc3fd6dfb", + "target": "63e91020-83b2-4f35-b174-ad9692aabb48", + "type": "default", + "sourceHandle": "latents", + "targetHandle": "latents" + }, + { + "id": "reactflow__edge-0093692f-9cf4-454d-a5b8-62f0e3eb3bb8vae-63e91020-83b2-4f35-b174-ad9692aabb48vae", + "source": "0093692f-9cf4-454d-a5b8-62f0e3eb3bb8", + "target": "63e91020-83b2-4f35-b174-ad9692aabb48", + "type": "default", + "sourceHandle": "vae", + "targetHandle": "vae" + }, + { + "id": "reactflow__edge-ade2c0d3-0384-4157-b39b-29ce429cfa15value-faf965a4-7530-427b-b1f3-4ba6505c2a08prompt", + "source": "ade2c0d3-0384-4157-b39b-29ce429cfa15", + "target": "faf965a4-7530-427b-b1f3-4ba6505c2a08", + "type": "default", + "sourceHandle": "value", + "targetHandle": "prompt" + }, + { + "id": "reactflow__edge-719dabe8-8297-4749-aea1-37be301cd425value-3193ad09-a7c2-4bf4-a3a9-1c61cc33a204prompt", + "source": "719dabe8-8297-4749-aea1-37be301cd425", + "target": "3193ad09-a7c2-4bf4-a3a9-1c61cc33a204", + "type": "default", + "sourceHandle": "value", + "targetHandle": "prompt" + }, + { + "id": "reactflow__edge-719dabe8-8297-4749-aea1-37be301cd425value-ad8fa655-3a76-43d0-9c02-4d7644dea650string_left", + "source": "719dabe8-8297-4749-aea1-37be301cd425", + "target": "ad8fa655-3a76-43d0-9c02-4d7644dea650", + "type": "default", + "sourceHandle": "value", + "targetHandle": "string_left" + }, + { + "id": "reactflow__edge-ad8fa655-3a76-43d0-9c02-4d7644dea650value-3193ad09-a7c2-4bf4-a3a9-1c61cc33a204style", + "source": "ad8fa655-3a76-43d0-9c02-4d7644dea650", + "target": "3193ad09-a7c2-4bf4-a3a9-1c61cc33a204", + "type": "default", + "sourceHandle": "value", + "targetHandle": "style" + }, + { + "id": "reactflow__edge-ade2c0d3-0384-4157-b39b-29ce429cfa15value-3774ec24-a69e-4254-864c-097d07a6256fstring_left", + "source": "ade2c0d3-0384-4157-b39b-29ce429cfa15", + "target": "3774ec24-a69e-4254-864c-097d07a6256f", + "type": "default", + "sourceHandle": "value", + "targetHandle": "string_left" + }, + { + "id": "reactflow__edge-3774ec24-a69e-4254-864c-097d07a6256fvalue-faf965a4-7530-427b-b1f3-4ba6505c2a08style", + "source": "3774ec24-a69e-4254-864c-097d07a6256f", + "target": "faf965a4-7530-427b-b1f3-4ba6505c2a08", + "type": "default", + "sourceHandle": "value", + "targetHandle": "style" } ] -} \ No newline at end of file +} diff --git a/docs/workflows/Text_to_Image.json b/docs/workflows/Text_to_Image.json index a49ce7bf93..1e42df6e07 100644 --- a/docs/workflows/Text_to_Image.json +++ b/docs/workflows/Text_to_Image.json @@ -1,8 +1,8 @@ { - "name": "Text to Image", + "name": "Text to Image - SD1.5", "author": "InvokeAI", "description": "Sample text to image workflow for Stable Diffusion 1.5/2", - "version": "1.0.1", + "version": "1.1.0", "contact": "invoke@invoke.ai", "tags": "text2image, SD1.5, SD2, default", "notes": "", @@ -18,10 +18,19 @@ { "nodeId": "93dc02a4-d05b-48ed-b99c-c9b616af3402", "fieldName": "prompt" + }, + { + "nodeId": "55705012-79b9-4aac-9f26-c0b10309785b", + "fieldName": "width" + }, + { + "nodeId": "55705012-79b9-4aac-9f26-c0b10309785b", + "fieldName": "height" } ], "meta": { - "version": "1.0.0" + "category": "default", + "version": "2.0.0" }, "nodes": [ { @@ -30,44 +39,56 @@ "data": { "id": "93dc02a4-d05b-48ed-b99c-c9b616af3402", "type": "compel", + "label": "Negative Compel Prompt", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "prompt": { "id": "7739aff6-26cb-4016-8897-5a1fb2305e4e", "name": "prompt", - "type": "string", "fieldKind": "input", "label": "Negative Prompt", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, "value": "" }, "clip": { "id": "48d23dce-a6ae-472a-9f8c-22a714ea5ce0", "name": "clip", - "type": "ClipField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } } }, "outputs": { "conditioning": { "id": "37cf3a9d-f6b7-4b64-8ff6-2558c5ecc447", "name": "conditioning", - "type": "ConditioningField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } } - }, - "label": "Negative Compel Prompt", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 261, + "height": 259, "position": { - "x": 995.7263915923627, - "y": 239.67783573351227 + "x": 1000, + "y": 350 } }, { @@ -76,37 +97,60 @@ "data": { "id": "55705012-79b9-4aac-9f26-c0b10309785b", "type": "noise", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.1", + "nodePack": "invokeai", "inputs": { "seed": { "id": "6431737c-918a-425d-a3b4-5d57e2f35d4d", "name": "seed", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 0 }, "width": { "id": "38fc5b66-fe6e-47c8-bba9-daf58e454ed7", "name": "width", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 512 }, "height": { "id": "16298330-e2bf-4872-a514-d6923df53cbb", "name": "height", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 512 }, "use_cpu": { "id": "c7c436d3-7a7a-4e76-91e4-c6deb271623c", "name": "use_cpu", - "type": "boolean", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, "value": true } }, @@ -114,35 +158,40 @@ "noise": { "id": "50f650dc-0184-4e23-a927-0497a96fe954", "name": "noise", - "type": "LatentsField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } }, "width": { "id": "bb8a452b-133d-42d1-ae4a-3843d7e4109a", "name": "width", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } }, "height": { "id": "35cfaa12-3b8b-4b7a-a884-327ff3abddd9", "name": "height", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 389, + "height": 388, "position": { - "x": 993.4442117555518, - "y": 605.6757415334787 + "x": 600, + "y": 325 } }, { @@ -151,13 +200,24 @@ "data": { "id": "c8d55139-f380-4695-b7f2-8b3d1e1e3db8", "type": "main_model_loader", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "model": { "id": "993eabd2-40fd-44fe-bce7-5d0c7075ddab", "name": "model", - "type": "MainModelField", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MainModelField" + }, "value": { "model_name": "stable-diffusion-v1-5", "base_model": "sd-1", @@ -169,35 +229,40 @@ "unet": { "id": "5c18c9db-328d-46d0-8cb9-143391c410be", "name": "unet", - "type": "UNetField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "UNetField" + } }, "clip": { "id": "6effcac0-ec2f-4bf5-a49e-a2c29cf921f4", "name": "clip", - "type": "ClipField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } }, "vae": { "id": "57683ba3-f5f5-4f58-b9a2-4b83dacad4a1", "name": "vae", - "type": "VaeField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, "height": 226, "position": { - "x": 163.04436745878343, - "y": 254.63156870373479 + "x": 600, + "y": 25 } }, { @@ -206,44 +271,56 @@ "data": { "id": "7d8bf987-284f-413a-b2fd-d825445a5d6c", "type": "compel", + "label": "Positive Compel Prompt", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "prompt": { "id": "7739aff6-26cb-4016-8897-5a1fb2305e4e", "name": "prompt", - "type": "string", "fieldKind": "input", "label": "Positive Prompt", - "value": "" + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "Super cute tiger cub, national geographic award-winning photograph" }, "clip": { "id": "48d23dce-a6ae-472a-9f8c-22a714ea5ce0", "name": "clip", - "type": "ClipField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } } }, "outputs": { "conditioning": { "id": "37cf3a9d-f6b7-4b64-8ff6-2558c5ecc447", "name": "conditioning", - "type": "ConditioningField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } } - }, - "label": "Positive Compel Prompt", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 261, + "height": 259, "position": { - "x": 595.7263915923627, - "y": 239.67783573351227 + "x": 1000, + "y": 25 } }, { @@ -252,21 +329,36 @@ "data": { "id": "ea94bc37-d995-4a83-aa99-4af42479f2f2", "type": "rand_int", + "label": "Random Seed", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": false, + "version": "1.0.0", + "nodePack": "invokeai", "inputs": { "low": { "id": "3ec65a37-60ba-4b6c-a0b2-553dd7a84b84", "name": "low", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 0 }, "high": { "id": "085f853a-1a5f-494d-8bec-e4ba29a3f2d1", "name": "high", - "type": "integer", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, "value": 2147483647 } }, @@ -274,23 +366,20 @@ "value": { "id": "812ade4d-7699-4261-b9fc-a6c9d2ab55ee", "name": "value", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } } - }, - "label": "Random Seed", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": false, - "version": "1.0.0" + } }, "width": 320, - "height": 218, + "height": 32, "position": { - "x": 541.094822888628, - "y": 694.5704476446829 + "x": 600, + "y": 275 } }, { @@ -299,144 +388,224 @@ "data": { "id": "eea2702a-19fb-45b5-9d75-56b4211ec03c", "type": "denoise_latents", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.5.0", + "nodePack": "invokeai", "inputs": { "positive_conditioning": { "id": "90b7f4f8-ada7-4028-8100-d2e54f192052", "name": "positive_conditioning", - "type": "ConditioningField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } }, "negative_conditioning": { "id": "9393779e-796c-4f64-b740-902a1177bf53", "name": "negative_conditioning", - "type": "ConditioningField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } }, "noise": { "id": "8e17f1e5-4f98-40b1-b7f4-86aeeb4554c1", "name": "noise", - "type": "LatentsField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } }, "steps": { "id": "9b63302d-6bd2-42c9-ac13-9b1afb51af88", "name": "steps", - "type": "integer", "fieldKind": "input", "label": "", - "value": 10 + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 50 }, "cfg_scale": { "id": "87dd04d3-870e-49e1-98bf-af003a810109", "name": "cfg_scale", - "type": "FloatPolymorphic", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "FloatField" + }, "value": 7.5 }, "denoising_start": { "id": "f369d80f-4931-4740-9bcd-9f0620719fab", "name": "denoising_start", - "type": "float", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, "value": 0 }, "denoising_end": { "id": "747d10e5-6f02-445c-994c-0604d814de8c", "name": "denoising_end", - "type": "float", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, "value": 1 }, "scheduler": { "id": "1de84a4e-3a24-4ec8-862b-16ce49633b9b", "name": "scheduler", - "type": "Scheduler", "fieldKind": "input", "label": "", - "value": "euler" + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "SchedulerField" + }, + "value": "unipc" }, "unet": { "id": "ffa6fef4-3ce2-4bdb-9296-9a834849489b", "name": "unet", - "type": "UNetField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "UNetField" + } }, "control": { "id": "077b64cb-34be-4fcc-83f2-e399807a02bd", "name": "control", - "type": "ControlPolymorphic", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "ControlField" + } }, "ip_adapter": { "id": "1d6948f7-3a65-4a65-a20c-768b287251aa", "name": "ip_adapter", - "type": "IPAdapterPolymorphic", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "IPAdapterField" + } }, "t2i_adapter": { "id": "75e67b09-952f-4083-aaf4-6b804d690412", "name": "t2i_adapter", - "type": "T2IAdapterPolymorphic", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "T2IAdapterField" + } + }, + "cfg_rescale_multiplier": { + "id": "9101f0a6-5fe0-4826-b7b3-47e5d506826c", + "name": "cfg_rescale_multiplier", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 }, "latents": { "id": "334d4ba3-5a99-4195-82c5-86fb3f4f7d43", "name": "latents", - "type": "LatentsField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } }, "denoise_mask": { "id": "0d3dbdbf-b014-4e95-8b18-ff2ff9cb0bfa", "name": "denoise_mask", - "type": "DenoiseMaskField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "DenoiseMaskField" + } } }, "outputs": { "latents": { "id": "70fa5bbc-0c38-41bb-861a-74d6d78d2f38", "name": "latents", - "type": "LatentsField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } }, "width": { "id": "98ee0e6c-82aa-4e8f-8be5-dc5f00ee47f0", "name": "width", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } }, "height": { "id": "e8cb184a-5e1a-47c8-9695-4b8979564f5d", "name": "height", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": true, - "useCache": true, - "version": "1.4.0" + } }, "width": 320, - "height": 646, + "height": 703, "position": { - "x": 1476.5794704734735, - "y": 256.80174342731783 + "x": 1400, + "y": 25 } }, { @@ -445,153 +614,185 @@ "data": { "id": "58c957f5-0d01-41fc-a803-b2bbf0413d4f", "type": "l2i", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": false, + "useCache": true, + "version": "1.2.0", + "nodePack": "invokeai", "inputs": { "metadata": { "id": "ab375f12-0042-4410-9182-29e30db82c85", "name": "metadata", - "type": "MetadataField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } }, "latents": { "id": "3a7e7efd-bff5-47d7-9d48-615127afee78", "name": "latents", - "type": "LatentsField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } }, "vae": { "id": "a1f5f7a1-0795-4d58-b036-7820c0b0ef2b", "name": "vae", - "type": "VaeField", "fieldKind": "input", - "label": "" + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } }, "tiled": { "id": "da52059a-0cee-4668-942f-519aa794d739", "name": "tiled", - "type": "boolean", "fieldKind": "input", "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, "value": false }, "fp32": { "id": "c4841df3-b24e-4140-be3b-ccd454c2522c", "name": "fp32", - "type": "boolean", "fieldKind": "input", "label": "", - "value": false + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": true } }, "outputs": { "image": { "id": "72d667d0-cf85-459d-abf2-28bd8b823fe7", "name": "image", - "type": "ImageField", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } }, "width": { "id": "c8c907d8-1066-49d1-b9a6-83bdcd53addc", "name": "width", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } }, "height": { "id": "230f359c-b4ea-436c-b372-332d7dcdca85", "name": "height", - "type": "integer", - "fieldKind": "output" + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } } - }, - "label": "", - "isOpen": true, - "notes": "", - "embedWorkflow": false, - "isIntermediate": false, - "useCache": true, - "version": "1.0.0" + } }, "width": 320, - "height": 267, + "height": 266, "position": { - "x": 2037.9648469717395, - "y": 426.10844427600136 + "x": 1800, + "y": 25 } } ], "edges": [ { - "source": "ea94bc37-d995-4a83-aa99-4af42479f2f2", - "sourceHandle": "value", - "target": "55705012-79b9-4aac-9f26-c0b10309785b", - "targetHandle": "seed", "id": "reactflow__edge-ea94bc37-d995-4a83-aa99-4af42479f2f2value-55705012-79b9-4aac-9f26-c0b10309785bseed", - "type": "default" + "source": "ea94bc37-d995-4a83-aa99-4af42479f2f2", + "target": "55705012-79b9-4aac-9f26-c0b10309785b", + "type": "default", + "sourceHandle": "value", + "targetHandle": "seed" }, { - "source": "c8d55139-f380-4695-b7f2-8b3d1e1e3db8", - "sourceHandle": "clip", - "target": "7d8bf987-284f-413a-b2fd-d825445a5d6c", - "targetHandle": "clip", "id": "reactflow__edge-c8d55139-f380-4695-b7f2-8b3d1e1e3db8clip-7d8bf987-284f-413a-b2fd-d825445a5d6cclip", - "type": "default" - }, - { "source": "c8d55139-f380-4695-b7f2-8b3d1e1e3db8", + "target": "7d8bf987-284f-413a-b2fd-d825445a5d6c", + "type": "default", "sourceHandle": "clip", - "target": "93dc02a4-d05b-48ed-b99c-c9b616af3402", - "targetHandle": "clip", + "targetHandle": "clip" + }, + { "id": "reactflow__edge-c8d55139-f380-4695-b7f2-8b3d1e1e3db8clip-93dc02a4-d05b-48ed-b99c-c9b616af3402clip", - "type": "default" + "source": "c8d55139-f380-4695-b7f2-8b3d1e1e3db8", + "target": "93dc02a4-d05b-48ed-b99c-c9b616af3402", + "type": "default", + "sourceHandle": "clip", + "targetHandle": "clip" }, { - "source": "55705012-79b9-4aac-9f26-c0b10309785b", - "sourceHandle": "noise", - "target": "eea2702a-19fb-45b5-9d75-56b4211ec03c", - "targetHandle": "noise", "id": "reactflow__edge-55705012-79b9-4aac-9f26-c0b10309785bnoise-eea2702a-19fb-45b5-9d75-56b4211ec03cnoise", - "type": "default" + "source": "55705012-79b9-4aac-9f26-c0b10309785b", + "target": "eea2702a-19fb-45b5-9d75-56b4211ec03c", + "type": "default", + "sourceHandle": "noise", + "targetHandle": "noise" }, { - "source": "7d8bf987-284f-413a-b2fd-d825445a5d6c", - "sourceHandle": "conditioning", - "target": "eea2702a-19fb-45b5-9d75-56b4211ec03c", - "targetHandle": "positive_conditioning", "id": "reactflow__edge-7d8bf987-284f-413a-b2fd-d825445a5d6cconditioning-eea2702a-19fb-45b5-9d75-56b4211ec03cpositive_conditioning", - "type": "default" - }, - { - "source": "93dc02a4-d05b-48ed-b99c-c9b616af3402", + "source": "7d8bf987-284f-413a-b2fd-d825445a5d6c", + "target": "eea2702a-19fb-45b5-9d75-56b4211ec03c", + "type": "default", "sourceHandle": "conditioning", - "target": "eea2702a-19fb-45b5-9d75-56b4211ec03c", - "targetHandle": "negative_conditioning", + "targetHandle": "positive_conditioning" + }, + { "id": "reactflow__edge-93dc02a4-d05b-48ed-b99c-c9b616af3402conditioning-eea2702a-19fb-45b5-9d75-56b4211ec03cnegative_conditioning", - "type": "default" - }, - { - "source": "c8d55139-f380-4695-b7f2-8b3d1e1e3db8", - "sourceHandle": "unet", + "source": "93dc02a4-d05b-48ed-b99c-c9b616af3402", "target": "eea2702a-19fb-45b5-9d75-56b4211ec03c", - "targetHandle": "unet", + "type": "default", + "sourceHandle": "conditioning", + "targetHandle": "negative_conditioning" + }, + { "id": "reactflow__edge-c8d55139-f380-4695-b7f2-8b3d1e1e3db8unet-eea2702a-19fb-45b5-9d75-56b4211ec03cunet", - "type": "default" - }, - { - "source": "eea2702a-19fb-45b5-9d75-56b4211ec03c", - "sourceHandle": "latents", - "target": "58c957f5-0d01-41fc-a803-b2bbf0413d4f", - "targetHandle": "latents", - "id": "reactflow__edge-eea2702a-19fb-45b5-9d75-56b4211ec03clatents-58c957f5-0d01-41fc-a803-b2bbf0413d4flatents", - "type": "default" - }, - { "source": "c8d55139-f380-4695-b7f2-8b3d1e1e3db8", - "sourceHandle": "vae", + "target": "eea2702a-19fb-45b5-9d75-56b4211ec03c", + "type": "default", + "sourceHandle": "unet", + "targetHandle": "unet" + }, + { + "id": "reactflow__edge-eea2702a-19fb-45b5-9d75-56b4211ec03clatents-58c957f5-0d01-41fc-a803-b2bbf0413d4flatents", + "source": "eea2702a-19fb-45b5-9d75-56b4211ec03c", "target": "58c957f5-0d01-41fc-a803-b2bbf0413d4f", - "targetHandle": "vae", + "type": "default", + "sourceHandle": "latents", + "targetHandle": "latents" + }, + { "id": "reactflow__edge-c8d55139-f380-4695-b7f2-8b3d1e1e3db8vae-58c957f5-0d01-41fc-a803-b2bbf0413d4fvae", - "type": "default" + "source": "c8d55139-f380-4695-b7f2-8b3d1e1e3db8", + "target": "58c957f5-0d01-41fc-a803-b2bbf0413d4f", + "type": "default", + "sourceHandle": "vae", + "targetHandle": "vae" } ] -} \ No newline at end of file +} diff --git a/installer/create_installer.sh b/installer/create_installer.sh index 4e0771fecc..b32f65d9bf 100755 --- a/installer/create_installer.sh +++ b/installer/create_installer.sh @@ -2,43 +2,72 @@ set -e +BCYAN="\e[1;36m" +BYELLOW="\e[1;33m" +BGREEN="\e[1;32m" +BRED="\e[1;31m" +RED="\e[31m" +RESET="\e[0m" + +function is_bin_in_path { + builtin type -P "$1" &>/dev/null +} + +function git_show { + git show -s --format='%h %s' $1 +} + cd "$(dirname "$0")" +echo -e "${BYELLOW}This script must be run from the installer directory!${RESET}" +echo "The current working directory is $(pwd)" +read -p "If that looks right, press any key to proceed, or CTRL-C to exit..." +echo + +# Some machines only have `python3` in PATH, others have `python` - make an alias. +# We can use a function to approximate an alias within a non-interactive shell. +if ! is_bin_in_path python && is_bin_in_path python3; then + function python { + python3 "$@" + } +fi + if [[ -v "VIRTUAL_ENV" ]]; then # we can't just call 'deactivate' because this function is not exported # to the environment of this script from the bash process that runs the script - echo "A virtual environment is activated. Please deactivate it before proceeding". + echo -e "${BRED}A virtual environment is activated. Please deactivate it before proceeding.${RESET}" exit -1 fi -VERSION=$(cd ..; python -c "from invokeai.version import __version__ as version; print(version)") +VERSION=$( + cd .. + python -c "from invokeai.version import __version__ as version; print(version)" +) PATCH="" VERSION="v${VERSION}${PATCH}" -LATEST_TAG="v3-latest" -echo Building installer for version $VERSION -echo "Be certain that you're in the 'installer' directory before continuing." -read -p "Press any key to continue, or CTRL-C to exit..." +echo -e "${BGREEN}HEAD${RESET}:" +git_show +echo -read -e -p "Tag this repo with '${VERSION}' and '${LATEST_TAG}'? [n]: " input -RESPONSE=${input:='n'} -if [ "$RESPONSE" == 'y' ]; then +# ---------------------- FRONTEND ---------------------- - git push origin :refs/tags/$VERSION - if ! git tag -fa $VERSION ; then - echo "Existing/invalid tag" - exit -1 - fi +pushd ../invokeai/frontend/web >/dev/null +echo +echo "Installing frontend dependencies..." +echo +pnpm i --frozen-lockfile +echo +echo "Building frontend..." +echo +pnpm build +popd - git push origin :refs/tags/$LATEST_TAG - git tag -fa $LATEST_TAG +# ---------------------- BACKEND ---------------------- - echo "remember to push --tags!" -fi - -# ---------------------- - -echo Building the wheel +echo +echo "Building wheel..." +echo # install the 'build' package in the user site packages, if needed # could be improved by using a temporary venv, but it's tiny and harmless @@ -46,12 +75,15 @@ if [[ $(python -c 'from importlib.util import find_spec; print(find_spec("build" pip install --user build fi -rm -r ../build +rm -rf ../build + python -m build --wheel --outdir dist/ ../. # ---------------------- -echo Building installer zip fles for InvokeAI $VERSION +echo +echo "Building installer zip files for InvokeAI ${VERSION}..." +echo # get rid of any old ones rm -f *.zip @@ -59,9 +91,11 @@ rm -rf InvokeAI-Installer # copy content mkdir InvokeAI-Installer -for f in templates lib *.txt *.reg; do +for f in templates *.txt *.reg; do cp -r ${f} InvokeAI-Installer/ done +mkdir InvokeAI-Installer/lib +cp lib/*.py InvokeAI-Installer/lib # Move the wheel mv dist/*.whl InvokeAI-Installer/lib/ @@ -72,13 +106,13 @@ cp install.sh.in InvokeAI-Installer/install.sh chmod a+x InvokeAI-Installer/install.sh # Windows -perl -p -e "s/^set INVOKEAI_VERSION=.*/set INVOKEAI_VERSION=$VERSION/" install.bat.in > InvokeAI-Installer/install.bat +perl -p -e "s/^set INVOKEAI_VERSION=.*/set INVOKEAI_VERSION=$VERSION/" install.bat.in >InvokeAI-Installer/install.bat cp WinLongPathsEnabled.reg InvokeAI-Installer/ # Zip everything up zip -r InvokeAI-installer-$VERSION.zip InvokeAI-Installer # clean up -rm -rf InvokeAI-Installer tmp dist +rm -rf InvokeAI-Installer tmp dist ../invokeai/frontend/web/dist/ exit 0 diff --git a/installer/lib/installer.py b/installer/lib/installer.py index 7b928f3c9c..3bca5e108c 100644 --- a/installer/lib/installer.py +++ b/installer/lib/installer.py @@ -241,12 +241,12 @@ class InvokeAiInstance: pip[ "install", "--require-virtualenv", - "numpy~=1.24.0", # choose versions that won't be uninstalled during phase 2 + "numpy==1.26.3", # choose versions that won't be uninstalled during phase 2 "urllib3~=1.26.0", "requests~=2.28.0", - "torch==2.1.0", + "torch==2.1.2", "torchmetrics==0.11.4", - "torchvision>=0.14.1", + "torchvision==0.16.2", "--force-reinstall", "--find-links" if find_links is not None else None, find_links, diff --git a/installer/tag_release.sh b/installer/tag_release.sh new file mode 100755 index 0000000000..a914c1a505 --- /dev/null +++ b/installer/tag_release.sh @@ -0,0 +1,71 @@ +#!/bin/bash + +set -e + +BCYAN="\e[1;36m" +BYELLOW="\e[1;33m" +BGREEN="\e[1;32m" +BRED="\e[1;31m" +RED="\e[31m" +RESET="\e[0m" + +function does_tag_exist { + git rev-parse --quiet --verify "refs/tags/$1" >/dev/null +} + +function git_show_ref { + git show-ref --dereference $1 --abbrev 7 +} + +function git_show { + git show -s --format='%h %s' $1 +} + +VERSION=$( + cd .. + python -c "from invokeai.version import __version__ as version; print(version)" +) +PATCH="" +MAJOR_VERSION=$(echo $VERSION | sed 's/\..*$//') +VERSION="v${VERSION}${PATCH}" +LATEST_TAG="v${MAJOR_VERSION}-latest" + +if does_tag_exist $VERSION; then + echo -e "${BCYAN}${VERSION}${RESET} already exists:" + git_show_ref tags/$VERSION + echo +fi +if does_tag_exist $LATEST_TAG; then + echo -e "${BCYAN}${LATEST_TAG}${RESET} already exists:" + git_show_ref tags/$LATEST_TAG + echo +fi + +echo -e "${BGREEN}HEAD${RESET}:" +git_show +echo + +echo -e -n "Create tags ${BCYAN}${VERSION}${RESET} and ${BCYAN}${LATEST_TAG}${RESET} @ ${BGREEN}HEAD${RESET}, ${RED}deleting existing tags on remote${RESET}? " +read -e -p 'y/n [n]: ' input +RESPONSE=${input:='n'} +if [ "$RESPONSE" == 'y' ]; then + echo + echo -e "Deleting ${BCYAN}${VERSION}${RESET} tag on remote..." + git push --delete origin $VERSION + + echo -e "Tagging ${BGREEN}HEAD${RESET} with ${BCYAN}${VERSION}${RESET} locally..." + if ! git tag -fa $VERSION; then + echo "Existing/invalid tag" + exit -1 + fi + + echo -e "Deleting ${BCYAN}${LATEST_TAG}${RESET} tag on remote..." + git push --delete origin $LATEST_TAG + + echo -e "Tagging ${BGREEN}HEAD${RESET} with ${BCYAN}${LATEST_TAG}${RESET} locally..." + git tag -fa $LATEST_TAG + + echo -e "Pushing updated tags to remote..." + git push origin --tags +fi +exit 0 diff --git a/invokeai/app/api/dependencies.py b/invokeai/app/api/dependencies.py index b739327368..0adcd677a2 100644 --- a/invokeai/app/api/dependencies.py +++ b/invokeai/app/api/dependencies.py @@ -2,7 +2,8 @@ from logging import Logger -from invokeai.app.services.workflow_image_records.workflow_image_records_sqlite import SqliteWorkflowImageRecordsStorage +from invokeai.app.services.shared.sqlite.sqlite_util import init_db +from invokeai.backend.model_manager.metadata import ModelMetadataStore from invokeai.backend.util.logging import InvokeAILogger from invokeai.version.invokeai_version import __version__ @@ -11,6 +12,7 @@ from ..services.board_images.board_images_default import BoardImagesService from ..services.board_records.board_records_sqlite import SqliteBoardRecordStorage from ..services.boards.boards_default import BoardService from ..services.config import InvokeAIAppConfig +from ..services.download import DownloadQueueService from ..services.image_files.image_files_disk import DiskImageFileStorage from ..services.image_records.image_records_sqlite import SqliteImageRecordStorage from ..services.images.images_default import ImageService @@ -23,14 +25,13 @@ from ..services.invoker import Invoker from ..services.item_storage.item_storage_sqlite import SqliteItemStorage from ..services.latents_storage.latents_storage_disk import DiskLatentsStorage from ..services.latents_storage.latents_storage_forward_cache import ForwardCacheLatentsStorage +from ..services.model_install import ModelInstallService from ..services.model_manager.model_manager_default import ModelManagerService from ..services.model_records import ModelRecordServiceSQL from ..services.names.names_default import SimpleNameService from ..services.session_processor.session_processor_default import DefaultSessionProcessor from ..services.session_queue.session_queue_sqlite import SqliteSessionQueue -from ..services.shared.default_graphs import create_system_graphs -from ..services.shared.graph import GraphExecutionState, LibraryGraph -from ..services.shared.sqlite import SqliteDatabase +from ..services.shared.graph import GraphExecutionState from ..services.urls.urls_default import LocalUrlService from ..services.workflow_records.workflow_records_sqlite import SqliteWorkflowRecordsStorage from .events import FastAPIEventService @@ -61,14 +62,15 @@ class ApiDependencies: invoker: Invoker @staticmethod - def initialize(config: InvokeAIAppConfig, event_handler_id: int, logger: Logger = logger): + def initialize(config: InvokeAIAppConfig, event_handler_id: int, logger: Logger = logger) -> None: logger.info(f"InvokeAI version {__version__}") logger.info(f"Root directory = {str(config.root_path)}") logger.debug(f"Internet connectivity is {config.internet_available}") output_folder = config.output_path + image_files = DiskImageFileStorage(f"{output_folder}/images") - db = SqliteDatabase(config, logger) + db = init_db(config=config, logger=logger, image_files=image_files) configuration = config logger = logger @@ -79,14 +81,21 @@ class ApiDependencies: boards = BoardService() events = FastAPIEventService(event_handler_id) graph_execution_manager = SqliteItemStorage[GraphExecutionState](db=db, table_name="graph_executions") - graph_library = SqliteItemStorage[LibraryGraph](db=db, table_name="graphs") - image_files = DiskImageFileStorage(f"{output_folder}/images") image_records = SqliteImageRecordStorage(db=db) images = ImageService() invocation_cache = MemoryInvocationCache(max_cache_size=config.node_cache_size) latents = ForwardCacheLatentsStorage(DiskLatentsStorage(f"{output_folder}/latents")) model_manager = ModelManagerService(config, logger) model_record_service = ModelRecordServiceSQL(db=db) + download_queue_service = DownloadQueueService(event_bus=events) + metadata_store = ModelMetadataStore(db=db) + model_install_service = ModelInstallService( + app_config=config, + record_store=model_record_service, + download_queue=download_queue_service, + metadata_store=metadata_store, + event_bus=events, + ) names = SimpleNameService() performance_statistics = InvocationStatsService() processor = DefaultInvocationProcessor() @@ -94,7 +103,6 @@ class ApiDependencies: session_processor = DefaultSessionProcessor() session_queue = SqliteSessionQueue(db=db) urls = LocalUrlService() - workflow_image_records = SqliteWorkflowImageRecordsStorage(db=db) workflow_records = SqliteWorkflowRecordsStorage(db=db) services = InvocationServices( @@ -105,7 +113,6 @@ class ApiDependencies: configuration=configuration, events=events, graph_execution_manager=graph_execution_manager, - graph_library=graph_library, image_files=image_files, image_records=image_records, images=images, @@ -114,6 +121,8 @@ class ApiDependencies: logger=logger, model_manager=model_manager, model_records=model_record_service, + download_queue=download_queue_service, + model_install=model_install_service, names=names, performance_statistics=performance_statistics, processor=processor, @@ -121,17 +130,13 @@ class ApiDependencies: session_processor=session_processor, session_queue=session_queue, urls=urls, - workflow_image_records=workflow_image_records, workflow_records=workflow_records, ) - create_system_graphs(services.graph_library) - ApiDependencies.invoker = Invoker(services) - db.clean() @staticmethod - def shutdown(): + def shutdown() -> None: if ApiDependencies.invoker: ApiDependencies.invoker.stop() diff --git a/invokeai/app/api/routers/download_queue.py b/invokeai/app/api/routers/download_queue.py new file mode 100644 index 0000000000..92b658c370 --- /dev/null +++ b/invokeai/app/api/routers/download_queue.py @@ -0,0 +1,111 @@ +# Copyright (c) 2023 Lincoln D. Stein +"""FastAPI route for the download queue.""" + +from typing import List, Optional + +from fastapi import Body, Path, Response +from fastapi.routing import APIRouter +from pydantic.networks import AnyHttpUrl +from starlette.exceptions import HTTPException + +from invokeai.app.services.download import ( + DownloadJob, + UnknownJobIDException, +) + +from ..dependencies import ApiDependencies + +download_queue_router = APIRouter(prefix="/v1/download_queue", tags=["download_queue"]) + + +@download_queue_router.get( + "/", + operation_id="list_downloads", +) +async def list_downloads() -> List[DownloadJob]: + """Get a list of active and inactive jobs.""" + queue = ApiDependencies.invoker.services.download_queue + return queue.list_jobs() + + +@download_queue_router.patch( + "/", + operation_id="prune_downloads", + responses={ + 204: {"description": "All completed jobs have been pruned"}, + 400: {"description": "Bad request"}, + }, +) +async def prune_downloads(): + """Prune completed and errored jobs.""" + queue = ApiDependencies.invoker.services.download_queue + queue.prune_jobs() + return Response(status_code=204) + + +@download_queue_router.post( + "/i/", + operation_id="download", +) +async def download( + source: AnyHttpUrl = Body(description="download source"), + dest: str = Body(description="download destination"), + priority: int = Body(default=10, description="queue priority"), + access_token: Optional[str] = Body(default=None, description="token for authorization to download"), +) -> DownloadJob: + """Download the source URL to the file or directory indicted in dest.""" + queue = ApiDependencies.invoker.services.download_queue + return queue.download(source, dest, priority, access_token) + + +@download_queue_router.get( + "/i/{id}", + operation_id="get_download_job", + responses={ + 200: {"description": "Success"}, + 404: {"description": "The requested download JobID could not be found"}, + }, +) +async def get_download_job( + id: int = Path(description="ID of the download job to fetch."), +) -> DownloadJob: + """Get a download job using its ID.""" + try: + job = ApiDependencies.invoker.services.download_queue.id_to_job(id) + return job + except UnknownJobIDException as e: + raise HTTPException(status_code=404, detail=str(e)) + + +@download_queue_router.delete( + "/i/{id}", + operation_id="cancel_download_job", + responses={ + 204: {"description": "Job has been cancelled"}, + 404: {"description": "The requested download JobID could not be found"}, + }, +) +async def cancel_download_job( + id: int = Path(description="ID of the download job to cancel."), +): + """Cancel a download job using its ID.""" + try: + queue = ApiDependencies.invoker.services.download_queue + job = queue.id_to_job(id) + queue.cancel_job(job) + return Response(status_code=204) + except UnknownJobIDException as e: + raise HTTPException(status_code=404, detail=str(e)) + + +@download_queue_router.delete( + "/i", + operation_id="cancel_all_download_jobs", + responses={ + 204: {"description": "Download jobs have been cancelled"}, + }, +) +async def cancel_all_download_jobs(): + """Cancel all download jobs.""" + ApiDependencies.invoker.services.download_queue.cancel_all_jobs() + return Response(status_code=204) diff --git a/invokeai/app/api/routers/images.py b/invokeai/app/api/routers/images.py index e8c8c693b3..125896b8d3 100644 --- a/invokeai/app/api/routers/images.py +++ b/invokeai/app/api/routers/images.py @@ -8,10 +8,11 @@ from fastapi.routing import APIRouter from PIL import Image from pydantic import BaseModel, Field, ValidationError -from invokeai.app.invocations.baseinvocation import MetadataField, MetadataFieldValidator, WorkflowFieldValidator +from invokeai.app.invocations.baseinvocation import MetadataField, MetadataFieldValidator from invokeai.app.services.image_records.image_records_common import ImageCategory, ImageRecordChanges, ResourceOrigin from invokeai.app.services.images.images_common import ImageDTO, ImageUrlsDTO from invokeai.app.services.shared.pagination import OffsetPaginatedResults +from invokeai.app.services.workflow_records.workflow_records_common import WorkflowWithoutID, WorkflowWithoutIDValidator from ..dependencies import ApiDependencies @@ -73,7 +74,7 @@ async def upload_image( workflow_raw = pil_image.info.get("invokeai_workflow", None) if workflow_raw is not None: try: - workflow = WorkflowFieldValidator.validate_json(workflow_raw) + workflow = WorkflowWithoutIDValidator.validate_json(workflow_raw) except ValidationError: ApiDependencies.invoker.services.logger.warn("Failed to parse metadata for uploaded image") pass @@ -184,6 +185,18 @@ async def get_image_metadata( raise HTTPException(status_code=404) +@images_router.get( + "/i/{image_name}/workflow", operation_id="get_image_workflow", response_model=Optional[WorkflowWithoutID] +) +async def get_image_workflow( + image_name: str = Path(description="The name of image whose workflow to get"), +) -> Optional[WorkflowWithoutID]: + try: + return ApiDependencies.invoker.services.images.get_workflow(image_name) + except Exception: + raise HTTPException(status_code=404) + + @images_router.api_route( "/i/{image_name}/full", methods=["GET", "HEAD"], diff --git a/invokeai/app/api/routers/model_records.py b/invokeai/app/api/routers/model_records.py index 87d8211d12..162d5b46e9 100644 --- a/invokeai/app/api/routers/model_records.py +++ b/invokeai/app/api/routers/model_records.py @@ -4,7 +4,7 @@ from hashlib import sha1 from random import randbytes -from typing import List, Optional +from typing import Any, Dict, List, Optional, Set from fastapi import Body, Path, Query, Response from fastapi.routing import APIRouter @@ -12,30 +12,45 @@ from pydantic import BaseModel, ConfigDict from starlette.exceptions import HTTPException from typing_extensions import Annotated +from invokeai.app.services.model_install import ModelInstallJob, ModelSource from invokeai.app.services.model_records import ( DuplicateModelException, InvalidModelException, + ModelRecordOrderBy, + ModelSummary, UnknownModelException, ) +from invokeai.app.services.shared.pagination import PaginatedResults from invokeai.backend.model_manager.config import ( AnyModelConfig, BaseModelType, + ModelFormat, ModelType, ) +from invokeai.backend.model_manager.metadata import AnyModelRepoMetadata from ..dependencies import ApiDependencies -model_records_router = APIRouter(prefix="/v1/model/record", tags=["models"]) +model_records_router = APIRouter(prefix="/v1/model/record", tags=["model_manager_v2_unstable"]) class ModelsList(BaseModel): """Return list of configs.""" - models: list[AnyModelConfig] + models: List[AnyModelConfig] model_config = ConfigDict(use_enum_values=True) +class ModelTagSet(BaseModel): + """Return tags for a set of models.""" + + key: str + name: str + author: str + tags: Set[str] + + @model_records_router.get( "/", operation_id="list_model_records", @@ -43,15 +58,25 @@ class ModelsList(BaseModel): async def list_model_records( base_models: Optional[List[BaseModelType]] = Query(default=None, description="Base models to include"), model_type: Optional[ModelType] = Query(default=None, description="The type of model to get"), + model_name: Optional[str] = Query(default=None, description="Exact match on the name of the model"), + model_format: Optional[ModelFormat] = Query( + default=None, description="Exact match on the format of the model (e.g. 'diffusers')" + ), ) -> ModelsList: """Get a list of models.""" record_store = ApiDependencies.invoker.services.model_records found_models: list[AnyModelConfig] = [] if base_models: for base_model in base_models: - found_models.extend(record_store.search_by_attr(base_model=base_model, model_type=model_type)) + found_models.extend( + record_store.search_by_attr( + base_model=base_model, model_type=model_type, model_name=model_name, model_format=model_format + ) + ) else: - found_models.extend(record_store.search_by_attr(model_type=model_type)) + found_models.extend( + record_store.search_by_attr(model_type=model_type, model_name=model_name, model_format=model_format) + ) return ModelsList(models=found_models) @@ -75,6 +100,59 @@ async def get_model_record( raise HTTPException(status_code=404, detail=str(e)) +@model_records_router.get("/meta", operation_id="list_model_summary") +async def list_model_summary( + page: int = Query(default=0, description="The page to get"), + per_page: int = Query(default=10, description="The number of models per page"), + order_by: ModelRecordOrderBy = Query(default=ModelRecordOrderBy.Default, description="The attribute to order by"), +) -> PaginatedResults[ModelSummary]: + """Gets a page of model summary data.""" + return ApiDependencies.invoker.services.model_records.list_models(page=page, per_page=per_page, order_by=order_by) + + +@model_records_router.get( + "/meta/i/{key}", + operation_id="get_model_metadata", + responses={ + 200: {"description": "Success"}, + 400: {"description": "Bad request"}, + 404: {"description": "No metadata available"}, + }, +) +async def get_model_metadata( + key: str = Path(description="Key of the model repo metadata to fetch."), +) -> Optional[AnyModelRepoMetadata]: + """Get a model metadata object.""" + record_store = ApiDependencies.invoker.services.model_records + result = record_store.get_metadata(key) + if not result: + raise HTTPException(status_code=404, detail="No metadata for a model with this key") + return result + + +@model_records_router.get( + "/tags", + operation_id="list_tags", +) +async def list_tags() -> Set[str]: + """Get a unique set of all the model tags.""" + record_store = ApiDependencies.invoker.services.model_records + return record_store.list_tags() + + +@model_records_router.get( + "/tags/search", + operation_id="search_by_metadata_tags", +) +async def search_by_metadata_tags( + tags: Set[str] = Query(default=None, description="Tags to search for"), +) -> ModelsList: + """Get a list of models.""" + record_store = ApiDependencies.invoker.services.model_records + results = record_store.search_by_metadata_tag(tags) + return ModelsList(models=results) + + @model_records_router.patch( "/i/{key}", operation_id="update_model_record", @@ -117,12 +195,17 @@ async def update_model_record( async def del_model_record( key: str = Path(description="Unique key of model to remove from model registry."), ) -> Response: - """Delete Model""" + """ + Delete model record from database. + + The configuration record will be removed. The corresponding weights files will be + deleted as well if they reside within the InvokeAI "models" directory. + """ logger = ApiDependencies.invoker.services.logger try: - record_store = ApiDependencies.invoker.services.model_records - record_store.del_model(key) + installer = ApiDependencies.invoker.services.model_install + installer.delete(key) logger.info(f"Deleted model: {key}") return Response(status_code=204) except UnknownModelException as e: @@ -143,9 +226,7 @@ async def del_model_record( async def add_model_record( config: Annotated[AnyModelConfig, Body(description="Model config", discriminator="type")], ) -> AnyModelConfig: - """ - Add a model using the configuration information appropriate for its type. - """ + """Add a model using the configuration information appropriate for its type.""" logger = ApiDependencies.invoker.services.logger record_store = ApiDependencies.invoker.services.model_records if config.key == "": @@ -162,3 +243,175 @@ async def add_model_record( # now fetch it out return record_store.get_model(config.key) + + +@model_records_router.post( + "/import", + operation_id="import_model_record", + responses={ + 201: {"description": "The model imported successfully"}, + 415: {"description": "Unrecognized file/folder format"}, + 424: {"description": "The model appeared to import successfully, but could not be found in the model manager"}, + 409: {"description": "There is already a model corresponding to this path or repo_id"}, + }, + status_code=201, +) +async def import_model( + source: ModelSource, + config: Optional[Dict[str, Any]] = Body( + description="Dict of fields that override auto-probed values in the model config record, such as name, description and prediction_type ", + default=None, + ), +) -> ModelInstallJob: + """Add a model using its local path, repo_id, or remote URL. + + Models will be downloaded, probed, configured and installed in a + series of background threads. The return object has `status` attribute + that can be used to monitor progress. + + The source object is a discriminated Union of LocalModelSource, + HFModelSource and URLModelSource. Set the "type" field to the + appropriate value: + + * To install a local path using LocalModelSource, pass a source of form: + `{ + "type": "local", + "path": "/path/to/model", + "inplace": false + }` + The "inplace" flag, if true, will register the model in place in its + current filesystem location. Otherwise, the model will be copied + into the InvokeAI models directory. + + * To install a HuggingFace repo_id using HFModelSource, pass a source of form: + `{ + "type": "hf", + "repo_id": "stabilityai/stable-diffusion-2.0", + "variant": "fp16", + "subfolder": "vae", + "access_token": "f5820a918aaf01" + }` + The `variant`, `subfolder` and `access_token` fields are optional. + + * To install a remote model using an arbitrary URL, pass: + `{ + "type": "url", + "url": "http://www.civitai.com/models/123456", + "access_token": "f5820a918aaf01" + }` + The `access_token` field is optonal + + The model's configuration record will be probed and filled in + automatically. To override the default guesses, pass "metadata" + with a Dict containing the attributes you wish to override. + + Installation occurs in the background. Either use list_model_install_jobs() + to poll for completion, or listen on the event bus for the following events: + + "model_install_running" + "model_install_completed" + "model_install_error" + + On successful completion, the event's payload will contain the field "key" + containing the installed ID of the model. On an error, the event's payload + will contain the fields "error_type" and "error" describing the nature of the + error and its traceback, respectively. + + """ + logger = ApiDependencies.invoker.services.logger + + try: + installer = ApiDependencies.invoker.services.model_install + result: ModelInstallJob = installer.import_model( + source=source, + config=config, + ) + logger.info(f"Started installation of {source}") + except UnknownModelException as e: + logger.error(str(e)) + raise HTTPException(status_code=424, detail=str(e)) + except InvalidModelException as e: + logger.error(str(e)) + raise HTTPException(status_code=415) + except ValueError as e: + logger.error(str(e)) + raise HTTPException(status_code=409, detail=str(e)) + return result + + +@model_records_router.get( + "/import", + operation_id="list_model_install_jobs", +) +async def list_model_install_jobs() -> List[ModelInstallJob]: + """Return list of model install jobs.""" + jobs: List[ModelInstallJob] = ApiDependencies.invoker.services.model_install.list_jobs() + return jobs + + +@model_records_router.get( + "/import/{id}", + operation_id="get_model_install_job", + responses={ + 200: {"description": "Success"}, + 404: {"description": "No such job"}, + }, +) +async def get_model_install_job(id: int = Path(description="Model install id")) -> ModelInstallJob: + """Return model install job corresponding to the given source.""" + try: + return ApiDependencies.invoker.services.model_install.get_job_by_id(id) + except ValueError as e: + raise HTTPException(status_code=404, detail=str(e)) + + +@model_records_router.delete( + "/import/{id}", + operation_id="cancel_model_install_job", + responses={ + 201: {"description": "The job was cancelled successfully"}, + 415: {"description": "No such job"}, + }, + status_code=201, +) +async def cancel_model_install_job(id: int = Path(description="Model install job ID")) -> None: + """Cancel the model install job(s) corresponding to the given job ID.""" + installer = ApiDependencies.invoker.services.model_install + try: + job = installer.get_job_by_id(id) + except ValueError as e: + raise HTTPException(status_code=415, detail=str(e)) + installer.cancel_job(job) + + +@model_records_router.patch( + "/import", + operation_id="prune_model_install_jobs", + responses={ + 204: {"description": "All completed and errored jobs have been pruned"}, + 400: {"description": "Bad request"}, + }, +) +async def prune_model_install_jobs() -> Response: + """Prune all completed and errored jobs from the install job list.""" + ApiDependencies.invoker.services.model_install.prune_jobs() + return Response(status_code=204) + + +@model_records_router.patch( + "/sync", + operation_id="sync_models_to_config", + responses={ + 204: {"description": "Model config record database resynced with files on disk"}, + 400: {"description": "Bad request"}, + }, +) +async def sync_models_to_config() -> Response: + """ + Traverse the models and autoimport directories. + + Model files without a corresponding + record in the database are added. Orphan records without a models file are deleted. + """ + ApiDependencies.invoker.services.model_install.sync_to_config() + return Response(status_code=204) diff --git a/invokeai/app/api/routers/utilities.py b/invokeai/app/api/routers/utilities.py index 476d10e2c0..2a912dfacf 100644 --- a/invokeai/app/api/routers/utilities.py +++ b/invokeai/app/api/routers/utilities.py @@ -23,10 +23,11 @@ class DynamicPromptsResponse(BaseModel): ) async def parse_dynamicprompts( prompt: str = Body(description="The prompt to parse with dynamicprompts"), - max_prompts: int = Body(default=1000, description="The max number of prompts to generate"), + max_prompts: int = Body(ge=1, le=10000, default=1000, description="The max number of prompts to generate"), combinatorial: bool = Body(default=True, description="Whether to use the combinatorial generator"), ) -> DynamicPromptsResponse: """Creates a batch process""" + max_prompts = min(max_prompts, 10000) generator: Union[RandomPromptGenerator, CombinatorialPromptGenerator] try: error: Optional[str] = None diff --git a/invokeai/app/api/routers/workflows.py b/invokeai/app/api/routers/workflows.py index 36de31fb51..6e93d6d0ce 100644 --- a/invokeai/app/api/routers/workflows.py +++ b/invokeai/app/api/routers/workflows.py @@ -1,7 +1,19 @@ -from fastapi import APIRouter, Path +from typing import Optional + +from fastapi import APIRouter, Body, HTTPException, Path, Query from invokeai.app.api.dependencies import ApiDependencies -from invokeai.app.invocations.baseinvocation import WorkflowField +from invokeai.app.services.shared.pagination import PaginatedResults +from invokeai.app.services.shared.sqlite.sqlite_common import SQLiteDirection +from invokeai.app.services.workflow_records.workflow_records_common import ( + Workflow, + WorkflowCategory, + WorkflowNotFoundError, + WorkflowRecordDTO, + WorkflowRecordListItemDTO, + WorkflowRecordOrderBy, + WorkflowWithoutID, +) workflows_router = APIRouter(prefix="/v1/workflows", tags=["workflows"]) @@ -10,11 +22,76 @@ workflows_router = APIRouter(prefix="/v1/workflows", tags=["workflows"]) "/i/{workflow_id}", operation_id="get_workflow", responses={ - 200: {"model": WorkflowField}, + 200: {"model": WorkflowRecordDTO}, }, ) async def get_workflow( workflow_id: str = Path(description="The workflow to get"), -) -> WorkflowField: +) -> WorkflowRecordDTO: """Gets a workflow""" - return ApiDependencies.invoker.services.workflow_records.get(workflow_id) + try: + return ApiDependencies.invoker.services.workflow_records.get(workflow_id) + except WorkflowNotFoundError: + raise HTTPException(status_code=404, detail="Workflow not found") + + +@workflows_router.patch( + "/i/{workflow_id}", + operation_id="update_workflow", + responses={ + 200: {"model": WorkflowRecordDTO}, + }, +) +async def update_workflow( + workflow: Workflow = Body(description="The updated workflow", embed=True), +) -> WorkflowRecordDTO: + """Updates a workflow""" + return ApiDependencies.invoker.services.workflow_records.update(workflow=workflow) + + +@workflows_router.delete( + "/i/{workflow_id}", + operation_id="delete_workflow", +) +async def delete_workflow( + workflow_id: str = Path(description="The workflow to delete"), +) -> None: + """Deletes a workflow""" + ApiDependencies.invoker.services.workflow_records.delete(workflow_id) + + +@workflows_router.post( + "/", + operation_id="create_workflow", + responses={ + 200: {"model": WorkflowRecordDTO}, + }, +) +async def create_workflow( + workflow: WorkflowWithoutID = Body(description="The workflow to create", embed=True), +) -> WorkflowRecordDTO: + """Creates a workflow""" + return ApiDependencies.invoker.services.workflow_records.create(workflow=workflow) + + +@workflows_router.get( + "/", + operation_id="list_workflows", + responses={ + 200: {"model": PaginatedResults[WorkflowRecordListItemDTO]}, + }, +) +async def list_workflows( + page: int = Query(default=0, description="The page to get"), + per_page: int = Query(default=10, description="The number of workflows per page"), + order_by: WorkflowRecordOrderBy = Query( + default=WorkflowRecordOrderBy.Name, description="The attribute to order by" + ), + direction: SQLiteDirection = Query(default=SQLiteDirection.Ascending, description="The direction to order by"), + category: WorkflowCategory = Query(default=WorkflowCategory.User, description="The category of workflow to get"), + query: Optional[str] = Query(default=None, description="The text to query by (matches name and description)"), +) -> PaginatedResults[WorkflowRecordListItemDTO]: + """Gets a page of workflows""" + return ApiDependencies.invoker.services.workflow_records.get_many( + page=page, per_page=per_page, order_by=order_by, direction=direction, query=query, category=category + ) diff --git a/invokeai/app/api/sockets.py b/invokeai/app/api/sockets.py index 1d5de61fd6..c63297fa55 100644 --- a/invokeai/app/api/sockets.py +++ b/invokeai/app/api/sockets.py @@ -20,6 +20,7 @@ class SocketIO: self.__sio.on("subscribe_queue", handler=self._handle_sub_queue) self.__sio.on("unsubscribe_queue", handler=self._handle_unsub_queue) local_handler.register(event_name=EventServiceBase.queue_event, _func=self._handle_queue_event) + local_handler.register(event_name=EventServiceBase.model_event, _func=self._handle_model_event) async def _handle_queue_event(self, event: Event): await self.__sio.emit( @@ -28,10 +29,13 @@ class SocketIO: room=event[1]["data"]["queue_id"], ) - async def _handle_sub_queue(self, sid, data, *args, **kwargs): + async def _handle_sub_queue(self, sid, data, *args, **kwargs) -> None: if "queue_id" in data: await self.__sio.enter_room(sid, data["queue_id"]) - async def _handle_unsub_queue(self, sid, data, *args, **kwargs): + async def _handle_unsub_queue(self, sid, data, *args, **kwargs) -> None: if "queue_id" in data: await self.__sio.leave_room(sid, data["queue_id"]) + + async def _handle_model_event(self, event: Event) -> None: + await self.__sio.emit(event=event[1]["event"], data=event[1]["data"]) diff --git a/invokeai/app/api_app.py b/invokeai/app/api_app.py index 79c7740485..2307ecd756 100644 --- a/invokeai/app/api_app.py +++ b/invokeai/app/api_app.py @@ -45,6 +45,7 @@ if True: # hack to make flake8 happy with imports coming after setting up the c app_info, board_images, boards, + download_queue, images, model_records, models, @@ -75,7 +76,7 @@ mimetypes.add_type("text/css", ".css") # Create the app # TODO: create this all in a method so configuration/etc. can be passed in? -app = FastAPI(title="Invoke AI", docs_url=None, redoc_url=None, separate_input_output_schemas=False) +app = FastAPI(title="Invoke - Community Edition", docs_url=None, redoc_url=None, separate_input_output_schemas=False) # Add event handler event_handler_id: int = id(app) @@ -116,6 +117,7 @@ app.include_router(sessions.session_router, prefix="/api") app.include_router(utilities.utilities_router, prefix="/api") app.include_router(models.models_router, prefix="/api") app.include_router(model_records.model_records_router, prefix="/api") +app.include_router(download_queue.download_queue_router, prefix="/api") app.include_router(images.images_router, prefix="/api") app.include_router(boards.boards_router, prefix="/api") app.include_router(board_images.board_images_router, prefix="/api") @@ -203,8 +205,8 @@ app.openapi = custom_openapi # type: ignore [method-assign] # this is a valid a def overridden_swagger() -> HTMLResponse: return get_swagger_ui_html( openapi_url=app.openapi_url, # type: ignore [arg-type] # this is always a string - title=app.title, - swagger_favicon_url="/static/docs/favicon.ico", + title=f"{app.title} - Swagger UI", + swagger_favicon_url="static/docs/invoke-favicon-docs.svg", ) @@ -212,25 +214,26 @@ def overridden_swagger() -> HTMLResponse: def overridden_redoc() -> HTMLResponse: return get_redoc_html( openapi_url=app.openapi_url, # type: ignore [arg-type] # this is always a string - title=app.title, - redoc_favicon_url="/static/docs/favicon.ico", + title=f"{app.title} - Redoc", + redoc_favicon_url="static/docs/invoke-favicon-docs.svg", ) web_root_path = Path(list(web_dir.__path__)[0]) +# Only serve the UI if we it has a build +if (web_root_path / "dist").exists(): + # Cannot add headers to StaticFiles, so we must serve index.html with a custom route + # Add cache-control: no-store header to prevent caching of index.html, which leads to broken UIs at release + @app.get("/", include_in_schema=False, name="ui_root") + def get_index() -> FileResponse: + return FileResponse(Path(web_root_path, "dist/index.html"), headers={"Cache-Control": "no-store"}) -# Cannot add headers to StaticFiles, so we must serve index.html with a custom route -# Add cache-control: no-store header to prevent caching of index.html, which leads to broken UIs at release -@app.get("/", include_in_schema=False, name="ui_root") -def get_index() -> FileResponse: - return FileResponse(Path(web_root_path, "dist/index.html"), headers={"Cache-Control": "no-store"}) + # Must mount *after* the other routes else it borks em + app.mount("/assets", StaticFiles(directory=Path(web_root_path, "dist/assets/")), name="assets") + app.mount("/locales", StaticFiles(directory=Path(web_root_path, "dist/locales/")), name="locales") - -# # Must mount *after* the other routes else it borks em app.mount("/static", StaticFiles(directory=Path(web_root_path, "static/")), name="static") # docs favicon is in here -app.mount("/assets", StaticFiles(directory=Path(web_root_path, "dist/assets/")), name="assets") -app.mount("/locales", StaticFiles(directory=Path(web_root_path, "dist/locales/")), name="locales") def invoke_api() -> None: @@ -271,6 +274,8 @@ def invoke_api() -> None: port=port, loop="asyncio", log_level=app_config.log_level, + ssl_certfile=app_config.ssl_certfile, + ssl_keyfile=app_config.ssl_keyfile, ) server = uvicorn.Server(config) diff --git a/invokeai/app/invocations/baseinvocation.py b/invokeai/app/invocations/baseinvocation.py index b93e4f922f..d9e0c7ba0d 100644 --- a/invokeai/app/invocations/baseinvocation.py +++ b/invokeai/app/invocations/baseinvocation.py @@ -4,6 +4,7 @@ from __future__ import annotations import inspect import re +import warnings from abc import ABC, abstractmethod from enum import Enum from inspect import signature @@ -16,6 +17,7 @@ from pydantic.fields import FieldInfo, _Unset from pydantic_core import PydanticUndefined from invokeai.app.services.config.config_default import InvokeAIAppConfig +from invokeai.app.services.workflow_records.workflow_records_common import WorkflowWithoutID from invokeai.app.shared.fields import FieldDescriptions from invokeai.app.util.metaenum import MetaEnum from invokeai.app.util.misc import uuid_string @@ -37,6 +39,19 @@ class InvalidFieldError(TypeError): pass +class Classification(str, Enum, metaclass=MetaEnum): + """ + The classification of an Invocation. + - `Stable`: The invocation, including its inputs/outputs and internal logic, is stable. You may build workflows with it, having confidence that they will not break because of a change in this invocation. + - `Beta`: The invocation is not yet stable, but is planned to be stable in the future. Workflows built around this invocation may break, but we are committed to supporting this invocation long-term. + - `Prototype`: The invocation is not yet stable and may be removed from the application at any time. Workflows built around this invocation may break, and we are *not* committed to supporting this invocation. + """ + + Stable = "stable" + Beta = "beta" + Prototype = "prototype" + + class Input(str, Enum, metaclass=MetaEnum): """ The type of input a field accepts. @@ -437,6 +452,7 @@ class UIConfigBase(BaseModel): description='The node\'s version. Should be a valid semver string e.g. "1.0.0" or "3.8.13".', ) node_pack: Optional[str] = Field(default=None, description="Whether or not this is a custom node") + classification: Classification = Field(default=Classification.Stable, description="The node's classification") model_config = ConfigDict( validate_assignment=True, @@ -452,6 +468,7 @@ class InvocationContext: queue_id: str queue_item_id: int queue_batch_id: str + workflow: Optional[WorkflowWithoutID] def __init__( self, @@ -460,12 +477,14 @@ class InvocationContext: queue_item_id: int, queue_batch_id: str, graph_execution_state_id: str, + workflow: Optional[WorkflowWithoutID], ): self.services = services self.graph_execution_state_id = graph_execution_state_id self.queue_id = queue_id self.queue_item_id = queue_item_id self.queue_batch_id = queue_batch_id + self.workflow = workflow class BaseInvocationOutput(BaseModel): @@ -602,6 +621,7 @@ class BaseInvocation(ABC, BaseModel): schema["category"] = uiconfig.category if uiconfig.node_pack is not None: schema["node_pack"] = uiconfig.node_pack + schema["classification"] = uiconfig.classification schema["version"] = uiconfig.version if "required" not in schema or not isinstance(schema["required"], list): schema["required"] = [] @@ -705,8 +725,10 @@ class _Model(BaseModel): pass -# Get all pydantic model attrs, methods, etc -RESERVED_PYDANTIC_FIELD_NAMES = {m[0] for m in inspect.getmembers(_Model())} +with warnings.catch_warnings(): + warnings.simplefilter("ignore", category=DeprecationWarning) + # Get all pydantic model attrs, methods, etc + RESERVED_PYDANTIC_FIELD_NAMES = {m[0] for m in inspect.getmembers(_Model())} def validate_fields(model_fields: dict[str, FieldInfo], model_type: str) -> None: @@ -775,6 +797,7 @@ def invocation( category: Optional[str] = None, version: Optional[str] = None, use_cache: Optional[bool] = True, + classification: Classification = Classification.Stable, ) -> Callable[[Type[TBaseInvocation]], Type[TBaseInvocation]]: """ Registers an invocation. @@ -785,6 +808,7 @@ def invocation( :param Optional[str] category: Adds a category to the invocation. Used to group the invocations in the UI. Defaults to None. :param Optional[str] version: Adds a version to the invocation. Must be a valid semver string. Defaults to None. :param Optional[bool] use_cache: Whether or not to use the invocation cache. Defaults to True. The user may override this in the workflow editor. + :param Classification classification: The classification of the invocation. Defaults to FeatureClassification.Stable. Use Beta or Prototype if the invocation is unstable. """ def wrapper(cls: Type[TBaseInvocation]) -> Type[TBaseInvocation]: @@ -805,11 +829,12 @@ def invocation( cls.UIConfig.title = title cls.UIConfig.tags = tags cls.UIConfig.category = category + cls.UIConfig.classification = classification # Grab the node pack's name from the module name, if it's a custom node - module_name = cls.__module__.split(".")[0] - if module_name.endswith(CUSTOM_NODE_PACK_SUFFIX): - cls.UIConfig.node_pack = module_name.split(CUSTOM_NODE_PACK_SUFFIX)[0] + is_custom_node = cls.__module__.rsplit(".", 1)[0] == "invokeai.app.invocations" + if is_custom_node: + cls.UIConfig.node_pack = cls.__module__.split(".")[0] else: cls.UIConfig.node_pack = None @@ -903,24 +928,6 @@ def invocation_output( return wrapper -class WorkflowField(RootModel): - """ - Pydantic model for workflows with custom root of type dict[str, Any]. - Workflows are stored without a strict schema. - """ - - root: dict[str, Any] = Field(description="The workflow") - - -WorkflowFieldValidator = TypeAdapter(WorkflowField) - - -class WithWorkflow(BaseModel): - workflow: Optional[WorkflowField] = Field( - default=None, description=FieldDescriptions.workflow, json_schema_extra={"field_kind": FieldKind.NodeAttribute} - ) - - class MetadataField(RootModel): """ Pydantic model for metadata with custom root of type dict[str, Any]. @@ -943,3 +950,13 @@ class WithMetadata(BaseModel): orig_required=False, ).model_dump(exclude_none=True), ) + + +class WithWorkflow: + workflow = None + + def __init_subclass__(cls) -> None: + logger.warn( + f"{cls.__module__.split('.')[0]}.{cls.__name__}: WithWorkflow is deprecated. Use `context.workflow` to access the workflow." + ) + super().__init_subclass__() diff --git a/invokeai/app/invocations/compel.py b/invokeai/app/invocations/compel.py index 5494c3261f..49c62cff56 100644 --- a/invokeai/app/invocations/compel.py +++ b/invokeai/app/invocations/compel.py @@ -1,4 +1,3 @@ -import re from dataclasses import dataclass from typing import List, Optional, Union @@ -17,6 +16,7 @@ from invokeai.backend.stable_diffusion.diffusion.conditioning_data import ( from ...backend.model_management.lora import ModelPatcher from ...backend.model_management.models import ModelNotFoundException, ModelType from ...backend.util.devices import torch_dtype +from ..util.ti_utils import extract_ti_triggers_from_prompt from .baseinvocation import ( BaseInvocation, BaseInvocationOutput, @@ -87,7 +87,7 @@ class CompelInvocation(BaseInvocation): # loras = [(context.services.model_manager.get_model(**lora.dict(exclude={"weight"})).context.model, lora.weight) for lora in self.clip.loras] ti_list = [] - for trigger in re.findall(r"<[a-zA-Z0-9., _-]+>", self.prompt): + for trigger in extract_ti_triggers_from_prompt(self.prompt): name = trigger[1:-1] try: ti_list.append( @@ -210,7 +210,7 @@ class SDXLPromptInvocationBase: # loras = [(context.services.model_manager.get_model(**lora.dict(exclude={"weight"})).context.model, lora.weight) for lora in self.clip.loras] ti_list = [] - for trigger in re.findall(r"<[a-zA-Z0-9., _-]+>", prompt): + for trigger in extract_ti_triggers_from_prompt(prompt): name = trigger[1:-1] try: ti_list.append( diff --git a/invokeai/app/invocations/controlnet_image_processors.py b/invokeai/app/invocations/controlnet_image_processors.py index d57de57a37..f16a8e36ae 100644 --- a/invokeai/app/invocations/controlnet_image_processors.py +++ b/invokeai/app/invocations/controlnet_image_processors.py @@ -24,9 +24,10 @@ from controlnet_aux import ( ) from controlnet_aux.util import HWC3, ade_palette from PIL import Image -from pydantic import BaseModel, ConfigDict, Field, field_validator +from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator from invokeai.app.invocations.primitives import ImageField, ImageOutput +from invokeai.app.invocations.util import validate_begin_end_step, validate_weights from invokeai.app.services.image_records.image_records_common import ImageCategory, ResourceOrigin from invokeai.app.shared.fields import FieldDescriptions @@ -39,7 +40,6 @@ from .baseinvocation import ( InvocationContext, OutputField, WithMetadata, - WithWorkflow, invocation, invocation_output, ) @@ -76,17 +76,16 @@ class ControlField(BaseModel): resize_mode: CONTROLNET_RESIZE_VALUES = Field(default="just_resize", description="The resize mode to use") @field_validator("control_weight") + @classmethod def validate_control_weight(cls, v): - """Validate that all control weights in the valid range""" - if isinstance(v, list): - for i in v: - if i < -1 or i > 2: - raise ValueError("Control weights must be within -1 to 2 range") - else: - if v < -1 or v > 2: - raise ValueError("Control weights must be within -1 to 2 range") + validate_weights(v) return v + @model_validator(mode="after") + def validate_begin_end_step_percent(self): + validate_begin_end_step(self.begin_step_percent, self.end_step_percent) + return self + @invocation_output("control_output") class ControlOutput(BaseInvocationOutput): @@ -96,17 +95,17 @@ class ControlOutput(BaseInvocationOutput): control: ControlField = OutputField(description=FieldDescriptions.control) -@invocation("controlnet", title="ControlNet", tags=["controlnet"], category="controlnet", version="1.1.0") +@invocation("controlnet", title="ControlNet", tags=["controlnet"], category="controlnet", version="1.1.1") class ControlNetInvocation(BaseInvocation): """Collects ControlNet info to pass to other nodes""" image: ImageField = InputField(description="The control image") control_model: ControlNetModelField = InputField(description=FieldDescriptions.controlnet_model, input=Input.Direct) control_weight: Union[float, List[float]] = InputField( - default=1.0, description="The weight given to the ControlNet" + default=1.0, ge=-1, le=2, description="The weight given to the ControlNet" ) begin_step_percent: float = InputField( - default=0, ge=-1, le=2, description="When the ControlNet is first applied (% of total steps)" + default=0, ge=0, le=1, description="When the ControlNet is first applied (% of total steps)" ) end_step_percent: float = InputField( default=1, ge=0, le=1, description="When the ControlNet is last applied (% of total steps)" @@ -114,6 +113,17 @@ class ControlNetInvocation(BaseInvocation): control_mode: CONTROLNET_MODE_VALUES = InputField(default="balanced", description="The control mode used") resize_mode: CONTROLNET_RESIZE_VALUES = InputField(default="just_resize", description="The resize mode used") + @field_validator("control_weight") + @classmethod + def validate_control_weight(cls, v): + validate_weights(v) + return v + + @model_validator(mode="after") + def validate_begin_end_step_percent(self) -> "ControlNetInvocation": + validate_begin_end_step(self.begin_step_percent, self.end_step_percent) + return self + def invoke(self, context: InvocationContext) -> ControlOutput: return ControlOutput( control=ControlField( @@ -129,7 +139,7 @@ class ControlNetInvocation(BaseInvocation): # This invocation exists for other invocations to subclass it - do not register with @invocation! -class ImageProcessorInvocation(BaseInvocation, WithMetadata, WithWorkflow): +class ImageProcessorInvocation(BaseInvocation, WithMetadata): """Base class for invocations that preprocess images for ControlNet""" image: ImageField = InputField(description="The image to process") @@ -153,7 +163,7 @@ class ImageProcessorInvocation(BaseInvocation, WithMetadata, WithWorkflow): node_id=self.id, is_intermediate=self.is_intermediate, metadata=self.metadata, - workflow=self.workflow, + workflow=context.workflow, ) """Builds an ImageOutput and its ImageField""" @@ -173,7 +183,7 @@ class ImageProcessorInvocation(BaseInvocation, WithMetadata, WithWorkflow): title="Canny Processor", tags=["controlnet", "canny"], category="controlnet", - version="1.1.0", + version="1.2.0", ) class CannyImageProcessorInvocation(ImageProcessorInvocation): """Canny edge detection for ControlNet""" @@ -196,7 +206,7 @@ class CannyImageProcessorInvocation(ImageProcessorInvocation): title="HED (softedge) Processor", tags=["controlnet", "hed", "softedge"], category="controlnet", - version="1.1.0", + version="1.2.0", ) class HedImageProcessorInvocation(ImageProcessorInvocation): """Applies HED edge detection to image""" @@ -225,7 +235,7 @@ class HedImageProcessorInvocation(ImageProcessorInvocation): title="Lineart Processor", tags=["controlnet", "lineart"], category="controlnet", - version="1.1.0", + version="1.2.0", ) class LineartImageProcessorInvocation(ImageProcessorInvocation): """Applies line art processing to image""" @@ -247,7 +257,7 @@ class LineartImageProcessorInvocation(ImageProcessorInvocation): title="Lineart Anime Processor", tags=["controlnet", "lineart", "anime"], category="controlnet", - version="1.1.0", + version="1.2.0", ) class LineartAnimeImageProcessorInvocation(ImageProcessorInvocation): """Applies line art anime processing to image""" @@ -270,7 +280,7 @@ class LineartAnimeImageProcessorInvocation(ImageProcessorInvocation): title="Openpose Processor", tags=["controlnet", "openpose", "pose"], category="controlnet", - version="1.1.0", + version="1.2.0", ) class OpenposeImageProcessorInvocation(ImageProcessorInvocation): """Applies Openpose processing to image""" @@ -295,7 +305,7 @@ class OpenposeImageProcessorInvocation(ImageProcessorInvocation): title="Midas Depth Processor", tags=["controlnet", "midas"], category="controlnet", - version="1.1.0", + version="1.2.0", ) class MidasDepthImageProcessorInvocation(ImageProcessorInvocation): """Applies Midas depth processing to image""" @@ -322,7 +332,7 @@ class MidasDepthImageProcessorInvocation(ImageProcessorInvocation): title="Normal BAE Processor", tags=["controlnet"], category="controlnet", - version="1.1.0", + version="1.2.0", ) class NormalbaeImageProcessorInvocation(ImageProcessorInvocation): """Applies NormalBae processing to image""" @@ -339,7 +349,7 @@ class NormalbaeImageProcessorInvocation(ImageProcessorInvocation): @invocation( - "mlsd_image_processor", title="MLSD Processor", tags=["controlnet", "mlsd"], category="controlnet", version="1.1.0" + "mlsd_image_processor", title="MLSD Processor", tags=["controlnet", "mlsd"], category="controlnet", version="1.2.0" ) class MlsdImageProcessorInvocation(ImageProcessorInvocation): """Applies MLSD processing to image""" @@ -362,7 +372,7 @@ class MlsdImageProcessorInvocation(ImageProcessorInvocation): @invocation( - "pidi_image_processor", title="PIDI Processor", tags=["controlnet", "pidi"], category="controlnet", version="1.1.0" + "pidi_image_processor", title="PIDI Processor", tags=["controlnet", "pidi"], category="controlnet", version="1.2.0" ) class PidiImageProcessorInvocation(ImageProcessorInvocation): """Applies PIDI processing to image""" @@ -389,7 +399,7 @@ class PidiImageProcessorInvocation(ImageProcessorInvocation): title="Content Shuffle Processor", tags=["controlnet", "contentshuffle"], category="controlnet", - version="1.1.0", + version="1.2.0", ) class ContentShuffleImageProcessorInvocation(ImageProcessorInvocation): """Applies content shuffle processing to image""" @@ -419,7 +429,7 @@ class ContentShuffleImageProcessorInvocation(ImageProcessorInvocation): title="Zoe (Depth) Processor", tags=["controlnet", "zoe", "depth"], category="controlnet", - version="1.1.0", + version="1.2.0", ) class ZoeDepthImageProcessorInvocation(ImageProcessorInvocation): """Applies Zoe depth processing to image""" @@ -435,7 +445,7 @@ class ZoeDepthImageProcessorInvocation(ImageProcessorInvocation): title="Mediapipe Face Processor", tags=["controlnet", "mediapipe", "face"], category="controlnet", - version="1.1.0", + version="1.2.0", ) class MediapipeFaceProcessorInvocation(ImageProcessorInvocation): """Applies mediapipe face processing to image""" @@ -458,7 +468,7 @@ class MediapipeFaceProcessorInvocation(ImageProcessorInvocation): title="Leres (Depth) Processor", tags=["controlnet", "leres", "depth"], category="controlnet", - version="1.1.0", + version="1.2.0", ) class LeresImageProcessorInvocation(ImageProcessorInvocation): """Applies leres processing to image""" @@ -487,7 +497,7 @@ class LeresImageProcessorInvocation(ImageProcessorInvocation): title="Tile Resample Processor", tags=["controlnet", "tile"], category="controlnet", - version="1.1.0", + version="1.2.0", ) class TileResamplerProcessorInvocation(ImageProcessorInvocation): """Tile resampler processor""" @@ -527,7 +537,7 @@ class TileResamplerProcessorInvocation(ImageProcessorInvocation): title="Segment Anything Processor", tags=["controlnet", "segmentanything"], category="controlnet", - version="1.1.0", + version="1.2.0", ) class SegmentAnythingProcessorInvocation(ImageProcessorInvocation): """Applies segment anything processing to image""" @@ -569,7 +579,7 @@ class SamDetectorReproducibleColors(SamDetector): title="Color Map Processor", tags=["controlnet"], category="controlnet", - version="1.1.0", + version="1.2.0", ) class ColorMapImageProcessorInvocation(ImageProcessorInvocation): """Generates a color map from the provided image""" diff --git a/invokeai/app/invocations/custom_nodes/init.py b/invokeai/app/invocations/custom_nodes/init.py index e26bdaf568..e0c174013f 100644 --- a/invokeai/app/invocations/custom_nodes/init.py +++ b/invokeai/app/invocations/custom_nodes/init.py @@ -6,7 +6,6 @@ import sys from importlib.util import module_from_spec, spec_from_file_location from pathlib import Path -from invokeai.app.invocations.baseinvocation import CUSTOM_NODE_PACK_SUFFIX from invokeai.backend.util.logging import InvokeAILogger logger = InvokeAILogger.get_logger() @@ -34,7 +33,7 @@ for d in Path(__file__).parent.iterdir(): continue # load the module, appending adding a suffix to identify it as a custom node pack - spec = spec_from_file_location(f"{module_name}{CUSTOM_NODE_PACK_SUFFIX}", init.absolute()) + spec = spec_from_file_location(module_name, init.absolute()) if spec is None or spec.loader is None: logger.warn(f"Could not load {init}") diff --git a/invokeai/app/invocations/cv.py b/invokeai/app/invocations/cv.py index b9764285f5..cb6828d21a 100644 --- a/invokeai/app/invocations/cv.py +++ b/invokeai/app/invocations/cv.py @@ -8,11 +8,11 @@ from PIL import Image, ImageOps from invokeai.app.invocations.primitives import ImageField, ImageOutput from invokeai.app.services.image_records.image_records_common import ImageCategory, ResourceOrigin -from .baseinvocation import BaseInvocation, InputField, InvocationContext, WithMetadata, WithWorkflow, invocation +from .baseinvocation import BaseInvocation, InputField, InvocationContext, WithMetadata, invocation -@invocation("cv_inpaint", title="OpenCV Inpaint", tags=["opencv", "inpaint"], category="inpaint", version="1.1.0") -class CvInpaintInvocation(BaseInvocation, WithMetadata, WithWorkflow): +@invocation("cv_inpaint", title="OpenCV Inpaint", tags=["opencv", "inpaint"], category="inpaint", version="1.2.0") +class CvInpaintInvocation(BaseInvocation, WithMetadata): """Simple inpaint using opencv.""" image: ImageField = InputField(description="The image to inpaint") @@ -41,7 +41,7 @@ class CvInpaintInvocation(BaseInvocation, WithMetadata, WithWorkflow): node_id=self.id, session_id=context.graph_execution_state_id, is_intermediate=self.is_intermediate, - workflow=self.workflow, + workflow=context.workflow, ) return ImageOutput( diff --git a/invokeai/app/invocations/facetools.py b/invokeai/app/invocations/facetools.py index ef3d0aa9a1..e0c89b4de5 100644 --- a/invokeai/app/invocations/facetools.py +++ b/invokeai/app/invocations/facetools.py @@ -17,7 +17,6 @@ from invokeai.app.invocations.baseinvocation import ( InvocationContext, OutputField, WithMetadata, - WithWorkflow, invocation, invocation_output, ) @@ -438,8 +437,8 @@ def get_faces_list( return all_faces -@invocation("face_off", title="FaceOff", tags=["image", "faceoff", "face", "mask"], category="image", version="1.1.0") -class FaceOffInvocation(BaseInvocation, WithWorkflow, WithMetadata): +@invocation("face_off", title="FaceOff", tags=["image", "faceoff", "face", "mask"], category="image", version="1.2.0") +class FaceOffInvocation(BaseInvocation, WithMetadata): """Bound, extract, and mask a face from an image using MediaPipe detection""" image: ImageField = InputField(description="Image for face detection") @@ -508,7 +507,7 @@ class FaceOffInvocation(BaseInvocation, WithWorkflow, WithMetadata): node_id=self.id, session_id=context.graph_execution_state_id, is_intermediate=self.is_intermediate, - workflow=self.workflow, + workflow=context.workflow, ) mask_dto = context.services.images.create( @@ -532,8 +531,8 @@ class FaceOffInvocation(BaseInvocation, WithWorkflow, WithMetadata): return output -@invocation("face_mask_detection", title="FaceMask", tags=["image", "face", "mask"], category="image", version="1.1.0") -class FaceMaskInvocation(BaseInvocation, WithWorkflow, WithMetadata): +@invocation("face_mask_detection", title="FaceMask", tags=["image", "face", "mask"], category="image", version="1.2.0") +class FaceMaskInvocation(BaseInvocation, WithMetadata): """Face mask creation using mediapipe face detection""" image: ImageField = InputField(description="Image to face detect") @@ -627,7 +626,7 @@ class FaceMaskInvocation(BaseInvocation, WithWorkflow, WithMetadata): node_id=self.id, session_id=context.graph_execution_state_id, is_intermediate=self.is_intermediate, - workflow=self.workflow, + workflow=context.workflow, ) mask_dto = context.services.images.create( @@ -650,9 +649,9 @@ class FaceMaskInvocation(BaseInvocation, WithWorkflow, WithMetadata): @invocation( - "face_identifier", title="FaceIdentifier", tags=["image", "face", "identifier"], category="image", version="1.1.0" + "face_identifier", title="FaceIdentifier", tags=["image", "face", "identifier"], category="image", version="1.2.0" ) -class FaceIdentifierInvocation(BaseInvocation, WithWorkflow, WithMetadata): +class FaceIdentifierInvocation(BaseInvocation, WithMetadata): """Outputs an image with detected face IDs printed on each face. For use with other FaceTools.""" image: ImageField = InputField(description="Image to face detect") @@ -716,7 +715,7 @@ class FaceIdentifierInvocation(BaseInvocation, WithWorkflow, WithMetadata): node_id=self.id, session_id=context.graph_execution_state_id, is_intermediate=self.is_intermediate, - workflow=self.workflow, + workflow=context.workflow, ) return ImageOutput( diff --git a/invokeai/app/invocations/image.py b/invokeai/app/invocations/image.py index ad3b3aec71..f729d60cdd 100644 --- a/invokeai/app/invocations/image.py +++ b/invokeai/app/invocations/image.py @@ -13,7 +13,15 @@ from invokeai.app.shared.fields import FieldDescriptions from invokeai.backend.image_util.invisible_watermark import InvisibleWatermark from invokeai.backend.image_util.safety_checker import SafetyChecker -from .baseinvocation import BaseInvocation, Input, InputField, InvocationContext, WithMetadata, WithWorkflow, invocation +from .baseinvocation import ( + BaseInvocation, + Classification, + Input, + InputField, + InvocationContext, + WithMetadata, + invocation, +) @invocation("show_image", title="Show Image", tags=["image"], category="image", version="1.0.0") @@ -36,8 +44,14 @@ class ShowImageInvocation(BaseInvocation): ) -@invocation("blank_image", title="Blank Image", tags=["image"], category="image", version="1.1.0") -class BlankImageInvocation(BaseInvocation, WithMetadata, WithWorkflow): +@invocation( + "blank_image", + title="Blank Image", + tags=["image"], + category="image", + version="1.2.0", +) +class BlankImageInvocation(BaseInvocation, WithMetadata): """Creates a blank image and forwards it to the pipeline""" width: int = InputField(default=512, description="The width of the image") @@ -56,7 +70,7 @@ class BlankImageInvocation(BaseInvocation, WithMetadata, WithWorkflow): session_id=context.graph_execution_state_id, is_intermediate=self.is_intermediate, metadata=self.metadata, - workflow=self.workflow, + workflow=context.workflow, ) return ImageOutput( @@ -66,8 +80,14 @@ class BlankImageInvocation(BaseInvocation, WithMetadata, WithWorkflow): ) -@invocation("img_crop", title="Crop Image", tags=["image", "crop"], category="image", version="1.1.0") -class ImageCropInvocation(BaseInvocation, WithWorkflow, WithMetadata): +@invocation( + "img_crop", + title="Crop Image", + tags=["image", "crop"], + category="image", + version="1.2.0", +) +class ImageCropInvocation(BaseInvocation, WithMetadata): """Crops an image to a specified box. The box can be outside of the image.""" image: ImageField = InputField(description="The image to crop") @@ -90,7 +110,7 @@ class ImageCropInvocation(BaseInvocation, WithWorkflow, WithMetadata): session_id=context.graph_execution_state_id, is_intermediate=self.is_intermediate, metadata=self.metadata, - workflow=self.workflow, + workflow=context.workflow, ) return ImageOutput( @@ -155,8 +175,14 @@ class CenterPadCropInvocation(BaseInvocation): ) -@invocation("img_paste", title="Paste Image", tags=["image", "paste"], category="image", version="1.1.0") -class ImagePasteInvocation(BaseInvocation, WithWorkflow, WithMetadata): +@invocation( + "img_paste", + title="Paste Image", + tags=["image", "paste"], + category="image", + version="1.2.0", +) +class ImagePasteInvocation(BaseInvocation, WithMetadata): """Pastes an image into another image.""" base_image: ImageField = InputField(description="The base image") @@ -199,7 +225,7 @@ class ImagePasteInvocation(BaseInvocation, WithWorkflow, WithMetadata): session_id=context.graph_execution_state_id, is_intermediate=self.is_intermediate, metadata=self.metadata, - workflow=self.workflow, + workflow=context.workflow, ) return ImageOutput( @@ -209,8 +235,14 @@ class ImagePasteInvocation(BaseInvocation, WithWorkflow, WithMetadata): ) -@invocation("tomask", title="Mask from Alpha", tags=["image", "mask"], category="image", version="1.1.0") -class MaskFromAlphaInvocation(BaseInvocation, WithWorkflow, WithMetadata): +@invocation( + "tomask", + title="Mask from Alpha", + tags=["image", "mask"], + category="image", + version="1.2.0", +) +class MaskFromAlphaInvocation(BaseInvocation, WithMetadata): """Extracts the alpha channel of an image as a mask.""" image: ImageField = InputField(description="The image to create the mask from") @@ -231,7 +263,7 @@ class MaskFromAlphaInvocation(BaseInvocation, WithWorkflow, WithMetadata): session_id=context.graph_execution_state_id, is_intermediate=self.is_intermediate, metadata=self.metadata, - workflow=self.workflow, + workflow=context.workflow, ) return ImageOutput( @@ -241,8 +273,14 @@ class MaskFromAlphaInvocation(BaseInvocation, WithWorkflow, WithMetadata): ) -@invocation("img_mul", title="Multiply Images", tags=["image", "multiply"], category="image", version="1.1.0") -class ImageMultiplyInvocation(BaseInvocation, WithWorkflow, WithMetadata): +@invocation( + "img_mul", + title="Multiply Images", + tags=["image", "multiply"], + category="image", + version="1.2.0", +) +class ImageMultiplyInvocation(BaseInvocation, WithMetadata): """Multiplies two images together using `PIL.ImageChops.multiply()`.""" image1: ImageField = InputField(description="The first image to multiply") @@ -262,7 +300,7 @@ class ImageMultiplyInvocation(BaseInvocation, WithWorkflow, WithMetadata): session_id=context.graph_execution_state_id, is_intermediate=self.is_intermediate, metadata=self.metadata, - workflow=self.workflow, + workflow=context.workflow, ) return ImageOutput( @@ -275,8 +313,14 @@ class ImageMultiplyInvocation(BaseInvocation, WithWorkflow, WithMetadata): IMAGE_CHANNELS = Literal["A", "R", "G", "B"] -@invocation("img_chan", title="Extract Image Channel", tags=["image", "channel"], category="image", version="1.1.0") -class ImageChannelInvocation(BaseInvocation, WithWorkflow, WithMetadata): +@invocation( + "img_chan", + title="Extract Image Channel", + tags=["image", "channel"], + category="image", + version="1.2.0", +) +class ImageChannelInvocation(BaseInvocation, WithMetadata): """Gets a channel from an image.""" image: ImageField = InputField(description="The image to get the channel from") @@ -295,7 +339,7 @@ class ImageChannelInvocation(BaseInvocation, WithWorkflow, WithMetadata): session_id=context.graph_execution_state_id, is_intermediate=self.is_intermediate, metadata=self.metadata, - workflow=self.workflow, + workflow=context.workflow, ) return ImageOutput( @@ -308,8 +352,14 @@ class ImageChannelInvocation(BaseInvocation, WithWorkflow, WithMetadata): IMAGE_MODES = Literal["L", "RGB", "RGBA", "CMYK", "YCbCr", "LAB", "HSV", "I", "F"] -@invocation("img_conv", title="Convert Image Mode", tags=["image", "convert"], category="image", version="1.1.0") -class ImageConvertInvocation(BaseInvocation, WithWorkflow, WithMetadata): +@invocation( + "img_conv", + title="Convert Image Mode", + tags=["image", "convert"], + category="image", + version="1.2.0", +) +class ImageConvertInvocation(BaseInvocation, WithMetadata): """Converts an image to a different mode.""" image: ImageField = InputField(description="The image to convert") @@ -328,7 +378,7 @@ class ImageConvertInvocation(BaseInvocation, WithWorkflow, WithMetadata): session_id=context.graph_execution_state_id, is_intermediate=self.is_intermediate, metadata=self.metadata, - workflow=self.workflow, + workflow=context.workflow, ) return ImageOutput( @@ -338,8 +388,14 @@ class ImageConvertInvocation(BaseInvocation, WithWorkflow, WithMetadata): ) -@invocation("img_blur", title="Blur Image", tags=["image", "blur"], category="image", version="1.1.0") -class ImageBlurInvocation(BaseInvocation, WithWorkflow, WithMetadata): +@invocation( + "img_blur", + title="Blur Image", + tags=["image", "blur"], + category="image", + version="1.2.0", +) +class ImageBlurInvocation(BaseInvocation, WithMetadata): """Blurs an image""" image: ImageField = InputField(description="The image to blur") @@ -363,7 +419,7 @@ class ImageBlurInvocation(BaseInvocation, WithWorkflow, WithMetadata): session_id=context.graph_execution_state_id, is_intermediate=self.is_intermediate, metadata=self.metadata, - workflow=self.workflow, + workflow=context.workflow, ) return ImageOutput( @@ -373,6 +429,64 @@ class ImageBlurInvocation(BaseInvocation, WithWorkflow, WithMetadata): ) +@invocation( + "unsharp_mask", + title="Unsharp Mask", + tags=["image", "unsharp_mask"], + category="image", + version="1.2.0", + classification=Classification.Beta, +) +class UnsharpMaskInvocation(BaseInvocation, WithMetadata): + """Applies an unsharp mask filter to an image""" + + image: ImageField = InputField(description="The image to use") + radius: float = InputField(gt=0, description="Unsharp mask radius", default=2) + strength: float = InputField(ge=0, description="Unsharp mask strength", default=50) + + def pil_from_array(self, arr): + return Image.fromarray((arr * 255).astype("uint8")) + + def array_from_pil(self, img): + return numpy.array(img) / 255 + + def invoke(self, context: InvocationContext) -> ImageOutput: + image = context.services.images.get_pil_image(self.image.image_name) + mode = image.mode + + alpha_channel = image.getchannel("A") if mode == "RGBA" else None + image = image.convert("RGB") + image_blurred = self.array_from_pil(image.filter(ImageFilter.GaussianBlur(radius=self.radius))) + + image = self.array_from_pil(image) + image += (image - image_blurred) * (self.strength / 100.0) + image = numpy.clip(image, 0, 1) + image = self.pil_from_array(image) + + image = image.convert(mode) + + # Make the image RGBA if we had a source alpha channel + if alpha_channel is not None: + image.putalpha(alpha_channel) + + image_dto = context.services.images.create( + image=image, + image_origin=ResourceOrigin.INTERNAL, + image_category=ImageCategory.GENERAL, + node_id=self.id, + session_id=context.graph_execution_state_id, + is_intermediate=self.is_intermediate, + metadata=self.metadata, + workflow=context.workflow, + ) + + return ImageOutput( + image=ImageField(image_name=image_dto.image_name), + width=image.width, + height=image.height, + ) + + PIL_RESAMPLING_MODES = Literal[ "nearest", "box", @@ -393,8 +507,14 @@ PIL_RESAMPLING_MAP = { } -@invocation("img_resize", title="Resize Image", tags=["image", "resize"], category="image", version="1.1.0") -class ImageResizeInvocation(BaseInvocation, WithMetadata, WithWorkflow): +@invocation( + "img_resize", + title="Resize Image", + tags=["image", "resize"], + category="image", + version="1.2.0", +) +class ImageResizeInvocation(BaseInvocation, WithMetadata): """Resizes an image to specific dimensions""" image: ImageField = InputField(description="The image to resize") @@ -420,7 +540,7 @@ class ImageResizeInvocation(BaseInvocation, WithMetadata, WithWorkflow): session_id=context.graph_execution_state_id, is_intermediate=self.is_intermediate, metadata=self.metadata, - workflow=self.workflow, + workflow=context.workflow, ) return ImageOutput( @@ -430,8 +550,14 @@ class ImageResizeInvocation(BaseInvocation, WithMetadata, WithWorkflow): ) -@invocation("img_scale", title="Scale Image", tags=["image", "scale"], category="image", version="1.1.0") -class ImageScaleInvocation(BaseInvocation, WithMetadata, WithWorkflow): +@invocation( + "img_scale", + title="Scale Image", + tags=["image", "scale"], + category="image", + version="1.2.0", +) +class ImageScaleInvocation(BaseInvocation, WithMetadata): """Scales an image by a factor""" image: ImageField = InputField(description="The image to scale") @@ -462,7 +588,7 @@ class ImageScaleInvocation(BaseInvocation, WithMetadata, WithWorkflow): session_id=context.graph_execution_state_id, is_intermediate=self.is_intermediate, metadata=self.metadata, - workflow=self.workflow, + workflow=context.workflow, ) return ImageOutput( @@ -472,8 +598,14 @@ class ImageScaleInvocation(BaseInvocation, WithMetadata, WithWorkflow): ) -@invocation("img_lerp", title="Lerp Image", tags=["image", "lerp"], category="image", version="1.1.0") -class ImageLerpInvocation(BaseInvocation, WithWorkflow, WithMetadata): +@invocation( + "img_lerp", + title="Lerp Image", + tags=["image", "lerp"], + category="image", + version="1.2.0", +) +class ImageLerpInvocation(BaseInvocation, WithMetadata): """Linear interpolation of all pixels of an image""" image: ImageField = InputField(description="The image to lerp") @@ -496,7 +628,7 @@ class ImageLerpInvocation(BaseInvocation, WithWorkflow, WithMetadata): session_id=context.graph_execution_state_id, is_intermediate=self.is_intermediate, metadata=self.metadata, - workflow=self.workflow, + workflow=context.workflow, ) return ImageOutput( @@ -506,8 +638,14 @@ class ImageLerpInvocation(BaseInvocation, WithWorkflow, WithMetadata): ) -@invocation("img_ilerp", title="Inverse Lerp Image", tags=["image", "ilerp"], category="image", version="1.1.0") -class ImageInverseLerpInvocation(BaseInvocation, WithWorkflow, WithMetadata): +@invocation( + "img_ilerp", + title="Inverse Lerp Image", + tags=["image", "ilerp"], + category="image", + version="1.2.0", +) +class ImageInverseLerpInvocation(BaseInvocation, WithMetadata): """Inverse linear interpolation of all pixels of an image""" image: ImageField = InputField(description="The image to lerp") @@ -530,7 +668,7 @@ class ImageInverseLerpInvocation(BaseInvocation, WithWorkflow, WithMetadata): session_id=context.graph_execution_state_id, is_intermediate=self.is_intermediate, metadata=self.metadata, - workflow=self.workflow, + workflow=context.workflow, ) return ImageOutput( @@ -540,8 +678,14 @@ class ImageInverseLerpInvocation(BaseInvocation, WithWorkflow, WithMetadata): ) -@invocation("img_nsfw", title="Blur NSFW Image", tags=["image", "nsfw"], category="image", version="1.1.0") -class ImageNSFWBlurInvocation(BaseInvocation, WithMetadata, WithWorkflow): +@invocation( + "img_nsfw", + title="Blur NSFW Image", + tags=["image", "nsfw"], + category="image", + version="1.2.0", +) +class ImageNSFWBlurInvocation(BaseInvocation, WithMetadata): """Add blur to NSFW-flagged images""" image: ImageField = InputField(description="The image to check") @@ -566,7 +710,7 @@ class ImageNSFWBlurInvocation(BaseInvocation, WithMetadata, WithWorkflow): session_id=context.graph_execution_state_id, is_intermediate=self.is_intermediate, metadata=self.metadata, - workflow=self.workflow, + workflow=context.workflow, ) return ImageOutput( @@ -587,9 +731,9 @@ class ImageNSFWBlurInvocation(BaseInvocation, WithMetadata, WithWorkflow): title="Add Invisible Watermark", tags=["image", "watermark"], category="image", - version="1.1.0", + version="1.2.0", ) -class ImageWatermarkInvocation(BaseInvocation, WithMetadata, WithWorkflow): +class ImageWatermarkInvocation(BaseInvocation, WithMetadata): """Add an invisible watermark to an image""" image: ImageField = InputField(description="The image to check") @@ -606,7 +750,7 @@ class ImageWatermarkInvocation(BaseInvocation, WithMetadata, WithWorkflow): session_id=context.graph_execution_state_id, is_intermediate=self.is_intermediate, metadata=self.metadata, - workflow=self.workflow, + workflow=context.workflow, ) return ImageOutput( @@ -616,8 +760,14 @@ class ImageWatermarkInvocation(BaseInvocation, WithMetadata, WithWorkflow): ) -@invocation("mask_edge", title="Mask Edge", tags=["image", "mask", "inpaint"], category="image", version="1.1.0") -class MaskEdgeInvocation(BaseInvocation, WithWorkflow, WithMetadata): +@invocation( + "mask_edge", + title="Mask Edge", + tags=["image", "mask", "inpaint"], + category="image", + version="1.2.0", +) +class MaskEdgeInvocation(BaseInvocation, WithMetadata): """Applies an edge mask to an image""" image: ImageField = InputField(description="The image to apply the mask to") @@ -652,7 +802,7 @@ class MaskEdgeInvocation(BaseInvocation, WithWorkflow, WithMetadata): session_id=context.graph_execution_state_id, is_intermediate=self.is_intermediate, metadata=self.metadata, - workflow=self.workflow, + workflow=context.workflow, ) return ImageOutput( @@ -667,9 +817,9 @@ class MaskEdgeInvocation(BaseInvocation, WithWorkflow, WithMetadata): title="Combine Masks", tags=["image", "mask", "multiply"], category="image", - version="1.1.0", + version="1.2.0", ) -class MaskCombineInvocation(BaseInvocation, WithWorkflow, WithMetadata): +class MaskCombineInvocation(BaseInvocation, WithMetadata): """Combine two masks together by multiplying them using `PIL.ImageChops.multiply()`.""" mask1: ImageField = InputField(description="The first mask to combine") @@ -689,7 +839,7 @@ class MaskCombineInvocation(BaseInvocation, WithWorkflow, WithMetadata): session_id=context.graph_execution_state_id, is_intermediate=self.is_intermediate, metadata=self.metadata, - workflow=self.workflow, + workflow=context.workflow, ) return ImageOutput( @@ -699,8 +849,14 @@ class MaskCombineInvocation(BaseInvocation, WithWorkflow, WithMetadata): ) -@invocation("color_correct", title="Color Correct", tags=["image", "color"], category="image", version="1.1.0") -class ColorCorrectInvocation(BaseInvocation, WithWorkflow, WithMetadata): +@invocation( + "color_correct", + title="Color Correct", + tags=["image", "color"], + category="image", + version="1.2.0", +) +class ColorCorrectInvocation(BaseInvocation, WithMetadata): """ Shifts the colors of a target image to match the reference image, optionally using a mask to only color-correct certain regions of the target image. @@ -800,7 +956,7 @@ class ColorCorrectInvocation(BaseInvocation, WithWorkflow, WithMetadata): session_id=context.graph_execution_state_id, is_intermediate=self.is_intermediate, metadata=self.metadata, - workflow=self.workflow, + workflow=context.workflow, ) return ImageOutput( @@ -810,8 +966,14 @@ class ColorCorrectInvocation(BaseInvocation, WithWorkflow, WithMetadata): ) -@invocation("img_hue_adjust", title="Adjust Image Hue", tags=["image", "hue"], category="image", version="1.1.0") -class ImageHueAdjustmentInvocation(BaseInvocation, WithWorkflow, WithMetadata): +@invocation( + "img_hue_adjust", + title="Adjust Image Hue", + tags=["image", "hue"], + category="image", + version="1.2.0", +) +class ImageHueAdjustmentInvocation(BaseInvocation, WithMetadata): """Adjusts the Hue of an image.""" image: ImageField = InputField(description="The image to adjust") @@ -840,7 +1002,7 @@ class ImageHueAdjustmentInvocation(BaseInvocation, WithWorkflow, WithMetadata): is_intermediate=self.is_intermediate, session_id=context.graph_execution_state_id, metadata=self.metadata, - workflow=self.workflow, + workflow=context.workflow, ) return ImageOutput( @@ -913,9 +1075,9 @@ CHANNEL_FORMATS = { "value", ], category="image", - version="1.1.0", + version="1.2.0", ) -class ImageChannelOffsetInvocation(BaseInvocation, WithWorkflow, WithMetadata): +class ImageChannelOffsetInvocation(BaseInvocation, WithMetadata): """Add or subtract a value from a specific color channel of an image.""" image: ImageField = InputField(description="The image to adjust") @@ -950,7 +1112,7 @@ class ImageChannelOffsetInvocation(BaseInvocation, WithWorkflow, WithMetadata): is_intermediate=self.is_intermediate, session_id=context.graph_execution_state_id, metadata=self.metadata, - workflow=self.workflow, + workflow=context.workflow, ) return ImageOutput( @@ -984,9 +1146,9 @@ class ImageChannelOffsetInvocation(BaseInvocation, WithWorkflow, WithMetadata): "value", ], category="image", - version="1.1.0", + version="1.2.0", ) -class ImageChannelMultiplyInvocation(BaseInvocation, WithWorkflow, WithMetadata): +class ImageChannelMultiplyInvocation(BaseInvocation, WithMetadata): """Scale a specific color channel of an image.""" image: ImageField = InputField(description="The image to adjust") @@ -1025,7 +1187,7 @@ class ImageChannelMultiplyInvocation(BaseInvocation, WithWorkflow, WithMetadata) node_id=self.id, is_intermediate=self.is_intermediate, session_id=context.graph_execution_state_id, - workflow=self.workflow, + workflow=context.workflow, metadata=self.metadata, ) @@ -1043,10 +1205,10 @@ class ImageChannelMultiplyInvocation(BaseInvocation, WithWorkflow, WithMetadata) title="Save Image", tags=["primitives", "image"], category="primitives", - version="1.1.0", + version="1.2.0", use_cache=False, ) -class SaveImageInvocation(BaseInvocation, WithWorkflow, WithMetadata): +class SaveImageInvocation(BaseInvocation, WithMetadata): """Saves an image. Unlike an image primitive, this invocation stores a copy of the image.""" image: ImageField = InputField(description=FieldDescriptions.image) @@ -1064,7 +1226,7 @@ class SaveImageInvocation(BaseInvocation, WithWorkflow, WithMetadata): session_id=context.graph_execution_state_id, is_intermediate=self.is_intermediate, metadata=self.metadata, - workflow=self.workflow, + workflow=context.workflow, ) return ImageOutput( @@ -1082,7 +1244,7 @@ class SaveImageInvocation(BaseInvocation, WithWorkflow, WithMetadata): version="1.0.1", use_cache=False, ) -class LinearUIOutputInvocation(BaseInvocation, WithWorkflow, WithMetadata): +class LinearUIOutputInvocation(BaseInvocation, WithMetadata): """Handles Linear UI Image Outputting tasks.""" image: ImageField = InputField(description=FieldDescriptions.image) diff --git a/invokeai/app/invocations/infill.py b/invokeai/app/invocations/infill.py index 0822a4ce2d..c3d00bb133 100644 --- a/invokeai/app/invocations/infill.py +++ b/invokeai/app/invocations/infill.py @@ -13,7 +13,7 @@ from invokeai.backend.image_util.cv2_inpaint import cv2_inpaint from invokeai.backend.image_util.lama import LaMA from invokeai.backend.image_util.patchmatch import PatchMatch -from .baseinvocation import BaseInvocation, InputField, InvocationContext, WithMetadata, WithWorkflow, invocation +from .baseinvocation import BaseInvocation, InputField, InvocationContext, WithMetadata, invocation from .image import PIL_RESAMPLING_MAP, PIL_RESAMPLING_MODES @@ -118,8 +118,8 @@ def tile_fill_missing(im: Image.Image, tile_size: int = 16, seed: Optional[int] return si -@invocation("infill_rgba", title="Solid Color Infill", tags=["image", "inpaint"], category="inpaint", version="1.1.0") -class InfillColorInvocation(BaseInvocation, WithWorkflow, WithMetadata): +@invocation("infill_rgba", title="Solid Color Infill", tags=["image", "inpaint"], category="inpaint", version="1.2.0") +class InfillColorInvocation(BaseInvocation, WithMetadata): """Infills transparent areas of an image with a solid color""" image: ImageField = InputField(description="The image to infill") @@ -144,7 +144,7 @@ class InfillColorInvocation(BaseInvocation, WithWorkflow, WithMetadata): session_id=context.graph_execution_state_id, is_intermediate=self.is_intermediate, metadata=self.metadata, - workflow=self.workflow, + workflow=context.workflow, ) return ImageOutput( @@ -154,8 +154,8 @@ class InfillColorInvocation(BaseInvocation, WithWorkflow, WithMetadata): ) -@invocation("infill_tile", title="Tile Infill", tags=["image", "inpaint"], category="inpaint", version="1.1.1") -class InfillTileInvocation(BaseInvocation, WithWorkflow, WithMetadata): +@invocation("infill_tile", title="Tile Infill", tags=["image", "inpaint"], category="inpaint", version="1.2.1") +class InfillTileInvocation(BaseInvocation, WithMetadata): """Infills transparent areas of an image with tiles of the image""" image: ImageField = InputField(description="The image to infill") @@ -181,7 +181,7 @@ class InfillTileInvocation(BaseInvocation, WithWorkflow, WithMetadata): session_id=context.graph_execution_state_id, is_intermediate=self.is_intermediate, metadata=self.metadata, - workflow=self.workflow, + workflow=context.workflow, ) return ImageOutput( @@ -192,9 +192,9 @@ class InfillTileInvocation(BaseInvocation, WithWorkflow, WithMetadata): @invocation( - "infill_patchmatch", title="PatchMatch Infill", tags=["image", "inpaint"], category="inpaint", version="1.1.0" + "infill_patchmatch", title="PatchMatch Infill", tags=["image", "inpaint"], category="inpaint", version="1.2.0" ) -class InfillPatchMatchInvocation(BaseInvocation, WithWorkflow, WithMetadata): +class InfillPatchMatchInvocation(BaseInvocation, WithMetadata): """Infills transparent areas of an image using the PatchMatch algorithm""" image: ImageField = InputField(description="The image to infill") @@ -235,7 +235,7 @@ class InfillPatchMatchInvocation(BaseInvocation, WithWorkflow, WithMetadata): session_id=context.graph_execution_state_id, is_intermediate=self.is_intermediate, metadata=self.metadata, - workflow=self.workflow, + workflow=context.workflow, ) return ImageOutput( @@ -245,8 +245,8 @@ class InfillPatchMatchInvocation(BaseInvocation, WithWorkflow, WithMetadata): ) -@invocation("infill_lama", title="LaMa Infill", tags=["image", "inpaint"], category="inpaint", version="1.1.0") -class LaMaInfillInvocation(BaseInvocation, WithWorkflow, WithMetadata): +@invocation("infill_lama", title="LaMa Infill", tags=["image", "inpaint"], category="inpaint", version="1.2.0") +class LaMaInfillInvocation(BaseInvocation, WithMetadata): """Infills transparent areas of an image using the LaMa model""" image: ImageField = InputField(description="The image to infill") @@ -264,7 +264,7 @@ class LaMaInfillInvocation(BaseInvocation, WithWorkflow, WithMetadata): session_id=context.graph_execution_state_id, is_intermediate=self.is_intermediate, metadata=self.metadata, - workflow=self.workflow, + workflow=context.workflow, ) return ImageOutput( @@ -274,8 +274,8 @@ class LaMaInfillInvocation(BaseInvocation, WithWorkflow, WithMetadata): ) -@invocation("infill_cv2", title="CV2 Infill", tags=["image", "inpaint"], category="inpaint", version="1.1.0") -class CV2InfillInvocation(BaseInvocation, WithWorkflow, WithMetadata): +@invocation("infill_cv2", title="CV2 Infill", tags=["image", "inpaint"], category="inpaint", version="1.2.0") +class CV2InfillInvocation(BaseInvocation, WithMetadata): """Infills transparent areas of an image using OpenCV Inpainting""" image: ImageField = InputField(description="The image to infill") @@ -293,7 +293,7 @@ class CV2InfillInvocation(BaseInvocation, WithWorkflow, WithMetadata): session_id=context.graph_execution_state_id, is_intermediate=self.is_intermediate, metadata=self.metadata, - workflow=self.workflow, + workflow=context.workflow, ) return ImageOutput( diff --git a/invokeai/app/invocations/ip_adapter.py b/invokeai/app/invocations/ip_adapter.py index e0f582eab8..6bd2889624 100644 --- a/invokeai/app/invocations/ip_adapter.py +++ b/invokeai/app/invocations/ip_adapter.py @@ -2,7 +2,7 @@ import os from builtins import float from typing import List, Union -from pydantic import BaseModel, ConfigDict, Field +from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator from invokeai.app.invocations.baseinvocation import ( BaseInvocation, @@ -15,6 +15,7 @@ from invokeai.app.invocations.baseinvocation import ( invocation_output, ) from invokeai.app.invocations.primitives import ImageField +from invokeai.app.invocations.util import validate_begin_end_step, validate_weights from invokeai.app.shared.fields import FieldDescriptions from invokeai.backend.model_management.models.base import BaseModelType, ModelType from invokeai.backend.model_management.models.ip_adapter import get_ip_adapter_image_encoder_model_id @@ -39,7 +40,6 @@ class IPAdapterField(BaseModel): ip_adapter_model: IPAdapterModelField = Field(description="The IP-Adapter model to use.") image_encoder_model: CLIPVisionModelField = Field(description="The name of the CLIP image encoder model.") weight: Union[float, List[float]] = Field(default=1, description="The weight given to the ControlNet") - # weight: float = Field(default=1.0, ge=0, description="The weight of the IP-Adapter.") begin_step_percent: float = Field( default=0, ge=0, le=1, description="When the IP-Adapter is first applied (% of total steps)" ) @@ -47,6 +47,17 @@ class IPAdapterField(BaseModel): default=1, ge=0, le=1, description="When the IP-Adapter is last applied (% of total steps)" ) + @field_validator("weight") + @classmethod + def validate_ip_adapter_weight(cls, v): + validate_weights(v) + return v + + @model_validator(mode="after") + def validate_begin_end_step_percent(self): + validate_begin_end_step(self.begin_step_percent, self.end_step_percent) + return self + @invocation_output("ip_adapter_output") class IPAdapterOutput(BaseInvocationOutput): @@ -54,7 +65,7 @@ class IPAdapterOutput(BaseInvocationOutput): ip_adapter: IPAdapterField = OutputField(description=FieldDescriptions.ip_adapter, title="IP-Adapter") -@invocation("ip_adapter", title="IP-Adapter", tags=["ip_adapter", "control"], category="ip_adapter", version="1.1.0") +@invocation("ip_adapter", title="IP-Adapter", tags=["ip_adapter", "control"], category="ip_adapter", version="1.1.1") class IPAdapterInvocation(BaseInvocation): """Collects IP-Adapter info to pass to other nodes.""" @@ -64,18 +75,27 @@ class IPAdapterInvocation(BaseInvocation): description="The IP-Adapter model.", title="IP-Adapter Model", input=Input.Direct, ui_order=-1 ) - # weight: float = InputField(default=1.0, description="The weight of the IP-Adapter.", ui_type=UIType.Float) weight: Union[float, List[float]] = InputField( - default=1, ge=-1, description="The weight given to the IP-Adapter", title="Weight" + default=1, description="The weight given to the IP-Adapter", title="Weight" ) - begin_step_percent: float = InputField( - default=0, ge=-1, le=2, description="When the IP-Adapter is first applied (% of total steps)" + default=0, ge=0, le=1, description="When the IP-Adapter is first applied (% of total steps)" ) end_step_percent: float = InputField( default=1, ge=0, le=1, description="When the IP-Adapter is last applied (% of total steps)" ) + @field_validator("weight") + @classmethod + def validate_ip_adapter_weight(cls, v): + validate_weights(v) + return v + + @model_validator(mode="after") + def validate_begin_end_step_percent(self): + validate_begin_end_step(self.begin_step_percent, self.end_step_percent) + return self + def invoke(self, context: InvocationContext) -> IPAdapterOutput: # Lookup the CLIP Vision encoder that is intended to be used with the IP-Adapter model. ip_adapter_info = context.services.model_manager.model_info( diff --git a/invokeai/app/invocations/latent.py b/invokeai/app/invocations/latent.py index 218e05a986..9b93cf0a3d 100644 --- a/invokeai/app/invocations/latent.py +++ b/invokeai/app/invocations/latent.py @@ -64,7 +64,6 @@ from .baseinvocation import ( OutputField, UIType, WithMetadata, - WithWorkflow, invocation, invocation_output, ) @@ -221,7 +220,7 @@ def get_scheduler( title="Denoise Latents", tags=["latents", "denoise", "txt2img", "t2i", "t2l", "img2img", "i2i", "l2l"], category="latents", - version="1.5.0", + version="1.5.1", ) class DenoiseLatentsInvocation(BaseInvocation): """Denoises noisy latents to decodable images""" @@ -280,7 +279,7 @@ class DenoiseLatentsInvocation(BaseInvocation): ui_order=7, ) cfg_rescale_multiplier: float = InputField( - default=0, ge=0, lt=1, description=FieldDescriptions.cfg_rescale_multiplier + title="CFG Rescale Multiplier", default=0, ge=0, lt=1, description=FieldDescriptions.cfg_rescale_multiplier ) latents: Optional[LatentsField] = InputField( default=None, @@ -802,9 +801,9 @@ class DenoiseLatentsInvocation(BaseInvocation): title="Latents to Image", tags=["latents", "image", "vae", "l2i"], category="latents", - version="1.1.0", + version="1.2.0", ) -class LatentsToImageInvocation(BaseInvocation, WithMetadata, WithWorkflow): +class LatentsToImageInvocation(BaseInvocation, WithMetadata): """Generates an image from latents.""" latents: LatentsField = InputField( @@ -886,7 +885,7 @@ class LatentsToImageInvocation(BaseInvocation, WithMetadata, WithWorkflow): session_id=context.graph_execution_state_id, is_intermediate=self.is_intermediate, metadata=self.metadata, - workflow=self.workflow, + workflow=context.workflow, ) return ImageOutput( diff --git a/invokeai/app/invocations/onnx.py b/invokeai/app/invocations/onnx.py index 37b63fe692..759cfde700 100644 --- a/invokeai/app/invocations/onnx.py +++ b/invokeai/app/invocations/onnx.py @@ -1,7 +1,6 @@ # Copyright (c) 2023 Borisov Sergey (https://github.com/StAlKeR7779) import inspect -import re # from contextlib import ExitStack from typing import List, Literal, Union @@ -21,6 +20,7 @@ from invokeai.backend import BaseModelType, ModelType, SubModelType from ...backend.model_management import ONNXModelPatcher from ...backend.stable_diffusion import PipelineIntermediateState from ...backend.util import choose_torch_device +from ..util.ti_utils import extract_ti_triggers_from_prompt from .baseinvocation import ( BaseInvocation, BaseInvocationOutput, @@ -31,7 +31,6 @@ from .baseinvocation import ( UIComponent, UIType, WithMetadata, - WithWorkflow, invocation, invocation_output, ) @@ -79,7 +78,7 @@ class ONNXPromptInvocation(BaseInvocation): ] ti_list = [] - for trigger in re.findall(r"<[a-zA-Z0-9., _-]+>", self.prompt): + for trigger in extract_ti_triggers_from_prompt(self.prompt): name = trigger[1:-1] try: ti_list.append( @@ -326,9 +325,9 @@ class ONNXTextToLatentsInvocation(BaseInvocation): title="ONNX Latents to Image", tags=["latents", "image", "vae", "onnx"], category="image", - version="1.1.0", + version="1.2.0", ) -class ONNXLatentsToImageInvocation(BaseInvocation, WithMetadata, WithWorkflow): +class ONNXLatentsToImageInvocation(BaseInvocation, WithMetadata): """Generates an image from latents.""" latents: LatentsField = InputField( @@ -378,7 +377,7 @@ class ONNXLatentsToImageInvocation(BaseInvocation, WithMetadata, WithWorkflow): session_id=context.graph_execution_state_id, is_intermediate=self.is_intermediate, metadata=self.metadata, - workflow=self.workflow, + workflow=context.workflow, ) return ImageOutput( diff --git a/invokeai/app/invocations/t2i_adapter.py b/invokeai/app/invocations/t2i_adapter.py index 2412a00079..e055d23903 100644 --- a/invokeai/app/invocations/t2i_adapter.py +++ b/invokeai/app/invocations/t2i_adapter.py @@ -1,6 +1,6 @@ from typing import Union -from pydantic import BaseModel, ConfigDict, Field +from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator from invokeai.app.invocations.baseinvocation import ( BaseInvocation, @@ -14,6 +14,7 @@ from invokeai.app.invocations.baseinvocation import ( ) from invokeai.app.invocations.controlnet_image_processors import CONTROLNET_RESIZE_VALUES from invokeai.app.invocations.primitives import ImageField +from invokeai.app.invocations.util import validate_begin_end_step, validate_weights from invokeai.app.shared.fields import FieldDescriptions from invokeai.backend.model_management.models.base import BaseModelType @@ -37,6 +38,17 @@ class T2IAdapterField(BaseModel): ) resize_mode: CONTROLNET_RESIZE_VALUES = Field(default="just_resize", description="The resize mode to use") + @field_validator("weight") + @classmethod + def validate_ip_adapter_weight(cls, v): + validate_weights(v) + return v + + @model_validator(mode="after") + def validate_begin_end_step_percent(self): + validate_begin_end_step(self.begin_step_percent, self.end_step_percent) + return self + @invocation_output("t2i_adapter_output") class T2IAdapterOutput(BaseInvocationOutput): @@ -44,7 +56,7 @@ class T2IAdapterOutput(BaseInvocationOutput): @invocation( - "t2i_adapter", title="T2I-Adapter", tags=["t2i_adapter", "control"], category="t2i_adapter", version="1.0.0" + "t2i_adapter", title="T2I-Adapter", tags=["t2i_adapter", "control"], category="t2i_adapter", version="1.0.1" ) class T2IAdapterInvocation(BaseInvocation): """Collects T2I-Adapter info to pass to other nodes.""" @@ -61,7 +73,7 @@ class T2IAdapterInvocation(BaseInvocation): default=1, ge=0, description="The weight given to the T2I-Adapter", title="Weight" ) begin_step_percent: float = InputField( - default=0, ge=-1, le=2, description="When the T2I-Adapter is first applied (% of total steps)" + default=0, ge=0, le=1, description="When the T2I-Adapter is first applied (% of total steps)" ) end_step_percent: float = InputField( default=1, ge=0, le=1, description="When the T2I-Adapter is last applied (% of total steps)" @@ -71,6 +83,17 @@ class T2IAdapterInvocation(BaseInvocation): description="The resize mode applied to the T2I-Adapter input image so that it matches the target output size.", ) + @field_validator("weight") + @classmethod + def validate_ip_adapter_weight(cls, v): + validate_weights(v) + return v + + @model_validator(mode="after") + def validate_begin_end_step_percent(self): + validate_begin_end_step(self.begin_step_percent, self.end_step_percent) + return self + def invoke(self, context: InvocationContext) -> T2IAdapterOutput: return T2IAdapterOutput( t2i_adapter=T2IAdapterField( diff --git a/invokeai/app/invocations/tiles.py b/invokeai/app/invocations/tiles.py index 3055c1baae..e51f891a8d 100644 --- a/invokeai/app/invocations/tiles.py +++ b/invokeai/app/invocations/tiles.py @@ -1,3 +1,5 @@ +from typing import Literal + import numpy as np from PIL import Image from pydantic import BaseModel @@ -5,17 +7,24 @@ from pydantic import BaseModel from invokeai.app.invocations.baseinvocation import ( BaseInvocation, BaseInvocationOutput, + Classification, + Input, InputField, InvocationContext, OutputField, WithMetadata, - WithWorkflow, invocation, invocation_output, ) from invokeai.app.invocations.primitives import ImageField, ImageOutput from invokeai.app.services.image_records.image_records_common import ImageCategory, ResourceOrigin -from invokeai.backend.tiles.tiles import calc_tiles_with_overlap, merge_tiles_with_linear_blending +from invokeai.backend.tiles.tiles import ( + calc_tiles_even_split, + calc_tiles_min_overlap, + calc_tiles_with_overlap, + merge_tiles_with_linear_blending, + merge_tiles_with_seam_blending, +) from invokeai.backend.tiles.utils import Tile @@ -29,7 +38,14 @@ class CalculateImageTilesOutput(BaseInvocationOutput): tiles: list[Tile] = OutputField(description="The tiles coordinates that cover a particular image shape.") -@invocation("calculate_image_tiles", title="Calculate Image Tiles", tags=["tiles"], category="tiles", version="1.0.0") +@invocation( + "calculate_image_tiles", + title="Calculate Image Tiles", + tags=["tiles"], + category="tiles", + version="1.0.0", + classification=Classification.Beta, +) class CalculateImageTilesInvocation(BaseInvocation): """Calculate the coordinates and overlaps of tiles that cover a target image shape.""" @@ -56,6 +72,79 @@ class CalculateImageTilesInvocation(BaseInvocation): return CalculateImageTilesOutput(tiles=tiles) +@invocation( + "calculate_image_tiles_even_split", + title="Calculate Image Tiles Even Split", + tags=["tiles"], + category="tiles", + version="1.1.0", + classification=Classification.Beta, +) +class CalculateImageTilesEvenSplitInvocation(BaseInvocation): + """Calculate the coordinates and overlaps of tiles that cover a target image shape.""" + + image_width: int = InputField(ge=1, default=1024, description="The image width, in pixels, to calculate tiles for.") + image_height: int = InputField( + ge=1, default=1024, description="The image height, in pixels, to calculate tiles for." + ) + num_tiles_x: int = InputField( + default=2, + ge=1, + description="Number of tiles to divide image into on the x axis", + ) + num_tiles_y: int = InputField( + default=2, + ge=1, + description="Number of tiles to divide image into on the y axis", + ) + overlap: int = InputField( + default=128, + ge=0, + multiple_of=8, + description="The overlap, in pixels, between adjacent tiles.", + ) + + def invoke(self, context: InvocationContext) -> CalculateImageTilesOutput: + tiles = calc_tiles_even_split( + image_height=self.image_height, + image_width=self.image_width, + num_tiles_x=self.num_tiles_x, + num_tiles_y=self.num_tiles_y, + overlap=self.overlap, + ) + return CalculateImageTilesOutput(tiles=tiles) + + +@invocation( + "calculate_image_tiles_min_overlap", + title="Calculate Image Tiles Minimum Overlap", + tags=["tiles"], + category="tiles", + version="1.0.0", + classification=Classification.Beta, +) +class CalculateImageTilesMinimumOverlapInvocation(BaseInvocation): + """Calculate the coordinates and overlaps of tiles that cover a target image shape.""" + + image_width: int = InputField(ge=1, default=1024, description="The image width, in pixels, to calculate tiles for.") + image_height: int = InputField( + ge=1, default=1024, description="The image height, in pixels, to calculate tiles for." + ) + tile_width: int = InputField(ge=1, default=576, description="The tile width, in pixels.") + tile_height: int = InputField(ge=1, default=576, description="The tile height, in pixels.") + min_overlap: int = InputField(default=128, ge=0, description="Minimum overlap between adjacent tiles, in pixels.") + + def invoke(self, context: InvocationContext) -> CalculateImageTilesOutput: + tiles = calc_tiles_min_overlap( + image_height=self.image_height, + image_width=self.image_width, + tile_height=self.tile_height, + tile_width=self.tile_width, + min_overlap=self.min_overlap, + ) + return CalculateImageTilesOutput(tiles=tiles) + + @invocation_output("tile_to_properties_output") class TileToPropertiesOutput(BaseInvocationOutput): coords_left: int = OutputField(description="Left coordinate of the tile relative to its parent image.") @@ -77,7 +166,14 @@ class TileToPropertiesOutput(BaseInvocationOutput): overlap_right: int = OutputField(description="Overlap between this tile and its right neighbor.") -@invocation("tile_to_properties", title="Tile to Properties", tags=["tiles"], category="tiles", version="1.0.0") +@invocation( + "tile_to_properties", + title="Tile to Properties", + tags=["tiles"], + category="tiles", + version="1.0.0", + classification=Classification.Beta, +) class TileToPropertiesInvocation(BaseInvocation): """Split a Tile into its individual properties.""" @@ -103,7 +199,14 @@ class PairTileImageOutput(BaseInvocationOutput): tile_with_image: TileWithImage = OutputField(description="A tile description with its corresponding image.") -@invocation("pair_tile_image", title="Pair Tile with Image", tags=["tiles"], category="tiles", version="1.0.0") +@invocation( + "pair_tile_image", + title="Pair Tile with Image", + tags=["tiles"], + category="tiles", + version="1.0.0", + classification=Classification.Beta, +) class PairTileImageInvocation(BaseInvocation): """Pair an image with its tile properties.""" @@ -122,13 +225,29 @@ class PairTileImageInvocation(BaseInvocation): ) -@invocation("merge_tiles_to_image", title="Merge Tiles to Image", tags=["tiles"], category="tiles", version="1.0.0") -class MergeTilesToImageInvocation(BaseInvocation, WithMetadata, WithWorkflow): +BLEND_MODES = Literal["Linear", "Seam"] + + +@invocation( + "merge_tiles_to_image", + title="Merge Tiles to Image", + tags=["tiles"], + category="tiles", + version="1.1.0", + classification=Classification.Beta, +) +class MergeTilesToImageInvocation(BaseInvocation, WithMetadata): """Merge multiple tile images into a single image.""" # Inputs tiles_with_images: list[TileWithImage] = InputField(description="A list of tile images with tile properties.") + blend_mode: BLEND_MODES = InputField( + default="Seam", + description="blending type Linear or Seam", + input=Input.Direct, + ) blend_amount: int = InputField( + default=32, ge=0, description="The amount to blend adjacent tiles in pixels. Must be <= the amount of overlap between adjacent tiles.", ) @@ -158,10 +277,18 @@ class MergeTilesToImageInvocation(BaseInvocation, WithMetadata, WithWorkflow): channels = tile_np_images[0].shape[-1] dtype = tile_np_images[0].dtype np_image = np.zeros(shape=(height, width, channels), dtype=dtype) + if self.blend_mode == "Linear": + merge_tiles_with_linear_blending( + dst_image=np_image, tiles=tiles, tile_images=tile_np_images, blend_amount=self.blend_amount + ) + elif self.blend_mode == "Seam": + merge_tiles_with_seam_blending( + dst_image=np_image, tiles=tiles, tile_images=tile_np_images, blend_amount=self.blend_amount + ) + else: + raise ValueError(f"Unsupported blend mode: '{self.blend_mode}'.") - merge_tiles_with_linear_blending( - dst_image=np_image, tiles=tiles, tile_images=tile_np_images, blend_amount=self.blend_amount - ) + # Convert into a PIL image and save pil_image = Image.fromarray(np_image) image_dto = context.services.images.create( @@ -172,7 +299,7 @@ class MergeTilesToImageInvocation(BaseInvocation, WithMetadata, WithWorkflow): session_id=context.graph_execution_state_id, is_intermediate=self.is_intermediate, metadata=self.metadata, - workflow=self.workflow, + workflow=context.workflow, ) return ImageOutput( image=ImageField(image_name=image_dto.image_name), diff --git a/invokeai/app/invocations/upscale.py b/invokeai/app/invocations/upscale.py index 0f699b2d15..fa86dead55 100644 --- a/invokeai/app/invocations/upscale.py +++ b/invokeai/app/invocations/upscale.py @@ -14,7 +14,7 @@ from invokeai.app.services.image_records.image_records_common import ImageCatego from invokeai.backend.image_util.realesrgan.realesrgan import RealESRGAN from invokeai.backend.util.devices import choose_torch_device -from .baseinvocation import BaseInvocation, InputField, InvocationContext, WithMetadata, WithWorkflow, invocation +from .baseinvocation import BaseInvocation, InputField, InvocationContext, WithMetadata, invocation # TODO: Populate this from disk? # TODO: Use model manager to load? @@ -29,8 +29,8 @@ if choose_torch_device() == torch.device("mps"): from torch import mps -@invocation("esrgan", title="Upscale (RealESRGAN)", tags=["esrgan", "upscale"], category="esrgan", version="1.2.0") -class ESRGANInvocation(BaseInvocation, WithWorkflow, WithMetadata): +@invocation("esrgan", title="Upscale (RealESRGAN)", tags=["esrgan", "upscale"], category="esrgan", version="1.3.0") +class ESRGANInvocation(BaseInvocation, WithMetadata): """Upscales an image using RealESRGAN.""" image: ImageField = InputField(description="The input image") @@ -118,7 +118,7 @@ class ESRGANInvocation(BaseInvocation, WithWorkflow, WithMetadata): session_id=context.graph_execution_state_id, is_intermediate=self.is_intermediate, metadata=self.metadata, - workflow=self.workflow, + workflow=context.workflow, ) return ImageOutput( diff --git a/invokeai/app/invocations/util.py b/invokeai/app/invocations/util.py new file mode 100644 index 0000000000..c69c32eed0 --- /dev/null +++ b/invokeai/app/invocations/util.py @@ -0,0 +1,14 @@ +from typing import Union + + +def validate_weights(weights: Union[float, list[float]]) -> None: + """Validate that all control weights in the valid range""" + to_validate = weights if isinstance(weights, list) else [weights] + if any(i < -1 or i > 2 for i in to_validate): + raise ValueError("Control weights must be within -1 to 2 range") + + +def validate_begin_end_step(begin_step_percent: float, end_step_percent: float) -> None: + """Validate that begin_step_percent is less than end_step_percent""" + if begin_step_percent >= end_step_percent: + raise ValueError("Begin step percent must be less than or equal to end step percent") diff --git a/invokeai/app/services/board_image_records/board_image_records_sqlite.py b/invokeai/app/services/board_image_records/board_image_records_sqlite.py index 02bafd00ec..cde810a739 100644 --- a/invokeai/app/services/board_image_records/board_image_records_sqlite.py +++ b/invokeai/app/services/board_image_records/board_image_records_sqlite.py @@ -4,7 +4,7 @@ from typing import Optional, cast from invokeai.app.services.image_records.image_records_common import ImageRecord, deserialize_image_record from invokeai.app.services.shared.pagination import OffsetPaginatedResults -from invokeai.app.services.shared.sqlite import SqliteDatabase +from invokeai.app.services.shared.sqlite.sqlite_database import SqliteDatabase from .board_image_records_base import BoardImageRecordStorageBase @@ -20,63 +20,6 @@ class SqliteBoardImageRecordStorage(BoardImageRecordStorageBase): self._conn = db.conn self._cursor = self._conn.cursor() - try: - self._lock.acquire() - self._create_tables() - self._conn.commit() - finally: - self._lock.release() - - def _create_tables(self) -> None: - """Creates the `board_images` junction table.""" - - # Create the `board_images` junction table. - self._cursor.execute( - """--sql - CREATE TABLE IF NOT EXISTS board_images ( - board_id TEXT NOT NULL, - image_name TEXT NOT NULL, - created_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), - -- updated via trigger - updated_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), - -- Soft delete, currently unused - deleted_at DATETIME, - -- enforce one-to-many relationship between boards and images using PK - -- (we can extend this to many-to-many later) - PRIMARY KEY (image_name), - FOREIGN KEY (board_id) REFERENCES boards (board_id) ON DELETE CASCADE, - FOREIGN KEY (image_name) REFERENCES images (image_name) ON DELETE CASCADE - ); - """ - ) - - # Add index for board id - self._cursor.execute( - """--sql - CREATE INDEX IF NOT EXISTS idx_board_images_board_id ON board_images (board_id); - """ - ) - - # Add index for board id, sorted by created_at - self._cursor.execute( - """--sql - CREATE INDEX IF NOT EXISTS idx_board_images_board_id_created_at ON board_images (board_id, created_at); - """ - ) - - # Add trigger for `updated_at`. - self._cursor.execute( - """--sql - CREATE TRIGGER IF NOT EXISTS tg_board_images_updated_at - AFTER UPDATE - ON board_images FOR EACH ROW - BEGIN - UPDATE board_images SET updated_at = STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') - WHERE board_id = old.board_id AND image_name = old.image_name; - END; - """ - ) - def add_image_to_board( self, board_id: str, diff --git a/invokeai/app/services/board_records/board_records_sqlite.py b/invokeai/app/services/board_records/board_records_sqlite.py index ef507def2a..a3836cb6c7 100644 --- a/invokeai/app/services/board_records/board_records_sqlite.py +++ b/invokeai/app/services/board_records/board_records_sqlite.py @@ -3,7 +3,7 @@ import threading from typing import Union, cast from invokeai.app.services.shared.pagination import OffsetPaginatedResults -from invokeai.app.services.shared.sqlite import SqliteDatabase +from invokeai.app.services.shared.sqlite.sqlite_database import SqliteDatabase from invokeai.app.util.misc import uuid_string from .board_records_base import BoardRecordStorageBase @@ -28,52 +28,6 @@ class SqliteBoardRecordStorage(BoardRecordStorageBase): self._conn = db.conn self._cursor = self._conn.cursor() - try: - self._lock.acquire() - self._create_tables() - self._conn.commit() - finally: - self._lock.release() - - def _create_tables(self) -> None: - """Creates the `boards` table and `board_images` junction table.""" - - # Create the `boards` table. - self._cursor.execute( - """--sql - CREATE TABLE IF NOT EXISTS boards ( - board_id TEXT NOT NULL PRIMARY KEY, - board_name TEXT NOT NULL, - cover_image_name TEXT, - created_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), - -- Updated via trigger - updated_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), - -- Soft delete, currently unused - deleted_at DATETIME, - FOREIGN KEY (cover_image_name) REFERENCES images (image_name) ON DELETE SET NULL - ); - """ - ) - - self._cursor.execute( - """--sql - CREATE INDEX IF NOT EXISTS idx_boards_created_at ON boards (created_at); - """ - ) - - # Add trigger for `updated_at`. - self._cursor.execute( - """--sql - CREATE TRIGGER IF NOT EXISTS tg_boards_updated_at - AFTER UPDATE - ON boards FOR EACH ROW - BEGIN - UPDATE boards SET updated_at = current_timestamp - WHERE board_id = old.board_id; - END; - """ - ) - def delete(self, board_id: str) -> None: try: self._lock.acquire() diff --git a/invokeai/app/services/config/__init__.py b/invokeai/app/services/config/__init__.py index b9a92b03d2..105793a220 100644 --- a/invokeai/app/services/config/__init__.py +++ b/invokeai/app/services/config/__init__.py @@ -1,6 +1,7 @@ -""" -Init file for InvokeAI configure package -""" +"""Init file for InvokeAI configure package.""" -from .config_base import PagingArgumentParser # noqa F401 -from .config_default import InvokeAIAppConfig, get_invokeai_config # noqa F401 +from invokeai.app.services.config.config_common import PagingArgumentParser + +from .config_default import InvokeAIAppConfig, get_invokeai_config + +__all__ = ["InvokeAIAppConfig", "get_invokeai_config", "PagingArgumentParser"] diff --git a/invokeai/app/services/config/config_default.py b/invokeai/app/services/config/config_default.py index f9a561325d..83a831524d 100644 --- a/invokeai/app/services/config/config_default.py +++ b/invokeai/app/services/config/config_default.py @@ -173,7 +173,7 @@ from __future__ import annotations import os from pathlib import Path -from typing import ClassVar, Dict, List, Literal, Optional, Union, get_type_hints +from typing import Any, ClassVar, Dict, List, Literal, Optional, Union, get_type_hints from omegaconf import DictConfig, OmegaConf from pydantic import Field, TypeAdapter @@ -209,7 +209,7 @@ class InvokeAIAppConfig(InvokeAISettings): """Configuration object for InvokeAI App.""" singleton_config: ClassVar[Optional[InvokeAIAppConfig]] = None - singleton_init: ClassVar[Optional[Dict]] = None + singleton_init: ClassVar[Optional[Dict[str, Any]]] = None # fmt: off type: Literal["InvokeAI"] = "InvokeAI" @@ -221,6 +221,9 @@ class InvokeAIAppConfig(InvokeAISettings): allow_credentials : bool = Field(default=True, description="Allow CORS credentials", json_schema_extra=Categories.WebServer) allow_methods : List[str] = Field(default=["*"], description="Methods allowed for CORS", json_schema_extra=Categories.WebServer) allow_headers : List[str] = Field(default=["*"], description="Headers allowed for CORS", json_schema_extra=Categories.WebServer) + # SSL options correspond to https://www.uvicorn.org/settings/#https + ssl_certfile : Optional[Path] = Field(default=None, description="SSL certificate file (for HTTPS)", json_schema_extra=Categories.WebServer) + ssl_keyfile : Optional[Path] = Field(default=None, description="SSL key file", json_schema_extra=Categories.WebServer) # FEATURES esrgan : bool = Field(default=True, description="Enable/disable upscaling code", json_schema_extra=Categories.Features) @@ -260,7 +263,7 @@ class InvokeAIAppConfig(InvokeAISettings): # DEVICE device : Literal["auto", "cpu", "cuda", "cuda:1", "mps"] = Field(default="auto", description="Generation device", json_schema_extra=Categories.Device) - precision : Literal["auto", "float16", "float32", "autocast"] = Field(default="auto", description="Floating point precision", json_schema_extra=Categories.Device) + precision : Literal["auto", "float16", "bfloat16", "float32", "autocast"] = Field(default="auto", description="Floating point precision", json_schema_extra=Categories.Device) # GENERATION sequential_guidance : bool = Field(default=False, description="Whether to calculate guidance in serial instead of in parallel, lowering memory requirements", json_schema_extra=Categories.Generation) @@ -298,8 +301,8 @@ class InvokeAIAppConfig(InvokeAISettings): self, argv: Optional[list[str]] = None, conf: Optional[DictConfig] = None, - clobber=False, - ): + clobber: Optional[bool] = False, + ) -> None: """ Update settings with contents of init file, environment, and command-line settings. @@ -334,7 +337,7 @@ class InvokeAIAppConfig(InvokeAISettings): ) @classmethod - def get_config(cls, **kwargs) -> InvokeAIAppConfig: + def get_config(cls, **kwargs: Any) -> InvokeAIAppConfig: """Return a singleton InvokeAIAppConfig configuration object.""" if ( cls.singleton_config is None @@ -353,7 +356,7 @@ class InvokeAIAppConfig(InvokeAISettings): else: root = self.find_root().expanduser().absolute() self.root = root # insulate ourselves from relative paths that may change - return root + return root.resolve() @property def root_dir(self) -> Path: @@ -383,17 +386,17 @@ class InvokeAIAppConfig(InvokeAISettings): return db_dir / DB_FILE @property - def model_conf_path(self) -> Optional[Path]: + def model_conf_path(self) -> Path: """Path to models configuration file.""" return self._resolve(self.conf_path) @property - def legacy_conf_path(self) -> Optional[Path]: + def legacy_conf_path(self) -> Path: """Path to directory of legacy configuration files (e.g. v1-inference.yaml).""" return self._resolve(self.legacy_conf_dir) @property - def models_path(self) -> Optional[Path]: + def models_path(self) -> Path: """Path to the models directory.""" return self._resolve(self.models_dir) @@ -452,7 +455,7 @@ class InvokeAIAppConfig(InvokeAISettings): return _find_root() -def get_invokeai_config(**kwargs) -> InvokeAIAppConfig: +def get_invokeai_config(**kwargs: Any) -> InvokeAIAppConfig: """Legacy function which returns InvokeAIAppConfig.get_config().""" return InvokeAIAppConfig.get_config(**kwargs) diff --git a/invokeai/app/services/download/__init__.py b/invokeai/app/services/download/__init__.py new file mode 100644 index 0000000000..04c1dfdb1d --- /dev/null +++ b/invokeai/app/services/download/__init__.py @@ -0,0 +1,12 @@ +"""Init file for download queue.""" +from .download_base import DownloadJob, DownloadJobStatus, DownloadQueueServiceBase, UnknownJobIDException +from .download_default import DownloadQueueService, TqdmProgress + +__all__ = [ + "DownloadJob", + "DownloadQueueServiceBase", + "DownloadQueueService", + "TqdmProgress", + "DownloadJobStatus", + "UnknownJobIDException", +] diff --git a/invokeai/app/services/download/download_base.py b/invokeai/app/services/download/download_base.py new file mode 100644 index 0000000000..f854f64f58 --- /dev/null +++ b/invokeai/app/services/download/download_base.py @@ -0,0 +1,262 @@ +# Copyright (c) 2023 Lincoln D. Stein and the InvokeAI Development Team +"""Model download service.""" + +from abc import ABC, abstractmethod +from enum import Enum +from functools import total_ordering +from pathlib import Path +from typing import Any, Callable, List, Optional + +from pydantic import BaseModel, Field, PrivateAttr +from pydantic.networks import AnyHttpUrl + + +class DownloadJobStatus(str, Enum): + """State of a download job.""" + + WAITING = "waiting" # not enqueued, will not run + RUNNING = "running" # actively downloading + COMPLETED = "completed" # finished running + CANCELLED = "cancelled" # user cancelled + ERROR = "error" # terminated with an error message + + +class DownloadJobCancelledException(Exception): + """This exception is raised when a download job is cancelled.""" + + +class UnknownJobIDException(Exception): + """This exception is raised when an invalid job id is referened.""" + + +class ServiceInactiveException(Exception): + """This exception is raised when user attempts to initiate a download before the service is started.""" + + +DownloadEventHandler = Callable[["DownloadJob"], None] +DownloadExceptionHandler = Callable[["DownloadJob", Optional[Exception]], None] + + +@total_ordering +class DownloadJob(BaseModel): + """Class to monitor and control a model download request.""" + + # required variables to be passed in on creation + source: AnyHttpUrl = Field(description="Where to download from. Specific types specified in child classes.") + dest: Path = Field(description="Destination of downloaded model on local disk; a directory or file path") + access_token: Optional[str] = Field(default=None, description="authorization token for protected resources") + # automatically assigned on creation + id: int = Field(description="Numeric ID of this job", default=-1) # default id is a sentinel + priority: int = Field(default=10, description="Queue priority; lower values are higher priority") + + # set internally during download process + status: DownloadJobStatus = Field(default=DownloadJobStatus.WAITING, description="Status of the download") + download_path: Optional[Path] = Field(default=None, description="Final location of downloaded file") + job_started: Optional[str] = Field(default=None, description="Timestamp for when the download job started") + job_ended: Optional[str] = Field( + default=None, description="Timestamp for when the download job ende1d (completed or errored)" + ) + content_type: Optional[str] = Field(default=None, description="Content type of downloaded file") + bytes: int = Field(default=0, description="Bytes downloaded so far") + total_bytes: int = Field(default=0, description="Total file size (bytes)") + + # set when an error occurs + error_type: Optional[str] = Field(default=None, description="Name of exception that caused an error") + error: Optional[str] = Field(default=None, description="Traceback of the exception that caused an error") + + # internal flag + _cancelled: bool = PrivateAttr(default=False) + + # optional event handlers passed in on creation + _on_start: Optional[DownloadEventHandler] = PrivateAttr(default=None) + _on_progress: Optional[DownloadEventHandler] = PrivateAttr(default=None) + _on_complete: Optional[DownloadEventHandler] = PrivateAttr(default=None) + _on_cancelled: Optional[DownloadEventHandler] = PrivateAttr(default=None) + _on_error: Optional[DownloadExceptionHandler] = PrivateAttr(default=None) + + def __hash__(self) -> int: + """Return hash of the string representation of this object, for indexing.""" + return hash(str(self)) + + def __le__(self, other: "DownloadJob") -> bool: + """Return True if this job's priority is less than another's.""" + return self.priority <= other.priority + + def cancel(self) -> None: + """Call to cancel the job.""" + self._cancelled = True + + # cancelled and the callbacks are private attributes in order to prevent + # them from being serialized and/or used in the Json Schema + @property + def cancelled(self) -> bool: + """Call to cancel the job.""" + return self._cancelled + + @property + def complete(self) -> bool: + """Return true if job completed without errors.""" + return self.status == DownloadJobStatus.COMPLETED + + @property + def running(self) -> bool: + """Return true if the job is running.""" + return self.status == DownloadJobStatus.RUNNING + + @property + def errored(self) -> bool: + """Return true if the job is errored.""" + return self.status == DownloadJobStatus.ERROR + + @property + def in_terminal_state(self) -> bool: + """Return true if job has finished, one way or another.""" + return self.status not in [DownloadJobStatus.WAITING, DownloadJobStatus.RUNNING] + + @property + def on_start(self) -> Optional[DownloadEventHandler]: + """Return the on_start event handler.""" + return self._on_start + + @property + def on_progress(self) -> Optional[DownloadEventHandler]: + """Return the on_progress event handler.""" + return self._on_progress + + @property + def on_complete(self) -> Optional[DownloadEventHandler]: + """Return the on_complete event handler.""" + return self._on_complete + + @property + def on_error(self) -> Optional[DownloadExceptionHandler]: + """Return the on_error event handler.""" + return self._on_error + + @property + def on_cancelled(self) -> Optional[DownloadEventHandler]: + """Return the on_cancelled event handler.""" + return self._on_cancelled + + def set_callbacks( + self, + on_start: Optional[DownloadEventHandler] = None, + on_progress: Optional[DownloadEventHandler] = None, + on_complete: Optional[DownloadEventHandler] = None, + on_cancelled: Optional[DownloadEventHandler] = None, + on_error: Optional[DownloadExceptionHandler] = None, + ) -> None: + """Set the callbacks for download events.""" + self._on_start = on_start + self._on_progress = on_progress + self._on_complete = on_complete + self._on_error = on_error + self._on_cancelled = on_cancelled + + +class DownloadQueueServiceBase(ABC): + """Multithreaded queue for downloading models via URL.""" + + @abstractmethod + def start(self, *args: Any, **kwargs: Any) -> None: + """Start the download worker threads.""" + + @abstractmethod + def stop(self, *args: Any, **kwargs: Any) -> None: + """Stop the download worker threads.""" + + @abstractmethod + def download( + self, + source: AnyHttpUrl, + dest: Path, + priority: int = 10, + access_token: Optional[str] = None, + on_start: Optional[DownloadEventHandler] = None, + on_progress: Optional[DownloadEventHandler] = None, + on_complete: Optional[DownloadEventHandler] = None, + on_cancelled: Optional[DownloadEventHandler] = None, + on_error: Optional[DownloadExceptionHandler] = None, + ) -> DownloadJob: + """ + Create and enqueue download job. + + :param source: Source of the download as a URL. + :param dest: Path to download to. See below. + :param on_start, on_progress, on_complete, on_error: Callbacks for the indicated + events. + :returns: A DownloadJob object for monitoring the state of the download. + + The `dest` argument is a Path object. Its behavior is: + + 1. If the path exists and is a directory, then the URL contents will be downloaded + into that directory using the filename indicated in the response's `Content-Disposition` field. + If no content-disposition is present, then the last component of the URL will be used (similar to + wget's behavior). + 2. If the path does not exist, then it is taken as the name of a new file to create with the downloaded + content. + 3. If the path exists and is an existing file, then the downloader will try to resume the download from + the end of the existing file. + + """ + pass + + @abstractmethod + def submit_download_job( + self, + job: DownloadJob, + on_start: Optional[DownloadEventHandler] = None, + on_progress: Optional[DownloadEventHandler] = None, + on_complete: Optional[DownloadEventHandler] = None, + on_cancelled: Optional[DownloadEventHandler] = None, + on_error: Optional[DownloadExceptionHandler] = None, + ) -> None: + """ + Enqueue a download job. + + :param job: The DownloadJob + :param on_start, on_progress, on_complete, on_error: Callbacks for the indicated + events. + """ + pass + + @abstractmethod + def list_jobs(self) -> List[DownloadJob]: + """ + List active download jobs. + + :returns List[DownloadJob]: List of download jobs whose state is not "completed." + """ + pass + + @abstractmethod + def id_to_job(self, id: int) -> DownloadJob: + """ + Return the DownloadJob corresponding to the integer ID. + + :param id: ID of the DownloadJob. + + Exceptions: + * UnknownJobIDException + """ + pass + + @abstractmethod + def cancel_all_jobs(self) -> None: + """Cancel all active and enquedjobs.""" + pass + + @abstractmethod + def prune_jobs(self) -> None: + """Prune completed and errored queue items from the job list.""" + pass + + @abstractmethod + def cancel_job(self, job: DownloadJob) -> None: + """Cancel the job, clearing partial downloads and putting it into ERROR state.""" + pass + + @abstractmethod + def join(self) -> None: + """Wait until all jobs are off the queue.""" + pass diff --git a/invokeai/app/services/download/download_default.py b/invokeai/app/services/download/download_default.py new file mode 100644 index 0000000000..7c0dc0c452 --- /dev/null +++ b/invokeai/app/services/download/download_default.py @@ -0,0 +1,437 @@ +# Copyright (c) 2023, Lincoln D. Stein +"""Implementation of multithreaded download queue for invokeai.""" + +import os +import re +import threading +import traceback +from pathlib import Path +from queue import Empty, PriorityQueue +from typing import Any, Dict, List, Optional + +import requests +from pydantic.networks import AnyHttpUrl +from requests import HTTPError +from tqdm import tqdm + +from invokeai.app.services.events.events_base import EventServiceBase +from invokeai.app.util.misc import get_iso_timestamp +from invokeai.backend.util.logging import InvokeAILogger + +from .download_base import ( + DownloadEventHandler, + DownloadExceptionHandler, + DownloadJob, + DownloadJobCancelledException, + DownloadJobStatus, + DownloadQueueServiceBase, + ServiceInactiveException, + UnknownJobIDException, +) + +# Maximum number of bytes to download during each call to requests.iter_content() +DOWNLOAD_CHUNK_SIZE = 100000 + + +class DownloadQueueService(DownloadQueueServiceBase): + """Class for queued download of models.""" + + def __init__( + self, + max_parallel_dl: int = 5, + event_bus: Optional[EventServiceBase] = None, + requests_session: Optional[requests.sessions.Session] = None, + ): + """ + Initialize DownloadQueue. + + :param max_parallel_dl: Number of simultaneous downloads allowed [5]. + :param requests_session: Optional requests.sessions.Session object, for unit tests. + """ + self._jobs = {} + self._next_job_id = 0 + self._queue = PriorityQueue() + self._stop_event = threading.Event() + self._worker_pool = set() + self._lock = threading.Lock() + self._logger = InvokeAILogger.get_logger("DownloadQueueService") + self._event_bus = event_bus + self._requests = requests_session or requests.Session() + self._accept_download_requests = False + self._max_parallel_dl = max_parallel_dl + + def start(self, *args: Any, **kwargs: Any) -> None: + """Start the download worker threads.""" + with self._lock: + if self._worker_pool: + raise Exception("Attempt to start the download service twice") + self._stop_event.clear() + self._start_workers(self._max_parallel_dl) + self._accept_download_requests = True + + def stop(self, *args: Any, **kwargs: Any) -> None: + """Stop the download worker threads.""" + with self._lock: + if not self._worker_pool: + raise Exception("Attempt to stop the download service before it was started") + self._accept_download_requests = False # reject attempts to add new jobs to queue + queued_jobs = [x for x in self.list_jobs() if x.status == DownloadJobStatus.WAITING] + active_jobs = [x for x in self.list_jobs() if x.status == DownloadJobStatus.RUNNING] + if queued_jobs: + self._logger.warning(f"Cancelling {len(queued_jobs)} queued downloads") + if active_jobs: + self._logger.info(f"Waiting for {len(active_jobs)} active download jobs to complete") + with self._queue.mutex: + self._queue.queue.clear() + self.join() # wait for all active jobs to finish + self._stop_event.set() + self._worker_pool.clear() + + def submit_download_job( + self, + job: DownloadJob, + on_start: Optional[DownloadEventHandler] = None, + on_progress: Optional[DownloadEventHandler] = None, + on_complete: Optional[DownloadEventHandler] = None, + on_cancelled: Optional[DownloadEventHandler] = None, + on_error: Optional[DownloadExceptionHandler] = None, + ) -> None: + """Enqueue a download job.""" + if not self._accept_download_requests: + raise ServiceInactiveException( + "The download service is not currently accepting requests. Please call start() to initialize the service." + ) + with self._lock: + job.id = self._next_job_id + self._next_job_id += 1 + job.set_callbacks( + on_start=on_start, + on_progress=on_progress, + on_complete=on_complete, + on_cancelled=on_cancelled, + on_error=on_error, + ) + self._jobs[job.id] = job + self._queue.put(job) + + def download( + self, + source: AnyHttpUrl, + dest: Path, + priority: int = 10, + access_token: Optional[str] = None, + on_start: Optional[DownloadEventHandler] = None, + on_progress: Optional[DownloadEventHandler] = None, + on_complete: Optional[DownloadEventHandler] = None, + on_cancelled: Optional[DownloadEventHandler] = None, + on_error: Optional[DownloadExceptionHandler] = None, + ) -> DownloadJob: + """Create and enqueue a download job and return it.""" + if not self._accept_download_requests: + raise ServiceInactiveException( + "The download service is not currently accepting requests. Please call start() to initialize the service." + ) + job = DownloadJob( + source=source, + dest=dest, + priority=priority, + access_token=access_token, + ) + self.submit_download_job( + job, + on_start=on_start, + on_progress=on_progress, + on_complete=on_complete, + on_cancelled=on_cancelled, + on_error=on_error, + ) + return job + + def join(self) -> None: + """Wait for all jobs to complete.""" + self._queue.join() + + def list_jobs(self) -> List[DownloadJob]: + """List all the jobs.""" + return list(self._jobs.values()) + + def prune_jobs(self) -> None: + """Prune completed and errored queue items from the job list.""" + with self._lock: + to_delete = set() + for job_id, job in self._jobs.items(): + if job.in_terminal_state: + to_delete.add(job_id) + for job_id in to_delete: + del self._jobs[job_id] + + def id_to_job(self, id: int) -> DownloadJob: + """Translate a job ID into a DownloadJob object.""" + try: + return self._jobs[id] + except KeyError as excp: + raise UnknownJobIDException("Unrecognized job") from excp + + def cancel_job(self, job: DownloadJob) -> None: + """ + Cancel the indicated job. + + If it is running it will be stopped. + job.status will be set to DownloadJobStatus.CANCELLED + """ + with self._lock: + job.cancel() + + def cancel_all_jobs(self) -> None: + """Cancel all jobs (those not in enqueued, running or paused state).""" + for job in self._jobs.values(): + if not job.in_terminal_state: + self.cancel_job(job) + + def _start_workers(self, max_workers: int) -> None: + """Start the requested number of worker threads.""" + self._stop_event.clear() + for i in range(0, max_workers): # noqa B007 + worker = threading.Thread(target=self._download_next_item, daemon=True) + self._logger.debug(f"Download queue worker thread {worker.name} starting.") + worker.start() + self._worker_pool.add(worker) + + def _download_next_item(self) -> None: + """Worker thread gets next job on priority queue.""" + done = False + while not done: + if self._stop_event.is_set(): + done = True + continue + try: + job = self._queue.get(timeout=1) + except Empty: + continue + + try: + job.job_started = get_iso_timestamp() + self._do_download(job) + self._signal_job_complete(job) + + except (OSError, HTTPError) as excp: + job.error_type = excp.__class__.__name__ + f"({str(excp)})" + job.error = traceback.format_exc() + self._signal_job_error(job, excp) + except DownloadJobCancelledException: + self._signal_job_cancelled(job) + self._cleanup_cancelled_job(job) + + finally: + job.job_ended = get_iso_timestamp() + self._queue.task_done() + self._logger.debug(f"Download queue worker thread {threading.current_thread().name} exiting.") + + def _do_download(self, job: DownloadJob) -> None: + """Do the actual download.""" + url = job.source + header = {"Authorization": f"Bearer {job.access_token}"} if job.access_token else {} + open_mode = "wb" + + # Make a streaming request. This will retrieve headers including + # content-length and content-disposition, but not fetch any content itself + resp = self._requests.get(str(url), headers=header, stream=True) + if not resp.ok: + raise HTTPError(resp.reason) + + job.content_type = resp.headers.get("Content-Type") + content_length = int(resp.headers.get("content-length", 0)) + job.total_bytes = content_length + + if job.dest.is_dir(): + file_name = os.path.basename(str(url.path)) # default is to use the last bit of the URL + + if match := re.search('filename="(.+)"', resp.headers.get("Content-Disposition", "")): + remote_name = match.group(1) + if self._validate_filename(job.dest.as_posix(), remote_name): + file_name = remote_name + + job.download_path = job.dest / file_name + + else: + job.dest.parent.mkdir(parents=True, exist_ok=True) + job.download_path = job.dest + + assert job.download_path + + # Don't clobber an existing file. See commit 82c2c85202f88c6d24ff84710f297cfc6ae174af + # for code that instead resumes an interrupted download. + if job.download_path.exists(): + raise OSError(f"[Errno 17] File {job.download_path} exists") + + # append ".downloading" to the path + in_progress_path = self._in_progress_path(job.download_path) + + # signal caller that the download is starting. At this point, key fields such as + # download_path and total_bytes will be populated. We call it here because the might + # discover that the local file is already complete and generate a COMPLETED status. + self._signal_job_started(job) + + # "range not satisfiable" - local file is at least as large as the remote file + if resp.status_code == 416 or (content_length > 0 and job.bytes >= content_length): + self._logger.warning(f"{job.download_path}: complete file found. Skipping.") + return + + # "partial content" - local file is smaller than remote file + elif resp.status_code == 206 or job.bytes > 0: + self._logger.warning(f"{job.download_path}: partial file found. Resuming") + + # some other error + elif resp.status_code != 200: + raise HTTPError(resp.reason) + + self._logger.debug(f"{job.source}: Downloading {job.download_path}") + report_delta = job.total_bytes / 100 # report every 1% change + last_report_bytes = 0 + + # DOWNLOAD LOOP + with open(in_progress_path, open_mode) as file: + for data in resp.iter_content(chunk_size=DOWNLOAD_CHUNK_SIZE): + if job.cancelled: + raise DownloadJobCancelledException("Job was cancelled at caller's request") + + job.bytes += file.write(data) + if (job.bytes - last_report_bytes >= report_delta) or (job.bytes >= job.total_bytes): + last_report_bytes = job.bytes + self._signal_job_progress(job) + + # if we get here we are done and can rename the file to the original dest + self._logger.debug(f"{job.source}: saved to {job.download_path} (bytes={job.bytes})") + in_progress_path.rename(job.download_path) + + def _validate_filename(self, directory: str, filename: str) -> bool: + pc_name_max = os.pathconf(directory, "PC_NAME_MAX") if hasattr(os, "pathconf") else 260 # hardcoded for windows + pc_path_max = ( + os.pathconf(directory, "PC_PATH_MAX") if hasattr(os, "pathconf") else 32767 + ) # hardcoded for windows with long names enabled + if "/" in filename: + return False + if filename.startswith(".."): + return False + if len(filename) > pc_name_max: + return False + if len(os.path.join(directory, filename)) > pc_path_max: + return False + return True + + def _in_progress_path(self, path: Path) -> Path: + return path.with_name(path.name + ".downloading") + + def _signal_job_started(self, job: DownloadJob) -> None: + job.status = DownloadJobStatus.RUNNING + if job.on_start: + try: + job.on_start(job) + except Exception as e: + self._logger.error( + f"An error occurred while processing the on_start callback: {traceback.format_exception(e)}" + ) + if self._event_bus: + assert job.download_path + self._event_bus.emit_download_started(str(job.source), job.download_path.as_posix()) + + def _signal_job_progress(self, job: DownloadJob) -> None: + if job.on_progress: + try: + job.on_progress(job) + except Exception as e: + self._logger.error( + f"An error occurred while processing the on_progress callback: {traceback.format_exception(e)}" + ) + if self._event_bus: + assert job.download_path + self._event_bus.emit_download_progress( + str(job.source), + download_path=job.download_path.as_posix(), + current_bytes=job.bytes, + total_bytes=job.total_bytes, + ) + + def _signal_job_complete(self, job: DownloadJob) -> None: + job.status = DownloadJobStatus.COMPLETED + if job.on_complete: + try: + job.on_complete(job) + except Exception as e: + self._logger.error( + f"An error occurred while processing the on_complete callback: {traceback.format_exception(e)}" + ) + if self._event_bus: + assert job.download_path + self._event_bus.emit_download_complete( + str(job.source), download_path=job.download_path.as_posix(), total_bytes=job.total_bytes + ) + + def _signal_job_cancelled(self, job: DownloadJob) -> None: + if job.status not in [DownloadJobStatus.RUNNING, DownloadJobStatus.WAITING]: + return + job.status = DownloadJobStatus.CANCELLED + if job.on_cancelled: + try: + job.on_cancelled(job) + except Exception as e: + self._logger.error( + f"An error occurred while processing the on_cancelled callback: {traceback.format_exception(e)}" + ) + if self._event_bus: + self._event_bus.emit_download_cancelled(str(job.source)) + + def _signal_job_error(self, job: DownloadJob, excp: Optional[Exception] = None) -> None: + job.status = DownloadJobStatus.ERROR + self._logger.error(f"{str(job.source)}: {traceback.format_exception(excp)}") + if job.on_error: + try: + job.on_error(job, excp) + except Exception as e: + self._logger.error( + f"An error occurred while processing the on_error callback: {traceback.format_exception(e)}" + ) + if self._event_bus: + assert job.error_type + assert job.error + self._event_bus.emit_download_error(str(job.source), error_type=job.error_type, error=job.error) + + def _cleanup_cancelled_job(self, job: DownloadJob) -> None: + self._logger.debug(f"Cleaning up leftover files from cancelled download job {job.download_path}") + try: + if job.download_path: + partial_file = self._in_progress_path(job.download_path) + partial_file.unlink() + except OSError as excp: + self._logger.warning(excp) + + +# Example on_progress event handler to display a TQDM status bar +# Activate with: +# download_service.download('http://foo.bar/baz', '/tmp', on_progress=TqdmProgress().job_update +class TqdmProgress(object): + """TQDM-based progress bar object to use in on_progress handlers.""" + + _bars: Dict[int, tqdm] # the tqdm object + _last: Dict[int, int] # last bytes downloaded + + def __init__(self) -> None: # noqa D107 + self._bars = {} + self._last = {} + + def update(self, job: DownloadJob) -> None: # noqa D102 + job_id = job.id + # new job + if job_id not in self._bars: + assert job.download_path + dest = Path(job.download_path).name + self._bars[job_id] = tqdm( + desc=dest, + initial=0, + total=job.total_bytes, + unit="iB", + unit_scale=True, + ) + self._last[job_id] = 0 + self._bars[job_id].update(job.bytes - self._last[job_id]) + self._last[job_id] = job.bytes diff --git a/invokeai/app/services/events/__init__.py b/invokeai/app/services/events/__init__.py index e69de29bb2..17407d3b72 100644 --- a/invokeai/app/services/events/__init__.py +++ b/invokeai/app/services/events/__init__.py @@ -0,0 +1 @@ +from .events_base import EventServiceBase # noqa F401 diff --git a/invokeai/app/services/events/events_base.py b/invokeai/app/services/events/events_base.py index dd4152e609..e9365f3349 100644 --- a/invokeai/app/services/events/events_base.py +++ b/invokeai/app/services/events/events_base.py @@ -1,6 +1,7 @@ # Copyright (c) 2022 Kyle Schouviller (https://github.com/kyle0654) -from typing import Any, Optional + +from typing import Any, Dict, List, Optional, Union from invokeai.app.services.invocation_processor.invocation_processor_common import ProgressImage from invokeai.app.services.session_queue.session_queue_common import ( @@ -16,6 +17,8 @@ from invokeai.backend.model_management.models.base import BaseModelType, ModelTy class EventServiceBase: queue_event: str = "queue_event" + download_event: str = "download_event" + model_event: str = "model_event" """Basic event bus, to have an empty stand-in when not needed""" @@ -30,6 +33,20 @@ class EventServiceBase: payload={"event": event_name, "data": payload}, ) + def __emit_download_event(self, event_name: str, payload: dict) -> None: + payload["timestamp"] = get_timestamp() + self.dispatch( + event_name=EventServiceBase.download_event, + payload={"event": event_name, "data": payload}, + ) + + def __emit_model_event(self, event_name: str, payload: dict) -> None: + payload["timestamp"] = get_timestamp() + self.dispatch( + event_name=EventServiceBase.model_event, + payload={"event": event_name, "data": payload}, + ) + # Define events here for every event in the system. # This will make them easier to integrate until we find a schema generator. def emit_generator_progress( @@ -313,3 +330,166 @@ class EventServiceBase: event_name="queue_cleared", payload={"queue_id": queue_id}, ) + + def emit_download_started(self, source: str, download_path: str) -> None: + """ + Emit when a download job is started. + + :param url: The downloaded url + """ + self.__emit_download_event( + event_name="download_started", + payload={"source": source, "download_path": download_path}, + ) + + def emit_download_progress(self, source: str, download_path: str, current_bytes: int, total_bytes: int) -> None: + """ + Emit "download_progress" events at regular intervals during a download job. + + :param source: The downloaded source + :param download_path: The local downloaded file + :param current_bytes: Number of bytes downloaded so far + :param total_bytes: The size of the file being downloaded (if known) + """ + self.__emit_download_event( + event_name="download_progress", + payload={ + "source": source, + "download_path": download_path, + "current_bytes": current_bytes, + "total_bytes": total_bytes, + }, + ) + + def emit_download_complete(self, source: str, download_path: str, total_bytes: int) -> None: + """ + Emit a "download_complete" event at the end of a successful download. + + :param source: Source URL + :param download_path: Path to the locally downloaded file + :param total_bytes: The size of the downloaded file + """ + self.__emit_download_event( + event_name="download_complete", + payload={ + "source": source, + "download_path": download_path, + "total_bytes": total_bytes, + }, + ) + + def emit_download_cancelled(self, source: str) -> None: + """Emit a "download_cancelled" event in the event that the download was cancelled by user.""" + self.__emit_download_event( + event_name="download_cancelled", + payload={ + "source": source, + }, + ) + + def emit_download_error(self, source: str, error_type: str, error: str) -> None: + """ + Emit a "download_error" event when an download job encounters an exception. + + :param source: Source URL + :param error_type: The name of the exception that raised the error + :param error: The traceback from this error + """ + self.__emit_download_event( + event_name="download_error", + payload={ + "source": source, + "error_type": error_type, + "error": error, + }, + ) + + def emit_model_install_downloading( + self, + source: str, + local_path: str, + bytes: int, + total_bytes: int, + parts: List[Dict[str, Union[str, int]]], + ) -> None: + """ + Emit at intervals while the install job is in progress (remote models only). + + :param source: Source of the model + :param local_path: Where model is downloading to + :param parts: Progress of downloading URLs that comprise the model, if any. + :param bytes: Number of bytes downloaded so far. + :param total_bytes: Total size of download, including all files. + This emits a Dict with keys "source", "local_path", "bytes" and "total_bytes". + """ + self.__emit_model_event( + event_name="model_install_downloading", + payload={ + "source": source, + "local_path": local_path, + "bytes": bytes, + "total_bytes": total_bytes, + "parts": parts, + }, + ) + + def emit_model_install_running(self, source: str) -> None: + """ + Emit once when an install job becomes active. + + :param source: Source of the model; local path, repo_id or url + """ + self.__emit_model_event( + event_name="model_install_running", + payload={"source": source}, + ) + + def emit_model_install_completed(self, source: str, key: str, total_bytes: Optional[int] = None) -> None: + """ + Emit when an install job is completed successfully. + + :param source: Source of the model; local path, repo_id or url + :param key: Model config record key + :param total_bytes: Size of the model (may be None for installation of a local path) + """ + self.__emit_model_event( + event_name="model_install_completed", + payload={ + "source": source, + "total_bytes": total_bytes, + "key": key, + }, + ) + + def emit_model_install_cancelled(self, source: str) -> None: + """ + Emit when an install job is cancelled. + + :param source: Source of the model; local path, repo_id or url + """ + self.__emit_model_event( + event_name="model_install_cancelled", + payload={"source": source}, + ) + + def emit_model_install_error( + self, + source: str, + error_type: str, + error: str, + ) -> None: + """ + Emit when an install job encounters an exception. + + :param source: Source of the model + :param error_type: The name of the exception + :param error: A text description of the exception + """ + self.__emit_model_event( + event_name="model_install_error", + payload={ + "source": source, + "error_type": error_type, + "error": error, + }, + ) diff --git a/invokeai/app/services/image_files/image_files_base.py b/invokeai/app/services/image_files/image_files_base.py index 91e18f30fc..27dd67531f 100644 --- a/invokeai/app/services/image_files/image_files_base.py +++ b/invokeai/app/services/image_files/image_files_base.py @@ -4,7 +4,8 @@ from typing import Optional from PIL.Image import Image as PILImageType -from invokeai.app.invocations.baseinvocation import MetadataField, WorkflowField +from invokeai.app.invocations.baseinvocation import MetadataField +from invokeai.app.services.workflow_records.workflow_records_common import WorkflowWithoutID class ImageFileStorageBase(ABC): @@ -33,7 +34,7 @@ class ImageFileStorageBase(ABC): image: PILImageType, image_name: str, metadata: Optional[MetadataField] = None, - workflow: Optional[WorkflowField] = None, + workflow: Optional[WorkflowWithoutID] = None, thumbnail_size: int = 256, ) -> None: """Saves an image and a 256x256 WEBP thumbnail. Returns a tuple of the image name, thumbnail name, and created timestamp.""" @@ -43,3 +44,8 @@ class ImageFileStorageBase(ABC): def delete(self, image_name: str) -> None: """Deletes an image and its thumbnail (if one exists).""" pass + + @abstractmethod + def get_workflow(self, image_name: str) -> Optional[WorkflowWithoutID]: + """Gets the workflow of an image.""" + pass diff --git a/invokeai/app/services/image_files/image_files_disk.py b/invokeai/app/services/image_files/image_files_disk.py index cffcb702c9..0844821672 100644 --- a/invokeai/app/services/image_files/image_files_disk.py +++ b/invokeai/app/services/image_files/image_files_disk.py @@ -7,8 +7,9 @@ from PIL import Image, PngImagePlugin from PIL.Image import Image as PILImageType from send2trash import send2trash -from invokeai.app.invocations.baseinvocation import MetadataField, WorkflowField +from invokeai.app.invocations.baseinvocation import MetadataField from invokeai.app.services.invoker import Invoker +from invokeai.app.services.workflow_records.workflow_records_common import WorkflowWithoutID from invokeai.app.util.thumbnails import get_thumbnail_name, make_thumbnail from .image_files_base import ImageFileStorageBase @@ -56,7 +57,7 @@ class DiskImageFileStorage(ImageFileStorageBase): image: PILImageType, image_name: str, metadata: Optional[MetadataField] = None, - workflow: Optional[WorkflowField] = None, + workflow: Optional[WorkflowWithoutID] = None, thumbnail_size: int = 256, ) -> None: try: @@ -64,12 +65,19 @@ class DiskImageFileStorage(ImageFileStorageBase): image_path = self.get_path(image_name) pnginfo = PngImagePlugin.PngInfo() + info_dict = {} if metadata is not None: - pnginfo.add_text("invokeai_metadata", metadata.model_dump_json()) + metadata_json = metadata.model_dump_json() + info_dict["invokeai_metadata"] = metadata_json + pnginfo.add_text("invokeai_metadata", metadata_json) if workflow is not None: - pnginfo.add_text("invokeai_workflow", workflow.model_dump_json()) + workflow_json = workflow.model_dump_json() + info_dict["invokeai_workflow"] = workflow_json + pnginfo.add_text("invokeai_workflow", workflow_json) + # When saving the image, the image object's info field is not populated. We need to set it + image.info = info_dict image.save( image_path, "PNG", @@ -121,6 +129,13 @@ class DiskImageFileStorage(ImageFileStorageBase): path = path if isinstance(path, Path) else Path(path) return path.exists() + def get_workflow(self, image_name: str) -> WorkflowWithoutID | None: + image = self.get(image_name) + workflow = image.info.get("invokeai_workflow", None) + if workflow is not None: + return WorkflowWithoutID.model_validate_json(workflow) + return None + def __validate_storage_folders(self) -> None: """Checks if the required output folders exist and create them if they don't""" folders: list[Path] = [self.__output_folder, self.__thumbnails_folder] diff --git a/invokeai/app/services/image_records/image_records_base.py b/invokeai/app/services/image_records/image_records_base.py index 655e4b4fb8..727f4977fb 100644 --- a/invokeai/app/services/image_records/image_records_base.py +++ b/invokeai/app/services/image_records/image_records_base.py @@ -75,6 +75,7 @@ class ImageRecordStorageBase(ABC): image_category: ImageCategory, width: int, height: int, + has_workflow: bool, is_intermediate: Optional[bool] = False, starred: Optional[bool] = False, session_id: Optional[str] = None, diff --git a/invokeai/app/services/image_records/image_records_common.py b/invokeai/app/services/image_records/image_records_common.py index 61b97c6032..af681e90e1 100644 --- a/invokeai/app/services/image_records/image_records_common.py +++ b/invokeai/app/services/image_records/image_records_common.py @@ -100,6 +100,7 @@ IMAGE_DTO_COLS = ", ".join( "height", "session_id", "node_id", + "has_workflow", "is_intermediate", "created_at", "updated_at", @@ -145,6 +146,7 @@ class ImageRecord(BaseModelExcludeNull): """The node ID that generated this image, if it is a generated image.""" starred: bool = Field(description="Whether this image is starred.") """Whether this image is starred.""" + has_workflow: bool = Field(description="Whether this image has a workflow.") class ImageRecordChanges(BaseModelExcludeNull, extra="allow"): @@ -188,6 +190,7 @@ def deserialize_image_record(image_dict: dict) -> ImageRecord: deleted_at = image_dict.get("deleted_at", get_iso_timestamp()) is_intermediate = image_dict.get("is_intermediate", False) starred = image_dict.get("starred", False) + has_workflow = image_dict.get("has_workflow", False) return ImageRecord( image_name=image_name, @@ -202,4 +205,5 @@ def deserialize_image_record(image_dict: dict) -> ImageRecord: deleted_at=deleted_at, is_intermediate=is_intermediate, starred=starred, + has_workflow=has_workflow, ) diff --git a/invokeai/app/services/image_records/image_records_sqlite.py b/invokeai/app/services/image_records/image_records_sqlite.py index e0dabf1657..74f82e7d84 100644 --- a/invokeai/app/services/image_records/image_records_sqlite.py +++ b/invokeai/app/services/image_records/image_records_sqlite.py @@ -5,7 +5,7 @@ from typing import Optional, Union, cast from invokeai.app.invocations.baseinvocation import MetadataField, MetadataFieldValidator from invokeai.app.services.shared.pagination import OffsetPaginatedResults -from invokeai.app.services.shared.sqlite import SqliteDatabase +from invokeai.app.services.shared.sqlite.sqlite_database import SqliteDatabase from .image_records_base import ImageRecordStorageBase from .image_records_common import ( @@ -32,91 +32,6 @@ class SqliteImageRecordStorage(ImageRecordStorageBase): self._conn = db.conn self._cursor = self._conn.cursor() - try: - self._lock.acquire() - self._create_tables() - self._conn.commit() - finally: - self._lock.release() - - def _create_tables(self) -> None: - """Creates the `images` table.""" - - # Create the `images` table. - self._cursor.execute( - """--sql - CREATE TABLE IF NOT EXISTS images ( - image_name TEXT NOT NULL PRIMARY KEY, - -- This is an enum in python, unrestricted string here for flexibility - image_origin TEXT NOT NULL, - -- This is an enum in python, unrestricted string here for flexibility - image_category TEXT NOT NULL, - width INTEGER NOT NULL, - height INTEGER NOT NULL, - session_id TEXT, - node_id TEXT, - metadata TEXT, - is_intermediate BOOLEAN DEFAULT FALSE, - created_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), - -- Updated via trigger - updated_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), - -- Soft delete, currently unused - deleted_at DATETIME - ); - """ - ) - - self._cursor.execute("PRAGMA table_info(images)") - columns = [column[1] for column in self._cursor.fetchall()] - - if "starred" not in columns: - self._cursor.execute( - """--sql - ALTER TABLE images ADD COLUMN starred BOOLEAN DEFAULT FALSE; - """ - ) - - # Create the `images` table indices. - self._cursor.execute( - """--sql - CREATE UNIQUE INDEX IF NOT EXISTS idx_images_image_name ON images(image_name); - """ - ) - self._cursor.execute( - """--sql - CREATE INDEX IF NOT EXISTS idx_images_image_origin ON images(image_origin); - """ - ) - self._cursor.execute( - """--sql - CREATE INDEX IF NOT EXISTS idx_images_image_category ON images(image_category); - """ - ) - self._cursor.execute( - """--sql - CREATE INDEX IF NOT EXISTS idx_images_created_at ON images(created_at); - """ - ) - - self._cursor.execute( - """--sql - CREATE INDEX IF NOT EXISTS idx_images_starred ON images(starred); - """ - ) - - # Add trigger for `updated_at`. - self._cursor.execute( - """--sql - CREATE TRIGGER IF NOT EXISTS tg_images_updated_at - AFTER UPDATE - ON images FOR EACH ROW - BEGIN - UPDATE images SET updated_at = STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') - WHERE image_name = old.image_name; - END; - """ - ) - def get(self, image_name: str) -> ImageRecord: try: self._lock.acquire() @@ -408,6 +323,7 @@ class SqliteImageRecordStorage(ImageRecordStorageBase): image_category: ImageCategory, width: int, height: int, + has_workflow: bool, is_intermediate: Optional[bool] = False, starred: Optional[bool] = False, session_id: Optional[str] = None, @@ -429,9 +345,10 @@ class SqliteImageRecordStorage(ImageRecordStorageBase): session_id, metadata, is_intermediate, - starred + starred, + has_workflow ) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?); + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); """, ( image_name, @@ -444,6 +361,7 @@ class SqliteImageRecordStorage(ImageRecordStorageBase): metadata_json, is_intermediate, starred, + has_workflow, ), ) self._conn.commit() diff --git a/invokeai/app/services/images/images_base.py b/invokeai/app/services/images/images_base.py index 88eacdfa33..6414647e12 100644 --- a/invokeai/app/services/images/images_base.py +++ b/invokeai/app/services/images/images_base.py @@ -3,7 +3,7 @@ from typing import Callable, Optional from PIL.Image import Image as PILImageType -from invokeai.app.invocations.baseinvocation import MetadataField, WorkflowField +from invokeai.app.invocations.baseinvocation import MetadataField from invokeai.app.services.image_records.image_records_common import ( ImageCategory, ImageRecord, @@ -12,6 +12,7 @@ from invokeai.app.services.image_records.image_records_common import ( ) from invokeai.app.services.images.images_common import ImageDTO from invokeai.app.services.shared.pagination import OffsetPaginatedResults +from invokeai.app.services.workflow_records.workflow_records_common import WorkflowWithoutID class ImageServiceABC(ABC): @@ -51,7 +52,7 @@ class ImageServiceABC(ABC): board_id: Optional[str] = None, is_intermediate: Optional[bool] = False, metadata: Optional[MetadataField] = None, - workflow: Optional[WorkflowField] = None, + workflow: Optional[WorkflowWithoutID] = None, **kwargs ) -> ImageDTO: """Creates an image, storing the file and its metadata.""" @@ -86,6 +87,11 @@ class ImageServiceABC(ABC): """Gets an image's metadata.""" pass + @abstractmethod + def get_workflow(self, image_name: str) -> Optional[WorkflowWithoutID]: + """Gets an image's workflow.""" + pass + @abstractmethod def get_path(self, image_name: str, thumbnail: bool = False) -> str: """Gets an image's path.""" diff --git a/invokeai/app/services/images/images_common.py b/invokeai/app/services/images/images_common.py index 198c26c3a2..0464244b94 100644 --- a/invokeai/app/services/images/images_common.py +++ b/invokeai/app/services/images/images_common.py @@ -24,11 +24,6 @@ class ImageDTO(ImageRecord, ImageUrlsDTO): default=None, description="The id of the board the image belongs to, if one exists." ) """The id of the board the image belongs to, if one exists.""" - workflow_id: Optional[str] = Field( - default=None, - description="The workflow that generated this image.", - ) - """The workflow that generated this image.""" def image_record_to_dto( @@ -36,7 +31,6 @@ def image_record_to_dto( image_url: str, thumbnail_url: str, board_id: Optional[str], - workflow_id: Optional[str], ) -> ImageDTO: """Converts an image record to an image DTO.""" return ImageDTO( @@ -44,5 +38,4 @@ def image_record_to_dto( image_url=image_url, thumbnail_url=thumbnail_url, board_id=board_id, - workflow_id=workflow_id, ) diff --git a/invokeai/app/services/images/images_default.py b/invokeai/app/services/images/images_default.py index e592ba5c4d..30343f3a2c 100644 --- a/invokeai/app/services/images/images_default.py +++ b/invokeai/app/services/images/images_default.py @@ -2,9 +2,10 @@ from typing import Optional from PIL.Image import Image as PILImageType -from invokeai.app.invocations.baseinvocation import MetadataField, WorkflowField +from invokeai.app.invocations.baseinvocation import MetadataField from invokeai.app.services.invoker import Invoker from invokeai.app.services.shared.pagination import OffsetPaginatedResults +from invokeai.app.services.workflow_records.workflow_records_common import WorkflowWithoutID from ..image_files.image_files_common import ( ImageFileDeleteException, @@ -42,7 +43,7 @@ class ImageService(ImageServiceABC): board_id: Optional[str] = None, is_intermediate: Optional[bool] = False, metadata: Optional[MetadataField] = None, - workflow: Optional[WorkflowField] = None, + workflow: Optional[WorkflowWithoutID] = None, **kwargs ) -> ImageDTO: if image_origin not in ResourceOrigin: @@ -56,12 +57,6 @@ class ImageService(ImageServiceABC): (width, height) = image.size try: - if workflow is not None: - created_workflow = self.__invoker.services.workflow_records.create(workflow) - workflow_id = created_workflow.model_dump()["id"] - else: - workflow_id = None - # TODO: Consider using a transaction here to ensure consistency between storage and database self.__invoker.services.image_records.save( # Non-nullable fields @@ -70,6 +65,7 @@ class ImageService(ImageServiceABC): image_category=image_category, width=width, height=height, + has_workflow=workflow is not None, # Meta fields is_intermediate=is_intermediate, # Nullable fields @@ -80,8 +76,6 @@ class ImageService(ImageServiceABC): ) if board_id is not None: self.__invoker.services.board_image_records.add_image_to_board(board_id=board_id, image_name=image_name) - if workflow_id is not None: - self.__invoker.services.workflow_image_records.create(workflow_id=workflow_id, image_name=image_name) self.__invoker.services.image_files.save( image_name=image_name, image=image, metadata=metadata, workflow=workflow ) @@ -145,7 +139,6 @@ class ImageService(ImageServiceABC): image_url=self.__invoker.services.urls.get_image_url(image_name), thumbnail_url=self.__invoker.services.urls.get_image_url(image_name, True), board_id=self.__invoker.services.board_image_records.get_board_for_image(image_name), - workflow_id=self.__invoker.services.workflow_image_records.get_workflow_for_image(image_name), ) return image_dto @@ -166,18 +159,15 @@ class ImageService(ImageServiceABC): self.__invoker.services.logger.error("Problem getting image DTO") raise e - def get_workflow(self, image_name: str) -> Optional[WorkflowField]: + def get_workflow(self, image_name: str) -> Optional[WorkflowWithoutID]: try: - workflow_id = self.__invoker.services.workflow_image_records.get_workflow_for_image(image_name) - if workflow_id is None: - return None - return self.__invoker.services.workflow_records.get(workflow_id) - except ImageRecordNotFoundException: - self.__invoker.services.logger.error("Image record not found") + return self.__invoker.services.image_files.get_workflow(image_name) + except ImageFileNotFoundException: + self.__invoker.services.logger.error("Image file not found") + raise + except Exception: + self.__invoker.services.logger.error("Problem getting image workflow") raise - except Exception as e: - self.__invoker.services.logger.error("Problem getting image DTO") - raise e def get_path(self, image_name: str, thumbnail: bool = False) -> str: try: @@ -225,7 +215,6 @@ class ImageService(ImageServiceABC): image_url=self.__invoker.services.urls.get_image_url(r.image_name), thumbnail_url=self.__invoker.services.urls.get_image_url(r.image_name, True), board_id=self.__invoker.services.board_image_records.get_board_for_image(r.image_name), - workflow_id=self.__invoker.services.workflow_image_records.get_workflow_for_image(r.image_name), ) for r in results.items ] diff --git a/invokeai/app/services/invocation_processor/invocation_processor_default.py b/invokeai/app/services/invocation_processor/invocation_processor_default.py index 6e0d3075ea..09608dca2b 100644 --- a/invokeai/app/services/invocation_processor/invocation_processor_default.py +++ b/invokeai/app/services/invocation_processor/invocation_processor_default.py @@ -108,6 +108,7 @@ class DefaultInvocationProcessor(InvocationProcessorABC): queue_item_id=queue_item.session_queue_item_id, queue_id=queue_item.session_queue_id, queue_batch_id=queue_item.session_queue_batch_id, + workflow=queue_item.workflow, ) ) @@ -131,7 +132,6 @@ class DefaultInvocationProcessor(InvocationProcessorABC): source_node_id=source_node_id, result=outputs.model_dump(), ) - self.__invoker.services.performance_statistics.log_stats() except KeyboardInterrupt: pass @@ -178,6 +178,7 @@ class DefaultInvocationProcessor(InvocationProcessorABC): session_queue_item_id=queue_item.session_queue_item_id, session_queue_id=queue_item.session_queue_id, graph_execution_state=graph_execution_state, + workflow=queue_item.workflow, invoke_all=True, ) except Exception as e: @@ -193,6 +194,7 @@ class DefaultInvocationProcessor(InvocationProcessorABC): error=traceback.format_exc(), ) elif is_complete: + self.__invoker.services.performance_statistics.log_stats(graph_execution_state.id) self.__invoker.services.events.emit_graph_execution_complete( queue_batch_id=queue_item.session_queue_batch_id, queue_item_id=queue_item.session_queue_item_id, diff --git a/invokeai/app/services/invocation_queue/invocation_queue_common.py b/invokeai/app/services/invocation_queue/invocation_queue_common.py index 88e72886f7..696f6a981d 100644 --- a/invokeai/app/services/invocation_queue/invocation_queue_common.py +++ b/invokeai/app/services/invocation_queue/invocation_queue_common.py @@ -1,9 +1,12 @@ # Copyright (c) 2022 Kyle Schouviller (https://github.com/kyle0654) import time +from typing import Optional from pydantic import BaseModel, Field +from invokeai.app.services.workflow_records.workflow_records_common import WorkflowWithoutID + class InvocationQueueItem(BaseModel): graph_execution_state_id: str = Field(description="The ID of the graph execution state") @@ -15,5 +18,6 @@ class InvocationQueueItem(BaseModel): session_queue_batch_id: str = Field( description="The ID of the session batch from which this invocation queue item came" ) + workflow: Optional[WorkflowWithoutID] = Field(description="The workflow associated with this queue item") invoke_all: bool = Field(default=False) timestamp: float = Field(default_factory=time.time) diff --git a/invokeai/app/services/invocation_services.py b/invokeai/app/services/invocation_services.py index 366e2d0f2b..11a4de99d6 100644 --- a/invokeai/app/services/invocation_services.py +++ b/invokeai/app/services/invocation_services.py @@ -11,6 +11,7 @@ if TYPE_CHECKING: from .board_records.board_records_base import BoardRecordStorageBase from .boards.boards_base import BoardServiceABC from .config import InvokeAIAppConfig + from .download import DownloadQueueServiceBase from .events.events_base import EventServiceBase from .image_files.image_files_base import ImageFileStorageBase from .image_records.image_records_base import ImageRecordStorageBase @@ -21,14 +22,14 @@ if TYPE_CHECKING: from .invocation_stats.invocation_stats_base import InvocationStatsServiceBase from .item_storage.item_storage_base import ItemStorageABC from .latents_storage.latents_storage_base import LatentsStorageBase + from .model_install import ModelInstallServiceBase from .model_manager.model_manager_base import ModelManagerServiceBase from .model_records import ModelRecordServiceBase from .names.names_base import NameServiceBase from .session_processor.session_processor_base import SessionProcessorBase from .session_queue.session_queue_base import SessionQueueBase - from .shared.graph import GraphExecutionState, LibraryGraph + from .shared.graph import GraphExecutionState from .urls.urls_base import UrlServiceBase - from .workflow_image_records.workflow_image_records_base import WorkflowImageRecordsStorageBase from .workflow_records.workflow_records_base import WorkflowRecordsStorageBase @@ -43,7 +44,6 @@ class InvocationServices: configuration: "InvokeAIAppConfig" events: "EventServiceBase" graph_execution_manager: "ItemStorageABC[GraphExecutionState]" - graph_library: "ItemStorageABC[LibraryGraph]" images: "ImageServiceABC" image_records: "ImageRecordStorageBase" image_files: "ImageFileStorageBase" @@ -51,6 +51,8 @@ class InvocationServices: logger: "Logger" model_manager: "ModelManagerServiceBase" model_records: "ModelRecordServiceBase" + download_queue: "DownloadQueueServiceBase" + model_install: "ModelInstallServiceBase" processor: "InvocationProcessorABC" performance_statistics: "InvocationStatsServiceBase" queue: "InvocationQueueABC" @@ -59,7 +61,6 @@ class InvocationServices: invocation_cache: "InvocationCacheBase" names: "NameServiceBase" urls: "UrlServiceBase" - workflow_image_records: "WorkflowImageRecordsStorageBase" workflow_records: "WorkflowRecordsStorageBase" def __init__( @@ -71,7 +72,6 @@ class InvocationServices: configuration: "InvokeAIAppConfig", events: "EventServiceBase", graph_execution_manager: "ItemStorageABC[GraphExecutionState]", - graph_library: "ItemStorageABC[LibraryGraph]", images: "ImageServiceABC", image_files: "ImageFileStorageBase", image_records: "ImageRecordStorageBase", @@ -79,6 +79,8 @@ class InvocationServices: logger: "Logger", model_manager: "ModelManagerServiceBase", model_records: "ModelRecordServiceBase", + download_queue: "DownloadQueueServiceBase", + model_install: "ModelInstallServiceBase", processor: "InvocationProcessorABC", performance_statistics: "InvocationStatsServiceBase", queue: "InvocationQueueABC", @@ -87,7 +89,6 @@ class InvocationServices: invocation_cache: "InvocationCacheBase", names: "NameServiceBase", urls: "UrlServiceBase", - workflow_image_records: "WorkflowImageRecordsStorageBase", workflow_records: "WorkflowRecordsStorageBase", ): self.board_images = board_images @@ -97,7 +98,6 @@ class InvocationServices: self.configuration = configuration self.events = events self.graph_execution_manager = graph_execution_manager - self.graph_library = graph_library self.images = images self.image_files = image_files self.image_records = image_records @@ -105,6 +105,8 @@ class InvocationServices: self.logger = logger self.model_manager = model_manager self.model_records = model_records + self.download_queue = download_queue + self.model_install = model_install self.processor = processor self.performance_statistics = performance_statistics self.queue = queue @@ -113,5 +115,4 @@ class InvocationServices: self.invocation_cache = invocation_cache self.names = names self.urls = urls - self.workflow_image_records = workflow_image_records self.workflow_records = workflow_records diff --git a/invokeai/app/services/invocation_stats/invocation_stats_base.py b/invokeai/app/services/invocation_stats/invocation_stats_base.py index 7db653c3fb..6e5b6a9f69 100644 --- a/invokeai/app/services/invocation_stats/invocation_stats_base.py +++ b/invokeai/app/services/invocation_stats/invocation_stats_base.py @@ -30,23 +30,13 @@ writes to the system log is stored in InvocationServices.performance_statistics. from abc import ABC, abstractmethod from contextlib import AbstractContextManager -from typing import Dict from invokeai.app.invocations.baseinvocation import BaseInvocation -from invokeai.backend.model_management.model_cache import CacheStats - -from .invocation_stats_common import NodeLog class InvocationStatsServiceBase(ABC): "Abstract base class for recording node memory/time performance statistics" - # {graph_id => NodeLog} - _stats: Dict[str, NodeLog] - _cache_stats: Dict[str, CacheStats] - ram_used: float - ram_changed: float - @abstractmethod def __init__(self): """ @@ -77,45 +67,8 @@ class InvocationStatsServiceBase(ABC): pass @abstractmethod - def reset_all_stats(self): - """Zero all statistics""" - pass - - @abstractmethod - def update_invocation_stats( - self, - graph_id: str, - invocation_type: str, - time_used: float, - vram_used: float, - ): - """ - Add timing information on execution of a node. Usually - used internally. - :param graph_id: ID of the graph that is currently executing - :param invocation_type: String literal type of the node - :param time_used: Time used by node's exection (sec) - :param vram_used: Maximum VRAM used during exection (GB) - """ - pass - - @abstractmethod - def log_stats(self): + def log_stats(self, graph_execution_state_id: str): """ Write out the accumulated statistics to the log or somewhere else. """ pass - - @abstractmethod - def update_mem_stats( - self, - ram_used: float, - ram_changed: float, - ): - """ - Update the collector with RAM memory usage info. - - :param ram_used: How much RAM is currently in use. - :param ram_changed: How much RAM changed since last generation. - """ - pass diff --git a/invokeai/app/services/invocation_stats/invocation_stats_common.py b/invokeai/app/services/invocation_stats/invocation_stats_common.py index 19b954f6da..543edc076a 100644 --- a/invokeai/app/services/invocation_stats/invocation_stats_common.py +++ b/invokeai/app/services/invocation_stats/invocation_stats_common.py @@ -1,25 +1,84 @@ -from dataclasses import dataclass, field -from typing import Dict - -# size of GIG in bytes -GIG = 1073741824 +from collections import defaultdict +from dataclasses import dataclass @dataclass -class NodeStats: - """Class for tracking execution stats of an invocation node""" +class NodeExecutionStats: + """Class for tracking execution stats of an invocation node.""" - calls: int = 0 - time_used: float = 0.0 # seconds - max_vram: float = 0.0 # GB - cache_hits: int = 0 - cache_misses: int = 0 - cache_high_watermark: int = 0 + invocation_type: str + + start_time: float # Seconds since the epoch. + end_time: float # Seconds since the epoch. + + start_ram_gb: float # GB + end_ram_gb: float # GB + + peak_vram_gb: float # GB + + def total_time(self) -> float: + return self.end_time - self.start_time -@dataclass -class NodeLog: - """Class for tracking node usage""" +class GraphExecutionStats: + """Class for tracking execution stats of a graph.""" - # {node_type => NodeStats} - nodes: Dict[str, NodeStats] = field(default_factory=dict) + def __init__(self): + self._node_stats_list: list[NodeExecutionStats] = [] + + def add_node_execution_stats(self, node_stats: NodeExecutionStats): + self._node_stats_list.append(node_stats) + + def get_total_run_time(self) -> float: + """Get the total time spent executing nodes in the graph.""" + total = 0.0 + for node_stats in self._node_stats_list: + total += node_stats.total_time() + return total + + def get_first_node_stats(self) -> NodeExecutionStats | None: + """Get the stats of the first node in the graph (by start_time).""" + first_node = None + for node_stats in self._node_stats_list: + if first_node is None or node_stats.start_time < first_node.start_time: + first_node = node_stats + + assert first_node is not None + return first_node + + def get_last_node_stats(self) -> NodeExecutionStats | None: + """Get the stats of the last node in the graph (by end_time).""" + last_node = None + for node_stats in self._node_stats_list: + if last_node is None or node_stats.end_time > last_node.end_time: + last_node = node_stats + + return last_node + + def get_pretty_log(self, graph_execution_state_id: str) -> str: + log = f"Graph stats: {graph_execution_state_id}\n" + log += f"{'Node':>30} {'Calls':>7}{'Seconds':>9} {'VRAM Used':>10}\n" + + # Log stats aggregated by node type. + node_stats_by_type: dict[str, list[NodeExecutionStats]] = defaultdict(list) + for node_stats in self._node_stats_list: + node_stats_by_type[node_stats.invocation_type].append(node_stats) + + for node_type, node_type_stats_list in node_stats_by_type.items(): + num_calls = len(node_type_stats_list) + time_used = sum([n.total_time() for n in node_type_stats_list]) + peak_vram = max([n.peak_vram_gb for n in node_type_stats_list]) + log += f"{node_type:>30} {num_calls:>4} {time_used:7.3f}s {peak_vram:4.3f}G\n" + + # Log stats for the entire graph. + log += f"TOTAL GRAPH EXECUTION TIME: {self.get_total_run_time():7.3f}s\n" + + first_node = self.get_first_node_stats() + last_node = self.get_last_node_stats() + if first_node is not None and last_node is not None: + total_wall_time = last_node.end_time - first_node.start_time + ram_change = last_node.end_ram_gb - first_node.start_ram_gb + log += f"TOTAL GRAPH WALL TIME: {total_wall_time:7.3f}s\n" + log += f"RAM used by InvokeAI process: {last_node.end_ram_gb:4.2f}G ({ram_change:+5.3f}G)\n" + + return log diff --git a/invokeai/app/services/invocation_stats/invocation_stats_default.py b/invokeai/app/services/invocation_stats/invocation_stats_default.py index 34d2cd8354..93f396c2b9 100644 --- a/invokeai/app/services/invocation_stats/invocation_stats_default.py +++ b/invokeai/app/services/invocation_stats/invocation_stats_default.py @@ -1,5 +1,5 @@ import time -from typing import Dict +from contextlib import contextmanager import psutil import torch @@ -7,161 +7,119 @@ import torch import invokeai.backend.util.logging as logger from invokeai.app.invocations.baseinvocation import BaseInvocation from invokeai.app.services.invoker import Invoker -from invokeai.app.services.model_manager.model_manager_base import ModelManagerServiceBase from invokeai.backend.model_management.model_cache import CacheStats from .invocation_stats_base import InvocationStatsServiceBase -from .invocation_stats_common import GIG, NodeLog, NodeStats +from .invocation_stats_common import GraphExecutionStats, NodeExecutionStats + +# Size of 1GB in bytes. +GB = 2**30 class InvocationStatsService(InvocationStatsServiceBase): """Accumulate performance information about a running graph. Collects time spent in each node, as well as the maximum and current VRAM utilisation for CUDA systems""" - _invoker: Invoker - def __init__(self): - # {graph_id => NodeLog} - self._stats: Dict[str, NodeLog] = {} - self._cache_stats: Dict[str, CacheStats] = {} - self.ram_used: float = 0.0 - self.ram_changed: float = 0.0 + # Maps graph_execution_state_id to GraphExecutionStats. + self._stats: dict[str, GraphExecutionStats] = {} + # Maps graph_execution_state_id to model manager CacheStats. + self._cache_stats: dict[str, CacheStats] = {} def start(self, invoker: Invoker) -> None: self._invoker = invoker - class StatsContext: - """Context manager for collecting statistics.""" - - invocation: BaseInvocation - collector: "InvocationStatsServiceBase" - graph_id: str - start_time: float - ram_used: int - model_manager: ModelManagerServiceBase - - def __init__( - self, - invocation: BaseInvocation, - graph_id: str, - model_manager: ModelManagerServiceBase, - collector: "InvocationStatsServiceBase", - ): - """Initialize statistics for this run.""" - self.invocation = invocation - self.collector = collector - self.graph_id = graph_id - self.start_time = 0.0 - self.ram_used = 0 - self.model_manager = model_manager - - def __enter__(self): - self.start_time = time.time() - if torch.cuda.is_available(): - torch.cuda.reset_peak_memory_stats() - self.ram_used = psutil.Process().memory_info().rss - if self.model_manager: - self.model_manager.collect_cache_stats(self.collector._cache_stats[self.graph_id]) - - def __exit__(self, *args): - """Called on exit from the context.""" - ram_used = psutil.Process().memory_info().rss - self.collector.update_mem_stats( - ram_used=ram_used / GIG, - ram_changed=(ram_used - self.ram_used) / GIG, - ) - self.collector.update_invocation_stats( - graph_id=self.graph_id, - invocation_type=self.invocation.type, # type: ignore # `type` is not on the `BaseInvocation` model, but *is* on all invocations - time_used=time.time() - self.start_time, - vram_used=torch.cuda.max_memory_allocated() / GIG if torch.cuda.is_available() else 0.0, - ) - - def collect_stats( - self, - invocation: BaseInvocation, - graph_execution_state_id: str, - ) -> StatsContext: - if not self._stats.get(graph_execution_state_id): # first time we're seeing this - self._stats[graph_execution_state_id] = NodeLog() + @contextmanager + def collect_stats(self, invocation: BaseInvocation, graph_execution_state_id: str): + if not self._stats.get(graph_execution_state_id): + # First time we're seeing this graph_execution_state_id. + self._stats[graph_execution_state_id] = GraphExecutionStats() self._cache_stats[graph_execution_state_id] = CacheStats() - return self.StatsContext(invocation, graph_execution_state_id, self._invoker.services.model_manager, self) - def reset_all_stats(self): - """Zero all statistics""" - self._stats = {} + # Prune stale stats. There should be none since we're starting a new graph, but just in case. + self._prune_stale_stats() + + # Record state before the invocation. + start_time = time.time() + start_ram = psutil.Process().memory_info().rss + if torch.cuda.is_available(): + torch.cuda.reset_peak_memory_stats() + if self._invoker.services.model_manager: + self._invoker.services.model_manager.collect_cache_stats(self._cache_stats[graph_execution_state_id]) - def reset_stats(self, graph_execution_id: str): try: - self._stats.pop(graph_execution_id) - except KeyError: - logger.warning(f"Attempted to clear statistics for unknown graph {graph_execution_id}") + # Let the invocation run. + yield None + finally: + # Record state after the invocation. + node_stats = NodeExecutionStats( + invocation_type=invocation.type, + start_time=start_time, + end_time=time.time(), + start_ram_gb=start_ram / GB, + end_ram_gb=psutil.Process().memory_info().rss / GB, + peak_vram_gb=torch.cuda.max_memory_allocated() / GB if torch.cuda.is_available() else 0.0, + ) + self._stats[graph_execution_state_id].add_node_execution_stats(node_stats) - def update_mem_stats( - self, - ram_used: float, - ram_changed: float, - ): - self.ram_used = ram_used - self.ram_changed = ram_changed + def _prune_stale_stats(self): + """Check all graphs being tracked and prune any that have completed/errored. - def update_invocation_stats( - self, - graph_id: str, - invocation_type: str, - time_used: float, - vram_used: float, - ): - if not self._stats[graph_id].nodes.get(invocation_type): - self._stats[graph_id].nodes[invocation_type] = NodeStats() - stats = self._stats[graph_id].nodes[invocation_type] - stats.calls += 1 - stats.time_used += time_used - stats.max_vram = max(stats.max_vram, vram_used) - - def log_stats(self): - completed = set() - errored = set() - for graph_id, _node_log in self._stats.items(): + This shouldn't be necessary, but we don't have totally robust upstream handling of graph completions/errors, so + for now we call this function periodically to prevent them from accumulating. + """ + to_prune = [] + for graph_execution_state_id in self._stats: try: - current_graph_state = self._invoker.services.graph_execution_manager.get(graph_id) + graph_execution_state = self._invoker.services.graph_execution_manager.get(graph_execution_state_id) except Exception: - errored.add(graph_id) + # TODO(ryand): What would cause this? Should this exception just be allowed to propagate? + logger.warning(f"Failed to get graph state for {graph_execution_state_id}.") continue - if not current_graph_state.is_complete(): + if not graph_execution_state.is_complete(): + # The graph is still running, don't prune it. continue - total_time = 0 - logger.info(f"Graph stats: {graph_id}") - logger.info(f"{'Node':>30} {'Calls':>7}{'Seconds':>9} {'VRAM Used':>10}") - for node_type, stats in self._stats[graph_id].nodes.items(): - logger.info(f"{node_type:>30} {stats.calls:>4} {stats.time_used:7.3f}s {stats.max_vram:4.3f}G") - total_time += stats.time_used + to_prune.append(graph_execution_state_id) - cache_stats = self._cache_stats[graph_id] - hwm = cache_stats.high_watermark / GIG - tot = cache_stats.cache_size / GIG - loaded = sum(list(cache_stats.loaded_model_sizes.values())) / GIG + for graph_execution_state_id in to_prune: + del self._stats[graph_execution_state_id] + del self._cache_stats[graph_execution_state_id] - logger.info(f"TOTAL GRAPH EXECUTION TIME: {total_time:7.3f}s") - logger.info("RAM used by InvokeAI process: " + "%4.2fG" % self.ram_used + f" ({self.ram_changed:+5.3f}G)") - logger.info(f"RAM used to load models: {loaded:4.2f}G") - if torch.cuda.is_available(): - logger.info("VRAM in use: " + "%4.3fG" % (torch.cuda.memory_allocated() / GIG)) - logger.info("RAM cache statistics:") - logger.info(f" Model cache hits: {cache_stats.hits}") - logger.info(f" Model cache misses: {cache_stats.misses}") - logger.info(f" Models cached: {cache_stats.in_cache}") - logger.info(f" Models cleared from cache: {cache_stats.cleared}") - logger.info(f" Cache high water mark: {hwm:4.2f}/{tot:4.2f}G") + if len(to_prune) > 0: + logger.info(f"Pruned stale graph stats for {to_prune}.") - completed.add(graph_id) + def reset_stats(self, graph_execution_state_id: str): + try: + del self._stats[graph_execution_state_id] + del self._cache_stats[graph_execution_state_id] + except KeyError as e: + logger.warning(f"Attempted to clear statistics for unknown graph {graph_execution_state_id}: {e}.") - for graph_id in completed: - del self._stats[graph_id] - del self._cache_stats[graph_id] + def log_stats(self, graph_execution_state_id: str): + try: + graph_stats = self._stats[graph_execution_state_id] + cache_stats = self._cache_stats[graph_execution_state_id] + except KeyError as e: + logger.warning(f"Attempted to log statistics for unknown graph {graph_execution_state_id}: {e}.") + return - for graph_id in errored: - del self._stats[graph_id] - del self._cache_stats[graph_id] + log = graph_stats.get_pretty_log(graph_execution_state_id) + + hwm = cache_stats.high_watermark / GB + tot = cache_stats.cache_size / GB + loaded = sum(list(cache_stats.loaded_model_sizes.values())) / GB + log += f"RAM used to load models: {loaded:4.2f}G\n" + if torch.cuda.is_available(): + log += f"VRAM in use: {(torch.cuda.memory_allocated() / GB):4.3f}G\n" + log += "RAM cache statistics:\n" + log += f" Model cache hits: {cache_stats.hits}\n" + log += f" Model cache misses: {cache_stats.misses}\n" + log += f" Models cached: {cache_stats.in_cache}\n" + log += f" Models cleared from cache: {cache_stats.cleared}\n" + log += f" Cache high water mark: {hwm:4.2f}/{tot:4.2f}G\n" + logger.info(log) + + del self._stats[graph_execution_state_id] + del self._cache_stats[graph_execution_state_id] diff --git a/invokeai/app/services/invoker.py b/invokeai/app/services/invoker.py index 134bec2693..a04c6f2059 100644 --- a/invokeai/app/services/invoker.py +++ b/invokeai/app/services/invoker.py @@ -2,6 +2,8 @@ from typing import Optional +from invokeai.app.services.workflow_records.workflow_records_common import WorkflowWithoutID + from .invocation_queue.invocation_queue_common import InvocationQueueItem from .invocation_services import InvocationServices from .shared.graph import Graph, GraphExecutionState @@ -22,6 +24,7 @@ class Invoker: session_queue_item_id: int, session_queue_batch_id: str, graph_execution_state: GraphExecutionState, + workflow: Optional[WorkflowWithoutID] = None, invoke_all: bool = False, ) -> Optional[str]: """Determines the next node to invoke and enqueues it, preparing if needed. @@ -43,6 +46,7 @@ class Invoker: session_queue_batch_id=session_queue_batch_id, graph_execution_state_id=graph_execution_state.id, invocation_id=invocation.id, + workflow=workflow, invoke_all=invoke_all, ) ) diff --git a/invokeai/app/services/item_storage/item_storage_sqlite.py b/invokeai/app/services/item_storage/item_storage_sqlite.py index d5a1b7f730..e02d3bdbb2 100644 --- a/invokeai/app/services/item_storage/item_storage_sqlite.py +++ b/invokeai/app/services/item_storage/item_storage_sqlite.py @@ -5,7 +5,7 @@ from typing import Generic, Optional, TypeVar, get_args from pydantic import BaseModel, TypeAdapter from invokeai.app.services.shared.pagination import PaginatedResults -from invokeai.app.services.shared.sqlite import SqliteDatabase +from invokeai.app.services.shared.sqlite.sqlite_database import SqliteDatabase from .item_storage_base import ItemStorageABC diff --git a/invokeai/app/services/model_install/__init__.py b/invokeai/app/services/model_install/__init__.py new file mode 100644 index 0000000000..5a01d07b5f --- /dev/null +++ b/invokeai/app/services/model_install/__init__.py @@ -0,0 +1,27 @@ +"""Initialization file for model install service package.""" + +from .model_install_base import ( + CivitaiModelSource, + HFModelSource, + InstallStatus, + LocalModelSource, + ModelInstallJob, + ModelInstallServiceBase, + ModelSource, + UnknownInstallJobException, + URLModelSource, +) +from .model_install_default import ModelInstallService + +__all__ = [ + "ModelInstallServiceBase", + "ModelInstallService", + "InstallStatus", + "ModelInstallJob", + "UnknownInstallJobException", + "ModelSource", + "LocalModelSource", + "HFModelSource", + "URLModelSource", + "CivitaiModelSource", +] diff --git a/invokeai/app/services/model_install/model_install_base.py b/invokeai/app/services/model_install/model_install_base.py new file mode 100644 index 0000000000..a863e14a65 --- /dev/null +++ b/invokeai/app/services/model_install/model_install_base.py @@ -0,0 +1,412 @@ +# Copyright 2023 Lincoln D. Stein and the InvokeAI development team +"""Baseclass definitions for the model installer.""" + +import re +import traceback +from abc import ABC, abstractmethod +from enum import Enum +from pathlib import Path +from typing import Any, Dict, List, Literal, Optional, Set, Union + +from pydantic import BaseModel, Field, PrivateAttr, field_validator +from pydantic.networks import AnyHttpUrl +from typing_extensions import Annotated + +from invokeai.app.services.config import InvokeAIAppConfig +from invokeai.app.services.download import DownloadJob, DownloadQueueServiceBase +from invokeai.app.services.events import EventServiceBase +from invokeai.app.services.invoker import Invoker +from invokeai.app.services.model_records import ModelRecordServiceBase +from invokeai.backend.model_manager import AnyModelConfig, ModelRepoVariant +from invokeai.backend.model_manager.metadata import AnyModelRepoMetadata, ModelMetadataStore + + +class InstallStatus(str, Enum): + """State of an install job running in the background.""" + + WAITING = "waiting" # waiting to be dequeued + DOWNLOADING = "downloading" # downloading of model files in process + RUNNING = "running" # being processed + COMPLETED = "completed" # finished running + ERROR = "error" # terminated with an error message + CANCELLED = "cancelled" # terminated with an error message + + +class ModelInstallPart(BaseModel): + url: AnyHttpUrl + path: Path + bytes: int = 0 + total_bytes: int = 0 + + +class UnknownInstallJobException(Exception): + """Raised when the status of an unknown job is requested.""" + + +class StringLikeSource(BaseModel): + """ + Base class for model sources, implements functions that lets the source be sorted and indexed. + + These shenanigans let this stuff work: + + source1 = LocalModelSource(path='C:/users/mort/foo.safetensors') + mydict = {source1: 'model 1'} + assert mydict['C:/users/mort/foo.safetensors'] == 'model 1' + assert mydict[LocalModelSource(path='C:/users/mort/foo.safetensors')] == 'model 1' + + source2 = LocalModelSource(path=Path('C:/users/mort/foo.safetensors')) + assert source1 == source2 + assert source1 == 'C:/users/mort/foo.safetensors' + """ + + def __hash__(self) -> int: + """Return hash of the path field, for indexing.""" + return hash(str(self)) + + def __lt__(self, other: object) -> int: + """Return comparison of the stringified version, for sorting.""" + return str(self) < str(other) + + def __eq__(self, other: object) -> bool: + """Return equality on the stringified version.""" + if isinstance(other, Path): + return str(self) == other.as_posix() + else: + return str(self) == str(other) + + +class LocalModelSource(StringLikeSource): + """A local file or directory path.""" + + path: str | Path + inplace: Optional[bool] = False + type: Literal["local"] = "local" + + # these methods allow the source to be used in a string-like way, + # for example as an index into a dict + def __str__(self) -> str: + """Return string version of path when string rep needed.""" + return Path(self.path).as_posix() + + +class CivitaiModelSource(StringLikeSource): + """A Civitai version id, with optional variant and access token.""" + + version_id: int + variant: Optional[ModelRepoVariant] = None + access_token: Optional[str] = None + type: Literal["civitai"] = "civitai" + + def __str__(self) -> str: + """Return string version of repoid when string rep needed.""" + base: str = str(self.version_id) + base += f" ({self.variant})" if self.variant else "" + return base + + +class HFModelSource(StringLikeSource): + """ + A HuggingFace repo_id with optional variant, sub-folder and access token. + Note that the variant option, if not provided to the constructor, will default to fp16, which is + what people (almost) always want. + """ + + repo_id: str + variant: Optional[ModelRepoVariant] = ModelRepoVariant.FP16 + subfolder: Optional[Path] = None + access_token: Optional[str] = None + type: Literal["hf"] = "hf" + + @field_validator("repo_id") + @classmethod + def proper_repo_id(cls, v: str) -> str: # noqa D102 + if not re.match(r"^([.\w-]+/[.\w-]+)$", v): + raise ValueError(f"{v}: invalid repo_id format") + return v + + def __str__(self) -> str: + """Return string version of repoid when string rep needed.""" + base: str = self.repo_id + base += f":{self.subfolder}" if self.subfolder else "" + base += f" ({self.variant})" if self.variant else "" + return base + + +class URLModelSource(StringLikeSource): + """A generic URL point to a checkpoint file.""" + + url: AnyHttpUrl + access_token: Optional[str] = None + type: Literal["url"] = "url" + + def __str__(self) -> str: + """Return string version of the url when string rep needed.""" + return str(self.url) + + +ModelSource = Annotated[ + Union[LocalModelSource, HFModelSource, CivitaiModelSource, URLModelSource], Field(discriminator="type") +] + + +class ModelInstallJob(BaseModel): + """Object that tracks the current status of an install request.""" + + id: int = Field(description="Unique ID for this job") + status: InstallStatus = Field(default=InstallStatus.WAITING, description="Current status of install process") + config_in: Dict[str, Any] = Field( + default_factory=dict, description="Configuration information (e.g. 'description') to apply to model." + ) + config_out: Optional[AnyModelConfig] = Field( + default=None, description="After successful installation, this will hold the configuration object." + ) + inplace: bool = Field( + default=False, description="Leave model in its current location; otherwise install under models directory" + ) + source: ModelSource = Field(description="Source (URL, repo_id, or local path) of model") + local_path: Path = Field(description="Path to locally-downloaded model; may be the same as the source") + bytes: Optional[int] = Field( + default=None, description="For a remote model, the number of bytes downloaded so far (may not be available)" + ) + total_bytes: int = Field(default=0, description="Total size of the model to be installed") + source_metadata: Optional[AnyModelRepoMetadata] = Field( + default=None, description="Metadata provided by the model source" + ) + download_parts: Set[DownloadJob] = Field( + default_factory=set, description="Download jobs contributing to this install" + ) + # internal flags and transitory settings + _install_tmpdir: Optional[Path] = PrivateAttr(default=None) + _exception: Optional[Exception] = PrivateAttr(default=None) + + def set_error(self, e: Exception) -> None: + """Record the error and traceback from an exception.""" + self._exception = e + self.status = InstallStatus.ERROR + + def cancel(self) -> None: + """Call to cancel the job.""" + self.status = InstallStatus.CANCELLED + + @property + def error_type(self) -> Optional[str]: + """Class name of the exception that led to status==ERROR.""" + return self._exception.__class__.__name__ if self._exception else None + + @property + def error(self) -> Optional[str]: + """Error traceback.""" + return "".join(traceback.format_exception(self._exception)) if self._exception else None + + @property + def cancelled(self) -> bool: + """Set status to CANCELLED.""" + return self.status == InstallStatus.CANCELLED + + @property + def errored(self) -> bool: + """Return true if job has errored.""" + return self.status == InstallStatus.ERROR + + @property + def waiting(self) -> bool: + """Return true if job is waiting to run.""" + return self.status == InstallStatus.WAITING + + @property + def downloading(self) -> bool: + """Return true if job is downloading.""" + return self.status == InstallStatus.DOWNLOADING + + @property + def running(self) -> bool: + """Return true if job is running.""" + return self.status == InstallStatus.RUNNING + + @property + def complete(self) -> bool: + """Return true if job completed without errors.""" + return self.status == InstallStatus.COMPLETED + + @property + def in_terminal_state(self) -> bool: + """Return true if job is in a terminal state.""" + return self.status in [InstallStatus.COMPLETED, InstallStatus.ERROR, InstallStatus.CANCELLED] + + +class ModelInstallServiceBase(ABC): + """Abstract base class for InvokeAI model installation.""" + + @abstractmethod + def __init__( + self, + app_config: InvokeAIAppConfig, + record_store: ModelRecordServiceBase, + download_queue: DownloadQueueServiceBase, + metadata_store: ModelMetadataStore, + event_bus: Optional["EventServiceBase"] = None, + ): + """ + Create ModelInstallService object. + + :param config: Systemwide InvokeAIAppConfig. + :param store: Systemwide ModelConfigStore + :param event_bus: InvokeAI event bus for reporting events to. + """ + + # make the invoker optional here because we don't need it and it + # makes the installer harder to use outside the web app + @abstractmethod + def start(self, invoker: Optional[Invoker] = None) -> None: + """Start the installer service.""" + + @abstractmethod + def stop(self, invoker: Optional[Invoker] = None) -> None: + """Stop the model install service. After this the objection can be safely deleted.""" + + @property + @abstractmethod + def app_config(self) -> InvokeAIAppConfig: + """Return the appConfig object associated with the installer.""" + + @property + @abstractmethod + def record_store(self) -> ModelRecordServiceBase: + """Return the ModelRecoreService object associated with the installer.""" + + @property + @abstractmethod + def event_bus(self) -> Optional[EventServiceBase]: + """Return the event service base object associated with the installer.""" + + @abstractmethod + def register_path( + self, + model_path: Union[Path, str], + config: Optional[Dict[str, Any]] = None, + ) -> str: + """ + Probe and register the model at model_path. + + This keeps the model in its current location. + + :param model_path: Filesystem Path to the model. + :param config: Dict of attributes that will override autoassigned values. + :returns id: The string ID of the registered model. + """ + + @abstractmethod + def unregister(self, key: str) -> None: + """Remove model with indicated key from the database.""" + + @abstractmethod + def delete(self, key: str) -> None: + """Remove model with indicated key from the database. Delete its files only if they are within our models directory.""" + + @abstractmethod + def unconditionally_delete(self, key: str) -> None: + """Remove model with indicated key from the database and unconditionally delete weight files from disk.""" + + @abstractmethod + def install_path( + self, + model_path: Union[Path, str], + config: Optional[Dict[str, Any]] = None, + ) -> str: + """ + Probe, register and install the model in the models directory. + + This moves the model from its current location into + the models directory handled by InvokeAI. + + :param model_path: Filesystem Path to the model. + :param config: Dict of attributes that will override autoassigned values. + :returns id: The string ID of the registered model. + """ + + @abstractmethod + def import_model( + self, + source: ModelSource, + config: Optional[Dict[str, Any]] = None, + ) -> ModelInstallJob: + """Install the indicated model. + + :param source: ModelSource object + + :param config: Optional dict. Any fields in this dict + will override corresponding autoassigned probe fields in the + model's config record. Use it to override + `name`, `description`, `base_type`, `model_type`, `format`, + `prediction_type`, `image_size`, and/or `ztsnr_training`. + + This will download the model located at `source`, + probe it, and install it into the models directory. + This call is executed asynchronously in a separate + thread and will issue the following events on the event bus: + + - model_install_started + - model_install_error + - model_install_completed + + The `inplace` flag does not affect the behavior of downloaded + models, which are always moved into the `models` directory. + + The call returns a ModelInstallJob object which can be + polled to learn the current status and/or error message. + + Variants recognized by HuggingFace currently are: + 1. onnx + 2. openvino + 3. fp16 + 4. None (usually returns fp32 model) + + """ + + @abstractmethod + def get_job_by_source(self, source: ModelSource) -> List[ModelInstallJob]: + """Return the ModelInstallJob(s) corresponding to the provided source.""" + + @abstractmethod + def get_job_by_id(self, id: int) -> ModelInstallJob: + """Return the ModelInstallJob corresponding to the provided id. Raises ValueError if no job has that ID.""" + + @abstractmethod + def list_jobs(self) -> List[ModelInstallJob]: # noqa D102 + """ + List active and complete install jobs. + """ + + @abstractmethod + def prune_jobs(self) -> None: + """Prune all completed and errored jobs.""" + + @abstractmethod + def cancel_job(self, job: ModelInstallJob) -> None: + """Cancel the indicated job.""" + + @abstractmethod + def wait_for_installs(self, timeout: int = 0) -> List[ModelInstallJob]: + """ + Wait for all pending installs to complete. + + This will block until all pending installs have + completed, been cancelled, or errored out. + + :param timeout: Wait up to indicated number of seconds. Raise an Exception('timeout') if + installs do not complete within the indicated time. + """ + + @abstractmethod + def scan_directory(self, scan_dir: Path, install: bool = False) -> List[str]: + """ + Recursively scan directory for new models and register or install them. + + :param scan_dir: Path to the directory to scan. + :param install: Install if True, otherwise register in place. + :returns list of IDs: Returns list of IDs of models registered/installed + """ + + @abstractmethod + def sync_to_config(self) -> None: + """Synchronize models on disk to those in the model record database.""" diff --git a/invokeai/app/services/model_install/model_install_default.py b/invokeai/app/services/model_install/model_install_default.py new file mode 100644 index 0000000000..f66da3ce17 --- /dev/null +++ b/invokeai/app/services/model_install/model_install_default.py @@ -0,0 +1,759 @@ +"""Model installation class.""" + +import os +import re +import threading +import time +from hashlib import sha256 +from pathlib import Path +from queue import Empty, Queue +from random import randbytes +from shutil import copyfile, copytree, move, rmtree +from tempfile import mkdtemp +from typing import Any, Dict, List, Optional, Set, Union + +from huggingface_hub import HfFolder +from pydantic.networks import AnyHttpUrl +from requests import Session + +from invokeai.app.services.config import InvokeAIAppConfig +from invokeai.app.services.download import DownloadJob, DownloadQueueServiceBase +from invokeai.app.services.events.events_base import EventServiceBase +from invokeai.app.services.invoker import Invoker +from invokeai.app.services.model_records import DuplicateModelException, ModelRecordServiceBase, ModelRecordServiceSQL +from invokeai.backend.model_manager.config import ( + AnyModelConfig, + BaseModelType, + InvalidModelConfigException, + ModelRepoVariant, + ModelType, +) +from invokeai.backend.model_manager.hash import FastModelHash +from invokeai.backend.model_manager.metadata import ( + AnyModelRepoMetadata, + CivitaiMetadataFetch, + HuggingFaceMetadataFetch, + ModelMetadataStore, + ModelMetadataWithFiles, + RemoteModelFile, +) +from invokeai.backend.model_manager.probe import ModelProbe +from invokeai.backend.model_manager.search import ModelSearch +from invokeai.backend.util import Chdir, InvokeAILogger +from invokeai.backend.util.devices import choose_precision, choose_torch_device + +from .model_install_base import ( + CivitaiModelSource, + HFModelSource, + InstallStatus, + LocalModelSource, + ModelInstallJob, + ModelInstallServiceBase, + ModelSource, + URLModelSource, +) + +TMPDIR_PREFIX = "tmpinstall_" + + +class ModelInstallService(ModelInstallServiceBase): + """class for InvokeAI model installation.""" + + def __init__( + self, + app_config: InvokeAIAppConfig, + record_store: ModelRecordServiceBase, + download_queue: DownloadQueueServiceBase, + metadata_store: Optional[ModelMetadataStore] = None, + event_bus: Optional[EventServiceBase] = None, + session: Optional[Session] = None, + ): + """ + Initialize the installer object. + + :param app_config: InvokeAIAppConfig object + :param record_store: Previously-opened ModelRecordService database + :param event_bus: Optional EventService object + """ + self._app_config = app_config + self._record_store = record_store + self._event_bus = event_bus + self._logger = InvokeAILogger.get_logger(name=self.__class__.__name__) + self._install_jobs: List[ModelInstallJob] = [] + self._install_queue: Queue[ModelInstallJob] = Queue() + self._cached_model_paths: Set[Path] = set() + self._models_installed: Set[str] = set() + self._lock = threading.Lock() + self._stop_event = threading.Event() + self._downloads_changed_event = threading.Event() + self._download_queue = download_queue + self._download_cache: Dict[AnyHttpUrl, ModelInstallJob] = {} + self._running = False + self._session = session + self._next_job_id = 0 + # There may not necessarily be a metadata store initialized + # so we create one and initialize it with the same sql database + # used by the record store service. + if metadata_store: + self._metadata_store = metadata_store + else: + assert isinstance(record_store, ModelRecordServiceSQL) + self._metadata_store = ModelMetadataStore(record_store.db) + + @property + def app_config(self) -> InvokeAIAppConfig: # noqa D102 + return self._app_config + + @property + def record_store(self) -> ModelRecordServiceBase: # noqa D102 + return self._record_store + + @property + def event_bus(self) -> Optional[EventServiceBase]: # noqa D102 + return self._event_bus + + # make the invoker optional here because we don't need it and it + # makes the installer harder to use outside the web app + def start(self, invoker: Optional[Invoker] = None) -> None: + """Start the installer thread.""" + with self._lock: + if self._running: + raise Exception("Attempt to start the installer service twice") + self._start_installer_thread() + self._remove_dangling_install_dirs() + self.sync_to_config() + + def stop(self, invoker: Optional[Invoker] = None) -> None: + """Stop the installer thread; after this the object can be deleted and garbage collected.""" + with self._lock: + if not self._running: + raise Exception("Attempt to stop the install service before it was started") + self._stop_event.set() + with self._install_queue.mutex: + self._install_queue.queue.clear() # get rid of pending jobs + active_jobs = [x for x in self.list_jobs() if x.running] + if active_jobs: + self._logger.warning("Waiting for active install job to complete") + self.wait_for_installs() + self._download_cache.clear() + self._running = False + + def register_path( + self, + model_path: Union[Path, str], + config: Optional[Dict[str, Any]] = None, + ) -> str: # noqa D102 + model_path = Path(model_path) + config = config or {} + if config.get("source") is None: + config["source"] = model_path.resolve().as_posix() + return self._register(model_path, config) + + def install_path( + self, + model_path: Union[Path, str], + config: Optional[Dict[str, Any]] = None, + ) -> str: # noqa D102 + model_path = Path(model_path) + config = config or {} + if config.get("source") is None: + config["source"] = model_path.resolve().as_posix() + + info: AnyModelConfig = self._probe_model(Path(model_path), config) + old_hash = info.original_hash + dest_path = self.app_config.models_path / info.base.value / info.type.value / model_path.name + try: + new_path = self._copy_model(model_path, dest_path) + except FileExistsError as excp: + raise DuplicateModelException( + f"A model named {model_path.name} is already installed at {dest_path.as_posix()}" + ) from excp + new_hash = FastModelHash.hash(new_path) + assert new_hash == old_hash, f"{model_path}: Model hash changed during installation, possibly corrupted." + + return self._register( + new_path, + config, + info, + ) + + def import_model(self, source: ModelSource, config: Optional[Dict[str, Any]] = None) -> ModelInstallJob: # noqa D102 + if isinstance(source, LocalModelSource): + install_job = self._import_local_model(source, config) + self._install_queue.put(install_job) # synchronously install + elif isinstance(source, CivitaiModelSource): + install_job = self._import_from_civitai(source, config) + elif isinstance(source, HFModelSource): + install_job = self._import_from_hf(source, config) + elif isinstance(source, URLModelSource): + install_job = self._import_from_url(source, config) + else: + raise ValueError(f"Unsupported model source: '{type(source)}'") + + self._install_jobs.append(install_job) + return install_job + + def list_jobs(self) -> List[ModelInstallJob]: # noqa D102 + return self._install_jobs + + def get_job_by_source(self, source: ModelSource) -> List[ModelInstallJob]: # noqa D102 + return [x for x in self._install_jobs if x.source == source] + + def get_job_by_id(self, id: int) -> ModelInstallJob: # noqa D102 + jobs = [x for x in self._install_jobs if x.id == id] + if not jobs: + raise ValueError(f"No job with id {id} known") + assert len(jobs) == 1 + assert isinstance(jobs[0], ModelInstallJob) + return jobs[0] + + def wait_for_installs(self, timeout: int = 0) -> List[ModelInstallJob]: # noqa D102 + """Block until all installation jobs are done.""" + start = time.time() + while len(self._download_cache) > 0: + if self._downloads_changed_event.wait(timeout=5): # in case we miss an event + self._downloads_changed_event.clear() + if timeout > 0 and time.time() - start > timeout: + raise Exception("Timeout exceeded") + self._install_queue.join() + return self._install_jobs + + def cancel_job(self, job: ModelInstallJob) -> None: + """Cancel the indicated job.""" + job.cancel() + with self._lock: + self._cancel_download_parts(job) + + def prune_jobs(self) -> None: + """Prune all completed and errored jobs.""" + unfinished_jobs = [x for x in self._install_jobs if not x.in_terminal_state] + self._install_jobs = unfinished_jobs + + def sync_to_config(self) -> None: + """Synchronize models on disk to those in the config record store database.""" + self._scan_models_directory() + if autoimport := self._app_config.autoimport_dir: + self._logger.info("Scanning autoimport directory for new models") + installed = self.scan_directory(self._app_config.root_path / autoimport) + self._logger.info(f"{len(installed)} new models registered") + self._logger.info("Model installer (re)initialized") + + def scan_directory(self, scan_dir: Path, install: bool = False) -> List[str]: # noqa D102 + self._cached_model_paths = {Path(x.path) for x in self.record_store.all_models()} + callback = self._scan_install if install else self._scan_register + search = ModelSearch(on_model_found=callback) + self._models_installed.clear() + search.search(scan_dir) + return list(self._models_installed) + + def unregister(self, key: str) -> None: # noqa D102 + self.record_store.del_model(key) + + def delete(self, key: str) -> None: # noqa D102 + """Unregister the model. Delete its files only if they are within our models directory.""" + model = self.record_store.get_model(key) + models_dir = self.app_config.models_path + model_path = models_dir / model.path + if model_path.is_relative_to(models_dir): + self.unconditionally_delete(key) + else: + self.unregister(key) + + def unconditionally_delete(self, key: str) -> None: # noqa D102 + model = self.record_store.get_model(key) + path = self.app_config.models_path / model.path + if path.is_dir(): + rmtree(path) + else: + path.unlink() + self.unregister(key) + + # -------------------------------------------------------------------------------------------- + # Internal functions that manage the installer threads + # -------------------------------------------------------------------------------------------- + def _start_installer_thread(self) -> None: + threading.Thread(target=self._install_next_item, daemon=True).start() + self._running = True + + def _install_next_item(self) -> None: + done = False + while not done: + if self._stop_event.is_set(): + done = True + continue + try: + job = self._install_queue.get(timeout=1) + except Empty: + continue + + assert job.local_path is not None + try: + if job.cancelled: + self._signal_job_cancelled(job) + + elif job.errored: + self._signal_job_errored(job) + + elif ( + job.waiting or job.downloading + ): # local jobs will be in waiting state, remote jobs will be downloading state + job.total_bytes = self._stat_size(job.local_path) + job.bytes = job.total_bytes + self._signal_job_running(job) + if job.inplace: + key = self.register_path(job.local_path, job.config_in) + else: + key = self.install_path(job.local_path, job.config_in) + job.config_out = self.record_store.get_model(key) + + # enter the metadata, if there is any + if job.source_metadata: + self._metadata_store.add_metadata(key, job.source_metadata) + self._signal_job_completed(job) + + except InvalidModelConfigException as excp: + if any(x.content_type is not None and "text/html" in x.content_type for x in job.download_parts): + job.set_error( + InvalidModelConfigException( + f"At least one file in {job.local_path} is an HTML page, not a model. This can happen when an access token is required to download." + ) + ) + else: + job.set_error(excp) + self._signal_job_errored(job) + + except (OSError, DuplicateModelException) as excp: + job.set_error(excp) + self._signal_job_errored(job) + + finally: + # if this is an install of a remote file, then clean up the temporary directory + if job._install_tmpdir is not None: + rmtree(job._install_tmpdir) + self._install_queue.task_done() + + self._logger.info("Install thread exiting") + + # -------------------------------------------------------------------------------------------- + # Internal functions that manage the models directory + # -------------------------------------------------------------------------------------------- + def _remove_dangling_install_dirs(self) -> None: + """Remove leftover tmpdirs from aborted installs.""" + path = self._app_config.models_path + for tmpdir in path.glob(f"{TMPDIR_PREFIX}*"): + self._logger.info(f"Removing dangling temporary directory {tmpdir}") + rmtree(tmpdir) + + def _scan_models_directory(self) -> None: + """ + Scan the models directory for new and missing models. + + New models will be added to the storage backend. Missing models + will be deleted. + """ + defunct_models = set() + installed = set() + + with Chdir(self._app_config.models_path): + self._logger.info("Checking for models that have been moved or deleted from disk") + for model_config in self.record_store.all_models(): + path = Path(model_config.path) + if not path.exists(): + self._logger.info(f"{model_config.name}: path {path.as_posix()} no longer exists. Unregistering") + defunct_models.add(model_config.key) + for key in defunct_models: + self.unregister(key) + + self._logger.info(f"Scanning {self._app_config.models_path} for new and orphaned models") + for cur_base_model in BaseModelType: + for cur_model_type in ModelType: + models_dir = Path(cur_base_model.value, cur_model_type.value) + installed.update(self.scan_directory(models_dir)) + self._logger.info(f"{len(installed)} new models registered; {len(defunct_models)} unregistered") + + def _sync_model_path(self, key: str, ignore_hash_change: bool = False) -> AnyModelConfig: + """ + Move model into the location indicated by its basetype, type and name. + + Call this after updating a model's attributes in order to move + the model's path into the location indicated by its basetype, type and + name. Applies only to models whose paths are within the root `models_dir` + directory. + + May raise an UnknownModelException. + """ + model = self.record_store.get_model(key) + old_path = Path(model.path) + models_dir = self.app_config.models_path + + if not old_path.is_relative_to(models_dir): + return model + + new_path = models_dir / model.base.value / model.type.value / model.name + self._logger.info(f"Moving {model.name} to {new_path}.") + new_path = self._move_model(old_path, new_path) + new_hash = FastModelHash.hash(new_path) + model.path = new_path.relative_to(models_dir).as_posix() + if model.current_hash != new_hash: + assert ( + ignore_hash_change + ), f"{model.name}: Model hash changed during installation, model is possibly corrupted" + model.current_hash = new_hash + self._logger.info(f"Model has new hash {model.current_hash}, but will continue to be identified by {key}") + self.record_store.update_model(key, model) + return model + + def _scan_register(self, model: Path) -> bool: + if model in self._cached_model_paths: + return True + try: + id = self.register_path(model) + self._sync_model_path(id) # possibly move it to right place in `models` + self._logger.info(f"Registered {model.name} with id {id}") + self._models_installed.add(id) + except DuplicateModelException: + pass + return True + + def _scan_install(self, model: Path) -> bool: + if model in self._cached_model_paths: + return True + try: + id = self.install_path(model) + self._logger.info(f"Installed {model} with id {id}") + self._models_installed.add(id) + except DuplicateModelException: + pass + return True + + def _copy_model(self, old_path: Path, new_path: Path) -> Path: + if old_path == new_path: + return old_path + new_path.parent.mkdir(parents=True, exist_ok=True) + if old_path.is_dir(): + copytree(old_path, new_path) + else: + copyfile(old_path, new_path) + return new_path + + def _move_model(self, old_path: Path, new_path: Path) -> Path: + if old_path == new_path: + return old_path + + new_path.parent.mkdir(parents=True, exist_ok=True) + + # if path already exists then we jigger the name to make it unique + counter: int = 1 + while new_path.exists(): + path = new_path.with_stem(new_path.stem + f"_{counter:02d}") + if not path.exists(): + new_path = path + counter += 1 + move(old_path, new_path) + return new_path + + def _probe_model(self, model_path: Path, config: Optional[Dict[str, Any]] = None) -> AnyModelConfig: + info: AnyModelConfig = ModelProbe.probe(Path(model_path)) + if config: # used to override probe fields + for key, value in config.items(): + setattr(info, key, value) + return info + + def _create_key(self) -> str: + return sha256(randbytes(100)).hexdigest()[0:32] + + def _register( + self, model_path: Path, config: Optional[Dict[str, Any]] = None, info: Optional[AnyModelConfig] = None + ) -> str: + info = info or ModelProbe.probe(model_path, config) + key = self._create_key() + + model_path = model_path.absolute() + if model_path.is_relative_to(self.app_config.models_path): + model_path = model_path.relative_to(self.app_config.models_path) + + info.path = model_path.as_posix() + + # add 'main' specific fields + if hasattr(info, "config"): + # make config relative to our root + legacy_conf = (self.app_config.root_dir / self.app_config.legacy_conf_dir / info.config).resolve() + info.config = legacy_conf.relative_to(self.app_config.root_dir).as_posix() + self.record_store.add_model(key, info) + return key + + def _next_id(self) -> int: + with self._lock: + id = self._next_job_id + self._next_job_id += 1 + return id + + @staticmethod + def _guess_variant() -> ModelRepoVariant: + """Guess the best HuggingFace variant type to download.""" + precision = choose_precision(choose_torch_device()) + return ModelRepoVariant.FP16 if precision == "float16" else ModelRepoVariant.DEFAULT + + def _import_local_model(self, source: LocalModelSource, config: Optional[Dict[str, Any]]) -> ModelInstallJob: + return ModelInstallJob( + id=self._next_id(), + source=source, + config_in=config or {}, + local_path=Path(source.path), + inplace=source.inplace, + ) + + def _import_from_civitai(self, source: CivitaiModelSource, config: Optional[Dict[str, Any]]) -> ModelInstallJob: + if not source.access_token: + self._logger.info("No Civitai access token provided; some models may not be downloadable.") + metadata = CivitaiMetadataFetch(self._session).from_id(str(source.version_id)) + assert isinstance(metadata, ModelMetadataWithFiles) + remote_files = metadata.download_urls(session=self._session) + return self._import_remote_model(source=source, config=config, metadata=metadata, remote_files=remote_files) + + def _import_from_hf(self, source: HFModelSource, config: Optional[Dict[str, Any]]) -> ModelInstallJob: + # Add user's cached access token to HuggingFace requests + source.access_token = source.access_token or HfFolder.get_token() + if not source.access_token: + self._logger.info("No HuggingFace access token present; some models may not be downloadable.") + + metadata = HuggingFaceMetadataFetch(self._session).from_id(source.repo_id) + assert isinstance(metadata, ModelMetadataWithFiles) + remote_files = metadata.download_urls( + variant=source.variant or self._guess_variant(), + subfolder=source.subfolder, + session=self._session, + ) + + return self._import_remote_model( + source=source, + config=config, + remote_files=remote_files, + metadata=metadata, + ) + + def _import_from_url(self, source: URLModelSource, config: Optional[Dict[str, Any]]) -> ModelInstallJob: + # URLs from Civitai or HuggingFace will be handled specially + url_patterns = { + r"https?://civitai.com/": CivitaiMetadataFetch, + r"https?://huggingface.co/": HuggingFaceMetadataFetch, + } + metadata = None + for pattern, fetcher in url_patterns.items(): + if re.match(pattern, str(source.url), re.IGNORECASE): + metadata = fetcher(self._session).from_url(source.url) + break + if metadata and isinstance(metadata, ModelMetadataWithFiles): + remote_files = metadata.download_urls(session=self._session) + else: + remote_files = [RemoteModelFile(url=source.url, path=Path("."), size=0)] + + return self._import_remote_model( + source=source, + config=config, + metadata=metadata, + remote_files=remote_files, + ) + + def _import_remote_model( + self, + source: ModelSource, + remote_files: List[RemoteModelFile], + metadata: Optional[AnyModelRepoMetadata], + config: Optional[Dict[str, Any]], + ) -> ModelInstallJob: + # TODO: Replace with tempfile.tmpdir() when multithreading is cleaned up. + # Currently the tmpdir isn't automatically removed at exit because it is + # being held in a daemon thread. + tmpdir = Path( + mkdtemp( + dir=self._app_config.models_path, + prefix=TMPDIR_PREFIX, + ) + ) + install_job = ModelInstallJob( + id=self._next_id(), + source=source, + config_in=config or {}, + source_metadata=metadata, + local_path=tmpdir, # local path may change once the download has started due to content-disposition handling + bytes=0, + total_bytes=0, + ) + # we remember the path up to the top of the tmpdir so that it may be + # removed safely at the end of the install process. + install_job._install_tmpdir = tmpdir + assert install_job.total_bytes is not None # to avoid type checking complaints in the loop below + + self._logger.info(f"Queuing {source} for downloading") + for model_file in remote_files: + url = model_file.url + path = model_file.path + self._logger.info(f"Downloading {url} => {path}") + install_job.total_bytes += model_file.size + assert hasattr(source, "access_token") + dest = tmpdir / path.parent + dest.mkdir(parents=True, exist_ok=True) + download_job = DownloadJob( + source=url, + dest=dest, + access_token=source.access_token, + ) + self._download_cache[download_job.source] = install_job # matches a download job to an install job + install_job.download_parts.add(download_job) + + self._download_queue.submit_download_job( + download_job, + on_start=self._download_started_callback, + on_progress=self._download_progress_callback, + on_complete=self._download_complete_callback, + on_error=self._download_error_callback, + on_cancelled=self._download_cancelled_callback, + ) + return install_job + + def _stat_size(self, path: Path) -> int: + size = 0 + if path.is_file(): + size = path.stat().st_size + elif path.is_dir(): + for root, _, files in os.walk(path): + size += sum(self._stat_size(Path(root, x)) for x in files) + return size + + # ------------------------------------------------------------------ + # Callbacks are executed by the download queue in a separate thread + # ------------------------------------------------------------------ + def _download_started_callback(self, download_job: DownloadJob) -> None: + self._logger.info(f"{download_job.source}: model download started") + with self._lock: + install_job = self._download_cache[download_job.source] + install_job.status = InstallStatus.DOWNLOADING + + assert download_job.download_path + if install_job.local_path == install_job._install_tmpdir: + partial_path = download_job.download_path.relative_to(install_job._install_tmpdir) + dest_name = partial_path.parts[0] + install_job.local_path = install_job._install_tmpdir / dest_name + + # Update the total bytes count for remote sources. + if not install_job.total_bytes: + install_job.total_bytes = sum(x.total_bytes for x in install_job.download_parts) + + def _download_progress_callback(self, download_job: DownloadJob) -> None: + with self._lock: + install_job = self._download_cache[download_job.source] + if install_job.cancelled: # This catches the case in which the caller directly calls job.cancel() + self._cancel_download_parts(install_job) + else: + # update sizes + install_job.bytes = sum(x.bytes for x in install_job.download_parts) + self._signal_job_downloading(install_job) + + def _download_complete_callback(self, download_job: DownloadJob) -> None: + with self._lock: + install_job = self._download_cache[download_job.source] + self._download_cache.pop(download_job.source, None) + + # are there any more active jobs left in this task? + if all(x.complete for x in install_job.download_parts): + # now enqueue job for actual installation into the models directory + self._install_queue.put(install_job) + + # Let other threads know that the number of downloads has changed + self._downloads_changed_event.set() + + def _download_error_callback(self, download_job: DownloadJob, excp: Optional[Exception] = None) -> None: + with self._lock: + install_job = self._download_cache.pop(download_job.source, None) + assert install_job is not None + assert excp is not None + install_job.set_error(excp) + self._logger.error( + f"Cancelling {install_job.source} due to an error while downloading {download_job.source}: {str(excp)}" + ) + self._cancel_download_parts(install_job) + + # Let other threads know that the number of downloads has changed + self._downloads_changed_event.set() + + def _download_cancelled_callback(self, download_job: DownloadJob) -> None: + with self._lock: + install_job = self._download_cache.pop(download_job.source, None) + if not install_job: + return + self._downloads_changed_event.set() + self._logger.warning(f"Download {download_job.source} cancelled.") + # if install job has already registered an error, then do not replace its status with cancelled + if not install_job.errored: + install_job.cancel() + self._cancel_download_parts(install_job) + + # Let other threads know that the number of downloads has changed + self._downloads_changed_event.set() + + def _cancel_download_parts(self, install_job: ModelInstallJob) -> None: + # on multipart downloads, _cancel_components() will get called repeatedly from the download callbacks + # do not lock here because it gets called within a locked context + for s in install_job.download_parts: + self._download_queue.cancel_job(s) + + if all(x.in_terminal_state for x in install_job.download_parts): + # When all parts have reached their terminal state, we finalize the job to clean up the temporary directory and other resources + self._install_queue.put(install_job) + + # ------------------------------------------------------------------------------------------------ + # Internal methods that put events on the event bus + # ------------------------------------------------------------------------------------------------ + def _signal_job_running(self, job: ModelInstallJob) -> None: + job.status = InstallStatus.RUNNING + self._logger.info(f"{job.source}: model installation started") + if self._event_bus: + self._event_bus.emit_model_install_running(str(job.source)) + + def _signal_job_downloading(self, job: ModelInstallJob) -> None: + if self._event_bus: + parts: List[Dict[str, str | int]] = [ + { + "url": str(x.source), + "local_path": str(x.download_path), + "bytes": x.bytes, + "total_bytes": x.total_bytes, + } + for x in job.download_parts + ] + assert job.bytes is not None + assert job.total_bytes is not None + self._event_bus.emit_model_install_downloading( + str(job.source), + local_path=job.local_path.as_posix(), + parts=parts, + bytes=job.bytes, + total_bytes=job.total_bytes, + ) + + def _signal_job_completed(self, job: ModelInstallJob) -> None: + job.status = InstallStatus.COMPLETED + assert job.config_out + self._logger.info( + f"{job.source}: model installation completed. {job.local_path} registered key {job.config_out.key}" + ) + if self._event_bus: + assert job.local_path is not None + assert job.config_out is not None + key = job.config_out.key + self._event_bus.emit_model_install_completed(str(job.source), key) + + def _signal_job_errored(self, job: ModelInstallJob) -> None: + self._logger.info(f"{job.source}: model installation encountered an exception: {job.error_type}\n{job.error}") + if self._event_bus: + error_type = job.error_type + error = job.error + assert error_type is not None + assert error is not None + self._event_bus.emit_model_install_error(str(job.source), error_type, error) + + def _signal_job_cancelled(self, job: ModelInstallJob) -> None: + self._logger.info(f"{job.source}: model installation was cancelled") + if self._event_bus: + self._event_bus.emit_model_install_cancelled(str(job.source)) diff --git a/invokeai/app/services/model_records/__init__.py b/invokeai/app/services/model_records/__init__.py index 05005d4227..1622066715 100644 --- a/invokeai/app/services/model_records/__init__.py +++ b/invokeai/app/services/model_records/__init__.py @@ -4,5 +4,17 @@ from .model_records_base import ( # noqa F401 InvalidModelException, ModelRecordServiceBase, UnknownModelException, + ModelSummary, + ModelRecordOrderBy, ) from .model_records_sql import ModelRecordServiceSQL # noqa F401 + +__all__ = [ + "ModelRecordServiceBase", + "ModelRecordServiceSQL", + "DuplicateModelException", + "InvalidModelException", + "UnknownModelException", + "ModelSummary", + "ModelRecordOrderBy", +] diff --git a/invokeai/app/services/model_records/model_records_base.py b/invokeai/app/services/model_records/model_records_base.py index 9b0612a846..57597570cd 100644 --- a/invokeai/app/services/model_records/model_records_base.py +++ b/invokeai/app/services/model_records/model_records_base.py @@ -4,13 +4,15 @@ Abstract base class for storing and retrieving model configuration records. """ from abc import ABC, abstractmethod +from enum import Enum from pathlib import Path -from typing import List, Optional, Union +from typing import Any, Dict, List, Optional, Set, Tuple, Union -from invokeai.backend.model_manager.config import AnyModelConfig, BaseModelType, ModelType +from pydantic import BaseModel, Field -# should match the InvokeAI version when this is first released. -CONFIG_FILE_VERSION = "3.2.0" +from invokeai.app.services.shared.pagination import PaginatedResults +from invokeai.backend.model_manager.config import AnyModelConfig, BaseModelType, ModelFormat, ModelType +from invokeai.backend.model_manager.metadata import AnyModelRepoMetadata, ModelMetadataStore class DuplicateModelException(Exception): @@ -29,17 +31,33 @@ class ConfigFileVersionMismatchException(Exception): """Raised on an attempt to open a config with an incompatible version.""" +class ModelRecordOrderBy(str, Enum): + """The order in which to return model summaries.""" + + Default = "default" # order by type, base, format and name + Type = "type" + Base = "base" + Name = "name" + Format = "format" + + +class ModelSummary(BaseModel): + """A short summary of models for UI listing purposes.""" + + key: str = Field(description="model key") + type: ModelType = Field(description="model type") + base: BaseModelType = Field(description="base model") + format: ModelFormat = Field(description="model format") + name: str = Field(description="model name") + description: str = Field(description="short description of model") + tags: Set[str] = Field(description="tags associated with model") + + class ModelRecordServiceBase(ABC): """Abstract base class for storage and retrieval of model configs.""" - @property @abstractmethod - def version(self) -> str: - """Return the config file/database schema version.""" - pass - - @abstractmethod - def add_model(self, key: str, config: Union[dict, AnyModelConfig]) -> AnyModelConfig: + def add_model(self, key: str, config: Union[Dict[str, Any], AnyModelConfig]) -> AnyModelConfig: """ Add a model to the database. @@ -63,7 +81,7 @@ class ModelRecordServiceBase(ABC): pass @abstractmethod - def update_model(self, key: str, config: Union[dict, AnyModelConfig]) -> AnyModelConfig: + def update_model(self, key: str, config: Union[Dict[str, Any], AnyModelConfig]) -> AnyModelConfig: """ Update the model, returning the updated version. @@ -84,6 +102,47 @@ class ModelRecordServiceBase(ABC): """ pass + @property + @abstractmethod + def metadata_store(self) -> ModelMetadataStore: + """Return a ModelMetadataStore initialized on the same database.""" + pass + + @abstractmethod + def get_metadata(self, key: str) -> Optional[AnyModelRepoMetadata]: + """ + Retrieve metadata (if any) from when model was downloaded from a repo. + + :param key: Model key + """ + pass + + @abstractmethod + def list_all_metadata(self) -> List[Tuple[str, AnyModelRepoMetadata]]: + """List metadata for all models that have it.""" + pass + + @abstractmethod + def search_by_metadata_tag(self, tags: Set[str]) -> List[AnyModelConfig]: + """ + Search model metadata for ones with all listed tags and return their corresponding configs. + + :param tags: Set of tags to search for. All tags must be present. + """ + pass + + @abstractmethod + def list_tags(self) -> Set[str]: + """Return a unique set of all the model tags in the metadata database.""" + pass + + @abstractmethod + def list_models( + self, page: int = 0, per_page: int = 10, order_by: ModelRecordOrderBy = ModelRecordOrderBy.Default + ) -> PaginatedResults[ModelSummary]: + """Return a paginated summary listing of each model in the database.""" + pass + @abstractmethod def exists(self, key: str) -> bool: """ @@ -115,6 +174,7 @@ class ModelRecordServiceBase(ABC): model_name: Optional[str] = None, base_model: Optional[BaseModelType] = None, model_type: Optional[ModelType] = None, + model_format: Optional[ModelFormat] = None, ) -> List[AnyModelConfig]: """ Return models matching name, base and/or type. @@ -122,6 +182,7 @@ class ModelRecordServiceBase(ABC): :param model_name: Filter by name of model (optional) :param base_model: Filter by base model (optional) :param model_type: Filter by type of model (optional) + :param model_format: Filter by model format (e.g. "diffusers") (optional) If none of the optional filters are passed, will return all models in the database. diff --git a/invokeai/app/services/model_records/model_records_sql.py b/invokeai/app/services/model_records/model_records_sql.py index d05e1418d8..4512da5d41 100644 --- a/invokeai/app/services/model_records/model_records_sql.py +++ b/invokeai/app/services/model_records/model_records_sql.py @@ -42,21 +42,26 @@ Typical usage: import json import sqlite3 +from math import ceil from pathlib import Path -from typing import List, Optional, Union +from typing import Any, Dict, List, Optional, Set, Tuple, Union +from invokeai.app.services.shared.pagination import PaginatedResults from invokeai.backend.model_manager.config import ( AnyModelConfig, BaseModelType, ModelConfigFactory, + ModelFormat, ModelType, ) +from invokeai.backend.model_manager.metadata import AnyModelRepoMetadata, ModelMetadataStore, UnknownMetadataException -from ..shared.sqlite import SqliteDatabase +from ..shared.sqlite.sqlite_database import SqliteDatabase from .model_records_base import ( - CONFIG_FILE_VERSION, DuplicateModelException, + ModelRecordOrderBy, ModelRecordServiceBase, + ModelSummary, UnknownModelException, ) @@ -64,9 +69,6 @@ from .model_records_base import ( class ModelRecordServiceSQL(ModelRecordServiceBase): """Implementation of the ModelConfigStore ABC using a SQL database.""" - _db: SqliteDatabase - _cursor: sqlite3.Cursor - def __init__(self, db: SqliteDatabase): """ Initialize a new object from preexisting sqlite3 connection and threading lock objects. @@ -78,86 +80,12 @@ class ModelRecordServiceSQL(ModelRecordServiceBase): self._db = db self._cursor = self._db.conn.cursor() - with self._db.lock: - # Enable foreign keys - self._db.conn.execute("PRAGMA foreign_keys = ON;") - self._create_tables() - self._db.conn.commit() - assert ( - str(self.version) == CONFIG_FILE_VERSION - ), f"Model config version {self.version} does not match expected version {CONFIG_FILE_VERSION}" + @property + def db(self) -> SqliteDatabase: + """Return the underlying database.""" + return self._db - def _create_tables(self) -> None: - """Create sqlite3 tables.""" - # model_config table breaks out the fields that are common to all config objects - # and puts class-specific ones in a serialized json object - self._cursor.execute( - """--sql - CREATE TABLE IF NOT EXISTS model_config ( - id TEXT NOT NULL PRIMARY KEY, - -- The next 3 fields are enums in python, unrestricted string here - base TEXT NOT NULL, - type TEXT NOT NULL, - name TEXT NOT NULL, - path TEXT NOT NULL, - original_hash TEXT, -- could be null - -- Serialized JSON representation of the whole config object, - -- which will contain additional fields from subclasses - config TEXT NOT NULL, - created_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), - -- Updated via trigger - updated_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), - -- unique constraint on combo of name, base and type - UNIQUE(name, base, type) - ); - """ - ) - - # metadata table - self._cursor.execute( - """--sql - CREATE TABLE IF NOT EXISTS model_manager_metadata ( - metadata_key TEXT NOT NULL PRIMARY KEY, - metadata_value TEXT NOT NULL - ); - """ - ) - - # Add trigger for `updated_at`. - self._cursor.execute( - """--sql - CREATE TRIGGER IF NOT EXISTS model_config_updated_at - AFTER UPDATE - ON model_config FOR EACH ROW - BEGIN - UPDATE model_config SET updated_at = STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') - WHERE id = old.id; - END; - """ - ) - - # Add indexes for searchable fields - for stmt in [ - "CREATE INDEX IF NOT EXISTS base_index ON model_config(base);", - "CREATE INDEX IF NOT EXISTS type_index ON model_config(type);", - "CREATE INDEX IF NOT EXISTS name_index ON model_config(name);", - "CREATE UNIQUE INDEX IF NOT EXISTS path_index ON model_config(path);", - ]: - self._cursor.execute(stmt) - - # Add our version to the metadata table - self._cursor.execute( - """--sql - INSERT OR IGNORE into model_manager_metadata ( - metadata_key, - metadata_value - ) - VALUES (?,?); - """, - ("version", CONFIG_FILE_VERSION), - ) - - def add_model(self, key: str, config: Union[dict, AnyModelConfig]) -> AnyModelConfig: + def add_model(self, key: str, config: Union[Dict[str, Any], AnyModelConfig]) -> AnyModelConfig: """ Add a model to the database. @@ -175,21 +103,13 @@ class ModelRecordServiceSQL(ModelRecordServiceBase): """--sql INSERT INTO model_config ( id, - base, - type, - name, - path, original_hash, config ) - VALUES (?,?,?,?,?,?,?); + VALUES (?,?,?); """, ( key, - record.base, - record.type, - record.name, - record.path, record.original_hash, json_serialized, ), @@ -214,22 +134,6 @@ class ModelRecordServiceSQL(ModelRecordServiceBase): return self.get_model(key) - @property - def version(self) -> str: - """Return the version of the database schema.""" - with self._db.lock: - self._cursor.execute( - """--sql - SELECT metadata_value FROM model_manager_metadata - WHERE metadata_key=?; - """, - ("version",), - ) - rows = self._cursor.fetchone() - if not rows: - raise KeyError("Models database does not have metadata key 'version'") - return rows[0] - def del_model(self, key: str) -> None: """ Delete a model. @@ -269,14 +173,11 @@ class ModelRecordServiceSQL(ModelRecordServiceBase): self._cursor.execute( """--sql UPDATE model_config - SET base=?, - type=?, - name=?, - path=?, + SET config=? WHERE id=?; """, - (record.base, record.type, record.name, record.path, json_serialized, key), + (json_serialized, key), ) if self._cursor.rowcount == 0: raise UnknownModelException("model not found") @@ -332,6 +233,7 @@ class ModelRecordServiceSQL(ModelRecordServiceBase): model_name: Optional[str] = None, base_model: Optional[BaseModelType] = None, model_type: Optional[ModelType] = None, + model_format: Optional[ModelFormat] = None, ) -> List[AnyModelConfig]: """ Return models matching name, base and/or type. @@ -339,6 +241,7 @@ class ModelRecordServiceSQL(ModelRecordServiceBase): :param model_name: Filter by name of model (optional) :param base_model: Filter by base model (optional) :param model_type: Filter by type of model (optional) + :param model_format: Filter by model format (e.g. "diffusers") (optional) If none of the optional filters are passed, will return all models in the database. @@ -355,6 +258,9 @@ class ModelRecordServiceSQL(ModelRecordServiceBase): if model_type: where_clause.append("type=?") bindings.append(model_type) + if model_format: + where_clause.append("format=?") + bindings.append(model_format) where = f"WHERE {' AND '.join(where_clause)}" if where_clause else "" with self._db.lock: self._cursor.execute( @@ -374,7 +280,7 @@ class ModelRecordServiceSQL(ModelRecordServiceBase): self._cursor.execute( """--sql SELECT config FROM model_config - WHERE model_path=?; + WHERE path=?; """, (str(path),), ) @@ -394,3 +300,95 @@ class ModelRecordServiceSQL(ModelRecordServiceBase): ) results = [ModelConfigFactory.make_config(json.loads(x[0])) for x in self._cursor.fetchall()] return results + + @property + def metadata_store(self) -> ModelMetadataStore: + """Return a ModelMetadataStore initialized on the same database.""" + return ModelMetadataStore(self._db) + + def get_metadata(self, key: str) -> Optional[AnyModelRepoMetadata]: + """ + Retrieve metadata (if any) from when model was downloaded from a repo. + + :param key: Model key + """ + store = self.metadata_store + try: + metadata = store.get_metadata(key) + return metadata + except UnknownMetadataException: + return None + + def search_by_metadata_tag(self, tags: Set[str]) -> List[AnyModelConfig]: + """ + Search model metadata for ones with all listed tags and return their corresponding configs. + + :param tags: Set of tags to search for. All tags must be present. + """ + store = ModelMetadataStore(self._db) + keys = store.search_by_tag(tags) + return [self.get_model(x) for x in keys] + + def list_tags(self) -> Set[str]: + """Return a unique set of all the model tags in the metadata database.""" + store = ModelMetadataStore(self._db) + return store.list_tags() + + def list_all_metadata(self) -> List[Tuple[str, AnyModelRepoMetadata]]: + """List metadata for all models that have it.""" + store = ModelMetadataStore(self._db) + return store.list_all_metadata() + + def list_models( + self, page: int = 0, per_page: int = 10, order_by: ModelRecordOrderBy = ModelRecordOrderBy.Default + ) -> PaginatedResults[ModelSummary]: + """Return a paginated summary listing of each model in the database.""" + ordering = { + ModelRecordOrderBy.Default: "a.type, a.base, a.format, a.name", + ModelRecordOrderBy.Type: "a.type", + ModelRecordOrderBy.Base: "a.base", + ModelRecordOrderBy.Name: "a.name", + ModelRecordOrderBy.Format: "a.format", + } + + def _fixup(summary: Dict[str, str]) -> Dict[str, Union[str, int, Set[str]]]: + """Fix up results so that there are no null values.""" + result: Dict[str, Union[str, int, Set[str]]] = {} + for key, item in summary.items(): + result[key] = item or "" + result["tags"] = set(json.loads(summary["tags"] or "[]")) + return result + + # Lock so that the database isn't updated while we're doing the two queries. + with self._db.lock: + # query1: get the total number of model configs + self._cursor.execute( + """--sql + select count(*) from model_config; + """, + (), + ) + total = int(self._cursor.fetchone()[0]) + + # query2: fetch key fields from the join of model_config and model_metadata + self._cursor.execute( + f"""--sql + SELECT a.id as key, a.type, a.base, a.format, a.name, + json_extract(a.config, '$.description') as description, + json_extract(b.metadata, '$.tags') as tags + FROM model_config AS a + LEFT JOIN model_metadata AS b on a.id=b.id + ORDER BY {ordering[order_by]} -- using ? to bind doesn't work here for some reason + LIMIT ? + OFFSET ?; + """, + ( + per_page, + page * per_page, + ), + ) + rows = self._cursor.fetchall() + items = [ModelSummary.model_validate(_fixup(dict(x))) for x in rows] + return PaginatedResults( + page=page, pages=ceil(total / per_page), per_page=per_page, total=total, items=items + ) diff --git a/invokeai/app/services/session_processor/session_processor_default.py b/invokeai/app/services/session_processor/session_processor_default.py index 028f91fec3..32e94a305d 100644 --- a/invokeai/app/services/session_processor/session_processor_default.py +++ b/invokeai/app/services/session_processor/session_processor_default.py @@ -114,6 +114,7 @@ class DefaultSessionProcessor(SessionProcessorBase): session_queue_id=queue_item.queue_id, session_queue_item_id=queue_item.item_id, graph_execution_state=queue_item.session, + workflow=queue_item.workflow, invoke_all=True, ) queue_item = None diff --git a/invokeai/app/services/session_queue/session_queue_common.py b/invokeai/app/services/session_queue/session_queue_common.py index e7d7cdda46..94db6999c2 100644 --- a/invokeai/app/services/session_queue/session_queue_common.py +++ b/invokeai/app/services/session_queue/session_queue_common.py @@ -8,6 +8,10 @@ from pydantic_core import to_jsonable_python from invokeai.app.invocations.baseinvocation import BaseInvocation from invokeai.app.services.shared.graph import Graph, GraphExecutionState, NodeNotFoundError +from invokeai.app.services.workflow_records.workflow_records_common import ( + WorkflowWithoutID, + WorkflowWithoutIDValidator, +) from invokeai.app.util.misc import uuid_string # region Errors @@ -66,6 +70,9 @@ class Batch(BaseModel): batch_id: str = Field(default_factory=uuid_string, description="The ID of the batch") data: Optional[BatchDataCollection] = Field(default=None, description="The batch data collection.") graph: Graph = Field(description="The graph to initialize the session with") + workflow: Optional[WorkflowWithoutID] = Field( + default=None, description="The workflow to initialize the session with" + ) runs: int = Field( default=1, ge=1, description="Int stating how many times to iterate through all possible batch indices" ) @@ -164,6 +171,14 @@ def get_session(queue_item_dict: dict) -> GraphExecutionState: return session +def get_workflow(queue_item_dict: dict) -> Optional[WorkflowWithoutID]: + workflow_raw = queue_item_dict.get("workflow", None) + if workflow_raw is not None: + workflow = WorkflowWithoutIDValidator.validate_json(workflow_raw, strict=False) + return workflow + return None + + class SessionQueueItemWithoutGraph(BaseModel): """Session queue item without the full graph. Used for serialization.""" @@ -213,12 +228,16 @@ class SessionQueueItemDTO(SessionQueueItemWithoutGraph): class SessionQueueItem(SessionQueueItemWithoutGraph): session: GraphExecutionState = Field(description="The fully-populated session to be executed") + workflow: Optional[WorkflowWithoutID] = Field( + default=None, description="The workflow associated with this queue item" + ) @classmethod def queue_item_from_dict(cls, queue_item_dict: dict) -> "SessionQueueItem": # must parse these manually queue_item_dict["field_values"] = get_field_values(queue_item_dict) queue_item_dict["session"] = get_session(queue_item_dict) + queue_item_dict["workflow"] = get_workflow(queue_item_dict) return SessionQueueItem(**queue_item_dict) model_config = ConfigDict( @@ -334,7 +353,7 @@ def populate_graph(graph: Graph, node_field_values: Iterable[NodeFieldValue]) -> def create_session_nfv_tuples( batch: Batch, maximum: int -) -> Generator[tuple[GraphExecutionState, list[NodeFieldValue]], None, None]: +) -> Generator[tuple[GraphExecutionState, list[NodeFieldValue], Optional[WorkflowWithoutID]], None, None]: """ Create all graph permutations from the given batch data and graph. Yields tuples of the form (graph, batch_data_items) where batch_data_items is the list of BatchDataItems @@ -365,7 +384,7 @@ def create_session_nfv_tuples( return flat_node_field_values = list(chain.from_iterable(d)) graph = populate_graph(batch.graph, flat_node_field_values) - yield (GraphExecutionState(graph=graph), flat_node_field_values) + yield (GraphExecutionState(graph=graph), flat_node_field_values, batch.workflow) count += 1 @@ -391,12 +410,14 @@ def calc_session_count(batch: Batch) -> int: class SessionQueueValueToInsert(NamedTuple): """A tuple of values to insert into the session_queue table""" + # Careful with the ordering of this - it must match the insert statement queue_id: str # queue_id session: str # session json session_id: str # session_id batch_id: str # batch_id field_values: Optional[str] # field_values json priority: int # priority + workflow: Optional[str] # workflow json ValuesToInsert: TypeAlias = list[SessionQueueValueToInsert] @@ -404,7 +425,7 @@ ValuesToInsert: TypeAlias = list[SessionQueueValueToInsert] def prepare_values_to_insert(queue_id: str, batch: Batch, priority: int, max_new_queue_items: int) -> ValuesToInsert: values_to_insert: ValuesToInsert = [] - for session, field_values in create_session_nfv_tuples(batch, max_new_queue_items): + for session, field_values, workflow in create_session_nfv_tuples(batch, max_new_queue_items): # sessions must have unique id session.id = uuid_string() values_to_insert.append( @@ -416,6 +437,7 @@ def prepare_values_to_insert(queue_id: str, batch: Batch, priority: int, max_new # must use pydantic_encoder bc field_values is a list of models json.dumps(field_values, default=to_jsonable_python) if field_values else None, # field_values (json) priority, # priority + json.dumps(workflow, default=to_jsonable_python) if workflow else None, # workflow (json) ) ) return values_to_insert diff --git a/invokeai/app/services/session_queue/session_queue_sqlite.py b/invokeai/app/services/session_queue/session_queue_sqlite.py index 58d9d461ec..64642690e9 100644 --- a/invokeai/app/services/session_queue/session_queue_sqlite.py +++ b/invokeai/app/services/session_queue/session_queue_sqlite.py @@ -28,7 +28,7 @@ from invokeai.app.services.session_queue.session_queue_common import ( prepare_values_to_insert, ) from invokeai.app.services.shared.pagination import CursorPaginatedResults -from invokeai.app.services.shared.sqlite import SqliteDatabase +from invokeai.app.services.shared.sqlite.sqlite_database import SqliteDatabase class SqliteSessionQueue(SessionQueueBase): @@ -50,7 +50,6 @@ class SqliteSessionQueue(SessionQueueBase): self.__lock = db.lock self.__conn = db.conn self.__cursor = self.__conn.cursor() - self._create_tables() def _match_event_name(self, event: FastAPIEvent, match_in: list[str]) -> bool: return event[1]["event"] in match_in @@ -98,114 +97,6 @@ class SqliteSessionQueue(SessionQueueBase): except SessionQueueItemNotFoundError: return - def _create_tables(self) -> None: - """Creates the session queue tables, indicies, and triggers""" - try: - self.__lock.acquire() - self.__cursor.execute( - """--sql - CREATE TABLE IF NOT EXISTS session_queue ( - item_id INTEGER PRIMARY KEY AUTOINCREMENT, -- used for ordering, cursor pagination - batch_id TEXT NOT NULL, -- identifier of the batch this queue item belongs to - queue_id TEXT NOT NULL, -- identifier of the queue this queue item belongs to - session_id TEXT NOT NULL UNIQUE, -- duplicated data from the session column, for ease of access - field_values TEXT, -- NULL if no values are associated with this queue item - session TEXT NOT NULL, -- the session to be executed - status TEXT NOT NULL DEFAULT 'pending', -- the status of the queue item, one of 'pending', 'in_progress', 'completed', 'failed', 'canceled' - priority INTEGER NOT NULL DEFAULT 0, -- the priority, higher is more important - error TEXT, -- any errors associated with this queue item - created_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), - updated_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), -- updated via trigger - started_at DATETIME, -- updated via trigger - completed_at DATETIME -- updated via trigger, completed items are cleaned up on application startup - -- Ideally this is a FK, but graph_executions uses INSERT OR REPLACE, and REPLACE triggers the ON DELETE CASCADE... - -- FOREIGN KEY (session_id) REFERENCES graph_executions (id) ON DELETE CASCADE - ); - """ - ) - - self.__cursor.execute( - """--sql - CREATE UNIQUE INDEX IF NOT EXISTS idx_session_queue_item_id ON session_queue(item_id); - """ - ) - - self.__cursor.execute( - """--sql - CREATE UNIQUE INDEX IF NOT EXISTS idx_session_queue_session_id ON session_queue(session_id); - """ - ) - - self.__cursor.execute( - """--sql - CREATE INDEX IF NOT EXISTS idx_session_queue_batch_id ON session_queue(batch_id); - """ - ) - - self.__cursor.execute( - """--sql - CREATE INDEX IF NOT EXISTS idx_session_queue_created_priority ON session_queue(priority); - """ - ) - - self.__cursor.execute( - """--sql - CREATE INDEX IF NOT EXISTS idx_session_queue_created_status ON session_queue(status); - """ - ) - - self.__cursor.execute( - """--sql - CREATE TRIGGER IF NOT EXISTS tg_session_queue_completed_at - AFTER UPDATE OF status ON session_queue - FOR EACH ROW - WHEN - NEW.status = 'completed' - OR NEW.status = 'failed' - OR NEW.status = 'canceled' - BEGIN - UPDATE session_queue - SET completed_at = STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') - WHERE item_id = NEW.item_id; - END; - """ - ) - - self.__cursor.execute( - """--sql - CREATE TRIGGER IF NOT EXISTS tg_session_queue_started_at - AFTER UPDATE OF status ON session_queue - FOR EACH ROW - WHEN - NEW.status = 'in_progress' - BEGIN - UPDATE session_queue - SET started_at = STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') - WHERE item_id = NEW.item_id; - END; - """ - ) - - self.__cursor.execute( - """--sql - CREATE TRIGGER IF NOT EXISTS tg_session_queue_updated_at - AFTER UPDATE - ON session_queue FOR EACH ROW - BEGIN - UPDATE session_queue - SET updated_at = STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') - WHERE item_id = old.item_id; - END; - """ - ) - - self.__conn.commit() - except Exception: - self.__conn.rollback() - raise - finally: - self.__lock.release() - def _set_in_progress_to_canceled(self) -> None: """ Sets all in_progress queue items to canceled. Run on app startup, not associated with any queue. @@ -281,8 +172,8 @@ class SqliteSessionQueue(SessionQueueBase): self.__cursor.executemany( """--sql - INSERT INTO session_queue (queue_id, session, session_id, batch_id, field_values, priority) - VALUES (?, ?, ?, ?, ?, ?) + INSERT INTO session_queue (queue_id, session, session_id, batch_id, field_values, priority, workflow) + VALUES (?, ?, ?, ?, ?, ?, ?) """, values_to_insert, ) diff --git a/invokeai/app/services/shared/sqlite.py b/invokeai/app/services/shared/sqlite.py deleted file mode 100644 index 9cddb2b926..0000000000 --- a/invokeai/app/services/shared/sqlite.py +++ /dev/null @@ -1,50 +0,0 @@ -import sqlite3 -import threading -from logging import Logger -from pathlib import Path - -from invokeai.app.services.config import InvokeAIAppConfig - -sqlite_memory = ":memory:" - - -class SqliteDatabase: - def __init__(self, config: InvokeAIAppConfig, logger: Logger): - self._logger = logger - self._config = config - - if self._config.use_memory_db: - self.db_path = sqlite_memory - logger.info("Using in-memory database") - else: - db_path = self._config.db_path - db_path.parent.mkdir(parents=True, exist_ok=True) - self.db_path = str(db_path) - self._logger.info(f"Using database at {self.db_path}") - - self.conn = sqlite3.connect(self.db_path, check_same_thread=False) - self.lock = threading.RLock() - self.conn.row_factory = sqlite3.Row - - if self._config.log_sql: - self.conn.set_trace_callback(self._logger.debug) - - self.conn.execute("PRAGMA foreign_keys = ON;") - - def clean(self) -> None: - try: - if self.db_path == sqlite_memory: - return - initial_db_size = Path(self.db_path).stat().st_size - self.lock.acquire() - self.conn.execute("VACUUM;") - self.conn.commit() - final_db_size = Path(self.db_path).stat().st_size - freed_space_in_mb = round((initial_db_size - final_db_size) / 1024 / 1024, 2) - if freed_space_in_mb > 0: - self._logger.info(f"Cleaned database (freed {freed_space_in_mb}MB)") - except Exception as e: - self._logger.error(f"Error cleaning database: {e}") - raise e - finally: - self.lock.release() diff --git a/invokeai/app/services/workflow_image_records/__init__.py b/invokeai/app/services/shared/sqlite/__init__.py similarity index 100% rename from invokeai/app/services/workflow_image_records/__init__.py rename to invokeai/app/services/shared/sqlite/__init__.py diff --git a/invokeai/app/services/shared/sqlite/sqlite_common.py b/invokeai/app/services/shared/sqlite/sqlite_common.py new file mode 100644 index 0000000000..2520695201 --- /dev/null +++ b/invokeai/app/services/shared/sqlite/sqlite_common.py @@ -0,0 +1,10 @@ +from enum import Enum + +from invokeai.app.util.metaenum import MetaEnum + +sqlite_memory = ":memory:" + + +class SQLiteDirection(str, Enum, metaclass=MetaEnum): + Ascending = "ASC" + Descending = "DESC" diff --git a/invokeai/app/services/shared/sqlite/sqlite_database.py b/invokeai/app/services/shared/sqlite/sqlite_database.py new file mode 100644 index 0000000000..e860160044 --- /dev/null +++ b/invokeai/app/services/shared/sqlite/sqlite_database.py @@ -0,0 +1,67 @@ +import sqlite3 +import threading +from logging import Logger +from pathlib import Path + +from invokeai.app.services.shared.sqlite.sqlite_common import sqlite_memory + + +class SqliteDatabase: + """ + Manages a connection to an SQLite database. + + :param db_path: Path to the database file. If None, an in-memory database is used. + :param logger: Logger to use for logging. + :param verbose: Whether to log SQL statements. Provides `logger.debug` as the SQLite trace callback. + + This is a light wrapper around the `sqlite3` module, providing a few conveniences: + - The database file is written to disk if it does not exist. + - Foreign key constraints are enabled by default. + - The connection is configured to use the `sqlite3.Row` row factory. + + In addition to the constructor args, the instance provides the following attributes and methods: + - `conn`: A `sqlite3.Connection` object. Note that the connection must never be closed if the database is in-memory. + - `lock`: A shared re-entrant lock, used to approximate thread safety. + - `clean()`: Runs the SQL `VACUUM;` command and reports on the freed space. + """ + + def __init__(self, db_path: Path | None, logger: Logger, verbose: bool = False) -> None: + """Initializes the database. This is used internally by the class constructor.""" + self.logger = logger + self.db_path = db_path + self.verbose = verbose + + if not self.db_path: + logger.info("Initializing in-memory database") + else: + self.db_path.parent.mkdir(parents=True, exist_ok=True) + self.logger.info(f"Initializing database at {self.db_path}") + + self.conn = sqlite3.connect(database=self.db_path or sqlite_memory, check_same_thread=False) + self.lock = threading.RLock() + self.conn.row_factory = sqlite3.Row + + if self.verbose: + self.conn.set_trace_callback(self.logger.debug) + + self.conn.execute("PRAGMA foreign_keys = ON;") + + def clean(self) -> None: + """ + Cleans the database by running the VACUUM command, reporting on the freed space. + """ + # No need to clean in-memory database + if not self.db_path: + return + with self.lock: + try: + initial_db_size = Path(self.db_path).stat().st_size + self.conn.execute("VACUUM;") + self.conn.commit() + final_db_size = Path(self.db_path).stat().st_size + freed_space_in_mb = round((initial_db_size - final_db_size) / 1024 / 1024, 2) + if freed_space_in_mb > 0: + self.logger.info(f"Cleaned database (freed {freed_space_in_mb}MB)") + except Exception as e: + self.logger.error(f"Error cleaning database: {e}") + raise diff --git a/invokeai/app/services/shared/sqlite/sqlite_util.py b/invokeai/app/services/shared/sqlite/sqlite_util.py new file mode 100644 index 0000000000..202513fb40 --- /dev/null +++ b/invokeai/app/services/shared/sqlite/sqlite_util.py @@ -0,0 +1,36 @@ +from logging import Logger + +from invokeai.app.services.config.config_default import InvokeAIAppConfig +from invokeai.app.services.image_files.image_files_base import ImageFileStorageBase +from invokeai.app.services.shared.sqlite.sqlite_database import SqliteDatabase +from invokeai.app.services.shared.sqlite_migrator.migrations.migration_1 import build_migration_1 +from invokeai.app.services.shared.sqlite_migrator.migrations.migration_2 import build_migration_2 +from invokeai.app.services.shared.sqlite_migrator.migrations.migration_3 import build_migration_3 +from invokeai.app.services.shared.sqlite_migrator.migrations.migration_4 import build_migration_4 +from invokeai.app.services.shared.sqlite_migrator.sqlite_migrator_impl import SqliteMigrator + + +def init_db(config: InvokeAIAppConfig, logger: Logger, image_files: ImageFileStorageBase) -> SqliteDatabase: + """ + Initializes the SQLite database. + + :param config: The app config + :param logger: The logger + :param image_files: The image files service (used by migration 2) + + This function: + - Instantiates a :class:`SqliteDatabase` + - Instantiates a :class:`SqliteMigrator` and registers all migrations + - Runs all migrations + """ + db_path = None if config.use_memory_db else config.db_path + db = SqliteDatabase(db_path=db_path, logger=logger, verbose=config.log_sql) + + migrator = SqliteMigrator(db=db) + migrator.register_migration(build_migration_1()) + migrator.register_migration(build_migration_2(image_files=image_files, logger=logger)) + migrator.register_migration(build_migration_3(app_config=config, logger=logger)) + migrator.register_migration(build_migration_4()) + migrator.run_migrations() + + return db diff --git a/tests/nodes/__init__.py b/invokeai/app/services/shared/sqlite_migrator/__init__.py similarity index 100% rename from tests/nodes/__init__.py rename to invokeai/app/services/shared/sqlite_migrator/__init__.py diff --git a/invokeai/app/services/shared/sqlite_migrator/migrations/__init__.py b/invokeai/app/services/shared/sqlite_migrator/migrations/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/invokeai/app/services/shared/sqlite_migrator/migrations/migration_1.py b/invokeai/app/services/shared/sqlite_migrator/migrations/migration_1.py new file mode 100644 index 0000000000..574afb472f --- /dev/null +++ b/invokeai/app/services/shared/sqlite_migrator/migrations/migration_1.py @@ -0,0 +1,372 @@ +import sqlite3 + +from invokeai.app.services.shared.sqlite_migrator.sqlite_migrator_common import Migration + + +class Migration1Callback: + def __call__(self, cursor: sqlite3.Cursor) -> None: + """Migration callback for database version 1.""" + + self._create_board_images(cursor) + self._create_boards(cursor) + self._create_images(cursor) + self._create_model_config(cursor) + self._create_session_queue(cursor) + self._create_workflow_images(cursor) + self._create_workflows(cursor) + + def _create_board_images(self, cursor: sqlite3.Cursor) -> None: + """Creates the `board_images` table, indices and triggers.""" + tables = [ + """--sql + CREATE TABLE IF NOT EXISTS board_images ( + board_id TEXT NOT NULL, + image_name TEXT NOT NULL, + created_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), + -- updated via trigger + updated_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), + -- Soft delete, currently unused + deleted_at DATETIME, + -- enforce one-to-many relationship between boards and images using PK + -- (we can extend this to many-to-many later) + PRIMARY KEY (image_name), + FOREIGN KEY (board_id) REFERENCES boards (board_id) ON DELETE CASCADE, + FOREIGN KEY (image_name) REFERENCES images (image_name) ON DELETE CASCADE + ); + """ + ] + + indices = [ + "CREATE INDEX IF NOT EXISTS idx_board_images_board_id ON board_images (board_id);", + "CREATE INDEX IF NOT EXISTS idx_board_images_board_id_created_at ON board_images (board_id, created_at);", + ] + + triggers = [ + """--sql + CREATE TRIGGER IF NOT EXISTS tg_board_images_updated_at + AFTER UPDATE + ON board_images FOR EACH ROW + BEGIN + UPDATE board_images SET updated_at = STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') + WHERE board_id = old.board_id AND image_name = old.image_name; + END; + """ + ] + + for stmt in tables + indices + triggers: + cursor.execute(stmt) + + def _create_boards(self, cursor: sqlite3.Cursor) -> None: + """Creates the `boards` table, indices and triggers.""" + tables = [ + """--sql + CREATE TABLE IF NOT EXISTS boards ( + board_id TEXT NOT NULL PRIMARY KEY, + board_name TEXT NOT NULL, + cover_image_name TEXT, + created_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), + -- Updated via trigger + updated_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), + -- Soft delete, currently unused + deleted_at DATETIME, + FOREIGN KEY (cover_image_name) REFERENCES images (image_name) ON DELETE SET NULL + ); + """ + ] + + indices = ["CREATE INDEX IF NOT EXISTS idx_boards_created_at ON boards (created_at);"] + + triggers = [ + """--sql + CREATE TRIGGER IF NOT EXISTS tg_boards_updated_at + AFTER UPDATE + ON boards FOR EACH ROW + BEGIN + UPDATE boards SET updated_at = current_timestamp + WHERE board_id = old.board_id; + END; + """ + ] + + for stmt in tables + indices + triggers: + cursor.execute(stmt) + + def _create_images(self, cursor: sqlite3.Cursor) -> None: + """Creates the `images` table, indices and triggers. Adds the `starred` column.""" + + tables = [ + """--sql + CREATE TABLE IF NOT EXISTS images ( + image_name TEXT NOT NULL PRIMARY KEY, + -- This is an enum in python, unrestricted string here for flexibility + image_origin TEXT NOT NULL, + -- This is an enum in python, unrestricted string here for flexibility + image_category TEXT NOT NULL, + width INTEGER NOT NULL, + height INTEGER NOT NULL, + session_id TEXT, + node_id TEXT, + metadata TEXT, + is_intermediate BOOLEAN DEFAULT FALSE, + created_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), + -- Updated via trigger + updated_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), + -- Soft delete, currently unused + deleted_at DATETIME + ); + """ + ] + + indices = [ + "CREATE UNIQUE INDEX IF NOT EXISTS idx_images_image_name ON images(image_name);", + "CREATE INDEX IF NOT EXISTS idx_images_image_origin ON images(image_origin);", + "CREATE INDEX IF NOT EXISTS idx_images_image_category ON images(image_category);", + "CREATE INDEX IF NOT EXISTS idx_images_created_at ON images(created_at);", + ] + + triggers = [ + """--sql + CREATE TRIGGER IF NOT EXISTS tg_images_updated_at + AFTER UPDATE + ON images FOR EACH ROW + BEGIN + UPDATE images SET updated_at = STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') + WHERE image_name = old.image_name; + END; + """ + ] + + # Add the 'starred' column to `images` if it doesn't exist + cursor.execute("PRAGMA table_info(images)") + columns = [column[1] for column in cursor.fetchall()] + + if "starred" not in columns: + tables.append("ALTER TABLE images ADD COLUMN starred BOOLEAN DEFAULT FALSE;") + indices.append("CREATE INDEX IF NOT EXISTS idx_images_starred ON images(starred);") + + for stmt in tables + indices + triggers: + cursor.execute(stmt) + + def _create_model_config(self, cursor: sqlite3.Cursor) -> None: + """Creates the `model_config` table, `model_manager_metadata` table, indices and triggers.""" + + tables = [ + """--sql + CREATE TABLE IF NOT EXISTS model_config ( + id TEXT NOT NULL PRIMARY KEY, + -- The next 3 fields are enums in python, unrestricted string here + base TEXT NOT NULL, + type TEXT NOT NULL, + name TEXT NOT NULL, + path TEXT NOT NULL, + original_hash TEXT, -- could be null + -- Serialized JSON representation of the whole config object, + -- which will contain additional fields from subclasses + config TEXT NOT NULL, + created_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), + -- Updated via trigger + updated_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), + -- unique constraint on combo of name, base and type + UNIQUE(name, base, type) + ); + """, + """--sql + CREATE TABLE IF NOT EXISTS model_manager_metadata ( + metadata_key TEXT NOT NULL PRIMARY KEY, + metadata_value TEXT NOT NULL + ); + """, + ] + + # Add trigger for `updated_at`. + triggers = [ + """--sql + CREATE TRIGGER IF NOT EXISTS model_config_updated_at + AFTER UPDATE + ON model_config FOR EACH ROW + BEGIN + UPDATE model_config SET updated_at = STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') + WHERE id = old.id; + END; + """ + ] + + # Add indexes for searchable fields + indices = [ + "CREATE INDEX IF NOT EXISTS base_index ON model_config(base);", + "CREATE INDEX IF NOT EXISTS type_index ON model_config(type);", + "CREATE INDEX IF NOT EXISTS name_index ON model_config(name);", + "CREATE UNIQUE INDEX IF NOT EXISTS path_index ON model_config(path);", + ] + + for stmt in tables + indices + triggers: + cursor.execute(stmt) + + def _create_session_queue(self, cursor: sqlite3.Cursor) -> None: + tables = [ + """--sql + CREATE TABLE IF NOT EXISTS session_queue ( + item_id INTEGER PRIMARY KEY AUTOINCREMENT, -- used for ordering, cursor pagination + batch_id TEXT NOT NULL, -- identifier of the batch this queue item belongs to + queue_id TEXT NOT NULL, -- identifier of the queue this queue item belongs to + session_id TEXT NOT NULL UNIQUE, -- duplicated data from the session column, for ease of access + field_values TEXT, -- NULL if no values are associated with this queue item + session TEXT NOT NULL, -- the session to be executed + status TEXT NOT NULL DEFAULT 'pending', -- the status of the queue item, one of 'pending', 'in_progress', 'completed', 'failed', 'canceled' + priority INTEGER NOT NULL DEFAULT 0, -- the priority, higher is more important + error TEXT, -- any errors associated with this queue item + created_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), + updated_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), -- updated via trigger + started_at DATETIME, -- updated via trigger + completed_at DATETIME -- updated via trigger, completed items are cleaned up on application startup + -- Ideally this is a FK, but graph_executions uses INSERT OR REPLACE, and REPLACE triggers the ON DELETE CASCADE... + -- FOREIGN KEY (session_id) REFERENCES graph_executions (id) ON DELETE CASCADE + ); + """ + ] + + indices = [ + "CREATE UNIQUE INDEX IF NOT EXISTS idx_session_queue_item_id ON session_queue(item_id);", + "CREATE UNIQUE INDEX IF NOT EXISTS idx_session_queue_session_id ON session_queue(session_id);", + "CREATE INDEX IF NOT EXISTS idx_session_queue_batch_id ON session_queue(batch_id);", + "CREATE INDEX IF NOT EXISTS idx_session_queue_created_priority ON session_queue(priority);", + "CREATE INDEX IF NOT EXISTS idx_session_queue_created_status ON session_queue(status);", + ] + + triggers = [ + """--sql + CREATE TRIGGER IF NOT EXISTS tg_session_queue_completed_at + AFTER UPDATE OF status ON session_queue + FOR EACH ROW + WHEN + NEW.status = 'completed' + OR NEW.status = 'failed' + OR NEW.status = 'canceled' + BEGIN + UPDATE session_queue + SET completed_at = STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') + WHERE item_id = NEW.item_id; + END; + """, + """--sql + CREATE TRIGGER IF NOT EXISTS tg_session_queue_started_at + AFTER UPDATE OF status ON session_queue + FOR EACH ROW + WHEN + NEW.status = 'in_progress' + BEGIN + UPDATE session_queue + SET started_at = STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') + WHERE item_id = NEW.item_id; + END; + """, + """--sql + CREATE TRIGGER IF NOT EXISTS tg_session_queue_updated_at + AFTER UPDATE + ON session_queue FOR EACH ROW + BEGIN + UPDATE session_queue + SET updated_at = STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') + WHERE item_id = old.item_id; + END; + """, + ] + + for stmt in tables + indices + triggers: + cursor.execute(stmt) + + def _create_workflow_images(self, cursor: sqlite3.Cursor) -> None: + tables = [ + """--sql + CREATE TABLE IF NOT EXISTS workflow_images ( + workflow_id TEXT NOT NULL, + image_name TEXT NOT NULL, + created_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), + -- updated via trigger + updated_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), + -- Soft delete, currently unused + deleted_at DATETIME, + -- enforce one-to-many relationship between workflows and images using PK + -- (we can extend this to many-to-many later) + PRIMARY KEY (image_name), + FOREIGN KEY (workflow_id) REFERENCES workflows (workflow_id) ON DELETE CASCADE, + FOREIGN KEY (image_name) REFERENCES images (image_name) ON DELETE CASCADE + ); + """ + ] + + indices = [ + "CREATE INDEX IF NOT EXISTS idx_workflow_images_workflow_id ON workflow_images (workflow_id);", + "CREATE INDEX IF NOT EXISTS idx_workflow_images_workflow_id_created_at ON workflow_images (workflow_id, created_at);", + ] + + triggers = [ + """--sql + CREATE TRIGGER IF NOT EXISTS tg_workflow_images_updated_at + AFTER UPDATE + ON workflow_images FOR EACH ROW + BEGIN + UPDATE workflow_images SET updated_at = STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') + WHERE workflow_id = old.workflow_id AND image_name = old.image_name; + END; + """ + ] + + for stmt in tables + indices + triggers: + cursor.execute(stmt) + + def _create_workflows(self, cursor: sqlite3.Cursor) -> None: + tables = [ + """--sql + CREATE TABLE IF NOT EXISTS workflows ( + workflow TEXT NOT NULL, + workflow_id TEXT GENERATED ALWAYS AS (json_extract(workflow, '$.id')) VIRTUAL NOT NULL UNIQUE, -- gets implicit index + created_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), + updated_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')) -- updated via trigger + ); + """ + ] + + triggers = [ + """--sql + CREATE TRIGGER IF NOT EXISTS tg_workflows_updated_at + AFTER UPDATE + ON workflows FOR EACH ROW + BEGIN + UPDATE workflows + SET updated_at = STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') + WHERE workflow_id = old.workflow_id; + END; + """ + ] + + for stmt in tables + triggers: + cursor.execute(stmt) + + +def build_migration_1() -> Migration: + """ + Builds the migration from database version 0 (init) to 1. + + This migration represents the state of the database circa InvokeAI v3.4.0, which was the last + version to not use migrations to manage the database. + + As such, this migration does include some ALTER statements, and the SQL statements are written + to be idempotent. + + - Create `board_images` junction table + - Create `boards` table + - Create `images` table, add `starred` column + - Create `model_config` table + - Create `session_queue` table + - Create `workflow_images` junction table + - Create `workflows` table + """ + + migration_1 = Migration( + from_version=0, + to_version=1, + callback=Migration1Callback(), + ) + + return migration_1 diff --git a/invokeai/app/services/shared/sqlite_migrator/migrations/migration_2.py b/invokeai/app/services/shared/sqlite_migrator/migrations/migration_2.py new file mode 100644 index 0000000000..f290fe6159 --- /dev/null +++ b/invokeai/app/services/shared/sqlite_migrator/migrations/migration_2.py @@ -0,0 +1,166 @@ +import sqlite3 +from logging import Logger + +from pydantic import ValidationError +from tqdm import tqdm + +from invokeai.app.services.image_files.image_files_base import ImageFileStorageBase +from invokeai.app.services.image_files.image_files_common import ImageFileNotFoundException +from invokeai.app.services.shared.sqlite_migrator.sqlite_migrator_common import Migration +from invokeai.app.services.workflow_records.workflow_records_common import ( + UnsafeWorkflowWithVersionValidator, +) + + +class Migration2Callback: + def __init__(self, image_files: ImageFileStorageBase, logger: Logger): + self._image_files = image_files + self._logger = logger + + def __call__(self, cursor: sqlite3.Cursor): + self._add_images_has_workflow(cursor) + self._add_session_queue_workflow(cursor) + self._drop_old_workflow_tables(cursor) + self._add_workflow_library(cursor) + self._drop_model_manager_metadata(cursor) + self._migrate_embedded_workflows(cursor) + + def _add_images_has_workflow(self, cursor: sqlite3.Cursor) -> None: + """Add the `has_workflow` column to `images` table.""" + cursor.execute("PRAGMA table_info(images)") + columns = [column[1] for column in cursor.fetchall()] + + if "has_workflow" not in columns: + cursor.execute("ALTER TABLE images ADD COLUMN has_workflow BOOLEAN DEFAULT FALSE;") + + def _add_session_queue_workflow(self, cursor: sqlite3.Cursor) -> None: + """Add the `workflow` column to `session_queue` table.""" + + cursor.execute("PRAGMA table_info(session_queue)") + columns = [column[1] for column in cursor.fetchall()] + + if "workflow" not in columns: + cursor.execute("ALTER TABLE session_queue ADD COLUMN workflow TEXT;") + + def _drop_old_workflow_tables(self, cursor: sqlite3.Cursor) -> None: + """Drops the `workflows` and `workflow_images` tables.""" + cursor.execute("DROP TABLE IF EXISTS workflow_images;") + cursor.execute("DROP TABLE IF EXISTS workflows;") + + def _add_workflow_library(self, cursor: sqlite3.Cursor) -> None: + """Adds the `workflow_library` table and drops the `workflows` and `workflow_images` tables.""" + tables = [ + """--sql + CREATE TABLE IF NOT EXISTS workflow_library ( + workflow_id TEXT NOT NULL PRIMARY KEY, + workflow TEXT NOT NULL, + created_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), + -- updated via trigger + updated_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), + -- updated manually when retrieving workflow + opened_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), + -- Generated columns, needed for indexing and searching + category TEXT GENERATED ALWAYS as (json_extract(workflow, '$.meta.category')) VIRTUAL NOT NULL, + name TEXT GENERATED ALWAYS as (json_extract(workflow, '$.name')) VIRTUAL NOT NULL, + description TEXT GENERATED ALWAYS as (json_extract(workflow, '$.description')) VIRTUAL NOT NULL + ); + """, + ] + + indices = [ + "CREATE INDEX IF NOT EXISTS idx_workflow_library_created_at ON workflow_library(created_at);", + "CREATE INDEX IF NOT EXISTS idx_workflow_library_updated_at ON workflow_library(updated_at);", + "CREATE INDEX IF NOT EXISTS idx_workflow_library_opened_at ON workflow_library(opened_at);", + "CREATE INDEX IF NOT EXISTS idx_workflow_library_category ON workflow_library(category);", + "CREATE INDEX IF NOT EXISTS idx_workflow_library_name ON workflow_library(name);", + "CREATE INDEX IF NOT EXISTS idx_workflow_library_description ON workflow_library(description);", + ] + + triggers = [ + """--sql + CREATE TRIGGER IF NOT EXISTS tg_workflow_library_updated_at + AFTER UPDATE + ON workflow_library FOR EACH ROW + BEGIN + UPDATE workflow_library + SET updated_at = STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') + WHERE workflow_id = old.workflow_id; + END; + """ + ] + + for stmt in tables + indices + triggers: + cursor.execute(stmt) + + def _drop_model_manager_metadata(self, cursor: sqlite3.Cursor) -> None: + """Drops the `model_manager_metadata` table.""" + cursor.execute("DROP TABLE IF EXISTS model_manager_metadata;") + + def _migrate_embedded_workflows(self, cursor: sqlite3.Cursor) -> None: + """ + In the v3.5.0 release, InvokeAI changed how it handles embedded workflows. The `images` table in + the database now has a `has_workflow` column, indicating if an image has a workflow embedded. + + This migrate callback checks each image for the presence of an embedded workflow, then updates its entry + in the database accordingly. + """ + # Get all image names + cursor.execute("SELECT image_name FROM images") + image_names: list[str] = [image[0] for image in cursor.fetchall()] + total_image_names = len(image_names) + + if not total_image_names: + return + + self._logger.info(f"Migrating workflows for {total_image_names} images") + + # Migrate the images + to_migrate: list[tuple[bool, str]] = [] + pbar = tqdm(image_names) + for idx, image_name in enumerate(pbar): + pbar.set_description(f"Checking image {idx + 1}/{total_image_names} for workflow") + try: + pil_image = self._image_files.get(image_name) + except ImageFileNotFoundException: + self._logger.warning(f"Image {image_name} not found, skipping") + continue + except Exception as e: + self._logger.warning(f"Error while checking image {image_name}, skipping: {e}") + continue + if "invokeai_workflow" in pil_image.info: + try: + UnsafeWorkflowWithVersionValidator.validate_json(pil_image.info.get("invokeai_workflow", "")) + except ValidationError: + self._logger.warning(f"Image {image_name} has invalid embedded workflow, skipping") + continue + to_migrate.append((True, image_name)) + + self._logger.info(f"Adding {len(to_migrate)} embedded workflows to database") + cursor.executemany("UPDATE images SET has_workflow = ? WHERE image_name = ?", to_migrate) + + +def build_migration_2(image_files: ImageFileStorageBase, logger: Logger) -> Migration: + """ + Builds the migration from database version 1 to 2. + + Introduced in v3.5.0 for the new workflow library. + + :param image_files: The image files service, used to check for embedded workflows + :param logger: The logger, used to log progress during embedded workflows handling + + This migration does the following: + - Add `has_workflow` column to `images` table + - Add `workflow` column to `session_queue` table + - Drop `workflows` and `workflow_images` tables + - Add `workflow_library` table + - Drops the `model_manager_metadata` table + - Drops the `model_config` table, recreating it (at this point, there is no user data in this table) + - Populates the `has_workflow` column in the `images` table (requires `image_files` & `logger` dependencies) + """ + migration_2 = Migration( + from_version=1, + to_version=2, + callback=Migration2Callback(image_files=image_files, logger=logger), + ) + + return migration_2 diff --git a/invokeai/app/services/shared/sqlite_migrator/migrations/migration_3.py b/invokeai/app/services/shared/sqlite_migrator/migrations/migration_3.py new file mode 100644 index 0000000000..87bbcf856c --- /dev/null +++ b/invokeai/app/services/shared/sqlite_migrator/migrations/migration_3.py @@ -0,0 +1,79 @@ +import sqlite3 +from logging import Logger + +from invokeai.app.services.config import InvokeAIAppConfig +from invokeai.app.services.shared.sqlite_migrator.sqlite_migrator_common import Migration + +from .util.migrate_yaml_config_1 import MigrateModelYamlToDb1 + + +class Migration3Callback: + def __init__(self, app_config: InvokeAIAppConfig, logger: Logger) -> None: + self._app_config = app_config + self._logger = logger + + def __call__(self, cursor: sqlite3.Cursor) -> None: + self._drop_model_manager_metadata(cursor) + self._recreate_model_config(cursor) + self._migrate_model_config_records(cursor) + + def _drop_model_manager_metadata(self, cursor: sqlite3.Cursor) -> None: + """Drops the `model_manager_metadata` table.""" + cursor.execute("DROP TABLE IF EXISTS model_manager_metadata;") + + def _recreate_model_config(self, cursor: sqlite3.Cursor) -> None: + """ + Drops the `model_config` table, recreating it. + + In 3.4.0, this table used explicit columns but was changed to use json_extract 3.5.0. + + Because this table is not used in production, we are able to simply drop it and recreate it. + """ + + cursor.execute("DROP TABLE IF EXISTS model_config;") + + cursor.execute( + """--sql + CREATE TABLE IF NOT EXISTS model_config ( + id TEXT NOT NULL PRIMARY KEY, + -- The next 3 fields are enums in python, unrestricted string here + base TEXT GENERATED ALWAYS as (json_extract(config, '$.base')) VIRTUAL NOT NULL, + type TEXT GENERATED ALWAYS as (json_extract(config, '$.type')) VIRTUAL NOT NULL, + name TEXT GENERATED ALWAYS as (json_extract(config, '$.name')) VIRTUAL NOT NULL, + path TEXT GENERATED ALWAYS as (json_extract(config, '$.path')) VIRTUAL NOT NULL, + format TEXT GENERATED ALWAYS as (json_extract(config, '$.format')) VIRTUAL NOT NULL, + original_hash TEXT, -- could be null + -- Serialized JSON representation of the whole config object, + -- which will contain additional fields from subclasses + config TEXT NOT NULL, + created_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), + -- Updated via trigger + updated_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), + -- unique constraint on combo of name, base and type + UNIQUE(name, base, type) + ); + """ + ) + + def _migrate_model_config_records(self, cursor: sqlite3.Cursor) -> None: + """After updating the model config table, we repopulate it.""" + self._logger.info("Migrating model config records from models.yaml to database") + model_record_migrator = MigrateModelYamlToDb1(self._app_config, self._logger, cursor) + model_record_migrator.migrate() + + +def build_migration_3(app_config: InvokeAIAppConfig, logger: Logger) -> Migration: + """ + Build the migration from database version 2 to 3. + + This migration does the following: + - Drops the `model_config` table, recreating it + - Migrates data from `models.yaml` into the `model_config` table + """ + migration_3 = Migration( + from_version=2, + to_version=3, + callback=Migration3Callback(app_config=app_config, logger=logger), + ) + + return migration_3 diff --git a/invokeai/app/services/shared/sqlite_migrator/migrations/migration_4.py b/invokeai/app/services/shared/sqlite_migrator/migrations/migration_4.py new file mode 100644 index 0000000000..b8dc4dd83b --- /dev/null +++ b/invokeai/app/services/shared/sqlite_migrator/migrations/migration_4.py @@ -0,0 +1,83 @@ +import sqlite3 + +from invokeai.app.services.shared.sqlite_migrator.sqlite_migrator_common import Migration + + +class Migration4Callback: + """Callback to do step 4 of migration.""" + + def __call__(self, cursor: sqlite3.Cursor) -> None: # noqa D102 + self._create_model_metadata(cursor) + self._create_model_tags(cursor) + self._create_tags(cursor) + self._create_triggers(cursor) + + def _create_model_metadata(self, cursor: sqlite3.Cursor) -> None: + """Create the table used to store model metadata downloaded from remote sources.""" + cursor.execute( + """--sql + CREATE TABLE IF NOT EXISTS model_metadata ( + id TEXT NOT NULL PRIMARY KEY, + name TEXT GENERATED ALWAYS AS (json_extract(metadata, '$.name')) VIRTUAL NOT NULL, + author TEXT GENERATED ALWAYS AS (json_extract(metadata, '$.author')) VIRTUAL NOT NULL, + -- Serialized JSON representation of the whole metadata object, + -- which will contain additional fields from subclasses + metadata TEXT NOT NULL, + created_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), + -- Updated via trigger + updated_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), + FOREIGN KEY(id) REFERENCES model_config(id) ON DELETE CASCADE + ); + """ + ) + + def _create_model_tags(self, cursor: sqlite3.Cursor) -> None: + cursor.execute( + """--sql + CREATE TABLE IF NOT EXISTS model_tags ( + model_id TEXT NOT NULL, + tag_id INTEGER NOT NULL, + FOREIGN KEY(model_id) REFERENCES model_config(id) ON DELETE CASCADE, + FOREIGN KEY(tag_id) REFERENCES tags(tag_id) ON DELETE CASCADE, + UNIQUE(model_id,tag_id) + ); + """ + ) + + def _create_tags(self, cursor: sqlite3.Cursor) -> None: + cursor.execute( + """--sql + CREATE TABLE IF NOT EXISTS tags ( + tag_id INTEGER NOT NULL PRIMARY KEY, + tag_text TEXT NOT NULL UNIQUE + ); + """ + ) + + def _create_triggers(self, cursor: sqlite3.Cursor) -> None: + cursor.execute( + """--sql + CREATE TRIGGER IF NOT EXISTS model_metadata_updated_at + AFTER UPDATE + ON model_metadata FOR EACH ROW + BEGIN + UPDATE model_metadata SET updated_at = STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') + WHERE id = old.id; + END; + """ + ) + + +def build_migration_4() -> Migration: + """ + Build the migration from database version 3 to 4. + + Adds the tables needed to store model metadata and tags. + """ + migration_4 = Migration( + from_version=3, + to_version=4, + callback=Migration4Callback(), + ) + + return migration_4 diff --git a/invokeai/app/services/shared/sqlite_migrator/migrations/util/migrate_yaml_config_1.py b/invokeai/app/services/shared/sqlite_migrator/migrations/util/migrate_yaml_config_1.py new file mode 100644 index 0000000000..7a7565ba77 --- /dev/null +++ b/invokeai/app/services/shared/sqlite_migrator/migrations/util/migrate_yaml_config_1.py @@ -0,0 +1,146 @@ +# Copyright (c) 2023 Lincoln D. Stein +"""Migrate from the InvokeAI v2 models.yaml format to the v3 sqlite format.""" + +import json +import sqlite3 +from hashlib import sha1 +from logging import Logger +from pathlib import Path +from typing import Optional + +from omegaconf import DictConfig, OmegaConf +from pydantic import TypeAdapter + +from invokeai.app.services.config import InvokeAIAppConfig +from invokeai.app.services.model_records import ( + DuplicateModelException, + UnknownModelException, +) +from invokeai.backend.model_manager.config import ( + AnyModelConfig, + BaseModelType, + ModelConfigFactory, + ModelType, +) +from invokeai.backend.model_manager.hash import FastModelHash + +ModelsValidator = TypeAdapter(AnyModelConfig) + + +class MigrateModelYamlToDb1: + """ + Migrate the InvokeAI models.yaml format (VERSION 3.0.0) to SQL3 database format (VERSION 3.5.0). + + The class has one externally useful method, migrate(), which scans the + currently models.yaml file and imports all its entries into invokeai.db. + + Use this way: + + from invokeai.backend.model_manager/migrate_to_db import MigrateModelYamlToDb + MigrateModelYamlToDb().migrate() + + """ + + config: InvokeAIAppConfig + logger: Logger + cursor: sqlite3.Cursor + + def __init__(self, config: InvokeAIAppConfig, logger: Logger, cursor: sqlite3.Cursor = None) -> None: + self.config = config + self.logger = logger + self.cursor = cursor + + def get_yaml(self) -> DictConfig: + """Fetch the models.yaml DictConfig for this installation.""" + yaml_path = self.config.model_conf_path + omegaconf = OmegaConf.load(yaml_path) + assert isinstance(omegaconf, DictConfig) + return omegaconf + + def migrate(self) -> None: + """Do the migration from models.yaml to invokeai.db.""" + try: + yaml = self.get_yaml() + except OSError: + return + + for model_key, stanza in yaml.items(): + if model_key == "__metadata__": + assert ( + stanza["version"] == "3.0.0" + ), f"This script works on version 3.0.0 yaml files, but your configuration points to a {stanza['version']} version" + continue + + base_type, model_type, model_name = str(model_key).split("/") + hash = FastModelHash.hash(self.config.models_path / stanza.path) + assert isinstance(model_key, str) + new_key = sha1(model_key.encode("utf-8")).hexdigest() + + stanza["base"] = BaseModelType(base_type) + stanza["type"] = ModelType(model_type) + stanza["name"] = model_name + stanza["original_hash"] = hash + stanza["current_hash"] = hash + + new_config: AnyModelConfig = ModelsValidator.validate_python(stanza) # type: ignore # see https://github.com/pydantic/pydantic/discussions/7094 + + try: + if original_record := self._search_by_path(stanza.path): + key = original_record.key + self.logger.info(f"Updating model {model_name} with information from models.yaml using key {key}") + self._update_model(key, new_config) + else: + self.logger.info(f"Adding model {model_name} with key {model_key}") + self._add_model(new_key, new_config) + except DuplicateModelException: + self.logger.warning(f"Model {model_name} is already in the database") + except UnknownModelException: + self.logger.warning(f"Model at {stanza.path} could not be found in database") + + def _search_by_path(self, path: Path) -> Optional[AnyModelConfig]: + self.cursor.execute( + """--sql + SELECT config FROM model_config + WHERE path=?; + """, + (str(path),), + ) + results = [ModelConfigFactory.make_config(json.loads(x[0])) for x in self.cursor.fetchall()] + return results[0] if results else None + + def _update_model(self, key: str, config: AnyModelConfig) -> None: + record = ModelConfigFactory.make_config(config, key=key) # ensure it is a valid config obect + json_serialized = record.model_dump_json() # and turn it into a json string. + self.cursor.execute( + """--sql + UPDATE model_config + SET + config=? + WHERE id=?; + """, + (json_serialized, key), + ) + if self.cursor.rowcount == 0: + raise UnknownModelException("model not found") + + def _add_model(self, key: str, config: AnyModelConfig) -> None: + record = ModelConfigFactory.make_config(config, key=key) # ensure it is a valid config obect. + json_serialized = record.model_dump_json() # and turn it into a json string. + try: + self.cursor.execute( + """--sql + INSERT INTO model_config ( + id, + original_hash, + config + ) + VALUES (?,?,?); + """, + ( + key, + record.original_hash, + json_serialized, + ), + ) + except sqlite3.IntegrityError as exc: + raise DuplicateModelException(f"{record.name}: model is already in database") from exc diff --git a/invokeai/app/services/shared/sqlite_migrator/sqlite_migrator_common.py b/invokeai/app/services/shared/sqlite_migrator/sqlite_migrator_common.py new file mode 100644 index 0000000000..47ed5da505 --- /dev/null +++ b/invokeai/app/services/shared/sqlite_migrator/sqlite_migrator_common.py @@ -0,0 +1,164 @@ +import sqlite3 +from typing import Optional, Protocol, runtime_checkable + +from pydantic import BaseModel, ConfigDict, Field, model_validator + + +@runtime_checkable +class MigrateCallback(Protocol): + """ + A callback that performs a migration. + + Migrate callbacks are provided an open cursor to the database. They should not commit their + transaction; this is handled by the migrator. + + If the callback needs to access additional dependencies, will be provided to the callback at runtime. + + See :class:`Migration` for an example. + """ + + def __call__(self, cursor: sqlite3.Cursor) -> None: + ... + + +class MigrationError(RuntimeError): + """Raised when a migration fails.""" + + +class MigrationVersionError(ValueError): + """Raised when a migration version is invalid.""" + + +class Migration(BaseModel): + """ + Represents a migration for a SQLite database. + + :param from_version: The database version on which this migration may be run + :param to_version: The database version that results from this migration + :param migrate_callback: The callback to run to perform the migration + + Migration callbacks will be provided an open cursor to the database. They should not commit their + transaction; this is handled by the migrator. + + It is suggested to use a class to define the migration callback and a builder function to create + the :class:`Migration`. This allows the callback to be provided with additional dependencies and + keeps things tidy, as all migration logic is self-contained. + + Example: + ```py + # Define the migration callback class + class Migration1Callback: + # This migration needs a logger, so we define a class that accepts a logger in its constructor. + def __init__(self, image_files: ImageFileStorageBase) -> None: + self._image_files = ImageFileStorageBase + + # This dunder method allows the instance of the class to be called like a function. + def __call__(self, cursor: sqlite3.Cursor) -> None: + self._add_with_banana_column(cursor) + self._do_something_with_images(cursor) + + def _add_with_banana_column(self, cursor: sqlite3.Cursor) -> None: + \"""Adds the with_banana column to the sushi table.\""" + # Execute SQL using the cursor, taking care to *not commit* a transaction + cursor.execute('ALTER TABLE sushi ADD COLUMN with_banana BOOLEAN DEFAULT TRUE;') + + def _do_something_with_images(self, cursor: sqlite3.Cursor) -> None: + \"""Does something with the image files service.\""" + self._image_files.get(...) + + # Define the migration builder function. This function creates an instance of the migration callback + # class and returns a Migration. + def build_migration_1(image_files: ImageFileStorageBase) -> Migration: + \"""Builds the migration from database version 0 to 1. + Requires the image files service to... + \""" + + migration_1 = Migration( + from_version=0, + to_version=1, + migrate_callback=Migration1Callback(image_files=image_files), + ) + + return migration_1 + + # Register the migration after all dependencies have been initialized + db = SqliteDatabase(db_path, logger) + migrator = SqliteMigrator(db) + migrator.register_migration(build_migration_1(image_files)) + migrator.run_migrations() + ``` + """ + + from_version: int = Field(ge=0, strict=True, description="The database version on which this migration may be run") + to_version: int = Field(ge=1, strict=True, description="The database version that results from this migration") + callback: MigrateCallback = Field(description="The callback to run to perform the migration") + + @model_validator(mode="after") + def validate_to_version(self) -> "Migration": + """Validates that to_version is one greater than from_version.""" + if self.to_version != self.from_version + 1: + raise MigrationVersionError("to_version must be one greater than from_version") + return self + + def __hash__(self) -> int: + # Callables are not hashable, so we need to implement our own __hash__ function to use this class in a set. + return hash((self.from_version, self.to_version)) + + model_config = ConfigDict(arbitrary_types_allowed=True) + + +class MigrationSet: + """ + A set of Migrations. Performs validation during migration registration and provides utility methods. + + Migrations should be registered with `register()`. Once all are registered, `validate_migration_chain()` + should be called to ensure that the migrations form a single chain of migrations from version 0 to the latest version. + """ + + def __init__(self) -> None: + self._migrations: set[Migration] = set() + + def register(self, migration: Migration) -> None: + """Registers a migration.""" + migration_from_already_registered = any(m.from_version == migration.from_version for m in self._migrations) + migration_to_already_registered = any(m.to_version == migration.to_version for m in self._migrations) + if migration_from_already_registered or migration_to_already_registered: + raise MigrationVersionError("Migration with from_version or to_version already registered") + self._migrations.add(migration) + + def get(self, from_version: int) -> Optional[Migration]: + """Gets the migration that may be run on the given database version.""" + # register() ensures that there is only one migration with a given from_version, so this is safe. + return next((m for m in self._migrations if m.from_version == from_version), None) + + def validate_migration_chain(self) -> None: + """ + Validates that the migrations form a single chain of migrations from version 0 to the latest version, + Raises a MigrationError if there is a problem. + """ + if self.count == 0: + return + if self.latest_version == 0: + return + next_migration = self.get(from_version=0) + if next_migration is None: + raise MigrationError("Migration chain is fragmented") + touched_count = 1 + while next_migration is not None: + next_migration = self.get(next_migration.to_version) + if next_migration is not None: + touched_count += 1 + if touched_count != self.count: + raise MigrationError("Migration chain is fragmented") + + @property + def count(self) -> int: + """The count of registered migrations.""" + return len(self._migrations) + + @property + def latest_version(self) -> int: + """Gets latest to_version among registered migrations. Returns 0 if there are no migrations registered.""" + if self.count == 0: + return 0 + return sorted(self._migrations, key=lambda m: m.to_version)[-1].to_version diff --git a/invokeai/app/services/shared/sqlite_migrator/sqlite_migrator_impl.py b/invokeai/app/services/shared/sqlite_migrator/sqlite_migrator_impl.py new file mode 100644 index 0000000000..eef9c07ed4 --- /dev/null +++ b/invokeai/app/services/shared/sqlite_migrator/sqlite_migrator_impl.py @@ -0,0 +1,130 @@ +import sqlite3 +from pathlib import Path +from typing import Optional + +from invokeai.app.services.shared.sqlite.sqlite_database import SqliteDatabase +from invokeai.app.services.shared.sqlite_migrator.sqlite_migrator_common import Migration, MigrationError, MigrationSet + + +class SqliteMigrator: + """ + Manages migrations for a SQLite database. + + :param db: The instance of :class:`SqliteDatabase` to migrate. + + Migrations should be registered with :meth:`register_migration`. + + Each migration is run in a transaction. If a migration fails, the transaction is rolled back. + + Example Usage: + ```py + db = SqliteDatabase(db_path="my_db.db", logger=logger) + migrator = SqliteMigrator(db=db) + migrator.register_migration(build_migration_1()) + migrator.register_migration(build_migration_2()) + migrator.run_migrations() + ``` + """ + + backup_path: Optional[Path] = None + + def __init__(self, db: SqliteDatabase) -> None: + self._db = db + self._logger = db.logger + self._migration_set = MigrationSet() + + def register_migration(self, migration: Migration) -> None: + """Registers a migration.""" + self._migration_set.register(migration) + self._logger.debug(f"Registered migration {migration.from_version} -> {migration.to_version}") + + def run_migrations(self) -> bool: + """Migrates the database to the latest version.""" + with self._db.lock: + # This throws if there is a problem. + self._migration_set.validate_migration_chain() + cursor = self._db.conn.cursor() + self._create_migrations_table(cursor=cursor) + + if self._migration_set.count == 0: + self._logger.debug("No migrations registered") + return False + + if self._get_current_version(cursor=cursor) == self._migration_set.latest_version: + self._logger.debug("Database is up to date, no migrations to run") + return False + + self._logger.info("Database update needed") + next_migration = self._migration_set.get(from_version=self._get_current_version(cursor)) + while next_migration is not None: + self._run_migration(next_migration) + next_migration = self._migration_set.get(self._get_current_version(cursor)) + self._logger.info("Database updated successfully") + return True + + def _run_migration(self, migration: Migration) -> None: + """Runs a single migration.""" + try: + # Using sqlite3.Connection as a context manager commits a the transaction on exit, or rolls it back if an + # exception is raised. + with self._db.lock, self._db.conn as conn: + cursor = conn.cursor() + if self._get_current_version(cursor) != migration.from_version: + raise MigrationError( + f"Database is at version {self._get_current_version(cursor)}, expected {migration.from_version}" + ) + self._logger.debug(f"Running migration from {migration.from_version} to {migration.to_version}") + + # Run the actual migration + migration.callback(cursor) + + # Update the version + cursor.execute("INSERT INTO migrations (version) VALUES (?);", (migration.to_version,)) + + self._logger.debug( + f"Successfully migrated database from {migration.from_version} to {migration.to_version}" + ) + # We want to catch *any* error, mirroring the behaviour of the sqlite3 module. + except Exception as e: + # The connection context manager has already rolled back the migration, so we don't need to do anything. + msg = f"Error migrating database from {migration.from_version} to {migration.to_version}: {e}" + self._logger.error(msg) + raise MigrationError(msg) from e + + def _create_migrations_table(self, cursor: sqlite3.Cursor) -> None: + """Creates the migrations table for the database, if one does not already exist.""" + with self._db.lock: + try: + cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='migrations';") + if cursor.fetchone() is not None: + return + cursor.execute( + """--sql + CREATE TABLE migrations ( + version INTEGER PRIMARY KEY, + migrated_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')) + ); + """ + ) + cursor.execute("INSERT INTO migrations (version) VALUES (0);") + cursor.connection.commit() + self._logger.debug("Created migrations table") + except sqlite3.Error as e: + msg = f"Problem creating migrations table: {e}" + self._logger.error(msg) + cursor.connection.rollback() + raise MigrationError(msg) from e + + @classmethod + def _get_current_version(cls, cursor: sqlite3.Cursor) -> int: + """Gets the current version of the database, or 0 if the migrations table does not exist.""" + try: + cursor.execute("SELECT MAX(version) FROM migrations;") + version: int = cursor.fetchone()[0] + if version is None: + return 0 + return version + except sqlite3.OperationalError as e: + if "no such table" in str(e): + return 0 + raise diff --git a/invokeai/app/services/workflow_image_records/workflow_image_records_base.py b/invokeai/app/services/workflow_image_records/workflow_image_records_base.py deleted file mode 100644 index d99a2ba106..0000000000 --- a/invokeai/app/services/workflow_image_records/workflow_image_records_base.py +++ /dev/null @@ -1,23 +0,0 @@ -from abc import ABC, abstractmethod -from typing import Optional - - -class WorkflowImageRecordsStorageBase(ABC): - """Abstract base class for the one-to-many workflow-image relationship record storage.""" - - @abstractmethod - def create( - self, - workflow_id: str, - image_name: str, - ) -> None: - """Creates a workflow-image record.""" - pass - - @abstractmethod - def get_workflow_for_image( - self, - image_name: str, - ) -> Optional[str]: - """Gets an image's workflow id, if it has one.""" - pass diff --git a/invokeai/app/services/workflow_image_records/workflow_image_records_sqlite.py b/invokeai/app/services/workflow_image_records/workflow_image_records_sqlite.py deleted file mode 100644 index ec7a73f1d5..0000000000 --- a/invokeai/app/services/workflow_image_records/workflow_image_records_sqlite.py +++ /dev/null @@ -1,122 +0,0 @@ -import sqlite3 -import threading -from typing import Optional, cast - -from invokeai.app.services.shared.sqlite import SqliteDatabase -from invokeai.app.services.workflow_image_records.workflow_image_records_base import WorkflowImageRecordsStorageBase - - -class SqliteWorkflowImageRecordsStorage(WorkflowImageRecordsStorageBase): - """SQLite implementation of WorkflowImageRecordsStorageBase.""" - - _conn: sqlite3.Connection - _cursor: sqlite3.Cursor - _lock: threading.RLock - - def __init__(self, db: SqliteDatabase) -> None: - super().__init__() - self._lock = db.lock - self._conn = db.conn - self._cursor = self._conn.cursor() - - try: - self._lock.acquire() - self._create_tables() - self._conn.commit() - finally: - self._lock.release() - - def _create_tables(self) -> None: - # Create the `workflow_images` junction table. - self._cursor.execute( - """--sql - CREATE TABLE IF NOT EXISTS workflow_images ( - workflow_id TEXT NOT NULL, - image_name TEXT NOT NULL, - created_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), - -- updated via trigger - updated_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), - -- Soft delete, currently unused - deleted_at DATETIME, - -- enforce one-to-many relationship between workflows and images using PK - -- (we can extend this to many-to-many later) - PRIMARY KEY (image_name), - FOREIGN KEY (workflow_id) REFERENCES workflows (workflow_id) ON DELETE CASCADE, - FOREIGN KEY (image_name) REFERENCES images (image_name) ON DELETE CASCADE - ); - """ - ) - - # Add index for workflow id - self._cursor.execute( - """--sql - CREATE INDEX IF NOT EXISTS idx_workflow_images_workflow_id ON workflow_images (workflow_id); - """ - ) - - # Add index for workflow id, sorted by created_at - self._cursor.execute( - """--sql - CREATE INDEX IF NOT EXISTS idx_workflow_images_workflow_id_created_at ON workflow_images (workflow_id, created_at); - """ - ) - - # Add trigger for `updated_at`. - self._cursor.execute( - """--sql - CREATE TRIGGER IF NOT EXISTS tg_workflow_images_updated_at - AFTER UPDATE - ON workflow_images FOR EACH ROW - BEGIN - UPDATE workflow_images SET updated_at = STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') - WHERE workflow_id = old.workflow_id AND image_name = old.image_name; - END; - """ - ) - - def create( - self, - workflow_id: str, - image_name: str, - ) -> None: - """Creates a workflow-image record.""" - try: - self._lock.acquire() - self._cursor.execute( - """--sql - INSERT INTO workflow_images (workflow_id, image_name) - VALUES (?, ?); - """, - (workflow_id, image_name), - ) - self._conn.commit() - except sqlite3.Error as e: - self._conn.rollback() - raise e - finally: - self._lock.release() - - def get_workflow_for_image( - self, - image_name: str, - ) -> Optional[str]: - """Gets an image's workflow id, if it has one.""" - try: - self._lock.acquire() - self._cursor.execute( - """--sql - SELECT workflow_id - FROM workflow_images - WHERE image_name = ?; - """, - (image_name,), - ) - result = self._cursor.fetchone() - if result is None: - return None - return cast(str, result[0]) - except sqlite3.Error as e: - self._conn.rollback() - raise e - finally: - self._lock.release() diff --git a/invokeai/app/services/workflow_records/default_workflows/ESRGAN Upscaling with Canny ControlNet.json b/invokeai/app/services/workflow_records/default_workflows/ESRGAN Upscaling with Canny ControlNet.json new file mode 100644 index 0000000000..40d222f856 --- /dev/null +++ b/invokeai/app/services/workflow_records/default_workflows/ESRGAN Upscaling with Canny ControlNet.json @@ -0,0 +1,1363 @@ +{ + "name": "ESRGAN Upscaling with Canny ControlNet", + "author": "InvokeAI", + "description": "Sample workflow for using Upscaling with ControlNet with SD1.5", + "version": "1.0.1", + "contact": "invoke@invoke.ai", + "tags": "upscale, controlnet, default", + "notes": "", + "exposedFields": [ + { + "nodeId": "d8ace142-c05f-4f1d-8982-88dc7473958d", + "fieldName": "model" + }, + { + "nodeId": "63b6ab7e-5b05-4d1b-a3b1-42d8e53ce16b", + "fieldName": "prompt" + }, + { + "nodeId": "771bdf6a-0813-4099-a5d8-921a138754d4", + "fieldName": "image" + } + ], + "meta": { + "category": "default", + "version": "2.0.0" + }, + "nodes": [ + { + "id": "e8bf67fe-67de-4227-87eb-79e86afdfc74", + "type": "invocation", + "data": { + "id": "e8bf67fe-67de-4227-87eb-79e86afdfc74", + "type": "compel", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", + "inputs": { + "prompt": { + "id": "5f762fae-d791-42d9-8ab5-2b830c33ff20", + "name": "prompt", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "" + }, + "clip": { + "id": "8ac95f40-317d-4513-bbba-b99effd3b438", + "name": "clip", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } + } + }, + "outputs": { + "conditioning": { + "id": "46c65b2b-c0b5-40c2-b183-74e9451c6d56", + "name": "conditioning", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + } + } + }, + "position": { + "x": 1250, + "y": 1500 + }, + "width": 320, + "height": 219 + }, + { + "id": "d8ace142-c05f-4f1d-8982-88dc7473958d", + "type": "invocation", + "data": { + "id": "d8ace142-c05f-4f1d-8982-88dc7473958d", + "type": "main_model_loader", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", + "inputs": { + "model": { + "id": "b35ae88a-f2d2-43f6-958c-8c624391250f", + "name": "model", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MainModelField" + }, + "value": { + "model_name": "stable-diffusion-v1-5", + "base_model": "sd-1", + "model_type": "main" + } + } + }, + "outputs": { + "unet": { + "id": "02f243cb-c6e2-42c5-8be9-ef0519d54383", + "name": "unet", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "UNetField" + } + }, + "clip": { + "id": "7762ed13-5b28-40f4-85f1-710942ceb92a", + "name": "clip", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } + }, + "vae": { + "id": "69566153-1918-417d-a3bb-32e9e857ef6b", + "name": "vae", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } + } + } + }, + "position": { + "x": 700, + "y": 1375 + }, + "width": 320, + "height": 193 + }, + { + "id": "771bdf6a-0813-4099-a5d8-921a138754d4", + "type": "invocation", + "data": { + "id": "771bdf6a-0813-4099-a5d8-921a138754d4", + "type": "image", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", + "inputs": { + "image": { + "id": "0f6d68a2-38bd-4f65-a112-0a256c7a2678", + "name": "image", + "fieldKind": "input", + "label": "Image To Upscale", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + } + }, + "outputs": { + "image": { + "id": "76f6f9b6-755b-4373-93fa-6a779998d2c8", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "6858e46b-707c-444f-beda-9b5f4aecfdf8", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "421bdc6e-ecd1-4935-9665-d38ab8314f79", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 375, + "y": 1900 + }, + "width": 320, + "height": 189 + }, + { + "id": "f7564dd2-9539-47f2-ac13-190804461f4e", + "type": "invocation", + "data": { + "id": "f7564dd2-9539-47f2-ac13-190804461f4e", + "type": "esrgan", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.3.0", + "nodePack": "invokeai", + "inputs": { + "metadata": { + "id": "8fa0c7eb-5bd3-4575-98e7-72285c532504", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "image": { + "id": "3c949799-a504-41c9-b342-cff4b8146c48", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "model_name": { + "id": "77cb4750-53d6-4c2c-bb5c-145981acbf17", + "name": "model_name", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, + "value": "RealESRGAN_x4plus.pth" + }, + "tile_size": { + "id": "7787b3ad-46ee-4248-995f-bc740e1f988b", + "name": "tile_size", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 400 + } + }, + "outputs": { + "image": { + "id": "37e6308e-e926-4e07-b0db-4e8601f495d0", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "c194d84a-fac7-4856-b646-d08477a5ad2b", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "b2a6206c-a9c8-4271-a055-0b93a7f7d505", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 775, + "y": 1900 + }, + "width": 320, + "height": 295 + }, + { + "id": "1d887701-df21-4966-ae6e-a7d82307d7bd", + "type": "invocation", + "data": { + "id": "1d887701-df21-4966-ae6e-a7d82307d7bd", + "type": "canny_image_processor", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.2.0", + "nodePack": "invokeai", + "inputs": { + "metadata": { + "id": "52c877c8-25d9-4949-8518-f536fcdd152d", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "image": { + "id": "e0af11fe-4f95-4193-a599-cf40b6a963f5", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "low_threshold": { + "id": "ab775f7b-f556-4298-a9d6-2274f3a6c77c", + "name": "low_threshold", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 100 + }, + "high_threshold": { + "id": "9e58b615-06e4-417f-b0d8-63f1574cd174", + "name": "high_threshold", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 200 + } + }, + "outputs": { + "image": { + "id": "61feb8bf-95c9-4634-87e2-887fc43edbdf", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "9e203e41-73f7-4cfa-bdca-5040e5e60c55", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "ec7d99dc-0d82-4495-a759-6423808bff1c", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 1200, + "y": 1900 + }, + "width": 320, + "height": 293 + }, + { + "id": "ca1d020c-89a8-4958-880a-016d28775cfa", + "type": "invocation", + "data": { + "id": "ca1d020c-89a8-4958-880a-016d28775cfa", + "type": "controlnet", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.1.1", + "nodePack": "invokeai", + "inputs": { + "image": { + "id": "2973c126-e301-4595-a7dc-d6e1729ccdbf", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "control_model": { + "id": "4bb4d987-8491-4839-b41b-6e2f546fe2d0", + "name": "control_model", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ControlNetModelField" + }, + "value": { + "model_name": "canny", + "base_model": "sd-1" + } + }, + "control_weight": { + "id": "a3cf387a-b58f-4058-858f-6a918efac609", + "name": "control_weight", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "FloatField" + }, + "value": 1 + }, + "begin_step_percent": { + "id": "e0614f69-8a58-408b-9238-d3a44a4db4e0", + "name": "begin_step_percent", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 + }, + "end_step_percent": { + "id": "ac683539-b6ed-4166-9294-2040e3ede206", + "name": "end_step_percent", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 1 + }, + "control_mode": { + "id": "f00b21de-cbd7-4901-8efc-e7134a2dc4c8", + "name": "control_mode", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, + "value": "balanced" + }, + "resize_mode": { + "id": "cafb60ee-3959-4d57-a06c-13b83be6ea4f", + "name": "resize_mode", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, + "value": "just_resize" + } + }, + "outputs": { + "control": { + "id": "dfb88dd1-12bf-4034-9268-e726f894c131", + "name": "control", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ControlField" + } + } + } + }, + "position": { + "x": 1650, + "y": 1900 + }, + "width": 320, + "height": 451 + }, + { + "id": "f50624ce-82bf-41d0-bdf7-8aab11a80d48", + "type": "invocation", + "data": { + "id": "f50624ce-82bf-41d0-bdf7-8aab11a80d48", + "type": "noise", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.1", + "nodePack": "invokeai", + "inputs": { + "seed": { + "id": "f76b0e01-b601-423f-9b5f-ab7a1f10fe82", + "name": "seed", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "width": { + "id": "eec326d6-710c-45de-a25c-95704c80d7e2", + "name": "width", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + }, + "height": { + "id": "2794a27d-5337-43ca-95d9-41b673642c94", + "name": "height", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + }, + "use_cpu": { + "id": "ae7654e3-979e-44a1-8968-7e3199e91e66", + "name": "use_cpu", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": true + } + }, + "outputs": { + "noise": { + "id": "8b6dc166-4ead-4124-8ac9-529814b0cbb9", + "name": "noise", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "width": { + "id": "e3fe3940-a277-4838-a448-5f81f2a7d99d", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "48ecd6ef-c216-40d5-9d1b-d37bd00c82e7", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 1650, + "y": 1775 + }, + "width": 320, + "height": 24 + }, + { + "id": "c3737554-8d87-48ff-a6f8-e71d2867f434", + "type": "invocation", + "data": { + "id": "c3737554-8d87-48ff-a6f8-e71d2867f434", + "type": "denoise_latents", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.5.1", + "nodePack": "invokeai", + "inputs": { + "positive_conditioning": { + "id": "e127084b-72f5-4fe4-892b-84f34f88bce9", + "name": "positive_conditioning", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + }, + "negative_conditioning": { + "id": "72cde4ee-55de-4d3e-9057-74e741c04e20", + "name": "negative_conditioning", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + }, + "noise": { + "id": "747f7023-1c19-465b-bec8-1d9695dd3505", + "name": "noise", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "steps": { + "id": "80860292-633c-46f2-83d0-60d0029b65d2", + "name": "steps", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 10 + }, + "cfg_scale": { + "id": "ebc71e6f-9148-4f12-b455-5e1f179d1c3a", + "name": "cfg_scale", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "FloatField" + }, + "value": 7.5 + }, + "denoising_start": { + "id": "ced44b8f-3bad-4c34-8113-13bc0faed28a", + "name": "denoising_start", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 + }, + "denoising_end": { + "id": "79bf4b77-3502-4f72-ba8b-269c4c3c5c72", + "name": "denoising_end", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 1 + }, + "scheduler": { + "id": "ed56e2b8-f477-41a2-b9f5-f15f4933ae65", + "name": "scheduler", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "SchedulerField" + }, + "value": "euler" + }, + "unet": { + "id": "146b790c-b08e-437c-a2e1-e393c2c1c41a", + "name": "unet", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "UNetField" + } + }, + "control": { + "id": "75ed3df1-d261-4b8e-a89b-341c4d7161fb", + "name": "control", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "ControlField" + } + }, + "ip_adapter": { + "id": "eab9a61d-9b64-44d3-8d90-4686f5887cb0", + "name": "ip_adapter", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "IPAdapterField" + } + }, + "t2i_adapter": { + "id": "2dc8d637-58fd-4069-ad33-85c32d958b7b", + "name": "t2i_adapter", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "T2IAdapterField" + } + }, + "cfg_rescale_multiplier": { + "id": "391e5010-e402-4380-bb46-e7edaede3512", + "name": "cfg_rescale_multiplier", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 + }, + "latents": { + "id": "6767e40a-97c6-4487-b3c9-cad1c150bf9f", + "name": "latents", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "denoise_mask": { + "id": "6251efda-d97d-4ff1-94b5-8cc6b458c184", + "name": "denoise_mask", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "DenoiseMaskField" + } + } + }, + "outputs": { + "latents": { + "id": "4e7986a4-dff2-4448-b16b-1af477b81f8b", + "name": "latents", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "width": { + "id": "dad525dd-d2f8-4f07-8c8d-51f2a3c5456e", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "af03a089-4739-40c6-8b48-25d458d63c2f", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 2128.740065979906, + "y": 1232.6219060454753 + }, + "width": 320, + "height": 612 + }, + { + "id": "3ed9b2ef-f4ec-40a7-94db-92e63b583ec0", + "type": "invocation", + "data": { + "id": "3ed9b2ef-f4ec-40a7-94db-92e63b583ec0", + "type": "l2i", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": false, + "useCache": true, + "version": "1.2.0", + "nodePack": "invokeai", + "inputs": { + "metadata": { + "id": "9f7a1a9f-7861-4f09-874b-831af89b7474", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "latents": { + "id": "a5b42432-8ee7-48cd-b61c-b97be6e490a2", + "name": "latents", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "vae": { + "id": "890de106-e6c3-4c2c-8d67-b368def64894", + "name": "vae", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } + }, + "tiled": { + "id": "b8e5a2ca-5fbc-49bd-ad4c-ea0e109d46e3", + "name": "tiled", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": false + }, + "fp32": { + "id": "fdaf6264-4593-4bd2-ac71-8a0acff261af", + "name": "fp32", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": false + } + }, + "outputs": { + "image": { + "id": "94c5877d-6c78-4662-a836-8a84fc75d0a0", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "2a854e42-1616-42f5-b9ef-7b73c40afc1d", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "dd649053-1433-4f31-90b3-8bb103efc5b1", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 2559.4751127537957, + "y": 1246.6000376741406 + }, + "width": 320, + "height": 224 + }, + { + "id": "5ca498a4-c8c8-4580-a396-0c984317205d", + "type": "invocation", + "data": { + "id": "5ca498a4-c8c8-4580-a396-0c984317205d", + "type": "i2l", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", + "inputs": { + "image": { + "id": "9e6c4010-0f79-4587-9062-29d9a8f96b3b", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "vae": { + "id": "b9ed2ec4-e8e3-4d69-8a42-27f2d983bcd6", + "name": "vae", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } + }, + "tiled": { + "id": "bb48d10b-2440-4c46-b835-646ae5ebc013", + "name": "tiled", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": false + }, + "fp32": { + "id": "1048612c-c0f4-4abf-a684-0045e7d158f8", + "name": "fp32", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": false + } + }, + "outputs": { + "latents": { + "id": "55301367-0578-4dee-8060-031ae13c7bf8", + "name": "latents", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "width": { + "id": "2eb65690-1f20-4070-afbd-1e771b9f8ca9", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "d5bf64c7-c30f-43b8-9bc2-95e7718c1bdc", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 1650, + "y": 1675 + }, + "width": 320, + "height": 24 + }, + { + "id": "63b6ab7e-5b05-4d1b-a3b1-42d8e53ce16b", + "type": "invocation", + "data": { + "id": "63b6ab7e-5b05-4d1b-a3b1-42d8e53ce16b", + "type": "compel", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", + "inputs": { + "prompt": { + "id": "5f762fae-d791-42d9-8ab5-2b830c33ff20", + "name": "prompt", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "" + }, + "clip": { + "id": "8ac95f40-317d-4513-bbba-b99effd3b438", + "name": "clip", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } + } + }, + "outputs": { + "conditioning": { + "id": "46c65b2b-c0b5-40c2-b183-74e9451c6d56", + "name": "conditioning", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + } + } + }, + "position": { + "x": 1250, + "y": 1200 + }, + "width": 320, + "height": 219 + }, + { + "id": "eb8f6f8a-c7b1-4914-806e-045ee2717a35", + "type": "invocation", + "data": { + "id": "eb8f6f8a-c7b1-4914-806e-045ee2717a35", + "type": "rand_int", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": false, + "version": "1.0.0", + "inputs": { + "low": { + "id": "2118026f-1c64-41fa-ab6b-7532410f60ae", + "name": "low", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "high": { + "id": "c12f312a-fdfd-4aca-9aa6-4c99bc70bd63", + "name": "high", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 2147483647 + } + }, + "outputs": { + "value": { + "id": "75552bad-6212-4ae7-96a7-68e666acea4c", + "name": "value", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 1650, + "y": 1600 + }, + "width": 320, + "height": 24 + } + ], + "edges": [ + { + "id": "5ca498a4-c8c8-4580-a396-0c984317205d-f50624ce-82bf-41d0-bdf7-8aab11a80d48-collapsed", + "type": "collapsed", + "source": "5ca498a4-c8c8-4580-a396-0c984317205d", + "target": "f50624ce-82bf-41d0-bdf7-8aab11a80d48" + }, + { + "id": "eb8f6f8a-c7b1-4914-806e-045ee2717a35-f50624ce-82bf-41d0-bdf7-8aab11a80d48-collapsed", + "type": "collapsed", + "source": "eb8f6f8a-c7b1-4914-806e-045ee2717a35", + "target": "f50624ce-82bf-41d0-bdf7-8aab11a80d48" + }, + { + "id": "reactflow__edge-771bdf6a-0813-4099-a5d8-921a138754d4image-f7564dd2-9539-47f2-ac13-190804461f4eimage", + "type": "default", + "source": "771bdf6a-0813-4099-a5d8-921a138754d4", + "target": "f7564dd2-9539-47f2-ac13-190804461f4e", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-f7564dd2-9539-47f2-ac13-190804461f4eimage-1d887701-df21-4966-ae6e-a7d82307d7bdimage", + "type": "default", + "source": "f7564dd2-9539-47f2-ac13-190804461f4e", + "target": "1d887701-df21-4966-ae6e-a7d82307d7bd", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-5ca498a4-c8c8-4580-a396-0c984317205dwidth-f50624ce-82bf-41d0-bdf7-8aab11a80d48width", + "type": "default", + "source": "5ca498a4-c8c8-4580-a396-0c984317205d", + "target": "f50624ce-82bf-41d0-bdf7-8aab11a80d48", + "sourceHandle": "width", + "targetHandle": "width" + }, + { + "id": "reactflow__edge-5ca498a4-c8c8-4580-a396-0c984317205dheight-f50624ce-82bf-41d0-bdf7-8aab11a80d48height", + "type": "default", + "source": "5ca498a4-c8c8-4580-a396-0c984317205d", + "target": "f50624ce-82bf-41d0-bdf7-8aab11a80d48", + "sourceHandle": "height", + "targetHandle": "height" + }, + { + "id": "reactflow__edge-f50624ce-82bf-41d0-bdf7-8aab11a80d48noise-c3737554-8d87-48ff-a6f8-e71d2867f434noise", + "type": "default", + "source": "f50624ce-82bf-41d0-bdf7-8aab11a80d48", + "target": "c3737554-8d87-48ff-a6f8-e71d2867f434", + "sourceHandle": "noise", + "targetHandle": "noise" + }, + { + "id": "reactflow__edge-5ca498a4-c8c8-4580-a396-0c984317205dlatents-c3737554-8d87-48ff-a6f8-e71d2867f434latents", + "type": "default", + "source": "5ca498a4-c8c8-4580-a396-0c984317205d", + "target": "c3737554-8d87-48ff-a6f8-e71d2867f434", + "sourceHandle": "latents", + "targetHandle": "latents" + }, + { + "id": "reactflow__edge-e8bf67fe-67de-4227-87eb-79e86afdfc74conditioning-c3737554-8d87-48ff-a6f8-e71d2867f434negative_conditioning", + "type": "default", + "source": "e8bf67fe-67de-4227-87eb-79e86afdfc74", + "target": "c3737554-8d87-48ff-a6f8-e71d2867f434", + "sourceHandle": "conditioning", + "targetHandle": "negative_conditioning" + }, + { + "id": "reactflow__edge-63b6ab7e-5b05-4d1b-a3b1-42d8e53ce16bconditioning-c3737554-8d87-48ff-a6f8-e71d2867f434positive_conditioning", + "type": "default", + "source": "63b6ab7e-5b05-4d1b-a3b1-42d8e53ce16b", + "target": "c3737554-8d87-48ff-a6f8-e71d2867f434", + "sourceHandle": "conditioning", + "targetHandle": "positive_conditioning" + }, + { + "id": "reactflow__edge-d8ace142-c05f-4f1d-8982-88dc7473958dclip-63b6ab7e-5b05-4d1b-a3b1-42d8e53ce16bclip", + "type": "default", + "source": "d8ace142-c05f-4f1d-8982-88dc7473958d", + "target": "63b6ab7e-5b05-4d1b-a3b1-42d8e53ce16b", + "sourceHandle": "clip", + "targetHandle": "clip" + }, + { + "id": "reactflow__edge-d8ace142-c05f-4f1d-8982-88dc7473958dclip-e8bf67fe-67de-4227-87eb-79e86afdfc74clip", + "type": "default", + "source": "d8ace142-c05f-4f1d-8982-88dc7473958d", + "target": "e8bf67fe-67de-4227-87eb-79e86afdfc74", + "sourceHandle": "clip", + "targetHandle": "clip" + }, + { + "id": "reactflow__edge-1d887701-df21-4966-ae6e-a7d82307d7bdimage-ca1d020c-89a8-4958-880a-016d28775cfaimage", + "type": "default", + "source": "1d887701-df21-4966-ae6e-a7d82307d7bd", + "target": "ca1d020c-89a8-4958-880a-016d28775cfa", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-ca1d020c-89a8-4958-880a-016d28775cfacontrol-c3737554-8d87-48ff-a6f8-e71d2867f434control", + "type": "default", + "source": "ca1d020c-89a8-4958-880a-016d28775cfa", + "target": "c3737554-8d87-48ff-a6f8-e71d2867f434", + "sourceHandle": "control", + "targetHandle": "control" + }, + { + "id": "reactflow__edge-c3737554-8d87-48ff-a6f8-e71d2867f434latents-3ed9b2ef-f4ec-40a7-94db-92e63b583ec0latents", + "type": "default", + "source": "c3737554-8d87-48ff-a6f8-e71d2867f434", + "target": "3ed9b2ef-f4ec-40a7-94db-92e63b583ec0", + "sourceHandle": "latents", + "targetHandle": "latents" + }, + { + "id": "reactflow__edge-d8ace142-c05f-4f1d-8982-88dc7473958dvae-3ed9b2ef-f4ec-40a7-94db-92e63b583ec0vae", + "type": "default", + "source": "d8ace142-c05f-4f1d-8982-88dc7473958d", + "target": "3ed9b2ef-f4ec-40a7-94db-92e63b583ec0", + "sourceHandle": "vae", + "targetHandle": "vae" + }, + { + "id": "reactflow__edge-f7564dd2-9539-47f2-ac13-190804461f4eimage-5ca498a4-c8c8-4580-a396-0c984317205dimage", + "type": "default", + "source": "f7564dd2-9539-47f2-ac13-190804461f4e", + "target": "5ca498a4-c8c8-4580-a396-0c984317205d", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-d8ace142-c05f-4f1d-8982-88dc7473958dunet-c3737554-8d87-48ff-a6f8-e71d2867f434unet", + "type": "default", + "source": "d8ace142-c05f-4f1d-8982-88dc7473958d", + "target": "c3737554-8d87-48ff-a6f8-e71d2867f434", + "sourceHandle": "unet", + "targetHandle": "unet" + }, + { + "id": "reactflow__edge-d8ace142-c05f-4f1d-8982-88dc7473958dvae-5ca498a4-c8c8-4580-a396-0c984317205dvae", + "type": "default", + "source": "d8ace142-c05f-4f1d-8982-88dc7473958d", + "target": "5ca498a4-c8c8-4580-a396-0c984317205d", + "sourceHandle": "vae", + "targetHandle": "vae" + }, + { + "id": "reactflow__edge-eb8f6f8a-c7b1-4914-806e-045ee2717a35value-f50624ce-82bf-41d0-bdf7-8aab11a80d48seed", + "type": "default", + "source": "eb8f6f8a-c7b1-4914-806e-045ee2717a35", + "target": "f50624ce-82bf-41d0-bdf7-8aab11a80d48", + "sourceHandle": "value", + "targetHandle": "seed" + } + ] +} \ No newline at end of file diff --git a/invokeai/app/services/workflow_records/default_workflows/Face Detailer with IP-Adapter & Canny (See Note in Details).json b/invokeai/app/services/workflow_records/default_workflows/Face Detailer with IP-Adapter & Canny (See Note in Details).json new file mode 100644 index 0000000000..6e738bcf21 --- /dev/null +++ b/invokeai/app/services/workflow_records/default_workflows/Face Detailer with IP-Adapter & Canny (See Note in Details).json @@ -0,0 +1,2743 @@ +{ + "_version": 1, + "name": "Face Detailer with IP-Adapter & Canny (See Note in Details)", + "author": "kosmoskatten", + "description": "A workflow to add detail to and improve faces. This workflow is most effective when used with a model that creates realistic outputs. ", + "version": "1.0.0", + "contact": "invoke@invoke.ai", + "tags": "face detailer, IP-Adapter, Canny", + "notes": "Set this image as the blur mask: https://i.imgur.com/Gxi61zP.png", + "exposedFields": [ + { + "nodeId": "c6359181-6479-40ec-bf3a-b7e8451683b8", + "fieldName": "model" + }, + { + "nodeId": "cdfa5ab0-b3e2-43ed-85bb-2ac4aa83bc05", + "fieldName": "value" + }, + { + "nodeId": "f0de6c44-4515-4f79-bcc0-dee111bcfe31", + "fieldName": "value" + }, + { + "nodeId": "2c9bc2a6-6c03-4861-aad4-db884a7682f8", + "fieldName": "image" + }, + { + "nodeId": "c59e815c-1f3a-4e2b-b6b8-66f4b005e955", + "fieldName": "image" + } + ], + "meta": { + "category": "default", + "version": "2.0.0" + }, + "nodes": [ + { + "id": "44f2c190-eb03-460d-8d11-a94d13b33f19", + "type": "invocation", + "data": { + "id": "44f2c190-eb03-460d-8d11-a94d13b33f19", + "type": "compel", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", + "inputs": { + "prompt": { + "id": "916b229a-38e1-45a2-a433-cca97495b143", + "name": "prompt", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "" + }, + "clip": { + "id": "ae9aeb1a-4ebd-4bc3-b6e6-a8c9adca01f6", + "name": "clip", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } + } + }, + "outputs": { + "conditioning": { + "id": "4d59bad1-99a9-43e2-bdb4-7a0f3dd5b787", + "name": "conditioning", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + } + } + }, + "position": { + "x": 2575, + "y": -250 + }, + "width": 320, + "height": 195 + }, + { + "id": "c59e815c-1f3a-4e2b-b6b8-66f4b005e955", + "type": "invocation", + "data": { + "id": "c59e815c-1f3a-4e2b-b6b8-66f4b005e955", + "type": "img_resize", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.2.0", + "nodePack": "invokeai", + "inputs": { + "metadata": { + "id": "48ff6f70-380c-4e19-acf7-91063cfff8a8", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "image": { + "id": "2a348a03-07a3-4a97-93c8-46051045b32f", + "name": "image", + "fieldKind": "input", + "label": "Blur Mask", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "6b95969c-ca73-4b54-815d-7aae305a67bd", + "name": "width", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + }, + "height": { + "id": "af83c526-c730-4a34-8f73-80f443fecc05", + "name": "height", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + }, + "resample_mode": { + "id": "43f7d6b5-ebe0-43c4-bf5d-8fb7fdc40a3f", + "name": "resample_mode", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, + "value": "lanczos" + } + }, + "outputs": { + "image": { + "id": "e492b013-615d-4dfd-b0d8-7df7b5ba9a9d", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "05f829b3-c253-495a-b1ad-9906c0833e49", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "65d5d662-2527-4f3c-8a87-0a7d9d4486de", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 4423.179487179487, + "y": 482.66666666666674 + }, + "width": 320, + "height": 347 + }, + { + "id": "2c9bc2a6-6c03-4861-aad4-db884a7682f8", + "type": "invocation", + "data": { + "id": "2c9bc2a6-6c03-4861-aad4-db884a7682f8", + "type": "image", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", + "inputs": { + "image": { + "id": "729c571b-d5a0-4b53-8f50-5e11eb744f66", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + } + }, + "outputs": { + "image": { + "id": "3632a144-58d6-4447-bafc-e4f7d6ca96bf", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "30faefcc-81a1-445b-a3fe-0110ceb56772", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "d173d225-849a-4498-a75d-ba17210dbd3e", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 2050, + "y": -75 + }, + "width": 320, + "height": 165 + }, + { + "id": "9ae34718-a17d-401d-9859-086896c29fca", + "type": "invocation", + "data": { + "id": "9ae34718-a17d-401d-9859-086896c29fca", + "type": "face_off", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.2.0", + "nodePack": "invokeai", + "inputs": { + "metadata": { + "id": "0144d549-b04a-49c2-993f-9ecb2695191a", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "image": { + "id": "9c580dec-a958-43a4-9aa0-7ab9491c56a0", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "face_id": { + "id": "1ee762e1-810f-46f7-a591-ecd28abff85b", + "name": "face_id", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "minimum_confidence": { + "id": "74d2bae8-7ac5-4f8f-afb7-1efc76ed72a0", + "name": "minimum_confidence", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0.5 + }, + "x_offset": { + "id": "f1c1489d-cbbb-45d2-ba94-e150fc5ce24d", + "name": "x_offset", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 + }, + "y_offset": { + "id": "6621377a-7e29-4841-aa47-aa7d438662f9", + "name": "y_offset", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 + }, + "padding": { + "id": "0414c830-1be8-48cd-b0c8-6de10b099029", + "name": "padding", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 64 + }, + "chunk": { + "id": "22eba30a-c68a-4e5f-8f97-315830959b04", + "name": "chunk", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": false + } + }, + "outputs": { + "image": { + "id": "7d8fa807-0e9c-4d6a-a85a-388bd0cb5166", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "048361ca-314c-44a4-8b6e-ca4917e3468f", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "7b721071-63e5-4d54-9607-9fa2192163a8", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "mask": { + "id": "a9c6194a-3dbd-4b18-af04-a85a9498f04e", + "name": "mask", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "x": { + "id": "d072582c-2db5-430b-9e50-b50277baa7d5", + "name": "x", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "y": { + "id": "40624813-e55d-42d7-bc14-dea48ccfd9c8", + "name": "y", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 2575, + "y": 200 + }, + "width": 320, + "height": 569 + }, + { + "id": "50a8db6a-3796-4522-8547-53275efa4e7d", + "type": "invocation", + "data": { + "id": "50a8db6a-3796-4522-8547-53275efa4e7d", + "type": "img_resize", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.2.0", + "nodePack": "invokeai", + "inputs": { + "metadata": { + "id": "6bf91925-e22e-4bcb-90e4-f8ac32ddff36", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "image": { + "id": "65af3f4e-7a89-4df4-8ba9-377af1701d16", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "1f036fee-77f3-480f-b690-089b27616ab8", + "name": "width", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + }, + "height": { + "id": "0c703b6e-e91a-4cd7-8b9e-b97865f76793", + "name": "height", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + }, + "resample_mode": { + "id": "ed77cf71-94cb-4da4-b536-75cb7aad8e54", + "name": "resample_mode", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, + "value": "lanczos" + } + }, + "outputs": { + "image": { + "id": "0d9e437b-6a08-45e1-9a55-ef03ae28e616", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "7c56c704-b4e5-410f-bb62-cd441ddb454f", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "45e12e17-7f25-46bd-a804-4384ec6b98cc", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 3000, + "y": 0 + }, + "width": 320, + "height": 24 + }, + { + "id": "de8b1a48-a2e4-42ca-90bb-66058bffd534", + "type": "invocation", + "data": { + "id": "de8b1a48-a2e4-42ca-90bb-66058bffd534", + "type": "i2l", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", + "inputs": { + "image": { + "id": "6c4d2827-4995-49d4-94ce-0ba0541d8839", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "vae": { + "id": "9d6e3ab6-b6a4-45ac-ad75-0a96efba4c2f", + "name": "vae", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } + }, + "tiled": { + "id": "9c258141-a75d-4ffd-bce5-f3fb3d90b720", + "name": "tiled", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": false + }, + "fp32": { + "id": "2235cc48-53c9-4e8a-a74a-ed41c61f2993", + "name": "fp32", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": true + } + }, + "outputs": { + "latents": { + "id": "8eb9293f-8f43-4c0c-b0fb-8c4db1200f87", + "name": "latents", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "width": { + "id": "ce493959-d308-423c-b0f5-db05912e0318", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "827bf290-94fb-455f-a970-f98ba8800eac", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 3100, + "y": -275 + }, + "width": 320, + "height": 24 + }, + { + "id": "bd06261d-a74a-4d1f-8374-745ed6194bc2", + "type": "invocation", + "data": { + "id": "bd06261d-a74a-4d1f-8374-745ed6194bc2", + "type": "denoise_latents", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.5.1", + "nodePack": "invokeai", + "inputs": { + "positive_conditioning": { + "id": "673e4094-448b-4c59-ab05-d05b29b3e07f", + "name": "positive_conditioning", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + }, + "negative_conditioning": { + "id": "3b3bac27-7e8a-4c4e-8b5b-c5231125302a", + "name": "negative_conditioning", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + }, + "noise": { + "id": "d7c20d11-fbfb-4613-ba58-bf00307e53be", + "name": "noise", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "steps": { + "id": "e4af3bea-dae4-403f-8cec-6cb66fa888ce", + "name": "steps", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 40 + }, + "cfg_scale": { + "id": "9ec125bb-6819-4970-89fe-fe09e6b96885", + "name": "cfg_scale", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "FloatField" + }, + "value": 3 + }, + "denoising_start": { + "id": "7190b40d-9467-4238-b180-0d19065258e2", + "name": "denoising_start", + "fieldKind": "input", + "label": "Original Image Percent", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0.2 + }, + "denoising_end": { + "id": "c033f2d4-b60a-4a25-8a88-7852b556657a", + "name": "denoising_end", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 1 + }, + "scheduler": { + "id": "bb043b8a-a119-4b2a-bb88-8afb364bdcc1", + "name": "scheduler", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "SchedulerField" + }, + "value": "dpmpp_2m_sde_k" + }, + "unet": { + "id": "16d7688a-fc80-405c-aa55-a8ba2a1efecb", + "name": "unet", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "UNetField" + } + }, + "control": { + "id": "d0225ede-7d03-405d-b5b4-97c07d9b602b", + "name": "control", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "ControlField" + } + }, + "ip_adapter": { + "id": "6fbe0a17-6b85-4d3e-835d-0e23d3040bf4", + "name": "ip_adapter", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IPAdapterField" + } + }, + "t2i_adapter": { + "id": "2e4e1e6e-0278-47e3-a464-1a51760a9411", + "name": "t2i_adapter", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "T2IAdapterField" + } + }, + "cfg_rescale_multiplier": { + "id": "c9703a2e-4178-493c-90b9-81325a83a5ec", + "name": "cfg_rescale_multiplier", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 + }, + "latents": { + "id": "b2527e78-6f55-4274-aaa0-8fef1c928faa", + "name": "latents", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "denoise_mask": { + "id": "cceec5a4-d3e9-4cff-a1e1-b5b62cb12588", + "name": "denoise_mask", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "DenoiseMaskField" + } + } + }, + "outputs": { + "latents": { + "id": "6eca0515-4357-40be-ac8d-f84eb927dc31", + "name": "latents", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "width": { + "id": "14453d1c-6202-4377-811c-88ac9c024e77", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "0e0e04dc-4158-4461-b0ba-6c6af16e863c", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 4597.554345564559, + "y": -265.6421598623905 + }, + "width": 320, + "height": 588 + }, + { + "id": "35623411-ba3a-4eaa-91fd-1e0fda0a5b42", + "type": "invocation", + "data": { + "id": "35623411-ba3a-4eaa-91fd-1e0fda0a5b42", + "type": "noise", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.1", + "nodePack": "invokeai", + "inputs": { + "seed": { + "id": "c6b5bc5e-ef09-4f9c-870e-1110a0f5017f", + "name": "seed", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 123451234 + }, + "width": { + "id": "7bdd24b6-4f14-4d0a-b8fc-9b24145b4ba9", + "name": "width", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + }, + "height": { + "id": "dc15bf97-b8d5-49c6-999b-798b33679418", + "name": "height", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + }, + "use_cpu": { + "id": "00626297-19dd-4989-9688-e8d527c9eacf", + "name": "use_cpu", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": true + } + }, + "outputs": { + "noise": { + "id": "2915f8ae-0f6e-4f26-8541-0ebf477586b6", + "name": "noise", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "width": { + "id": "26587461-a24a-434d-9ae5-8d8f36fea221", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "335d08fc-8bf1-4393-8902-2c579f327b51", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 4025, + "y": -175 + }, + "width": 320, + "height": 24 + }, + { + "id": "2224ed72-2453-4252-bd89-3085240e0b6f", + "type": "invocation", + "data": { + "id": "2224ed72-2453-4252-bd89-3085240e0b6f", + "type": "l2i", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": false, + "useCache": true, + "version": "1.2.0", + "nodePack": "invokeai", + "inputs": { + "metadata": { + "id": "2f077d6f-579e-4399-9986-3feabefa9ade", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "latents": { + "id": "568a1537-dc7c-44f5-8a87-3571b0528b85", + "name": "latents", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "vae": { + "id": "392c3757-ad3a-46af-8d76-9724ca30aad8", + "name": "vae", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } + }, + "tiled": { + "id": "90f98601-c05d-453e-878b-18e23cc222b4", + "name": "tiled", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": false + }, + "fp32": { + "id": "6be5cad7-dd41-4f83-98e7-124a6ad1728d", + "name": "fp32", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": true + } + }, + "outputs": { + "image": { + "id": "6f90a4f5-42dd-472a-8f30-403bcbc16531", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "4d1c8a66-35fc-40e9-a7a9-d8604a247d33", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "e668cfb3-aedc-4032-94c9-b8add1fbaacf", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 4980.1395106966565, + "y": -255.9158921745602 + }, + "width": 320, + "height": 224 + }, + { + "id": "2974e5b3-3d41-4b6f-9953-cd21e8f3a323", + "type": "invocation", + "data": { + "id": "2974e5b3-3d41-4b6f-9953-cd21e8f3a323", + "type": "lscale", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", + "inputs": { + "latents": { + "id": "79e8f073-ddc3-416e-b818-6ef8ec73cc07", + "name": "latents", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "scale_factor": { + "id": "23f78d24-72df-4bde-8d3c-8593ce507205", + "name": "scale_factor", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 1.5 + }, + "mode": { + "id": "4ab30c38-57d3-480d-8b34-918887e92340", + "name": "mode", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, + "value": "bilinear" + }, + "antialias": { + "id": "22b39171-0003-44f0-9c04-d241581d2a39", + "name": "antialias", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": true + } + }, + "outputs": { + "latents": { + "id": "f6d71aef-6251-4d51-afa8-f692a72bfd1f", + "name": "latents", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "width": { + "id": "8db4cf33-5489-4887-a5f6-5e926d959c40", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "74e1ec7c-50b6-4e97-a7b8-6602e6d78c08", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 3075, + "y": -175 + }, + "width": 320, + "height": 24 + }, + { + "id": "a7d14545-aa09-4b96-bfc5-40c009af9110", + "type": "invocation", + "data": { + "id": "a7d14545-aa09-4b96-bfc5-40c009af9110", + "type": "img_paste", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": false, + "useCache": true, + "version": "1.2.0", + "nodePack": "invokeai", + "inputs": { + "metadata": { + "id": "159f5a3c-4b47-46dd-b8fe-450455ee3dcf", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "base_image": { + "id": "445cfacf-5042-49ae-a63e-c19f21f90b1d", + "name": "base_image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "image": { + "id": "c292948b-8efd-4f5c-909d-d902cfd1509a", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "mask": { + "id": "8b7bc7e9-35b5-45bc-9b8c-e15e92ab4d74", + "name": "mask", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "x": { + "id": "0694ba58-07bc-470b-80b5-9c7a99b64607", + "name": "x", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "y": { + "id": "40f8b20b-f804-4ec2-9622-285726f7665f", + "name": "y", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "crop": { + "id": "8a09a132-c07e-4cfb-8ec2-7093dc063f99", + "name": "crop", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": false + } + }, + "outputs": { + "image": { + "id": "4a96ec78-d4b6-435f-b5a3-6366cbfcfba7", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "c1ee69c7-6ca0-4604-abc9-b859f4178421", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "6c198681-5f16-4526-8e37-0bf000962acd", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 6000, + "y": -200 + }, + "width": 320, + "height": 431 + }, + { + "id": "ff8c23dc-da7c-45b7-b5c9-d984b12f02ef", + "type": "invocation", + "data": { + "id": "ff8c23dc-da7c-45b7-b5c9-d984b12f02ef", + "type": "img_resize", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.2.0", + "nodePack": "invokeai", + "inputs": { + "metadata": { + "id": "afbbb112-60e4-44c8-bdfd-30f48d58b236", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "image": { + "id": "2a348a03-07a3-4a97-93c8-46051045b32f", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "6b95969c-ca73-4b54-815d-7aae305a67bd", + "name": "width", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + }, + "height": { + "id": "af83c526-c730-4a34-8f73-80f443fecc05", + "name": "height", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + }, + "resample_mode": { + "id": "43f7d6b5-ebe0-43c4-bf5d-8fb7fdc40a3f", + "name": "resample_mode", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, + "value": "lanczos" + } + }, + "outputs": { + "image": { + "id": "e492b013-615d-4dfd-b0d8-7df7b5ba9a9d", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "05f829b3-c253-495a-b1ad-9906c0833e49", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "65d5d662-2527-4f3c-8a87-0a7d9d4486de", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 5500, + "y": -225 + }, + "width": 320, + "height": 347 + }, + { + "id": "cdfa5ab0-b3e2-43ed-85bb-2ac4aa83bc05", + "type": "invocation", + "data": { + "id": "cdfa5ab0-b3e2-43ed-85bb-2ac4aa83bc05", + "type": "float", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", + "inputs": { + "value": { + "id": "d5d8063d-44f6-4e20-b557-2f4ce093c7ef", + "name": "value", + "fieldKind": "input", + "label": "Orignal Image Percentage", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0.4 + } + }, + "outputs": { + "value": { + "id": "562416a4-0d75-48aa-835e-5e2d221dfbb7", + "name": "value", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + } + } + } + }, + "position": { + "x": 4025, + "y": -75 + }, + "width": 320, + "height": 24 + }, + { + "id": "64712037-92e8-483f-9f6e-87588539c1b8", + "type": "invocation", + "data": { + "id": "64712037-92e8-483f-9f6e-87588539c1b8", + "type": "float", + "label": "CFG Main", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", + "inputs": { + "value": { + "id": "750358d5-251d-4fe6-a673-2cde21995da2", + "name": "value", + "fieldKind": "input", + "label": "CFG Main", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 6 + } + }, + "outputs": { + "value": { + "id": "eea7f6d2-92e4-4581-b555-64a44fda2be9", + "name": "value", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + } + } + } + }, + "position": { + "x": 4035.2678120778373, + "y": 13.393127532980124 + }, + "width": 320, + "height": 24 + }, + { + "id": "c865f39f-f830-4ed7-88a5-e935cfe050a9", + "type": "invocation", + "data": { + "id": "c865f39f-f830-4ed7-88a5-e935cfe050a9", + "type": "rand_int", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": false, + "version": "1.0.0", + "nodePack": "invokeai", + "inputs": { + "low": { + "id": "31e29709-9f19-45b0-a2de-fdee29a50393", + "name": "low", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "high": { + "id": "d47d875c-509d-4fa3-9112-e335d3144a17", + "name": "high", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 2147483647 + } + }, + "outputs": { + "value": { + "id": "15b8d1ea-d2ac-4b3a-9619-57bba9a6da75", + "name": "value", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 4025, + "y": -275 + }, + "width": 320, + "height": 24 + }, + { + "id": "f4d15b64-c4a6-42a5-90fc-e4ed07a0ca65", + "type": "invocation", + "data": { + "id": "f4d15b64-c4a6-42a5-90fc-e4ed07a0ca65", + "type": "compel", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", + "inputs": { + "prompt": { + "id": "916b229a-38e1-45a2-a433-cca97495b143", + "name": "prompt", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "" + }, + "clip": { + "id": "ae9aeb1a-4ebd-4bc3-b6e6-a8c9adca01f6", + "name": "clip", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } + } + }, + "outputs": { + "conditioning": { + "id": "4d59bad1-99a9-43e2-bdb4-7a0f3dd5b787", + "name": "conditioning", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + } + } + }, + "position": { + "x": 2550, + "y": -525 + }, + "width": 320, + "height": 195 + }, + { + "id": "22b750db-b85e-486b-b278-ac983e329813", + "type": "invocation", + "data": { + "id": "22b750db-b85e-486b-b278-ac983e329813", + "type": "ip_adapter", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.1.1", + "nodePack": "invokeai", + "inputs": { + "image": { + "id": "088a126c-ab1d-4c7a-879a-c1eea09eac8e", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "ip_adapter_model": { + "id": "f2ac529f-f778-4a12-af12-0c7e449de17a", + "name": "ip_adapter_model", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IPAdapterModelField" + }, + "value": { + "model_name": "ip_adapter_plus_face_sd15", + "base_model": "sd-1" + } + }, + "weight": { + "id": "ddb4a7cb-607d-47e8-b46b-cc1be27ebde0", + "name": "weight", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0.5 + }, + "begin_step_percent": { + "id": "1807371f-b56c-4777-baa2-de71e21f0b80", + "name": "begin_step_percent", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 + }, + "end_step_percent": { + "id": "4ea8e4dc-9cd7-445e-9b32-8934c652381b", + "name": "end_step_percent", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0.8 + } + }, + "outputs": { + "ip_adapter": { + "id": "739b5fed-d813-4611-8f87-1dded25a7619", + "name": "ip_adapter", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IPAdapterField" + } + } + } + }, + "position": { + "x": 3575, + "y": -200 + }, + "width": 320, + "height": 318 + }, + { + "id": "f60b6161-8f26-42f6-89ff-545e6011e501", + "type": "invocation", + "data": { + "id": "f60b6161-8f26-42f6-89ff-545e6011e501", + "type": "controlnet", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.1.1", + "nodePack": "invokeai", + "inputs": { + "image": { + "id": "96434c75-abd8-4b73-ab82-0b358e4735bf", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "control_model": { + "id": "21551ac2-ee50-4fe8-b06c-5be00680fb5c", + "name": "control_model", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ControlNetModelField" + }, + "value": { + "model_name": "canny", + "base_model": "sd-1" + } + }, + "control_weight": { + "id": "1dacac0a-b985-4bdf-b4b5-b960f4cff6ed", + "name": "control_weight", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "FloatField" + }, + "value": 0.5 + }, + "begin_step_percent": { + "id": "b2a3f128-7fc1-4c12-acc8-540f013c856b", + "name": "begin_step_percent", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 + }, + "end_step_percent": { + "id": "0e701834-f7ba-4a6e-b9cb-6d4aff5dacd8", + "name": "end_step_percent", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0.5 + }, + "control_mode": { + "id": "f9a5f038-ae80-4b6e-8a48-362a2c858299", + "name": "control_mode", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, + "value": "balanced" + }, + "resize_mode": { + "id": "5369dd44-a708-4b66-8182-fea814d2a0ae", + "name": "resize_mode", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, + "value": "just_resize" + } + }, + "outputs": { + "control": { + "id": "f470a1af-7b68-4849-a144-02bc345fd810", + "name": "control", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ControlField" + } + } + } + }, + "position": { + "x": 3950, + "y": 150 + }, + "width": 320, + "height": 426 + }, + { + "id": "8fe598c6-d447-44fa-a165-4975af77d080", + "type": "invocation", + "data": { + "id": "8fe598c6-d447-44fa-a165-4975af77d080", + "type": "canny_image_processor", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.2.0", + "nodePack": "invokeai", + "inputs": { + "metadata": { + "id": "855f4575-309a-4810-bd02-7c4a04e0efc8", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "image": { + "id": "7d2695fa-a617-431a-bc0e-69ac7c061651", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "low_threshold": { + "id": "ceb37a49-c989-4afa-abbf-49b6e52ef663", + "name": "low_threshold", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 100 + }, + "high_threshold": { + "id": "6ec118f8-ca6c-4be7-9951-6eee58afbc1b", + "name": "high_threshold", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 200 + } + }, + "outputs": { + "image": { + "id": "264bcaaf-d185-43ce-9e1a-b6f707140c0c", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "0d374d8e-d5c7-49be-9057-443e32e45048", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "fa892b68-6135-4598-a765-e79cd5c6e3f6", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 3519.4131037388597, + "y": 576.7946795840575 + }, + "width": 320, + "height": 293 + }, + { + "id": "4bd4ae80-567f-4366-b8c6-3bb06f4fb46a", + "type": "invocation", + "data": { + "id": "4bd4ae80-567f-4366-b8c6-3bb06f4fb46a", + "type": "img_scale", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.2.0", + "nodePack": "invokeai", + "inputs": { + "metadata": { + "id": "46fc750e-7dda-4145-8f72-be88fb93f351", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "image": { + "id": "f7f41bb3-9a5a-4022-b671-0acc2819f7c3", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "scale_factor": { + "id": "1ae95574-f725-4cbc-bb78-4c9db240f78a", + "name": "scale_factor", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 1.5 + }, + "resample_mode": { + "id": "0756e37d-3d01-4c2c-9364-58e8978b04a2", + "name": "resample_mode", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, + "value": "bicubic" + } + }, + "outputs": { + "image": { + "id": "2729e697-cacc-4874-94bf-3aee5c18b5f9", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "d9551981-cbd3-419a-bcb9-5b50600e8c18", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "3355c99e-cdc6-473b-a7c6-a9d1dcc941e5", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 3079.916484101321, + "y": 151.0148192064986 + }, + "width": 320, + "height": 295 + }, + { + "id": "381d5b6a-f044-48b0-bc07-6138fbfa8dfc", + "type": "invocation", + "data": { + "id": "381d5b6a-f044-48b0-bc07-6138fbfa8dfc", + "type": "mask_combine", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.2.0", + "nodePack": "invokeai", + "inputs": { + "metadata": { + "id": "061ea794-2494-429e-bfdd-5fbd2c7eeb99", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "mask1": { + "id": "446c6c99-9cb5-4035-a452-ab586ef4ede9", + "name": "mask1", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "mask2": { + "id": "ebbe37b8-8bf3-4520-b6f5-631fe2d05d66", + "name": "mask2", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + } + }, + "outputs": { + "image": { + "id": "7c33cfae-ea9a-4572-91ca-40fc4112369f", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "7410c10c-3060-44a9-b399-43555c3e1156", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "3eb74c96-ae3e-4091-b027-703428244fdf", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 5450, + "y": 250 + }, + "width": 320, + "height": 238 + }, + { + "id": "77da4e4d-5778-4469-8449-ffed03d54bdb", + "type": "invocation", + "data": { + "id": "77da4e4d-5778-4469-8449-ffed03d54bdb", + "type": "img_blur", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.2.0", + "nodePack": "invokeai", + "inputs": { + "metadata": { + "id": "755d4fa2-a520-4837-a3da-65e1f479e6e6", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "image": { + "id": "a4786d7d-9593-4f5f-830b-d94bb0e42bca", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "radius": { + "id": "e1c9afa0-4d41-4664-b560-e1e85f467267", + "name": "radius", + "fieldKind": "input", + "label": "Mask Blue", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 150 + }, + "blur_type": { + "id": "f6231886-0981-444b-bd26-24674f87e7cb", + "name": "blur_type", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, + "value": "gaussian" + } + }, + "outputs": { + "image": { + "id": "20c7bcfc-269d-4119-8b45-6c59dd4005d7", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "37e228ef-cb59-4477-b18f-343609d7bb4e", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "2de6080e-8bc3-42cd-bb8a-afd72f082df4", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 5000, + "y": 300 + }, + "width": 320, + "height": 295 + }, + { + "id": "f0de6c44-4515-4f79-bcc0-dee111bcfe31", + "type": "invocation", + "data": { + "id": "f0de6c44-4515-4f79-bcc0-dee111bcfe31", + "type": "float", + "label": "Face Detail Scale", + "isOpen": false, + "notes": "The image is cropped to the face and scaled to 512x512. This value can scale even more. Best result with value between 1-2.\n\n1 = 512\n2 = 1024\n\n", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", + "inputs": { + "value": { + "id": "9b51a26f-af3c-4caa-940a-5183234b1ed7", + "name": "value", + "fieldKind": "input", + "label": "Face Detail Scale", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 1.5 + } + }, + "outputs": { + "value": { + "id": "c7c87b77-c149-4e9c-8ed1-beb1ba013055", + "name": "value", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + } + } + } + }, + "position": { + "x": 2578.2364832140506, + "y": 78.7948456497351 + }, + "width": 320, + "height": 24 + }, + { + "id": "c6359181-6479-40ec-bf3a-b7e8451683b8", + "type": "invocation", + "data": { + "id": "c6359181-6479-40ec-bf3a-b7e8451683b8", + "type": "main_model_loader", + "version": "1.0.0", + "label": "", + "notes": "", + "isOpen": true, + "isIntermediate": true, + "useCache": true, + "inputs": { + "model": { + "id": "055b0ebf-3dd6-4f49-99cb-e99b7272736e", + "name": "model", + "type": { + "name": "MainModelField", + "isCollection": false, + "isCollectionOrScalar": false + }, + "label": "", + "fieldKind": "input" + } + }, + "outputs": { + "vae": { + "id": "8326ee8e-4b2c-4209-be86-44c3014b7400", + "name": "vae", + "type": { + "name": "VaeField", + "isCollection": false, + "isCollectionOrScalar": false + }, + "fieldKind": "output" + }, + "clip": { + "id": "ccce5429-6295-434e-b054-d8965ecbd88f", + "name": "clip", + "type": { + "name": "ClipField", + "isCollection": false, + "isCollectionOrScalar": false + }, + "fieldKind": "output" + }, + "unet": { + "id": "1b410439-dd40-4ac5-ae3f-7f8cfcf42043", + "name": "unet", + "type": { + "name": "UNetField", + "isCollection": false, + "isCollectionOrScalar": false + }, + "fieldKind": "output" + } + } + }, + "position": { + "x": 2031.5518710051792, + "y": -492.1742944307074 + }, + "width": 320, + "height": 168 + } + ], + "edges": [ + { + "id": "f0de6c44-4515-4f79-bcc0-dee111bcfe31-2974e5b3-3d41-4b6f-9953-cd21e8f3a323-collapsed", + "type": "collapsed", + "source": "f0de6c44-4515-4f79-bcc0-dee111bcfe31", + "target": "2974e5b3-3d41-4b6f-9953-cd21e8f3a323" + }, + { + "id": "de8b1a48-a2e4-42ca-90bb-66058bffd534-2974e5b3-3d41-4b6f-9953-cd21e8f3a323-collapsed", + "type": "collapsed", + "source": "de8b1a48-a2e4-42ca-90bb-66058bffd534", + "target": "2974e5b3-3d41-4b6f-9953-cd21e8f3a323" + }, + { + "id": "50a8db6a-3796-4522-8547-53275efa4e7d-de8b1a48-a2e4-42ca-90bb-66058bffd534-collapsed", + "type": "collapsed", + "source": "50a8db6a-3796-4522-8547-53275efa4e7d", + "target": "de8b1a48-a2e4-42ca-90bb-66058bffd534" + }, + { + "id": "2974e5b3-3d41-4b6f-9953-cd21e8f3a323-35623411-ba3a-4eaa-91fd-1e0fda0a5b42-collapsed", + "type": "collapsed", + "source": "2974e5b3-3d41-4b6f-9953-cd21e8f3a323", + "target": "35623411-ba3a-4eaa-91fd-1e0fda0a5b42" + }, + { + "id": "c865f39f-f830-4ed7-88a5-e935cfe050a9-35623411-ba3a-4eaa-91fd-1e0fda0a5b42-collapsed", + "type": "collapsed", + "source": "c865f39f-f830-4ed7-88a5-e935cfe050a9", + "target": "35623411-ba3a-4eaa-91fd-1e0fda0a5b42" + }, + { + "id": "reactflow__edge-2c9bc2a6-6c03-4861-aad4-db884a7682f8image-9ae34718-a17d-401d-9859-086896c29fcaimage", + "type": "default", + "source": "2c9bc2a6-6c03-4861-aad4-db884a7682f8", + "target": "9ae34718-a17d-401d-9859-086896c29fca", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-9ae34718-a17d-401d-9859-086896c29fcaimage-50a8db6a-3796-4522-8547-53275efa4e7dimage", + "type": "default", + "source": "9ae34718-a17d-401d-9859-086896c29fca", + "target": "50a8db6a-3796-4522-8547-53275efa4e7d", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-35623411-ba3a-4eaa-91fd-1e0fda0a5b42noise-bd06261d-a74a-4d1f-8374-745ed6194bc2noise", + "type": "default", + "source": "35623411-ba3a-4eaa-91fd-1e0fda0a5b42", + "target": "bd06261d-a74a-4d1f-8374-745ed6194bc2", + "sourceHandle": "noise", + "targetHandle": "noise" + }, + { + "id": "reactflow__edge-de8b1a48-a2e4-42ca-90bb-66058bffd534latents-2974e5b3-3d41-4b6f-9953-cd21e8f3a323latents", + "type": "default", + "source": "de8b1a48-a2e4-42ca-90bb-66058bffd534", + "target": "2974e5b3-3d41-4b6f-9953-cd21e8f3a323", + "sourceHandle": "latents", + "targetHandle": "latents" + }, + { + "id": "reactflow__edge-2974e5b3-3d41-4b6f-9953-cd21e8f3a323latents-bd06261d-a74a-4d1f-8374-745ed6194bc2latents", + "type": "default", + "source": "2974e5b3-3d41-4b6f-9953-cd21e8f3a323", + "target": "bd06261d-a74a-4d1f-8374-745ed6194bc2", + "sourceHandle": "latents", + "targetHandle": "latents" + }, + { + "id": "reactflow__edge-2974e5b3-3d41-4b6f-9953-cd21e8f3a323width-35623411-ba3a-4eaa-91fd-1e0fda0a5b42width", + "type": "default", + "source": "2974e5b3-3d41-4b6f-9953-cd21e8f3a323", + "target": "35623411-ba3a-4eaa-91fd-1e0fda0a5b42", + "sourceHandle": "width", + "targetHandle": "width" + }, + { + "id": "reactflow__edge-2974e5b3-3d41-4b6f-9953-cd21e8f3a323height-35623411-ba3a-4eaa-91fd-1e0fda0a5b42height", + "type": "default", + "source": "2974e5b3-3d41-4b6f-9953-cd21e8f3a323", + "target": "35623411-ba3a-4eaa-91fd-1e0fda0a5b42", + "sourceHandle": "height", + "targetHandle": "height" + }, + { + "id": "reactflow__edge-2c9bc2a6-6c03-4861-aad4-db884a7682f8image-a7d14545-aa09-4b96-bfc5-40c009af9110base_image", + "type": "default", + "source": "2c9bc2a6-6c03-4861-aad4-db884a7682f8", + "target": "a7d14545-aa09-4b96-bfc5-40c009af9110", + "sourceHandle": "image", + "targetHandle": "base_image" + }, + { + "id": "reactflow__edge-2224ed72-2453-4252-bd89-3085240e0b6fimage-ff8c23dc-da7c-45b7-b5c9-d984b12f02efimage", + "type": "default", + "source": "2224ed72-2453-4252-bd89-3085240e0b6f", + "target": "ff8c23dc-da7c-45b7-b5c9-d984b12f02ef", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-9ae34718-a17d-401d-9859-086896c29fcawidth-ff8c23dc-da7c-45b7-b5c9-d984b12f02efwidth", + "type": "default", + "source": "9ae34718-a17d-401d-9859-086896c29fca", + "target": "ff8c23dc-da7c-45b7-b5c9-d984b12f02ef", + "sourceHandle": "width", + "targetHandle": "width" + }, + { + "id": "reactflow__edge-9ae34718-a17d-401d-9859-086896c29fcaheight-ff8c23dc-da7c-45b7-b5c9-d984b12f02efheight", + "type": "default", + "source": "9ae34718-a17d-401d-9859-086896c29fca", + "target": "ff8c23dc-da7c-45b7-b5c9-d984b12f02ef", + "sourceHandle": "height", + "targetHandle": "height" + }, + { + "id": "reactflow__edge-9ae34718-a17d-401d-9859-086896c29fcax-a7d14545-aa09-4b96-bfc5-40c009af9110x", + "type": "default", + "source": "9ae34718-a17d-401d-9859-086896c29fca", + "target": "a7d14545-aa09-4b96-bfc5-40c009af9110", + "sourceHandle": "x", + "targetHandle": "x" + }, + { + "id": "reactflow__edge-9ae34718-a17d-401d-9859-086896c29fcay-a7d14545-aa09-4b96-bfc5-40c009af9110y", + "type": "default", + "source": "9ae34718-a17d-401d-9859-086896c29fca", + "target": "a7d14545-aa09-4b96-bfc5-40c009af9110", + "sourceHandle": "y", + "targetHandle": "y" + }, + { + "id": "reactflow__edge-50a8db6a-3796-4522-8547-53275efa4e7dimage-de8b1a48-a2e4-42ca-90bb-66058bffd534image", + "type": "default", + "source": "50a8db6a-3796-4522-8547-53275efa4e7d", + "target": "de8b1a48-a2e4-42ca-90bb-66058bffd534", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-cdfa5ab0-b3e2-43ed-85bb-2ac4aa83bc05value-bd06261d-a74a-4d1f-8374-745ed6194bc2denoising_start", + "type": "default", + "source": "cdfa5ab0-b3e2-43ed-85bb-2ac4aa83bc05", + "target": "bd06261d-a74a-4d1f-8374-745ed6194bc2", + "sourceHandle": "value", + "targetHandle": "denoising_start" + }, + { + "id": "reactflow__edge-64712037-92e8-483f-9f6e-87588539c1b8value-bd06261d-a74a-4d1f-8374-745ed6194bc2cfg_scale", + "type": "default", + "source": "64712037-92e8-483f-9f6e-87588539c1b8", + "target": "bd06261d-a74a-4d1f-8374-745ed6194bc2", + "sourceHandle": "value", + "targetHandle": "cfg_scale" + }, + { + "id": "reactflow__edge-9ae34718-a17d-401d-9859-086896c29fcawidth-c59e815c-1f3a-4e2b-b6b8-66f4b005e955width", + "type": "default", + "source": "9ae34718-a17d-401d-9859-086896c29fca", + "target": "c59e815c-1f3a-4e2b-b6b8-66f4b005e955", + "sourceHandle": "width", + "targetHandle": "width" + }, + { + "id": "reactflow__edge-9ae34718-a17d-401d-9859-086896c29fcaheight-c59e815c-1f3a-4e2b-b6b8-66f4b005e955height", + "type": "default", + "source": "9ae34718-a17d-401d-9859-086896c29fca", + "target": "c59e815c-1f3a-4e2b-b6b8-66f4b005e955", + "sourceHandle": "height", + "targetHandle": "height" + }, + { + "id": "reactflow__edge-ff8c23dc-da7c-45b7-b5c9-d984b12f02efimage-a7d14545-aa09-4b96-bfc5-40c009af9110image", + "type": "default", + "source": "ff8c23dc-da7c-45b7-b5c9-d984b12f02ef", + "target": "a7d14545-aa09-4b96-bfc5-40c009af9110", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-bd06261d-a74a-4d1f-8374-745ed6194bc2latents-2224ed72-2453-4252-bd89-3085240e0b6flatents", + "type": "default", + "source": "bd06261d-a74a-4d1f-8374-745ed6194bc2", + "target": "2224ed72-2453-4252-bd89-3085240e0b6f", + "sourceHandle": "latents", + "targetHandle": "latents" + }, + { + "id": "reactflow__edge-c865f39f-f830-4ed7-88a5-e935cfe050a9value-35623411-ba3a-4eaa-91fd-1e0fda0a5b42seed", + "type": "default", + "source": "c865f39f-f830-4ed7-88a5-e935cfe050a9", + "target": "35623411-ba3a-4eaa-91fd-1e0fda0a5b42", + "sourceHandle": "value", + "targetHandle": "seed" + }, + { + "id": "reactflow__edge-f4d15b64-c4a6-42a5-90fc-e4ed07a0ca65conditioning-bd06261d-a74a-4d1f-8374-745ed6194bc2positive_conditioning", + "type": "default", + "source": "f4d15b64-c4a6-42a5-90fc-e4ed07a0ca65", + "target": "bd06261d-a74a-4d1f-8374-745ed6194bc2", + "sourceHandle": "conditioning", + "targetHandle": "positive_conditioning" + }, + { + "id": "reactflow__edge-44f2c190-eb03-460d-8d11-a94d13b33f19conditioning-bd06261d-a74a-4d1f-8374-745ed6194bc2negative_conditioning", + "type": "default", + "source": "44f2c190-eb03-460d-8d11-a94d13b33f19", + "target": "bd06261d-a74a-4d1f-8374-745ed6194bc2", + "sourceHandle": "conditioning", + "targetHandle": "negative_conditioning" + }, + { + "id": "reactflow__edge-22b750db-b85e-486b-b278-ac983e329813ip_adapter-bd06261d-a74a-4d1f-8374-745ed6194bc2ip_adapter", + "type": "default", + "source": "22b750db-b85e-486b-b278-ac983e329813", + "target": "bd06261d-a74a-4d1f-8374-745ed6194bc2", + "sourceHandle": "ip_adapter", + "targetHandle": "ip_adapter" + }, + { + "id": "reactflow__edge-50a8db6a-3796-4522-8547-53275efa4e7dimage-4bd4ae80-567f-4366-b8c6-3bb06f4fb46aimage", + "type": "default", + "source": "50a8db6a-3796-4522-8547-53275efa4e7d", + "target": "4bd4ae80-567f-4366-b8c6-3bb06f4fb46a", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-4bd4ae80-567f-4366-b8c6-3bb06f4fb46aimage-22b750db-b85e-486b-b278-ac983e329813image", + "type": "default", + "source": "4bd4ae80-567f-4366-b8c6-3bb06f4fb46a", + "target": "22b750db-b85e-486b-b278-ac983e329813", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-8fe598c6-d447-44fa-a165-4975af77d080image-f60b6161-8f26-42f6-89ff-545e6011e501image", + "type": "default", + "source": "8fe598c6-d447-44fa-a165-4975af77d080", + "target": "f60b6161-8f26-42f6-89ff-545e6011e501", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-4bd4ae80-567f-4366-b8c6-3bb06f4fb46aimage-8fe598c6-d447-44fa-a165-4975af77d080image", + "type": "default", + "source": "4bd4ae80-567f-4366-b8c6-3bb06f4fb46a", + "target": "8fe598c6-d447-44fa-a165-4975af77d080", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-f60b6161-8f26-42f6-89ff-545e6011e501control-bd06261d-a74a-4d1f-8374-745ed6194bc2control", + "type": "default", + "source": "f60b6161-8f26-42f6-89ff-545e6011e501", + "target": "bd06261d-a74a-4d1f-8374-745ed6194bc2", + "sourceHandle": "control", + "targetHandle": "control" + }, + { + "id": "reactflow__edge-c59e815c-1f3a-4e2b-b6b8-66f4b005e955image-381d5b6a-f044-48b0-bc07-6138fbfa8dfcmask2", + "type": "default", + "source": "c59e815c-1f3a-4e2b-b6b8-66f4b005e955", + "target": "381d5b6a-f044-48b0-bc07-6138fbfa8dfc", + "sourceHandle": "image", + "targetHandle": "mask2" + }, + { + "id": "reactflow__edge-381d5b6a-f044-48b0-bc07-6138fbfa8dfcimage-a7d14545-aa09-4b96-bfc5-40c009af9110mask", + "type": "default", + "source": "381d5b6a-f044-48b0-bc07-6138fbfa8dfc", + "target": "a7d14545-aa09-4b96-bfc5-40c009af9110", + "sourceHandle": "image", + "targetHandle": "mask" + }, + { + "id": "reactflow__edge-77da4e4d-5778-4469-8449-ffed03d54bdbimage-381d5b6a-f044-48b0-bc07-6138fbfa8dfcmask1", + "type": "default", + "source": "77da4e4d-5778-4469-8449-ffed03d54bdb", + "target": "381d5b6a-f044-48b0-bc07-6138fbfa8dfc", + "sourceHandle": "image", + "targetHandle": "mask1" + }, + { + "id": "reactflow__edge-9ae34718-a17d-401d-9859-086896c29fcamask-77da4e4d-5778-4469-8449-ffed03d54bdbimage", + "type": "default", + "source": "9ae34718-a17d-401d-9859-086896c29fca", + "target": "77da4e4d-5778-4469-8449-ffed03d54bdb", + "sourceHandle": "mask", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-f0de6c44-4515-4f79-bcc0-dee111bcfe31value-2974e5b3-3d41-4b6f-9953-cd21e8f3a323scale_factor", + "type": "default", + "source": "f0de6c44-4515-4f79-bcc0-dee111bcfe31", + "target": "2974e5b3-3d41-4b6f-9953-cd21e8f3a323", + "sourceHandle": "value", + "targetHandle": "scale_factor" + }, + { + "id": "reactflow__edge-f0de6c44-4515-4f79-bcc0-dee111bcfe31value-4bd4ae80-567f-4366-b8c6-3bb06f4fb46ascale_factor", + "type": "default", + "source": "f0de6c44-4515-4f79-bcc0-dee111bcfe31", + "target": "4bd4ae80-567f-4366-b8c6-3bb06f4fb46a", + "sourceHandle": "value", + "targetHandle": "scale_factor" + }, + { + "id": "reactflow__edge-c6359181-6479-40ec-bf3a-b7e8451683b8vae-2224ed72-2453-4252-bd89-3085240e0b6fvae", + "type": "default", + "source": "c6359181-6479-40ec-bf3a-b7e8451683b8", + "target": "2224ed72-2453-4252-bd89-3085240e0b6f", + "sourceHandle": "vae", + "targetHandle": "vae" + }, + { + "id": "reactflow__edge-c6359181-6479-40ec-bf3a-b7e8451683b8clip-44f2c190-eb03-460d-8d11-a94d13b33f19clip", + "type": "default", + "source": "c6359181-6479-40ec-bf3a-b7e8451683b8", + "target": "44f2c190-eb03-460d-8d11-a94d13b33f19", + "sourceHandle": "clip", + "targetHandle": "clip" + }, + { + "id": "reactflow__edge-c6359181-6479-40ec-bf3a-b7e8451683b8clip-f4d15b64-c4a6-42a5-90fc-e4ed07a0ca65clip", + "type": "default", + "source": "c6359181-6479-40ec-bf3a-b7e8451683b8", + "target": "f4d15b64-c4a6-42a5-90fc-e4ed07a0ca65", + "sourceHandle": "clip", + "targetHandle": "clip" + }, + { + "id": "reactflow__edge-c6359181-6479-40ec-bf3a-b7e8451683b8unet-bd06261d-a74a-4d1f-8374-745ed6194bc2unet", + "type": "default", + "source": "c6359181-6479-40ec-bf3a-b7e8451683b8", + "target": "bd06261d-a74a-4d1f-8374-745ed6194bc2", + "sourceHandle": "unet", + "targetHandle": "unet" + }, + { + "id": "reactflow__edge-c6359181-6479-40ec-bf3a-b7e8451683b8vae-de8b1a48-a2e4-42ca-90bb-66058bffd534vae", + "type": "default", + "source": "c6359181-6479-40ec-bf3a-b7e8451683b8", + "target": "de8b1a48-a2e4-42ca-90bb-66058bffd534", + "sourceHandle": "vae", + "targetHandle": "vae" + } + ] +} \ No newline at end of file diff --git a/invokeai/app/services/workflow_records/default_workflows/Multi ControlNet (Canny & Depth).json b/invokeai/app/services/workflow_records/default_workflows/Multi ControlNet (Canny & Depth).json new file mode 100644 index 0000000000..8a21a87928 --- /dev/null +++ b/invokeai/app/services/workflow_records/default_workflows/Multi ControlNet (Canny & Depth).json @@ -0,0 +1,1479 @@ +{ + "name": "Multi ControlNet (Canny & Depth)", + "author": "InvokeAI", + "description": "A sample workflow using canny & depth ControlNets to guide the generation process. ", + "version": "1.0.0", + "contact": "invoke@invoke.ai", + "tags": "ControlNet, canny, depth", + "notes": "", + "exposedFields": [ + { + "nodeId": "54486974-835b-4d81-8f82-05f9f32ce9e9", + "fieldName": "model" + }, + { + "nodeId": "7ce68934-3419-42d4-ac70-82cfc9397306", + "fieldName": "prompt" + }, + { + "nodeId": "273e3f96-49ea-4dc5-9d5b-9660390f14e1", + "fieldName": "prompt" + }, + { + "nodeId": "c4b23e64-7986-40c4-9cad-46327b12e204", + "fieldName": "image" + }, + { + "nodeId": "8e860e51-5045-456e-bf04-9a62a2a5c49e", + "fieldName": "image" + } + ], + "meta": { + "category": "default", + "version": "2.0.0" + }, + "nodes": [ + { + "id": "8e860e51-5045-456e-bf04-9a62a2a5c49e", + "type": "invocation", + "data": { + "id": "8e860e51-5045-456e-bf04-9a62a2a5c49e", + "type": "image", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", + "inputs": { + "image": { + "id": "189c8adf-68cc-4774-a729-49da89f6fdf1", + "name": "image", + "fieldKind": "input", + "label": "Depth Input Image", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + } + }, + "outputs": { + "image": { + "id": "1a31cacd-9d19-4f32-b558-c5e4aa39ce73", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "12f298fd-1d11-4cca-9426-01240f7ec7cf", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "c47dabcb-44e8-40c9-992d-81dca59f598e", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 3625, + "y": -75 + }, + "width": 320, + "height": 189 + }, + { + "id": "a33199c2-8340-401e-b8a2-42ffa875fc1c", + "type": "invocation", + "data": { + "id": "a33199c2-8340-401e-b8a2-42ffa875fc1c", + "type": "controlnet", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.1.1", + "nodePack": "invokeai", + "inputs": { + "image": { + "id": "4e0a3172-d3c2-4005-a84c-fa12a404f8a0", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "control_model": { + "id": "8cb2d998-4086-430a-8b13-94cbc81e3ca3", + "name": "control_model", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ControlNetModelField" + }, + "value": { + "model_name": "depth", + "base_model": "sd-1" + } + }, + "control_weight": { + "id": "5e32bd8a-9dc8-42d8-9bcc-c2b0460c0b0f", + "name": "control_weight", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "FloatField" + }, + "value": 1 + }, + "begin_step_percent": { + "id": "c258a276-352a-416c-8358-152f11005c0c", + "name": "begin_step_percent", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 + }, + "end_step_percent": { + "id": "43001125-0d70-4f87-8e79-da6603ad6c33", + "name": "end_step_percent", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 1 + }, + "control_mode": { + "id": "d2f14561-9443-4374-9270-e2f05007944e", + "name": "control_mode", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, + "value": "balanced" + }, + "resize_mode": { + "id": "727ee7d3-8bf6-4c7d-8b8a-43546b3b59cd", + "name": "resize_mode", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, + "value": "just_resize" + } + }, + "outputs": { + "control": { + "id": "b034aa0f-4d0d-46e4-b5e3-e25a9588d087", + "name": "control", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ControlField" + } + } + } + }, + "position": { + "x": 4477.604342844504, + "y": -49.39005411272677 + }, + "width": 320, + "height": 451 + }, + { + "id": "273e3f96-49ea-4dc5-9d5b-9660390f14e1", + "type": "invocation", + "data": { + "id": "273e3f96-49ea-4dc5-9d5b-9660390f14e1", + "type": "compel", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", + "inputs": { + "prompt": { + "id": "7c2c4771-2161-4d77-aced-ff8c4b3f1c15", + "name": "prompt", + "fieldKind": "input", + "label": "Negative Prompt", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "" + }, + "clip": { + "id": "06d59e91-9cca-411d-bf05-86b099b3e8f7", + "name": "clip", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } + } + }, + "outputs": { + "conditioning": { + "id": "858bc33c-134c-4bf6-8855-f943e1d26f14", + "name": "conditioning", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + } + } + }, + "position": { + "x": 4075, + "y": -825 + }, + "width": 320, + "height": 219 + }, + { + "id": "54486974-835b-4d81-8f82-05f9f32ce9e9", + "type": "invocation", + "data": { + "id": "54486974-835b-4d81-8f82-05f9f32ce9e9", + "type": "main_model_loader", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", + "inputs": { + "model": { + "id": "f4a915a5-593e-4b6d-9198-c78eb5cefaed", + "name": "model", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MainModelField" + }, + "value": { + "model_name": "stable-diffusion-v1-5", + "base_model": "sd-1", + "model_type": "main" + } + } + }, + "outputs": { + "unet": { + "id": "ee24fb16-da38-4c66-9fbc-e8f296ed40d2", + "name": "unet", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "UNetField" + } + }, + "clip": { + "id": "f3fb0524-8803-41c1-86db-a61a13ee6a33", + "name": "clip", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } + }, + "vae": { + "id": "5c4878a8-b40f-44ab-b146-1c1f42c860b3", + "name": "vae", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } + } + } + }, + "position": { + "x": 3600, + "y": -1000 + }, + "width": 320, + "height": 193 + }, + { + "id": "7ce68934-3419-42d4-ac70-82cfc9397306", + "type": "invocation", + "data": { + "id": "7ce68934-3419-42d4-ac70-82cfc9397306", + "type": "compel", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", + "inputs": { + "prompt": { + "id": "7c2c4771-2161-4d77-aced-ff8c4b3f1c15", + "name": "prompt", + "fieldKind": "input", + "label": "Positive Prompt", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "" + }, + "clip": { + "id": "06d59e91-9cca-411d-bf05-86b099b3e8f7", + "name": "clip", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } + } + }, + "outputs": { + "conditioning": { + "id": "858bc33c-134c-4bf6-8855-f943e1d26f14", + "name": "conditioning", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + } + } + }, + "position": { + "x": 4075, + "y": -1125 + }, + "width": 320, + "height": 219 + }, + { + "id": "d204d184-f209-4fae-a0a1-d152800844e1", + "type": "invocation", + "data": { + "id": "d204d184-f209-4fae-a0a1-d152800844e1", + "type": "controlnet", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.1.1", + "nodePack": "invokeai", + "inputs": { + "image": { + "id": "4e0a3172-d3c2-4005-a84c-fa12a404f8a0", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "control_model": { + "id": "8cb2d998-4086-430a-8b13-94cbc81e3ca3", + "name": "control_model", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ControlNetModelField" + }, + "value": { + "model_name": "canny", + "base_model": "sd-1" + } + }, + "control_weight": { + "id": "5e32bd8a-9dc8-42d8-9bcc-c2b0460c0b0f", + "name": "control_weight", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "FloatField" + }, + "value": 1 + }, + "begin_step_percent": { + "id": "c258a276-352a-416c-8358-152f11005c0c", + "name": "begin_step_percent", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 + }, + "end_step_percent": { + "id": "43001125-0d70-4f87-8e79-da6603ad6c33", + "name": "end_step_percent", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 1 + }, + "control_mode": { + "id": "d2f14561-9443-4374-9270-e2f05007944e", + "name": "control_mode", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, + "value": "balanced" + }, + "resize_mode": { + "id": "727ee7d3-8bf6-4c7d-8b8a-43546b3b59cd", + "name": "resize_mode", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, + "value": "just_resize" + } + }, + "outputs": { + "control": { + "id": "b034aa0f-4d0d-46e4-b5e3-e25a9588d087", + "name": "control", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ControlField" + } + } + } + }, + "position": { + "x": 4479.68542130465, + "y": -618.4221638099414 + }, + "width": 320, + "height": 451 + }, + { + "id": "c4b23e64-7986-40c4-9cad-46327b12e204", + "type": "invocation", + "data": { + "id": "c4b23e64-7986-40c4-9cad-46327b12e204", + "type": "image", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", + "inputs": { + "image": { + "id": "189c8adf-68cc-4774-a729-49da89f6fdf1", + "name": "image", + "fieldKind": "input", + "label": "Canny Input Image", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + } + }, + "outputs": { + "image": { + "id": "1a31cacd-9d19-4f32-b558-c5e4aa39ce73", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "12f298fd-1d11-4cca-9426-01240f7ec7cf", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "c47dabcb-44e8-40c9-992d-81dca59f598e", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 3625, + "y": -425 + }, + "width": 320, + "height": 189 + }, + { + "id": "ca4d5059-8bfb-447f-b415-da0faba5a143", + "type": "invocation", + "data": { + "id": "ca4d5059-8bfb-447f-b415-da0faba5a143", + "type": "collect", + "label": "ControlNet Collection", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "inputs": { + "item": { + "id": "b16ae602-8708-4b1b-8d4f-9e0808d429ab", + "name": "item", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "CollectionItemField" + } + } + }, + "outputs": { + "collection": { + "id": "d8987dd8-dec8-4d94-816a-3e356af29884", + "name": "collection", + "fieldKind": "output", + "type": { + "isCollection": true, + "isCollectionOrScalar": false, + "name": "CollectionField" + } + } + } + }, + "position": { + "x": 4875, + "y": -575 + }, + "width": 320, + "height": 87 + }, + { + "id": "018b1214-c2af-43a7-9910-fb687c6726d7", + "type": "invocation", + "data": { + "id": "018b1214-c2af-43a7-9910-fb687c6726d7", + "type": "midas_depth_image_processor", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.2.0", + "nodePack": "invokeai", + "inputs": { + "metadata": { + "id": "77f91980-c696-4a18-a9ea-6e2fc329a747", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "image": { + "id": "50710a20-2af5-424d-9d17-aa08167829c6", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "a_mult": { + "id": "f3b26f9d-2498-415e-9c01-197a8d06c0a5", + "name": "a_mult", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 2 + }, + "bg_th": { + "id": "4b1eb3ae-9d4a-47d6-b0ed-da62501e007f", + "name": "bg_th", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0.1 + } + }, + "outputs": { + "image": { + "id": "b4ed637c-c4a0-4fdd-a24e-36d6412e4ccf", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "6bf9b609-d72c-4239-99bd-390a73cc3a9c", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "3e8aef09-cf44-4e3e-a490-d3c9e7b23119", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 4100, + "y": -75 + }, + "width": 320, + "height": 293 + }, + { + "id": "c826ba5e-9676-4475-b260-07b85e88753c", + "type": "invocation", + "data": { + "id": "c826ba5e-9676-4475-b260-07b85e88753c", + "type": "canny_image_processor", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.2.0", + "nodePack": "invokeai", + "inputs": { + "metadata": { + "id": "08331ea6-99df-4e61-a919-204d9bfa8fb2", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "image": { + "id": "33a37284-06ac-459c-ba93-1655e4f69b2d", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "low_threshold": { + "id": "21ec18a3-50c5-4ba1-9642-f921744d594f", + "name": "low_threshold", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 100 + }, + "high_threshold": { + "id": "ebeab271-a5ff-4c88-acfd-1d0271ab6ed4", + "name": "high_threshold", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 200 + } + }, + "outputs": { + "image": { + "id": "c0caadbf-883f-4cb4-a62d-626b9c81fc4e", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "df225843-8098-49c0-99d1-3b0b6600559f", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "e4abe0de-aa16-41f3-9cd7-968b49db5da3", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 4095.757337055795, + "y": -455.63440891935863 + }, + "width": 320, + "height": 293 + }, + { + "id": "9db25398-c869-4a63-8815-c6559341ef12", + "type": "invocation", + "data": { + "id": "9db25398-c869-4a63-8815-c6559341ef12", + "type": "l2i", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": false, + "useCache": true, + "version": "1.2.0", + "nodePack": "invokeai", + "inputs": { + "metadata": { + "id": "2f269793-72e5-4ff3-b76c-fab4f93e983f", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "latents": { + "id": "4aaedd3b-cc77-420c-806e-c7fa74ec4cdf", + "name": "latents", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "vae": { + "id": "432b066a-2462-4d18-83d9-64620b72df45", + "name": "vae", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } + }, + "tiled": { + "id": "61f86e0f-7c46-40f8-b3f5-fe2f693595ca", + "name": "tiled", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": false + }, + "fp32": { + "id": "39b6c89a-37ef-4a7e-9509-daeca49d5092", + "name": "fp32", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": false + } + }, + "outputs": { + "image": { + "id": "6204e9b0-61dd-4250-b685-2092ba0e28e6", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "b4140649-8d5d-4d2d-bfa6-09e389ede5f9", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "f3a0c0c8-fc24-4646-8be1-ed8cdd140828", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 5675, + "y": -825 + }, + "width": 320, + "height": 224 + }, + { + "id": "ac481b7f-08bf-4a9d-9e0c-3a82ea5243ce", + "type": "invocation", + "data": { + "id": "ac481b7f-08bf-4a9d-9e0c-3a82ea5243ce", + "type": "denoise_latents", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.5.1", + "nodePack": "invokeai", + "inputs": { + "positive_conditioning": { + "id": "869cd309-c238-444b-a1a0-5021f99785ba", + "name": "positive_conditioning", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + }, + "negative_conditioning": { + "id": "343447b4-1e37-4e9e-8ac7-4d04864066af", + "name": "negative_conditioning", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + }, + "noise": { + "id": "b556571e-0cf9-4e03-8cfc-5caad937d957", + "name": "noise", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "steps": { + "id": "a3b3d2de-9308-423e-b00d-c209c3e6e808", + "name": "steps", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 10 + }, + "cfg_scale": { + "id": "b13c50a4-ec7e-4579-b0ef-2fe5df2605ea", + "name": "cfg_scale", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "FloatField" + }, + "value": 7.5 + }, + "denoising_start": { + "id": "57d5d755-f58f-4347-b991-f0bca4a0ab29", + "name": "denoising_start", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 + }, + "denoising_end": { + "id": "323e78a6-880a-4d73-a62c-70faff965aa6", + "name": "denoising_end", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 1 + }, + "scheduler": { + "id": "c25fdc17-a089-43ac-953e-067c45d5c76b", + "name": "scheduler", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "SchedulerField" + }, + "value": "euler" + }, + "unet": { + "id": "6cde662b-e633-4569-b6b4-ec87c52c9c11", + "name": "unet", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "UNetField" + } + }, + "control": { + "id": "276a4df9-bb26-4505-a4d3-a94e18c7b541", + "name": "control", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "ControlField" + } + }, + "ip_adapter": { + "id": "48d40c51-b5e2-4457-a428-eef0696695e8", + "name": "ip_adapter", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "IPAdapterField" + } + }, + "t2i_adapter": { + "id": "75dd8af2-e7d7-48b4-a574-edd9f6e686ad", + "name": "t2i_adapter", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "T2IAdapterField" + } + }, + "cfg_rescale_multiplier": { + "id": "b90460cf-d0c9-4676-8909-2e8e22dc8ee5", + "name": "cfg_rescale_multiplier", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 + }, + "latents": { + "id": "9223d67b-1dd7-4b34-a45f-ed0a725d9702", + "name": "latents", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "denoise_mask": { + "id": "4ee99177-6923-4b7f-8fe0-d721dd7cb05b", + "name": "denoise_mask", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "DenoiseMaskField" + } + } + }, + "outputs": { + "latents": { + "id": "7fb4e326-a974-43e8-9ee7-2e3ab235819d", + "name": "latents", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "width": { + "id": "6bb8acd0-8973-4195-a095-e376385dc705", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "795dea52-1c7d-4e64-99f7-2f60ec6e3ab9", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 5274.672987098195, + "y": -823.0752416664332 + }, + "width": 320, + "height": 612 + }, + { + "id": "2e77a0a1-db6a-47a2-a8bf-1e003be6423b", + "type": "invocation", + "data": { + "id": "2e77a0a1-db6a-47a2-a8bf-1e003be6423b", + "type": "noise", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.1", + "inputs": { + "seed": { + "id": "96d7667a-9c56-4fb4-99db-868e2f08e874", + "name": "seed", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "width": { + "id": "1ce644ea-c9bf-48c5-9822-bdec0d2895c5", + "name": "width", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + }, + "height": { + "id": "26d68b53-8a04-4db7-b0f8-57c9bddc0e49", + "name": "height", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + }, + "use_cpu": { + "id": "cf8fb92e-2a8e-4cd5-baf5-4011e0ddfa22", + "name": "use_cpu", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": true + } + }, + "outputs": { + "noise": { + "id": "d9cb9305-6b3a-49a9-b27c-00fb3a58b85c", + "name": "noise", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "width": { + "id": "4ff28d00-ceee-42b8-90e7-f5e5a518376d", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "a6314b9c-346a-4aa6-9260-626ed46c060a", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 4875, + "y": -675 + }, + "width": 320, + "height": 24 + }, + { + "id": "8b260b4d-3fd6-44d4-b1be-9f0e43c628ce", + "type": "invocation", + "data": { + "id": "8b260b4d-3fd6-44d4-b1be-9f0e43c628ce", + "type": "rand_int", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": false, + "version": "1.0.0", + "inputs": { + "low": { + "id": "a190ad12-a6bd-499b-a82a-100e09fe9aa4", + "name": "low", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "high": { + "id": "a085063f-b9ba-46f2-a21b-c46c321949aa", + "name": "high", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 2147483647 + } + }, + "outputs": { + "value": { + "id": "a15aff56-4874-47fe-be32-d66745ed2ab5", + "name": "value", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 4875, + "y": -750 + }, + "width": 320, + "height": 24 + } + ], + "edges": [ + { + "id": "8b260b4d-3fd6-44d4-b1be-9f0e43c628ce-2e77a0a1-db6a-47a2-a8bf-1e003be6423b-collapsed", + "type": "collapsed", + "source": "8b260b4d-3fd6-44d4-b1be-9f0e43c628ce", + "target": "2e77a0a1-db6a-47a2-a8bf-1e003be6423b" + }, + { + "id": "reactflow__edge-54486974-835b-4d81-8f82-05f9f32ce9e9clip-7ce68934-3419-42d4-ac70-82cfc9397306clip", + "type": "default", + "source": "54486974-835b-4d81-8f82-05f9f32ce9e9", + "target": "7ce68934-3419-42d4-ac70-82cfc9397306", + "sourceHandle": "clip", + "targetHandle": "clip" + }, + { + "id": "reactflow__edge-54486974-835b-4d81-8f82-05f9f32ce9e9clip-273e3f96-49ea-4dc5-9d5b-9660390f14e1clip", + "type": "default", + "source": "54486974-835b-4d81-8f82-05f9f32ce9e9", + "target": "273e3f96-49ea-4dc5-9d5b-9660390f14e1", + "sourceHandle": "clip", + "targetHandle": "clip" + }, + { + "id": "reactflow__edge-a33199c2-8340-401e-b8a2-42ffa875fc1ccontrol-ca4d5059-8bfb-447f-b415-da0faba5a143item", + "type": "default", + "source": "a33199c2-8340-401e-b8a2-42ffa875fc1c", + "target": "ca4d5059-8bfb-447f-b415-da0faba5a143", + "sourceHandle": "control", + "targetHandle": "item" + }, + { + "id": "reactflow__edge-d204d184-f209-4fae-a0a1-d152800844e1control-ca4d5059-8bfb-447f-b415-da0faba5a143item", + "type": "default", + "source": "d204d184-f209-4fae-a0a1-d152800844e1", + "target": "ca4d5059-8bfb-447f-b415-da0faba5a143", + "sourceHandle": "control", + "targetHandle": "item" + }, + { + "id": "reactflow__edge-8e860e51-5045-456e-bf04-9a62a2a5c49eimage-018b1214-c2af-43a7-9910-fb687c6726d7image", + "type": "default", + "source": "8e860e51-5045-456e-bf04-9a62a2a5c49e", + "target": "018b1214-c2af-43a7-9910-fb687c6726d7", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-018b1214-c2af-43a7-9910-fb687c6726d7image-a33199c2-8340-401e-b8a2-42ffa875fc1cimage", + "type": "default", + "source": "018b1214-c2af-43a7-9910-fb687c6726d7", + "target": "a33199c2-8340-401e-b8a2-42ffa875fc1c", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-c4b23e64-7986-40c4-9cad-46327b12e204image-c826ba5e-9676-4475-b260-07b85e88753cimage", + "type": "default", + "source": "c4b23e64-7986-40c4-9cad-46327b12e204", + "target": "c826ba5e-9676-4475-b260-07b85e88753c", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-c826ba5e-9676-4475-b260-07b85e88753cimage-d204d184-f209-4fae-a0a1-d152800844e1image", + "type": "default", + "source": "c826ba5e-9676-4475-b260-07b85e88753c", + "target": "d204d184-f209-4fae-a0a1-d152800844e1", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-54486974-835b-4d81-8f82-05f9f32ce9e9vae-9db25398-c869-4a63-8815-c6559341ef12vae", + "type": "default", + "source": "54486974-835b-4d81-8f82-05f9f32ce9e9", + "target": "9db25398-c869-4a63-8815-c6559341ef12", + "sourceHandle": "vae", + "targetHandle": "vae" + }, + { + "id": "reactflow__edge-ac481b7f-08bf-4a9d-9e0c-3a82ea5243celatents-9db25398-c869-4a63-8815-c6559341ef12latents", + "type": "default", + "source": "ac481b7f-08bf-4a9d-9e0c-3a82ea5243ce", + "target": "9db25398-c869-4a63-8815-c6559341ef12", + "sourceHandle": "latents", + "targetHandle": "latents" + }, + { + "id": "reactflow__edge-ca4d5059-8bfb-447f-b415-da0faba5a143collection-ac481b7f-08bf-4a9d-9e0c-3a82ea5243cecontrol", + "type": "default", + "source": "ca4d5059-8bfb-447f-b415-da0faba5a143", + "target": "ac481b7f-08bf-4a9d-9e0c-3a82ea5243ce", + "sourceHandle": "collection", + "targetHandle": "control" + }, + { + "id": "reactflow__edge-54486974-835b-4d81-8f82-05f9f32ce9e9unet-ac481b7f-08bf-4a9d-9e0c-3a82ea5243ceunet", + "type": "default", + "source": "54486974-835b-4d81-8f82-05f9f32ce9e9", + "target": "ac481b7f-08bf-4a9d-9e0c-3a82ea5243ce", + "sourceHandle": "unet", + "targetHandle": "unet" + }, + { + "id": "reactflow__edge-273e3f96-49ea-4dc5-9d5b-9660390f14e1conditioning-ac481b7f-08bf-4a9d-9e0c-3a82ea5243cenegative_conditioning", + "type": "default", + "source": "273e3f96-49ea-4dc5-9d5b-9660390f14e1", + "target": "ac481b7f-08bf-4a9d-9e0c-3a82ea5243ce", + "sourceHandle": "conditioning", + "targetHandle": "negative_conditioning" + }, + { + "id": "reactflow__edge-7ce68934-3419-42d4-ac70-82cfc9397306conditioning-ac481b7f-08bf-4a9d-9e0c-3a82ea5243cepositive_conditioning", + "type": "default", + "source": "7ce68934-3419-42d4-ac70-82cfc9397306", + "target": "ac481b7f-08bf-4a9d-9e0c-3a82ea5243ce", + "sourceHandle": "conditioning", + "targetHandle": "positive_conditioning" + }, + { + "id": "reactflow__edge-2e77a0a1-db6a-47a2-a8bf-1e003be6423bnoise-ac481b7f-08bf-4a9d-9e0c-3a82ea5243cenoise", + "type": "default", + "source": "2e77a0a1-db6a-47a2-a8bf-1e003be6423b", + "target": "ac481b7f-08bf-4a9d-9e0c-3a82ea5243ce", + "sourceHandle": "noise", + "targetHandle": "noise" + }, + { + "id": "reactflow__edge-8b260b4d-3fd6-44d4-b1be-9f0e43c628cevalue-2e77a0a1-db6a-47a2-a8bf-1e003be6423bseed", + "type": "default", + "source": "8b260b4d-3fd6-44d4-b1be-9f0e43c628ce", + "target": "2e77a0a1-db6a-47a2-a8bf-1e003be6423b", + "sourceHandle": "value", + "targetHandle": "seed" + } + ] +} \ No newline at end of file diff --git a/invokeai/app/services/workflow_records/default_workflows/Prompt from File.json b/invokeai/app/services/workflow_records/default_workflows/Prompt from File.json new file mode 100644 index 0000000000..06a9a93d3f --- /dev/null +++ b/invokeai/app/services/workflow_records/default_workflows/Prompt from File.json @@ -0,0 +1,974 @@ +{ + "name": "Prompt from File", + "author": "InvokeAI", + "description": "Sample workflow using Prompt from File node", + "version": "0.1.0", + "contact": "invoke@invoke.ai", + "tags": "text2image, prompt from file, default", + "notes": "", + "exposedFields": [ + { + "nodeId": "d6353b7f-b447-4e17-8f2e-80a88c91d426", + "fieldName": "model" + }, + { + "nodeId": "1b7e0df8-8589-4915-a4ea-c0088f15d642", + "fieldName": "file_path" + } + ], + "meta": { + "category": "default", + "version": "2.0.0" + }, + "nodes": [ + { + "id": "c2eaf1ba-5708-4679-9e15-945b8b432692", + "type": "invocation", + "data": { + "id": "c2eaf1ba-5708-4679-9e15-945b8b432692", + "type": "compel", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", + "inputs": { + "prompt": { + "id": "dcdf3f6d-9b96-4bcd-9b8d-f992fefe4f62", + "name": "prompt", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "" + }, + "clip": { + "id": "3f1981c9-d8a9-42eb-a739-4f120eb80745", + "name": "clip", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } + } + }, + "outputs": { + "conditioning": { + "id": "46205e6c-c5e2-44cb-9c82-1cd20b95674a", + "name": "conditioning", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + } + } + }, + "position": { + "x": 925, + "y": -200 + }, + "width": 320, + "height": 24 + }, + { + "id": "1b7e0df8-8589-4915-a4ea-c0088f15d642", + "type": "invocation", + "data": { + "id": "1b7e0df8-8589-4915-a4ea-c0088f15d642", + "type": "prompt_from_file", + "label": "Prompts from File", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.1", + "nodePack": "invokeai", + "inputs": { + "file_path": { + "id": "37e37684-4f30-4ec8-beae-b333e550f904", + "name": "file_path", + "fieldKind": "input", + "label": "Prompts File Path", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "" + }, + "pre_prompt": { + "id": "7de02feb-819a-4992-bad3-72a30920ddea", + "name": "pre_prompt", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "" + }, + "post_prompt": { + "id": "95f191d8-a282-428e-bd65-de8cb9b7513a", + "name": "post_prompt", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "" + }, + "start_line": { + "id": "efee9a48-05ab-4829-8429-becfa64a0782", + "name": "start_line", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 1 + }, + "max_prompts": { + "id": "abebb428-3d3d-49fd-a482-4e96a16fff08", + "name": "max_prompts", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 1 + } + }, + "outputs": { + "collection": { + "id": "77d5d7f1-9877-4ab1-9a8c-33e9ffa9abf3", + "name": "collection", + "fieldKind": "output", + "type": { + "isCollection": true, + "isCollectionOrScalar": false, + "name": "StringField" + } + } + } + }, + "position": { + "x": 475, + "y": -400 + }, + "width": 320, + "height": 506 + }, + { + "id": "1b89067c-3f6b-42c8-991f-e3055789b251", + "type": "invocation", + "data": { + "id": "1b89067c-3f6b-42c8-991f-e3055789b251", + "type": "iterate", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.1.0", + "inputs": { + "collection": { + "id": "4c564bf8-5ed6-441e-ad2c-dda265d5785f", + "name": "collection", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": true, + "isCollectionOrScalar": false, + "name": "CollectionField" + } + } + }, + "outputs": { + "item": { + "id": "36340f9a-e7a5-4afa-b4b5-313f4e292380", + "name": "item", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "CollectionItemField" + } + }, + "index": { + "id": "1beca95a-2159-460f-97ff-c8bab7d89336", + "name": "index", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "total": { + "id": "ead597b8-108e-4eda-88a8-5c29fa2f8df9", + "name": "total", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 925, + "y": -400 + }, + "width": 320, + "height": 24 + }, + { + "id": "d6353b7f-b447-4e17-8f2e-80a88c91d426", + "type": "invocation", + "data": { + "id": "d6353b7f-b447-4e17-8f2e-80a88c91d426", + "type": "main_model_loader", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", + "inputs": { + "model": { + "id": "3f264259-3418-47d5-b90d-b6600e36ae46", + "name": "model", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MainModelField" + }, + "value": { + "model_name": "stable-diffusion-v1-5", + "base_model": "sd-1", + "model_type": "main" + } + } + }, + "outputs": { + "unet": { + "id": "8e182ea2-9d0a-4c02-9407-27819288d4b5", + "name": "unet", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "UNetField" + } + }, + "clip": { + "id": "d67d9d30-058c-46d5-bded-3d09d6d1aa39", + "name": "clip", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } + }, + "vae": { + "id": "89641601-0429-4448-98d5-190822d920d8", + "name": "vae", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } + } + } + }, + "position": { + "x": 0, + "y": -375 + }, + "width": 320, + "height": 193 + }, + { + "id": "fc9d0e35-a6de-4a19-84e1-c72497c823f6", + "type": "invocation", + "data": { + "id": "fc9d0e35-a6de-4a19-84e1-c72497c823f6", + "type": "compel", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", + "inputs": { + "prompt": { + "id": "dcdf3f6d-9b96-4bcd-9b8d-f992fefe4f62", + "name": "prompt", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "" + }, + "clip": { + "id": "3f1981c9-d8a9-42eb-a739-4f120eb80745", + "name": "clip", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } + } + }, + "outputs": { + "conditioning": { + "id": "46205e6c-c5e2-44cb-9c82-1cd20b95674a", + "name": "conditioning", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + } + } + }, + "position": { + "x": 925, + "y": -275 + }, + "width": 320, + "height": 24 + }, + { + "id": "0eb5f3f5-1b91-49eb-9ef0-41d67c7eae77", + "type": "invocation", + "data": { + "id": "0eb5f3f5-1b91-49eb-9ef0-41d67c7eae77", + "type": "noise", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.1", + "nodePack": "invokeai", + "inputs": { + "seed": { + "id": "b722d84a-eeee-484f-bef2-0250c027cb67", + "name": "seed", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "width": { + "id": "d5f8ce11-0502-4bfc-9a30-5757dddf1f94", + "name": "width", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + }, + "height": { + "id": "f187d5ff-38a5-4c3f-b780-fc5801ef34af", + "name": "height", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + }, + "use_cpu": { + "id": "12f112b8-8b76-4816-b79e-662edc9f9aa5", + "name": "use_cpu", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": true + } + }, + "outputs": { + "noise": { + "id": "08576ad1-96d9-42d2-96ef-6f5c1961933f", + "name": "noise", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "width": { + "id": "f3e1f94a-258d-41ff-9789-bd999bd9f40d", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "6cefc357-4339-415e-a951-49b9c2be32f4", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 925, + "y": 25 + }, + "width": 320, + "height": 24 + }, + { + "id": "dfc20e07-7aef-4fc0-a3a1-7bf68ec6a4e5", + "type": "invocation", + "data": { + "id": "dfc20e07-7aef-4fc0-a3a1-7bf68ec6a4e5", + "type": "rand_int", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": false, + "version": "1.0.0", + "nodePack": "invokeai", + "inputs": { + "low": { + "id": "b9fc6cf1-469c-4037-9bf0-04836965826f", + "name": "low", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "high": { + "id": "06eac725-0f60-4ba2-b8cd-7ad9f757488c", + "name": "high", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 2147483647 + } + }, + "outputs": { + "value": { + "id": "df08c84e-7346-4e92-9042-9e5cb773aaff", + "name": "value", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 925, + "y": -50 + }, + "width": 320, + "height": 24 + }, + { + "id": "491ec988-3c77-4c37-af8a-39a0c4e7a2a1", + "type": "invocation", + "data": { + "id": "491ec988-3c77-4c37-af8a-39a0c4e7a2a1", + "type": "l2i", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.2.0", + "nodePack": "invokeai", + "inputs": { + "metadata": { + "id": "022e4b33-562b-438d-b7df-41c3fd931f40", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "latents": { + "id": "67cb6c77-a394-4a66-a6a9-a0a7dcca69ec", + "name": "latents", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "vae": { + "id": "7b3fd9ad-a4ef-4e04-89fa-3832a9902dbd", + "name": "vae", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } + }, + "tiled": { + "id": "5ac5680d-3add-4115-8ec0-9ef5bb87493b", + "name": "tiled", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": false + }, + "fp32": { + "id": "db8297f5-55f8-452f-98cf-6572c2582152", + "name": "fp32", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": false + } + }, + "outputs": { + "image": { + "id": "d8778d0c-592a-4960-9280-4e77e00a7f33", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "c8b0a75a-f5de-4ff2-9227-f25bb2b97bec", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "83c05fbf-76b9-49ab-93c4-fa4b10e793e4", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 2037.861329274915, + "y": -329.8393457509562 + }, + "width": 320, + "height": 224 + }, + { + "id": "2fb1577f-0a56-4f12-8711-8afcaaaf1d5e", + "type": "invocation", + "data": { + "id": "2fb1577f-0a56-4f12-8711-8afcaaaf1d5e", + "type": "denoise_latents", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.5.1", + "nodePack": "invokeai", + "inputs": { + "positive_conditioning": { + "id": "751fb35b-3f23-45ce-af1c-053e74251337", + "name": "positive_conditioning", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + }, + "negative_conditioning": { + "id": "b9dc06b6-7481-4db1-a8c2-39d22a5eacff", + "name": "negative_conditioning", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + }, + "noise": { + "id": "6e15e439-3390-48a4-8031-01e0e19f0e1d", + "name": "noise", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "steps": { + "id": "bfdfb3df-760b-4d51-b17b-0abb38b976c2", + "name": "steps", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 10 + }, + "cfg_scale": { + "id": "47770858-322e-41af-8494-d8b63ed735f3", + "name": "cfg_scale", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "FloatField" + }, + "value": 7.5 + }, + "denoising_start": { + "id": "2ba78720-ee02-4130-a348-7bc3531f790b", + "name": "denoising_start", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 + }, + "denoising_end": { + "id": "a874dffb-d433-4d1a-9f59-af4367bb05e4", + "name": "denoising_end", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 1 + }, + "scheduler": { + "id": "36e021ad-b762-4fe4-ad4d-17f0291c40b2", + "name": "scheduler", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "SchedulerField" + }, + "value": "euler" + }, + "unet": { + "id": "98d3282d-f9f6-4b5e-b9e8-58658f1cac78", + "name": "unet", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "UNetField" + } + }, + "control": { + "id": "f2ea3216-43d5-42b4-887f-36e8f7166d53", + "name": "control", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "ControlField" + } + }, + "ip_adapter": { + "id": "d0780610-a298-47c8-a54e-70e769e0dfe2", + "name": "ip_adapter", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "IPAdapterField" + } + }, + "t2i_adapter": { + "id": "fdb40970-185e-4ea8-8bb5-88f06f91f46a", + "name": "t2i_adapter", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "T2IAdapterField" + } + }, + "cfg_rescale_multiplier": { + "id": "3af2d8c5-de83-425c-a100-49cb0f1f4385", + "name": "cfg_rescale_multiplier", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 + }, + "latents": { + "id": "e05b538a-1b5a-4aa5-84b1-fd2361289a81", + "name": "latents", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "denoise_mask": { + "id": "463a419e-df30-4382-8ffb-b25b25abe425", + "name": "denoise_mask", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "DenoiseMaskField" + } + } + }, + "outputs": { + "latents": { + "id": "559ee688-66cf-4139-8b82-3d3aa69995ce", + "name": "latents", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "width": { + "id": "0b4285c2-e8b9-48e5-98f6-0a49d3f98fd2", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "8b0881b9-45e5-47d5-b526-24b6661de0ee", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 1570.9941088179146, + "y": -407.6505491604564 + }, + "width": 320, + "height": 612 + } + ], + "edges": [ + { + "id": "1b89067c-3f6b-42c8-991f-e3055789b251-fc9d0e35-a6de-4a19-84e1-c72497c823f6-collapsed", + "type": "collapsed", + "source": "1b89067c-3f6b-42c8-991f-e3055789b251", + "target": "fc9d0e35-a6de-4a19-84e1-c72497c823f6" + }, + { + "id": "dfc20e07-7aef-4fc0-a3a1-7bf68ec6a4e5-0eb5f3f5-1b91-49eb-9ef0-41d67c7eae77-collapsed", + "type": "collapsed", + "source": "dfc20e07-7aef-4fc0-a3a1-7bf68ec6a4e5", + "target": "0eb5f3f5-1b91-49eb-9ef0-41d67c7eae77" + }, + { + "id": "reactflow__edge-1b7e0df8-8589-4915-a4ea-c0088f15d642collection-1b89067c-3f6b-42c8-991f-e3055789b251collection", + "type": "default", + "source": "1b7e0df8-8589-4915-a4ea-c0088f15d642", + "target": "1b89067c-3f6b-42c8-991f-e3055789b251", + "sourceHandle": "collection", + "targetHandle": "collection" + }, + { + "id": "reactflow__edge-d6353b7f-b447-4e17-8f2e-80a88c91d426clip-fc9d0e35-a6de-4a19-84e1-c72497c823f6clip", + "type": "default", + "source": "d6353b7f-b447-4e17-8f2e-80a88c91d426", + "target": "fc9d0e35-a6de-4a19-84e1-c72497c823f6", + "sourceHandle": "clip", + "targetHandle": "clip" + }, + { + "id": "reactflow__edge-1b89067c-3f6b-42c8-991f-e3055789b251item-fc9d0e35-a6de-4a19-84e1-c72497c823f6prompt", + "type": "default", + "source": "1b89067c-3f6b-42c8-991f-e3055789b251", + "target": "fc9d0e35-a6de-4a19-84e1-c72497c823f6", + "sourceHandle": "item", + "targetHandle": "prompt" + }, + { + "id": "reactflow__edge-d6353b7f-b447-4e17-8f2e-80a88c91d426clip-c2eaf1ba-5708-4679-9e15-945b8b432692clip", + "type": "default", + "source": "d6353b7f-b447-4e17-8f2e-80a88c91d426", + "target": "c2eaf1ba-5708-4679-9e15-945b8b432692", + "sourceHandle": "clip", + "targetHandle": "clip" + }, + { + "id": "reactflow__edge-dfc20e07-7aef-4fc0-a3a1-7bf68ec6a4e5value-0eb5f3f5-1b91-49eb-9ef0-41d67c7eae77seed", + "type": "default", + "source": "dfc20e07-7aef-4fc0-a3a1-7bf68ec6a4e5", + "target": "0eb5f3f5-1b91-49eb-9ef0-41d67c7eae77", + "sourceHandle": "value", + "targetHandle": "seed" + }, + { + "id": "reactflow__edge-fc9d0e35-a6de-4a19-84e1-c72497c823f6conditioning-2fb1577f-0a56-4f12-8711-8afcaaaf1d5epositive_conditioning", + "type": "default", + "source": "fc9d0e35-a6de-4a19-84e1-c72497c823f6", + "target": "2fb1577f-0a56-4f12-8711-8afcaaaf1d5e", + "sourceHandle": "conditioning", + "targetHandle": "positive_conditioning" + }, + { + "id": "reactflow__edge-c2eaf1ba-5708-4679-9e15-945b8b432692conditioning-2fb1577f-0a56-4f12-8711-8afcaaaf1d5enegative_conditioning", + "type": "default", + "source": "c2eaf1ba-5708-4679-9e15-945b8b432692", + "target": "2fb1577f-0a56-4f12-8711-8afcaaaf1d5e", + "sourceHandle": "conditioning", + "targetHandle": "negative_conditioning" + }, + { + "id": "reactflow__edge-0eb5f3f5-1b91-49eb-9ef0-41d67c7eae77noise-2fb1577f-0a56-4f12-8711-8afcaaaf1d5enoise", + "type": "default", + "source": "0eb5f3f5-1b91-49eb-9ef0-41d67c7eae77", + "target": "2fb1577f-0a56-4f12-8711-8afcaaaf1d5e", + "sourceHandle": "noise", + "targetHandle": "noise" + }, + { + "id": "reactflow__edge-d6353b7f-b447-4e17-8f2e-80a88c91d426unet-2fb1577f-0a56-4f12-8711-8afcaaaf1d5eunet", + "type": "default", + "source": "d6353b7f-b447-4e17-8f2e-80a88c91d426", + "target": "2fb1577f-0a56-4f12-8711-8afcaaaf1d5e", + "sourceHandle": "unet", + "targetHandle": "unet" + }, + { + "id": "reactflow__edge-2fb1577f-0a56-4f12-8711-8afcaaaf1d5elatents-491ec988-3c77-4c37-af8a-39a0c4e7a2a1latents", + "type": "default", + "source": "2fb1577f-0a56-4f12-8711-8afcaaaf1d5e", + "target": "491ec988-3c77-4c37-af8a-39a0c4e7a2a1", + "sourceHandle": "latents", + "targetHandle": "latents" + }, + { + "id": "reactflow__edge-d6353b7f-b447-4e17-8f2e-80a88c91d426vae-491ec988-3c77-4c37-af8a-39a0c4e7a2a1vae", + "type": "default", + "source": "d6353b7f-b447-4e17-8f2e-80a88c91d426", + "target": "491ec988-3c77-4c37-af8a-39a0c4e7a2a1", + "sourceHandle": "vae", + "targetHandle": "vae" + } + ] +} \ No newline at end of file diff --git a/invokeai/app/services/workflow_records/default_workflows/README.md b/invokeai/app/services/workflow_records/default_workflows/README.md new file mode 100644 index 0000000000..3901ead1cd --- /dev/null +++ b/invokeai/app/services/workflow_records/default_workflows/README.md @@ -0,0 +1,17 @@ +# Default Workflows + +Workflows placed in this directory will be synced to the `workflow_library` as +_default workflows_ on app startup. + +- Default workflows are not editable by users. If they are loaded and saved, + they will save as a copy of the default workflow. +- Default workflows must have the `meta.category` property set to `"default"`. + An exception will be raised during sync if this is not set correctly. +- Default workflows appear on the "Default Workflows" tab of the Workflow + Library. + +After adding or updating default workflows, you **must** start the app up and +load them to ensure: + +- The workflow loads without warning or errors +- The workflow runs successfully diff --git a/invokeai/app/services/workflow_records/default_workflows/SDXL Text to Image.json b/invokeai/app/services/workflow_records/default_workflows/SDXL Text to Image.json new file mode 100644 index 0000000000..67b68f6986 --- /dev/null +++ b/invokeai/app/services/workflow_records/default_workflows/SDXL Text to Image.json @@ -0,0 +1,1318 @@ +{ + "name": "SDXL Text to Image", + "author": "InvokeAI", + "description": "Sample text to image workflow for SDXL", + "version": "1.0.1", + "contact": "invoke@invoke.ai", + "tags": "text2image, SDXL, default", + "notes": "", + "exposedFields": [ + { + "nodeId": "ade2c0d3-0384-4157-b39b-29ce429cfa15", + "fieldName": "value" + }, + { + "nodeId": "719dabe8-8297-4749-aea1-37be301cd425", + "fieldName": "value" + }, + { + "nodeId": "30d3289c-773c-4152-a9d2-bd8a99c8fd22", + "fieldName": "model" + }, + { + "nodeId": "0093692f-9cf4-454d-a5b8-62f0e3eb3bb8", + "fieldName": "vae_model" + } + ], + "meta": { + "category": "default", + "version": "2.0.0" + }, + "nodes": [ + { + "id": "3774ec24-a69e-4254-864c-097d07a6256f", + "type": "invocation", + "data": { + "id": "3774ec24-a69e-4254-864c-097d07a6256f", + "type": "string_join", + "label": "Positive Style Concat", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "inputs": { + "string_left": { + "id": "8d84be5c-4a96-46ad-a92c-eaf6fcae4a69", + "name": "string_left", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "" + }, + "string_right": { + "id": "c8e2a881-f675-4c6b-865b-a0892473b750", + "name": "string_right", + "fieldKind": "input", + "label": "Positive Style Concat", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "" + } + }, + "outputs": { + "value": { + "id": "196fad08-73ea-4fe5-8cc3-b55fd3cf40e5", + "name": "value", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + } + } + } + }, + "position": { + "x": 750, + "y": -225 + }, + "width": 320, + "height": 24 + }, + { + "id": "719dabe8-8297-4749-aea1-37be301cd425", + "type": "invocation", + "data": { + "id": "719dabe8-8297-4749-aea1-37be301cd425", + "type": "string", + "label": "Negative Prompt", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "inputs": { + "value": { + "id": "744a5f7c-6e3a-4fbc-ac66-ba0cf8559eeb", + "name": "value", + "fieldKind": "input", + "label": "Negative Prompt", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "photograph" + } + }, + "outputs": { + "value": { + "id": "3e0ddf7a-a5de-4dad-b726-5d0cb4e0baa6", + "name": "value", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + } + } + } + }, + "position": { + "x": 750, + "y": -125 + }, + "width": 320, + "height": 219 + }, + { + "id": "3193ad09-a7c2-4bf4-a3a9-1c61cc33a204", + "type": "invocation", + "data": { + "id": "3193ad09-a7c2-4bf4-a3a9-1c61cc33a204", + "type": "sdxl_compel_prompt", + "label": "SDXL Negative Compel Prompt", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", + "inputs": { + "prompt": { + "id": "5a6889e6-95cb-462f-8f4a-6b93ae7afaec", + "name": "prompt", + "fieldKind": "input", + "label": "Negative Prompt", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "" + }, + "style": { + "id": "f240d0e6-3a1c-4320-af23-20ebb707c276", + "name": "style", + "fieldKind": "input", + "label": "Negative Style", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "" + }, + "original_width": { + "id": "05af07b0-99a0-4a68-8ad2-697bbdb7fc7e", + "name": "original_width", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 1024 + }, + "original_height": { + "id": "2c771996-a998-43b7-9dd3-3792664d4e5b", + "name": "original_height", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 1024 + }, + "crop_top": { + "id": "66519dca-a151-4e3e-ae1f-88f1f9877bde", + "name": "crop_top", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "crop_left": { + "id": "349cf2e9-f3d0-4e16-9ae2-7097d25b6a51", + "name": "crop_left", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "target_width": { + "id": "44499347-7bd6-4a73-99d6-5a982786db05", + "name": "target_width", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 1024 + }, + "target_height": { + "id": "fda359b0-ab80-4f3c-805b-c9f61319d7d2", + "name": "target_height", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 1024 + }, + "clip": { + "id": "b447adaf-a649-4a76-a827-046a9fc8d89b", + "name": "clip", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } + }, + "clip2": { + "id": "86ee4e32-08f9-4baa-9163-31d93f5c0187", + "name": "clip2", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } + } + }, + "outputs": { + "conditioning": { + "id": "7c10118e-7b4e-4911-b98e-d3ba6347dfd0", + "name": "conditioning", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + } + } + }, + "position": { + "x": 750, + "y": 200 + }, + "width": 320, + "height": 24 + }, + { + "id": "55705012-79b9-4aac-9f26-c0b10309785b", + "type": "invocation", + "data": { + "id": "55705012-79b9-4aac-9f26-c0b10309785b", + "type": "noise", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.1", + "nodePack": "invokeai", + "inputs": { + "seed": { + "id": "6431737c-918a-425d-a3b4-5d57e2f35d4d", + "name": "seed", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "width": { + "id": "38fc5b66-fe6e-47c8-bba9-daf58e454ed7", + "name": "width", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 1024 + }, + "height": { + "id": "16298330-e2bf-4872-a514-d6923df53cbb", + "name": "height", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 1024 + }, + "use_cpu": { + "id": "c7c436d3-7a7a-4e76-91e4-c6deb271623c", + "name": "use_cpu", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": true + } + }, + "outputs": { + "noise": { + "id": "50f650dc-0184-4e23-a927-0497a96fe954", + "name": "noise", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "width": { + "id": "bb8a452b-133d-42d1-ae4a-3843d7e4109a", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "35cfaa12-3b8b-4b7a-a884-327ff3abddd9", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 375, + "y": 0 + }, + "width": 320, + "height": 336 + }, + { + "id": "ea94bc37-d995-4a83-aa99-4af42479f2f2", + "type": "invocation", + "data": { + "id": "ea94bc37-d995-4a83-aa99-4af42479f2f2", + "type": "rand_int", + "label": "Random Seed", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": false, + "version": "1.0.0", + "nodePack": "invokeai", + "inputs": { + "low": { + "id": "3ec65a37-60ba-4b6c-a0b2-553dd7a84b84", + "name": "low", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "high": { + "id": "085f853a-1a5f-494d-8bec-e4ba29a3f2d1", + "name": "high", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 2147483647 + } + }, + "outputs": { + "value": { + "id": "812ade4d-7699-4261-b9fc-a6c9d2ab55ee", + "name": "value", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 375, + "y": -50 + }, + "width": 320, + "height": 24 + }, + { + "id": "30d3289c-773c-4152-a9d2-bd8a99c8fd22", + "type": "invocation", + "data": { + "id": "30d3289c-773c-4152-a9d2-bd8a99c8fd22", + "type": "sdxl_model_loader", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", + "inputs": { + "model": { + "id": "39f9e799-bc95-4318-a200-30eed9e60c42", + "name": "model", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "SDXLMainModelField" + } + } + }, + "outputs": { + "unet": { + "id": "2626a45e-59aa-4609-b131-2d45c5eaed69", + "name": "unet", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "UNetField" + } + }, + "clip": { + "id": "7c9c42fa-93d5-4639-ab8b-c4d9b0559baf", + "name": "clip", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } + }, + "clip2": { + "id": "0dafddcf-a472-49c1-a47c-7b8fab4c8bc9", + "name": "clip2", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } + }, + "vae": { + "id": "ee6a6997-1b3c-4ff3-99ce-1e7bfba2750c", + "name": "vae", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } + } + } + }, + "position": { + "x": 375, + "y": -500 + }, + "width": 320, + "height": 219 + }, + { + "id": "faf965a4-7530-427b-b1f3-4ba6505c2a08", + "type": "invocation", + "data": { + "id": "faf965a4-7530-427b-b1f3-4ba6505c2a08", + "type": "sdxl_compel_prompt", + "label": "SDXL Positive Compel Prompt", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", + "inputs": { + "prompt": { + "id": "5a6889e6-95cb-462f-8f4a-6b93ae7afaec", + "name": "prompt", + "fieldKind": "input", + "label": "Positive Prompt", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "" + }, + "style": { + "id": "f240d0e6-3a1c-4320-af23-20ebb707c276", + "name": "style", + "fieldKind": "input", + "label": "Positive Style", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "" + }, + "original_width": { + "id": "05af07b0-99a0-4a68-8ad2-697bbdb7fc7e", + "name": "original_width", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 1024 + }, + "original_height": { + "id": "2c771996-a998-43b7-9dd3-3792664d4e5b", + "name": "original_height", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 1024 + }, + "crop_top": { + "id": "66519dca-a151-4e3e-ae1f-88f1f9877bde", + "name": "crop_top", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "crop_left": { + "id": "349cf2e9-f3d0-4e16-9ae2-7097d25b6a51", + "name": "crop_left", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "target_width": { + "id": "44499347-7bd6-4a73-99d6-5a982786db05", + "name": "target_width", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 1024 + }, + "target_height": { + "id": "fda359b0-ab80-4f3c-805b-c9f61319d7d2", + "name": "target_height", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 1024 + }, + "clip": { + "id": "b447adaf-a649-4a76-a827-046a9fc8d89b", + "name": "clip", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } + }, + "clip2": { + "id": "86ee4e32-08f9-4baa-9163-31d93f5c0187", + "name": "clip2", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } + } + }, + "outputs": { + "conditioning": { + "id": "7c10118e-7b4e-4911-b98e-d3ba6347dfd0", + "name": "conditioning", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + } + } + }, + "position": { + "x": 750, + "y": -175 + }, + "width": 320, + "height": 24 + }, + { + "id": "63e91020-83b2-4f35-b174-ad9692aabb48", + "type": "invocation", + "data": { + "id": "63e91020-83b2-4f35-b174-ad9692aabb48", + "type": "l2i", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": false, + "useCache": false, + "version": "1.2.0", + "nodePack": "invokeai", + "inputs": { + "metadata": { + "id": "88971324-3fdb-442d-b8b7-7612478a8622", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "latents": { + "id": "da0e40cb-c49f-4fa5-9856-338b91a65f6b", + "name": "latents", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "vae": { + "id": "ae5164ce-1710-4ec5-a83a-6113a0d1b5c0", + "name": "vae", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } + }, + "tiled": { + "id": "2ccfd535-1a7b-4ecf-84db-9430a64fb3d7", + "name": "tiled", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": false + }, + "fp32": { + "id": "64f07d5a-54a2-429c-8c5b-0c2a3a8e5cd5", + "name": "fp32", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": false + } + }, + "outputs": { + "image": { + "id": "9b281eaa-6504-407d-a5ca-1e5e8020a4bf", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "98e545f3-b53b-490d-b94d-bed9418ccc75", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "4a74bd43-d7f7-4c7f-bb3b-d09bb2992c46", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 1475, + "y": -500 + }, + "width": 320, + "height": 224 + }, + { + "id": "50a36525-3c0a-4cc5-977c-e4bfc3fd6dfb", + "type": "invocation", + "data": { + "id": "50a36525-3c0a-4cc5-977c-e4bfc3fd6dfb", + "type": "denoise_latents", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.5.1", + "nodePack": "invokeai", + "inputs": { + "positive_conditioning": { + "id": "29b73dfa-a06e-4b4a-a844-515b9eb93a81", + "name": "positive_conditioning", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + }, + "negative_conditioning": { + "id": "a81e6f5b-f4de-4919-b483-b6e2f067465a", + "name": "negative_conditioning", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + }, + "noise": { + "id": "4ba06bb7-eb45-4fb9-9984-31001b545587", + "name": "noise", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "steps": { + "id": "36ee8a45-ca69-44bc-9bc3-aa881e6045c0", + "name": "steps", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 32 + }, + "cfg_scale": { + "id": "2a2024e0-a736-46ec-933c-c1c1ebe96943", + "name": "cfg_scale", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "FloatField" + }, + "value": 6 + }, + "denoising_start": { + "id": "be219d5e-41b7-430a-8fb5-bc21a31ad219", + "name": "denoising_start", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 + }, + "denoising_end": { + "id": "3adfb7ae-c9f7-4a40-b6e0-4c2050bd1a99", + "name": "denoising_end", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 1 + }, + "scheduler": { + "id": "14423e0d-7215-4ee0-b065-f9e95eaa8d7d", + "name": "scheduler", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "SchedulerField" + }, + "value": "dpmpp_2m_sde_k" + }, + "unet": { + "id": "e73bbf98-6489-492b-b83c-faed215febac", + "name": "unet", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "UNetField" + } + }, + "control": { + "id": "dab351b3-0c86-4ea5-9782-4e8edbfb0607", + "name": "control", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "ControlField" + } + }, + "ip_adapter": { + "id": "192daea0-a90a-43cc-a2ee-0114a8e90318", + "name": "ip_adapter", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "IPAdapterField" + } + }, + "t2i_adapter": { + "id": "ee386a55-d4c7-48c1-ac57-7bc4e3aada7a", + "name": "t2i_adapter", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "T2IAdapterField" + } + }, + "cfg_rescale_multiplier": { + "id": "106bbe8d-e641-4034-9a39-d4e82c298da1", + "name": "cfg_rescale_multiplier", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 + }, + "latents": { + "id": "3a922c6a-3d8c-4c9e-b3ec-2f4d81cda077", + "name": "latents", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "denoise_mask": { + "id": "cd7ce032-835f-495f-8b45-d57272f33132", + "name": "denoise_mask", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "DenoiseMaskField" + } + } + }, + "outputs": { + "latents": { + "id": "6260b84f-8361-470a-98d8-5b22a45c2d8c", + "name": "latents", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "width": { + "id": "aede0ecf-25b6-46be-aa30-b77f79715deb", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "519abf62-d475-48ef-ab8f-66136bc0e499", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 1125, + "y": -500 + }, + "width": 320, + "height": 612 + }, + { + "id": "0093692f-9cf4-454d-a5b8-62f0e3eb3bb8", + "type": "invocation", + "data": { + "id": "0093692f-9cf4-454d-a5b8-62f0e3eb3bb8", + "type": "vae_loader", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "inputs": { + "vae_model": { + "id": "28a17000-b629-49c6-b945-77c591cf7440", + "name": "vae_model", + "fieldKind": "input", + "label": "VAE (use the FP16 model)", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VAEModelField" + } + } + }, + "outputs": { + "vae": { + "id": "a34892b6-ba6d-44eb-8a68-af1f40a84186", + "name": "vae", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } + } + } + }, + "position": { + "x": 375, + "y": -225 + }, + "width": 320, + "height": 139 + }, + { + "id": "ade2c0d3-0384-4157-b39b-29ce429cfa15", + "type": "invocation", + "data": { + "id": "ade2c0d3-0384-4157-b39b-29ce429cfa15", + "type": "string", + "label": "Positive Prompt", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "inputs": { + "value": { + "id": "744a5f7c-6e3a-4fbc-ac66-ba0cf8559eeb", + "name": "value", + "fieldKind": "input", + "label": "Positive Prompt", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "Super cute tiger cub, fierce, traditional chinese watercolor" + } + }, + "outputs": { + "value": { + "id": "3e0ddf7a-a5de-4dad-b726-5d0cb4e0baa6", + "name": "value", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + } + } + } + }, + "position": { + "x": 750, + "y": -500 + }, + "width": 320, + "height": 219 + }, + { + "id": "ad8fa655-3a76-43d0-9c02-4d7644dea650", + "type": "invocation", + "data": { + "id": "ad8fa655-3a76-43d0-9c02-4d7644dea650", + "type": "string_join", + "label": "Negative Style Concat", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "inputs": { + "string_left": { + "id": "8d84be5c-4a96-46ad-a92c-eaf6fcae4a69", + "name": "string_left", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "" + }, + "string_right": { + "id": "c8e2a881-f675-4c6b-865b-a0892473b750", + "name": "string_right", + "fieldKind": "input", + "label": "Negative Style Prompt", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "" + } + }, + "outputs": { + "value": { + "id": "196fad08-73ea-4fe5-8cc3-b55fd3cf40e5", + "name": "value", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + } + } + } + }, + "position": { + "x": 750, + "y": 150 + }, + "width": 320, + "height": 24 + } + ], + "edges": [ + { + "id": "3774ec24-a69e-4254-864c-097d07a6256f-faf965a4-7530-427b-b1f3-4ba6505c2a08-collapsed", + "type": "collapsed", + "source": "3774ec24-a69e-4254-864c-097d07a6256f", + "target": "faf965a4-7530-427b-b1f3-4ba6505c2a08" + }, + { + "id": "ad8fa655-3a76-43d0-9c02-4d7644dea650-3193ad09-a7c2-4bf4-a3a9-1c61cc33a204-collapsed", + "type": "collapsed", + "source": "ad8fa655-3a76-43d0-9c02-4d7644dea650", + "target": "3193ad09-a7c2-4bf4-a3a9-1c61cc33a204" + }, + { + "id": "reactflow__edge-ea94bc37-d995-4a83-aa99-4af42479f2f2value-55705012-79b9-4aac-9f26-c0b10309785bseed", + "type": "default", + "source": "ea94bc37-d995-4a83-aa99-4af42479f2f2", + "target": "55705012-79b9-4aac-9f26-c0b10309785b", + "sourceHandle": "value", + "targetHandle": "seed" + }, + { + "id": "reactflow__edge-30d3289c-773c-4152-a9d2-bd8a99c8fd22clip-faf965a4-7530-427b-b1f3-4ba6505c2a08clip", + "type": "default", + "source": "30d3289c-773c-4152-a9d2-bd8a99c8fd22", + "target": "faf965a4-7530-427b-b1f3-4ba6505c2a08", + "sourceHandle": "clip", + "targetHandle": "clip" + }, + { + "id": "reactflow__edge-30d3289c-773c-4152-a9d2-bd8a99c8fd22clip2-faf965a4-7530-427b-b1f3-4ba6505c2a08clip2", + "type": "default", + "source": "30d3289c-773c-4152-a9d2-bd8a99c8fd22", + "target": "faf965a4-7530-427b-b1f3-4ba6505c2a08", + "sourceHandle": "clip2", + "targetHandle": "clip2" + }, + { + "id": "reactflow__edge-30d3289c-773c-4152-a9d2-bd8a99c8fd22clip-3193ad09-a7c2-4bf4-a3a9-1c61cc33a204clip", + "type": "default", + "source": "30d3289c-773c-4152-a9d2-bd8a99c8fd22", + "target": "3193ad09-a7c2-4bf4-a3a9-1c61cc33a204", + "sourceHandle": "clip", + "targetHandle": "clip" + }, + { + "id": "reactflow__edge-30d3289c-773c-4152-a9d2-bd8a99c8fd22clip2-3193ad09-a7c2-4bf4-a3a9-1c61cc33a204clip2", + "type": "default", + "source": "30d3289c-773c-4152-a9d2-bd8a99c8fd22", + "target": "3193ad09-a7c2-4bf4-a3a9-1c61cc33a204", + "sourceHandle": "clip2", + "targetHandle": "clip2" + }, + { + "id": "reactflow__edge-30d3289c-773c-4152-a9d2-bd8a99c8fd22unet-50a36525-3c0a-4cc5-977c-e4bfc3fd6dfbunet", + "type": "default", + "source": "30d3289c-773c-4152-a9d2-bd8a99c8fd22", + "target": "50a36525-3c0a-4cc5-977c-e4bfc3fd6dfb", + "sourceHandle": "unet", + "targetHandle": "unet" + }, + { + "id": "reactflow__edge-faf965a4-7530-427b-b1f3-4ba6505c2a08conditioning-50a36525-3c0a-4cc5-977c-e4bfc3fd6dfbpositive_conditioning", + "type": "default", + "source": "faf965a4-7530-427b-b1f3-4ba6505c2a08", + "target": "50a36525-3c0a-4cc5-977c-e4bfc3fd6dfb", + "sourceHandle": "conditioning", + "targetHandle": "positive_conditioning" + }, + { + "id": "reactflow__edge-3193ad09-a7c2-4bf4-a3a9-1c61cc33a204conditioning-50a36525-3c0a-4cc5-977c-e4bfc3fd6dfbnegative_conditioning", + "type": "default", + "source": "3193ad09-a7c2-4bf4-a3a9-1c61cc33a204", + "target": "50a36525-3c0a-4cc5-977c-e4bfc3fd6dfb", + "sourceHandle": "conditioning", + "targetHandle": "negative_conditioning" + }, + { + "id": "reactflow__edge-55705012-79b9-4aac-9f26-c0b10309785bnoise-50a36525-3c0a-4cc5-977c-e4bfc3fd6dfbnoise", + "type": "default", + "source": "55705012-79b9-4aac-9f26-c0b10309785b", + "target": "50a36525-3c0a-4cc5-977c-e4bfc3fd6dfb", + "sourceHandle": "noise", + "targetHandle": "noise" + }, + { + "id": "reactflow__edge-50a36525-3c0a-4cc5-977c-e4bfc3fd6dfblatents-63e91020-83b2-4f35-b174-ad9692aabb48latents", + "type": "default", + "source": "50a36525-3c0a-4cc5-977c-e4bfc3fd6dfb", + "target": "63e91020-83b2-4f35-b174-ad9692aabb48", + "sourceHandle": "latents", + "targetHandle": "latents" + }, + { + "id": "reactflow__edge-0093692f-9cf4-454d-a5b8-62f0e3eb3bb8vae-63e91020-83b2-4f35-b174-ad9692aabb48vae", + "type": "default", + "source": "0093692f-9cf4-454d-a5b8-62f0e3eb3bb8", + "target": "63e91020-83b2-4f35-b174-ad9692aabb48", + "sourceHandle": "vae", + "targetHandle": "vae" + }, + { + "id": "reactflow__edge-ade2c0d3-0384-4157-b39b-29ce429cfa15value-faf965a4-7530-427b-b1f3-4ba6505c2a08prompt", + "type": "default", + "source": "ade2c0d3-0384-4157-b39b-29ce429cfa15", + "target": "faf965a4-7530-427b-b1f3-4ba6505c2a08", + "sourceHandle": "value", + "targetHandle": "prompt" + }, + { + "id": "reactflow__edge-719dabe8-8297-4749-aea1-37be301cd425value-3193ad09-a7c2-4bf4-a3a9-1c61cc33a204prompt", + "type": "default", + "source": "719dabe8-8297-4749-aea1-37be301cd425", + "target": "3193ad09-a7c2-4bf4-a3a9-1c61cc33a204", + "sourceHandle": "value", + "targetHandle": "prompt" + }, + { + "id": "reactflow__edge-719dabe8-8297-4749-aea1-37be301cd425value-ad8fa655-3a76-43d0-9c02-4d7644dea650string_left", + "type": "default", + "source": "719dabe8-8297-4749-aea1-37be301cd425", + "target": "ad8fa655-3a76-43d0-9c02-4d7644dea650", + "sourceHandle": "value", + "targetHandle": "string_left" + }, + { + "id": "reactflow__edge-ad8fa655-3a76-43d0-9c02-4d7644dea650value-3193ad09-a7c2-4bf4-a3a9-1c61cc33a204style", + "type": "default", + "source": "ad8fa655-3a76-43d0-9c02-4d7644dea650", + "target": "3193ad09-a7c2-4bf4-a3a9-1c61cc33a204", + "sourceHandle": "value", + "targetHandle": "style" + }, + { + "id": "reactflow__edge-ade2c0d3-0384-4157-b39b-29ce429cfa15value-3774ec24-a69e-4254-864c-097d07a6256fstring_left", + "type": "default", + "source": "ade2c0d3-0384-4157-b39b-29ce429cfa15", + "target": "3774ec24-a69e-4254-864c-097d07a6256f", + "sourceHandle": "value", + "targetHandle": "string_left" + }, + { + "id": "reactflow__edge-3774ec24-a69e-4254-864c-097d07a6256fvalue-faf965a4-7530-427b-b1f3-4ba6505c2a08style", + "type": "default", + "source": "3774ec24-a69e-4254-864c-097d07a6256f", + "target": "faf965a4-7530-427b-b1f3-4ba6505c2a08", + "sourceHandle": "value", + "targetHandle": "style" + } + ] +} \ No newline at end of file diff --git a/invokeai/app/services/workflow_records/default_workflows/Text to Image - SD1.5.json b/invokeai/app/services/workflow_records/default_workflows/Text to Image - SD1.5.json new file mode 100644 index 0000000000..cde361426a --- /dev/null +++ b/invokeai/app/services/workflow_records/default_workflows/Text to Image - SD1.5.json @@ -0,0 +1,798 @@ +{ + "name": "Text to Image - SD1.5", + "author": "InvokeAI", + "description": "Sample text to image workflow for Stable Diffusion 1.5/2", + "version": "1.1.0", + "contact": "invoke@invoke.ai", + "tags": "text2image, SD1.5, SD2, default", + "notes": "", + "exposedFields": [ + { + "nodeId": "c8d55139-f380-4695-b7f2-8b3d1e1e3db8", + "fieldName": "model" + }, + { + "nodeId": "7d8bf987-284f-413a-b2fd-d825445a5d6c", + "fieldName": "prompt" + }, + { + "nodeId": "93dc02a4-d05b-48ed-b99c-c9b616af3402", + "fieldName": "prompt" + }, + { + "nodeId": "55705012-79b9-4aac-9f26-c0b10309785b", + "fieldName": "width" + }, + { + "nodeId": "55705012-79b9-4aac-9f26-c0b10309785b", + "fieldName": "height" + } + ], + "meta": { + "category": "default", + "version": "2.0.0" + }, + "nodes": [ + { + "id": "93dc02a4-d05b-48ed-b99c-c9b616af3402", + "type": "invocation", + "data": { + "id": "93dc02a4-d05b-48ed-b99c-c9b616af3402", + "type": "compel", + "label": "Negative Compel Prompt", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", + "inputs": { + "prompt": { + "id": "7739aff6-26cb-4016-8897-5a1fb2305e4e", + "name": "prompt", + "fieldKind": "input", + "label": "Negative Prompt", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "" + }, + "clip": { + "id": "48d23dce-a6ae-472a-9f8c-22a714ea5ce0", + "name": "clip", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } + } + }, + "outputs": { + "conditioning": { + "id": "37cf3a9d-f6b7-4b64-8ff6-2558c5ecc447", + "name": "conditioning", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + } + } + }, + "position": { + "x": 1000, + "y": 350 + }, + "width": 320, + "height": 219 + }, + { + "id": "55705012-79b9-4aac-9f26-c0b10309785b", + "type": "invocation", + "data": { + "id": "55705012-79b9-4aac-9f26-c0b10309785b", + "type": "noise", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.1", + "nodePack": "invokeai", + "inputs": { + "seed": { + "id": "6431737c-918a-425d-a3b4-5d57e2f35d4d", + "name": "seed", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "width": { + "id": "38fc5b66-fe6e-47c8-bba9-daf58e454ed7", + "name": "width", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + }, + "height": { + "id": "16298330-e2bf-4872-a514-d6923df53cbb", + "name": "height", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + }, + "use_cpu": { + "id": "c7c436d3-7a7a-4e76-91e4-c6deb271623c", + "name": "use_cpu", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": true + } + }, + "outputs": { + "noise": { + "id": "50f650dc-0184-4e23-a927-0497a96fe954", + "name": "noise", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "width": { + "id": "bb8a452b-133d-42d1-ae4a-3843d7e4109a", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "35cfaa12-3b8b-4b7a-a884-327ff3abddd9", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 600, + "y": 325 + }, + "width": 320, + "height": 388 + }, + { + "id": "c8d55139-f380-4695-b7f2-8b3d1e1e3db8", + "type": "invocation", + "data": { + "id": "c8d55139-f380-4695-b7f2-8b3d1e1e3db8", + "type": "main_model_loader", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", + "inputs": { + "model": { + "id": "993eabd2-40fd-44fe-bce7-5d0c7075ddab", + "name": "model", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MainModelField" + }, + "value": { + "model_name": "stable-diffusion-v1-5", + "base_model": "sd-1", + "model_type": "main" + } + } + }, + "outputs": { + "unet": { + "id": "5c18c9db-328d-46d0-8cb9-143391c410be", + "name": "unet", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "UNetField" + } + }, + "clip": { + "id": "6effcac0-ec2f-4bf5-a49e-a2c29cf921f4", + "name": "clip", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } + }, + "vae": { + "id": "57683ba3-f5f5-4f58-b9a2-4b83dacad4a1", + "name": "vae", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } + } + } + }, + "position": { + "x": 600, + "y": 25 + }, + "width": 320, + "height": 193 + }, + { + "id": "7d8bf987-284f-413a-b2fd-d825445a5d6c", + "type": "invocation", + "data": { + "id": "7d8bf987-284f-413a-b2fd-d825445a5d6c", + "type": "compel", + "label": "Positive Compel Prompt", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "nodePack": "invokeai", + "inputs": { + "prompt": { + "id": "7739aff6-26cb-4016-8897-5a1fb2305e4e", + "name": "prompt", + "fieldKind": "input", + "label": "Positive Prompt", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "Super cute tiger cub, national geographic award-winning photograph" + }, + "clip": { + "id": "48d23dce-a6ae-472a-9f8c-22a714ea5ce0", + "name": "clip", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } + } + }, + "outputs": { + "conditioning": { + "id": "37cf3a9d-f6b7-4b64-8ff6-2558c5ecc447", + "name": "conditioning", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + } + } + }, + "position": { + "x": 1000, + "y": 25 + }, + "width": 320, + "height": 219 + }, + { + "id": "ea94bc37-d995-4a83-aa99-4af42479f2f2", + "type": "invocation", + "data": { + "id": "ea94bc37-d995-4a83-aa99-4af42479f2f2", + "type": "rand_int", + "label": "Random Seed", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": false, + "version": "1.0.0", + "nodePack": "invokeai", + "inputs": { + "low": { + "id": "3ec65a37-60ba-4b6c-a0b2-553dd7a84b84", + "name": "low", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "high": { + "id": "085f853a-1a5f-494d-8bec-e4ba29a3f2d1", + "name": "high", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 2147483647 + } + }, + "outputs": { + "value": { + "id": "812ade4d-7699-4261-b9fc-a6c9d2ab55ee", + "name": "value", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 600, + "y": 275 + }, + "width": 320, + "height": 32 + }, + { + "id": "eea2702a-19fb-45b5-9d75-56b4211ec03c", + "type": "invocation", + "data": { + "id": "eea2702a-19fb-45b5-9d75-56b4211ec03c", + "type": "denoise_latents", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.5.1", + "nodePack": "invokeai", + "inputs": { + "positive_conditioning": { + "id": "90b7f4f8-ada7-4028-8100-d2e54f192052", + "name": "positive_conditioning", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + }, + "negative_conditioning": { + "id": "9393779e-796c-4f64-b740-902a1177bf53", + "name": "negative_conditioning", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + }, + "noise": { + "id": "8e17f1e5-4f98-40b1-b7f4-86aeeb4554c1", + "name": "noise", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "steps": { + "id": "9b63302d-6bd2-42c9-ac13-9b1afb51af88", + "name": "steps", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 50 + }, + "cfg_scale": { + "id": "87dd04d3-870e-49e1-98bf-af003a810109", + "name": "cfg_scale", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "FloatField" + }, + "value": 7.5 + }, + "denoising_start": { + "id": "f369d80f-4931-4740-9bcd-9f0620719fab", + "name": "denoising_start", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 + }, + "denoising_end": { + "id": "747d10e5-6f02-445c-994c-0604d814de8c", + "name": "denoising_end", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 1 + }, + "scheduler": { + "id": "1de84a4e-3a24-4ec8-862b-16ce49633b9b", + "name": "scheduler", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "SchedulerField" + }, + "value": "unipc" + }, + "unet": { + "id": "ffa6fef4-3ce2-4bdb-9296-9a834849489b", + "name": "unet", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "UNetField" + } + }, + "control": { + "id": "077b64cb-34be-4fcc-83f2-e399807a02bd", + "name": "control", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "ControlField" + } + }, + "ip_adapter": { + "id": "1d6948f7-3a65-4a65-a20c-768b287251aa", + "name": "ip_adapter", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "IPAdapterField" + } + }, + "t2i_adapter": { + "id": "75e67b09-952f-4083-aaf4-6b804d690412", + "name": "t2i_adapter", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "T2IAdapterField" + } + }, + "cfg_rescale_multiplier": { + "id": "9101f0a6-5fe0-4826-b7b3-47e5d506826c", + "name": "cfg_rescale_multiplier", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 + }, + "latents": { + "id": "334d4ba3-5a99-4195-82c5-86fb3f4f7d43", + "name": "latents", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "denoise_mask": { + "id": "0d3dbdbf-b014-4e95-8b18-ff2ff9cb0bfa", + "name": "denoise_mask", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "DenoiseMaskField" + } + } + }, + "outputs": { + "latents": { + "id": "70fa5bbc-0c38-41bb-861a-74d6d78d2f38", + "name": "latents", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "width": { + "id": "98ee0e6c-82aa-4e8f-8be5-dc5f00ee47f0", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "e8cb184a-5e1a-47c8-9695-4b8979564f5d", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 1400, + "y": 25 + }, + "width": 320, + "height": 612 + }, + { + "id": "58c957f5-0d01-41fc-a803-b2bbf0413d4f", + "type": "invocation", + "data": { + "id": "58c957f5-0d01-41fc-a803-b2bbf0413d4f", + "type": "l2i", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": false, + "useCache": true, + "version": "1.2.0", + "nodePack": "invokeai", + "inputs": { + "metadata": { + "id": "ab375f12-0042-4410-9182-29e30db82c85", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "latents": { + "id": "3a7e7efd-bff5-47d7-9d48-615127afee78", + "name": "latents", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "vae": { + "id": "a1f5f7a1-0795-4d58-b036-7820c0b0ef2b", + "name": "vae", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } + }, + "tiled": { + "id": "da52059a-0cee-4668-942f-519aa794d739", + "name": "tiled", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": false + }, + "fp32": { + "id": "c4841df3-b24e-4140-be3b-ccd454c2522c", + "name": "fp32", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": true + } + }, + "outputs": { + "image": { + "id": "72d667d0-cf85-459d-abf2-28bd8b823fe7", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "c8c907d8-1066-49d1-b9a6-83bdcd53addc", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "230f359c-b4ea-436c-b372-332d7dcdca85", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 1800, + "y": 25 + }, + "width": 320, + "height": 224 + } + ], + "edges": [ + { + "id": "reactflow__edge-ea94bc37-d995-4a83-aa99-4af42479f2f2value-55705012-79b9-4aac-9f26-c0b10309785bseed", + "type": "default", + "source": "ea94bc37-d995-4a83-aa99-4af42479f2f2", + "target": "55705012-79b9-4aac-9f26-c0b10309785b", + "sourceHandle": "value", + "targetHandle": "seed" + }, + { + "id": "reactflow__edge-c8d55139-f380-4695-b7f2-8b3d1e1e3db8clip-7d8bf987-284f-413a-b2fd-d825445a5d6cclip", + "type": "default", + "source": "c8d55139-f380-4695-b7f2-8b3d1e1e3db8", + "target": "7d8bf987-284f-413a-b2fd-d825445a5d6c", + "sourceHandle": "clip", + "targetHandle": "clip" + }, + { + "id": "reactflow__edge-c8d55139-f380-4695-b7f2-8b3d1e1e3db8clip-93dc02a4-d05b-48ed-b99c-c9b616af3402clip", + "type": "default", + "source": "c8d55139-f380-4695-b7f2-8b3d1e1e3db8", + "target": "93dc02a4-d05b-48ed-b99c-c9b616af3402", + "sourceHandle": "clip", + "targetHandle": "clip" + }, + { + "id": "reactflow__edge-55705012-79b9-4aac-9f26-c0b10309785bnoise-eea2702a-19fb-45b5-9d75-56b4211ec03cnoise", + "type": "default", + "source": "55705012-79b9-4aac-9f26-c0b10309785b", + "target": "eea2702a-19fb-45b5-9d75-56b4211ec03c", + "sourceHandle": "noise", + "targetHandle": "noise" + }, + { + "id": "reactflow__edge-7d8bf987-284f-413a-b2fd-d825445a5d6cconditioning-eea2702a-19fb-45b5-9d75-56b4211ec03cpositive_conditioning", + "type": "default", + "source": "7d8bf987-284f-413a-b2fd-d825445a5d6c", + "target": "eea2702a-19fb-45b5-9d75-56b4211ec03c", + "sourceHandle": "conditioning", + "targetHandle": "positive_conditioning" + }, + { + "id": "reactflow__edge-93dc02a4-d05b-48ed-b99c-c9b616af3402conditioning-eea2702a-19fb-45b5-9d75-56b4211ec03cnegative_conditioning", + "type": "default", + "source": "93dc02a4-d05b-48ed-b99c-c9b616af3402", + "target": "eea2702a-19fb-45b5-9d75-56b4211ec03c", + "sourceHandle": "conditioning", + "targetHandle": "negative_conditioning" + }, + { + "id": "reactflow__edge-c8d55139-f380-4695-b7f2-8b3d1e1e3db8unet-eea2702a-19fb-45b5-9d75-56b4211ec03cunet", + "type": "default", + "source": "c8d55139-f380-4695-b7f2-8b3d1e1e3db8", + "target": "eea2702a-19fb-45b5-9d75-56b4211ec03c", + "sourceHandle": "unet", + "targetHandle": "unet" + }, + { + "id": "reactflow__edge-eea2702a-19fb-45b5-9d75-56b4211ec03clatents-58c957f5-0d01-41fc-a803-b2bbf0413d4flatents", + "type": "default", + "source": "eea2702a-19fb-45b5-9d75-56b4211ec03c", + "target": "58c957f5-0d01-41fc-a803-b2bbf0413d4f", + "sourceHandle": "latents", + "targetHandle": "latents" + }, + { + "id": "reactflow__edge-c8d55139-f380-4695-b7f2-8b3d1e1e3db8vae-58c957f5-0d01-41fc-a803-b2bbf0413d4fvae", + "type": "default", + "source": "c8d55139-f380-4695-b7f2-8b3d1e1e3db8", + "target": "58c957f5-0d01-41fc-a803-b2bbf0413d4f", + "sourceHandle": "vae", + "targetHandle": "vae" + } + ] +} \ No newline at end of file diff --git a/invokeai/app/services/workflow_records/default_workflows/Text to Image with LoRA.json b/invokeai/app/services/workflow_records/default_workflows/Text to Image with LoRA.json new file mode 100644 index 0000000000..2cc94895fc --- /dev/null +++ b/invokeai/app/services/workflow_records/default_workflows/Text to Image with LoRA.json @@ -0,0 +1,902 @@ +{ + "name": "Text to Image with LoRA", + "author": "InvokeAI", + "description": "Simple text to image workflow with a LoRA", + "version": "1.0.0", + "contact": "invoke@invoke.ai", + "tags": "text to image, lora, default", + "notes": "", + "exposedFields": [ + { + "nodeId": "24e9d7ed-4836-4ec4-8f9e-e747721f9818", + "fieldName": "model" + }, + { + "nodeId": "c41e705b-f2e3-4d1a-83c4-e34bb9344966", + "fieldName": "lora" + }, + { + "nodeId": "c41e705b-f2e3-4d1a-83c4-e34bb9344966", + "fieldName": "weight" + }, + { + "nodeId": "c3fa6872-2599-4a82-a596-b3446a66cf8b", + "fieldName": "prompt" + } + ], + "meta": { + "category": "default", + "version": "2.0.0" + }, + "nodes": [ + { + "id": "85b77bb2-c67a-416a-b3e8-291abe746c44", + "type": "invocation", + "data": { + "id": "85b77bb2-c67a-416a-b3e8-291abe746c44", + "type": "compel", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "inputs": { + "prompt": { + "id": "39fe92c4-38eb-4cc7-bf5e-cbcd31847b11", + "name": "prompt", + "fieldKind": "input", + "label": "Negative Prompt", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "" + }, + "clip": { + "id": "14313164-e5c4-4e40-a599-41b614fe3690", + "name": "clip", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } + } + }, + "outputs": { + "conditioning": { + "id": "02140b9d-50f3-470b-a0b7-01fc6ed2dcd6", + "name": "conditioning", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + } + } + }, + "position": { + "x": 3425, + "y": -300 + }, + "width": 320, + "height": 219 + }, + { + "id": "24e9d7ed-4836-4ec4-8f9e-e747721f9818", + "type": "invocation", + "data": { + "id": "24e9d7ed-4836-4ec4-8f9e-e747721f9818", + "type": "main_model_loader", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "inputs": { + "model": { + "id": "e2e1c177-ae39-4244-920e-d621fa156a24", + "name": "model", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MainModelField" + }, + "value": { + "model_name": "Analog-Diffusion", + "base_model": "sd-1", + "model_type": "main" + } + } + }, + "outputs": { + "vae": { + "id": "f91410e8-9378-4298-b285-f0f40ffd9825", + "name": "vae", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } + }, + "clip": { + "id": "928d91bf-de0c-44a8-b0c8-4de0e2e5b438", + "name": "clip", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } + }, + "unet": { + "id": "eacaf530-4e7e-472e-b904-462192189fc1", + "name": "unet", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "UNetField" + } + } + } + }, + "position": { + "x": 2500, + "y": -600 + }, + "width": 320, + "height": 193 + }, + { + "id": "c41e705b-f2e3-4d1a-83c4-e34bb9344966", + "type": "invocation", + "data": { + "id": "c41e705b-f2e3-4d1a-83c4-e34bb9344966", + "type": "lora_loader", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "inputs": { + "lora": { + "id": "36d867e8-92ea-4c3f-9ad5-ba05c64cf326", + "name": "lora", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LoRAModelField" + }, + "value": { + "model_name": "Ink scenery", + "base_model": "sd-1" + } + }, + "weight": { + "id": "8be86540-ba81-49b3-b394-2b18fa70b867", + "name": "weight", + "fieldKind": "input", + "label": "LoRA Weight", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0.75 + }, + "unet": { + "id": "9c4d5668-e9e1-411b-8f4b-e71115bc4a01", + "name": "unet", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "UNetField" + } + }, + "clip": { + "id": "918ec00e-e76f-4ad0-aee1-3927298cf03b", + "name": "clip", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } + } + }, + "outputs": { + "unet": { + "id": "c63f7825-1bcf-451d-b7a7-aa79f5c77416", + "name": "unet", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "UNetField" + } + }, + "clip": { + "id": "6f79ef2d-00f7-4917-bee3-53e845bf4192", + "name": "clip", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } + } + } + }, + "position": { + "x": 2975, + "y": -600 + }, + "width": 320, + "height": 218 + }, + { + "id": "c3fa6872-2599-4a82-a596-b3446a66cf8b", + "type": "invocation", + "data": { + "id": "c3fa6872-2599-4a82-a596-b3446a66cf8b", + "type": "compel", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "inputs": { + "prompt": { + "id": "39fe92c4-38eb-4cc7-bf5e-cbcd31847b11", + "name": "prompt", + "fieldKind": "input", + "label": "Positive Prompt", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "cute tiger cub" + }, + "clip": { + "id": "14313164-e5c4-4e40-a599-41b614fe3690", + "name": "clip", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } + } + }, + "outputs": { + "conditioning": { + "id": "02140b9d-50f3-470b-a0b7-01fc6ed2dcd6", + "name": "conditioning", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + } + } + }, + "position": { + "x": 3425, + "y": -575 + }, + "width": 320, + "height": 219 + }, + { + "id": "ad487d0c-dcbb-49c5-bb8e-b28d4cbc5a63", + "type": "invocation", + "data": { + "id": "ad487d0c-dcbb-49c5-bb8e-b28d4cbc5a63", + "type": "denoise_latents", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.5.1", + "inputs": { + "positive_conditioning": { + "id": "025ff44b-c4c6-4339-91b4-5f461e2cadc5", + "name": "positive_conditioning", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + }, + "negative_conditioning": { + "id": "2d92b45a-a7fb-4541-9a47-7c7495f50f54", + "name": "negative_conditioning", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + }, + "noise": { + "id": "4d0deeff-24ed-4562-a1ca-7833c0649377", + "name": "noise", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "steps": { + "id": "c9907328-aece-4af9-8a95-211b4f99a325", + "name": "steps", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 10 + }, + "cfg_scale": { + "id": "7cf0f031-2078-49f4-9273-bb3a64ad7130", + "name": "cfg_scale", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "FloatField" + }, + "value": 7.5 + }, + "denoising_start": { + "id": "44cec3ba-b404-4b51-ba98-add9d783279e", + "name": "denoising_start", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 + }, + "denoising_end": { + "id": "3e7975f3-e438-4a13-8a14-395eba1fb7cd", + "name": "denoising_end", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 1 + }, + "scheduler": { + "id": "a6f6509b-7bb4-477d-b5fb-74baefa38111", + "name": "scheduler", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "SchedulerField" + }, + "value": "euler" + }, + "unet": { + "id": "5a87617a-b09f-417b-9b75-0cea4c255227", + "name": "unet", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "UNetField" + } + }, + "control": { + "id": "db87aace-ace8-4f2a-8f2b-1f752389fa9b", + "name": "control", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "ControlField" + } + }, + "ip_adapter": { + "id": "f0c133ed-4d6d-4567-bb9a-b1779810993c", + "name": "ip_adapter", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "IPAdapterField" + } + }, + "t2i_adapter": { + "id": "59ee1233-887f-45e7-aa14-cbad5f6cb77f", + "name": "t2i_adapter", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "T2IAdapterField" + } + }, + "cfg_rescale_multiplier": { + "id": "1a12e781-4b30-4707-b432-18c31866b5c3", + "name": "cfg_rescale_multiplier", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 + }, + "latents": { + "id": "d0e593ae-305c-424b-9acd-3af830085832", + "name": "latents", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "denoise_mask": { + "id": "b81b5a79-fc2b-4011-aae6-64c92bae59a7", + "name": "denoise_mask", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "DenoiseMaskField" + } + } + }, + "outputs": { + "latents": { + "id": "9ae4022a-548e-407e-90cf-cc5ca5ff8a21", + "name": "latents", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "width": { + "id": "730ba4bd-2c52-46bb-8c87-9b3aec155576", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "52b98f0b-b5ff-41b5-acc7-d0b1d1011a6f", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 3975, + "y": -575 + }, + "width": 320, + "height": 612 + }, + { + "id": "ea18915f-2c5b-4569-b725-8e9e9122e8d3", + "type": "invocation", + "data": { + "id": "ea18915f-2c5b-4569-b725-8e9e9122e8d3", + "type": "noise", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.1", + "inputs": { + "seed": { + "id": "446ac80c-ba0a-4fea-a2d7-21128f52e5bf", + "name": "seed", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "width": { + "id": "779831b3-20b4-4f5f-9de7-d17de57288d8", + "name": "width", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + }, + "height": { + "id": "08959766-6d67-4276-b122-e54b911f2316", + "name": "height", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + }, + "use_cpu": { + "id": "53b36a98-00c4-4dc5-97a4-ef3432c0a805", + "name": "use_cpu", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": true + } + }, + "outputs": { + "noise": { + "id": "eed95824-580b-442f-aa35-c073733cecce", + "name": "noise", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "width": { + "id": "7985a261-dfee-47a8-908a-c5a8754f5dc4", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "3d00f6c1-84b0-4262-83d9-3bf755babeea", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 3425, + "y": 75 + }, + "width": 320, + "height": 24 + }, + { + "id": "6fd74a17-6065-47a5-b48b-f4e2b8fa7953", + "type": "invocation", + "data": { + "id": "6fd74a17-6065-47a5-b48b-f4e2b8fa7953", + "type": "rand_int", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": false, + "version": "1.0.0", + "inputs": { + "low": { + "id": "d25305f3-bfd6-446c-8e2c-0b025ec9e9ad", + "name": "low", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "high": { + "id": "10376a3d-b8fe-4a51-b81a-ea46d8c12c78", + "name": "high", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 2147483647 + } + }, + "outputs": { + "value": { + "id": "c64878fa-53b1-4202-b88a-cfb854216a57", + "name": "value", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 3425, + "y": 0 + }, + "width": 320, + "height": 24 + }, + { + "id": "a9683c0a-6b1f-4a5e-8187-c57e764b3400", + "type": "invocation", + "data": { + "id": "a9683c0a-6b1f-4a5e-8187-c57e764b3400", + "type": "l2i", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": false, + "useCache": true, + "version": "1.2.0", + "inputs": { + "metadata": { + "id": "b1982e8a-14ad-4029-a697-beb30af8340f", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "latents": { + "id": "f7669388-9f91-46cc-94fc-301fa7041c3e", + "name": "latents", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "vae": { + "id": "c6f2d4db-4d0a-4e3d-acb4-b5c5a228a3e2", + "name": "vae", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } + }, + "tiled": { + "id": "19ef7d31-d96f-4e94-b7e5-95914e9076fc", + "name": "tiled", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": false + }, + "fp32": { + "id": "a9454533-8ab7-4225-b411-646dc5e76d00", + "name": "fp32", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": false + } + }, + "outputs": { + "image": { + "id": "4f81274e-e216-47f3-9fb6-f97493a40e6f", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "61a9acfb-1547-4f1e-8214-e89bd3855ee5", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "b15cc793-4172-4b07-bcf4-5627bbc7d0d7", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": 4450, + "y": -550 + }, + "width": 320, + "height": 224 + } + ], + "edges": [ + { + "id": "6fd74a17-6065-47a5-b48b-f4e2b8fa7953-ea18915f-2c5b-4569-b725-8e9e9122e8d3-collapsed", + "type": "collapsed", + "source": "6fd74a17-6065-47a5-b48b-f4e2b8fa7953", + "target": "ea18915f-2c5b-4569-b725-8e9e9122e8d3" + }, + { + "id": "reactflow__edge-24e9d7ed-4836-4ec4-8f9e-e747721f9818clip-c41e705b-f2e3-4d1a-83c4-e34bb9344966clip", + "type": "default", + "source": "24e9d7ed-4836-4ec4-8f9e-e747721f9818", + "target": "c41e705b-f2e3-4d1a-83c4-e34bb9344966", + "sourceHandle": "clip", + "targetHandle": "clip" + }, + { + "id": "reactflow__edge-c41e705b-f2e3-4d1a-83c4-e34bb9344966clip-c3fa6872-2599-4a82-a596-b3446a66cf8bclip", + "type": "default", + "source": "c41e705b-f2e3-4d1a-83c4-e34bb9344966", + "target": "c3fa6872-2599-4a82-a596-b3446a66cf8b", + "sourceHandle": "clip", + "targetHandle": "clip" + }, + { + "id": "reactflow__edge-24e9d7ed-4836-4ec4-8f9e-e747721f9818unet-c41e705b-f2e3-4d1a-83c4-e34bb9344966unet", + "type": "default", + "source": "24e9d7ed-4836-4ec4-8f9e-e747721f9818", + "target": "c41e705b-f2e3-4d1a-83c4-e34bb9344966", + "sourceHandle": "unet", + "targetHandle": "unet" + }, + { + "id": "reactflow__edge-c41e705b-f2e3-4d1a-83c4-e34bb9344966unet-ad487d0c-dcbb-49c5-bb8e-b28d4cbc5a63unet", + "type": "default", + "source": "c41e705b-f2e3-4d1a-83c4-e34bb9344966", + "target": "ad487d0c-dcbb-49c5-bb8e-b28d4cbc5a63", + "sourceHandle": "unet", + "targetHandle": "unet" + }, + { + "id": "reactflow__edge-85b77bb2-c67a-416a-b3e8-291abe746c44conditioning-ad487d0c-dcbb-49c5-bb8e-b28d4cbc5a63negative_conditioning", + "type": "default", + "source": "85b77bb2-c67a-416a-b3e8-291abe746c44", + "target": "ad487d0c-dcbb-49c5-bb8e-b28d4cbc5a63", + "sourceHandle": "conditioning", + "targetHandle": "negative_conditioning" + }, + { + "id": "reactflow__edge-c3fa6872-2599-4a82-a596-b3446a66cf8bconditioning-ad487d0c-dcbb-49c5-bb8e-b28d4cbc5a63positive_conditioning", + "type": "default", + "source": "c3fa6872-2599-4a82-a596-b3446a66cf8b", + "target": "ad487d0c-dcbb-49c5-bb8e-b28d4cbc5a63", + "sourceHandle": "conditioning", + "targetHandle": "positive_conditioning" + }, + { + "id": "reactflow__edge-ea18915f-2c5b-4569-b725-8e9e9122e8d3noise-ad487d0c-dcbb-49c5-bb8e-b28d4cbc5a63noise", + "type": "default", + "source": "ea18915f-2c5b-4569-b725-8e9e9122e8d3", + "target": "ad487d0c-dcbb-49c5-bb8e-b28d4cbc5a63", + "sourceHandle": "noise", + "targetHandle": "noise" + }, + { + "id": "reactflow__edge-6fd74a17-6065-47a5-b48b-f4e2b8fa7953value-ea18915f-2c5b-4569-b725-8e9e9122e8d3seed", + "type": "default", + "source": "6fd74a17-6065-47a5-b48b-f4e2b8fa7953", + "target": "ea18915f-2c5b-4569-b725-8e9e9122e8d3", + "sourceHandle": "value", + "targetHandle": "seed" + }, + { + "id": "reactflow__edge-ad487d0c-dcbb-49c5-bb8e-b28d4cbc5a63latents-a9683c0a-6b1f-4a5e-8187-c57e764b3400latents", + "type": "default", + "source": "ad487d0c-dcbb-49c5-bb8e-b28d4cbc5a63", + "target": "a9683c0a-6b1f-4a5e-8187-c57e764b3400", + "sourceHandle": "latents", + "targetHandle": "latents" + }, + { + "id": "reactflow__edge-24e9d7ed-4836-4ec4-8f9e-e747721f9818vae-a9683c0a-6b1f-4a5e-8187-c57e764b3400vae", + "type": "default", + "source": "24e9d7ed-4836-4ec4-8f9e-e747721f9818", + "target": "a9683c0a-6b1f-4a5e-8187-c57e764b3400", + "sourceHandle": "vae", + "targetHandle": "vae" + }, + { + "id": "reactflow__edge-c41e705b-f2e3-4d1a-83c4-e34bb9344966clip-85b77bb2-c67a-416a-b3e8-291abe746c44clip", + "type": "default", + "source": "c41e705b-f2e3-4d1a-83c4-e34bb9344966", + "target": "85b77bb2-c67a-416a-b3e8-291abe746c44", + "sourceHandle": "clip", + "targetHandle": "clip" + } + ] +} \ No newline at end of file diff --git a/invokeai/app/services/workflow_records/default_workflows/Tiled Upscaling (Beta).json b/invokeai/app/services/workflow_records/default_workflows/Tiled Upscaling (Beta).json new file mode 100644 index 0000000000..668cb1263d --- /dev/null +++ b/invokeai/app/services/workflow_records/default_workflows/Tiled Upscaling (Beta).json @@ -0,0 +1,3341 @@ +{ + "name": "Tiled Upscaling (Beta)", + "author": "Invoke", + "description": "A workflow to upscale an input image with tiled upscaling. ", + "version": "1.0.0", + "contact": "invoke@invoke.ai", + "tags": "tiled, upscaling, sd1.5", + "notes": "", + "exposedFields": [ + { + "nodeId": "2ff466b8-5e2a-4d8f-923a-a3884c7ecbc5", + "fieldName": "model" + }, + { + "nodeId": "5ca87ace-edf9-49c7-a424-cd42416b86a7", + "fieldName": "image" + }, + { + "nodeId": "86fce904-9dc2-466f-837a-92fe15969b51", + "fieldName": "value" + }, + { + "nodeId": "b875cae6-d8a3-4fdc-b969-4d53cbd03f9a", + "fieldName": "a" + }, + { + "nodeId": "3f99d25c-6b43-44ec-a61a-c7ff91712621", + "fieldName": "strength" + }, + { + "nodeId": "d334f2da-016a-4524-9911-bdab85546888", + "fieldName": "end_step_percent" + } + ], + "meta": { + "category": "default", + "version": "2.0.0" + }, + "nodes": [ + { + "id": "b875cae6-d8a3-4fdc-b969-4d53cbd03f9a", + "type": "invocation", + "data": { + "id": "b875cae6-d8a3-4fdc-b969-4d53cbd03f9a", + "type": "float_math", + "label": "Creativity Input", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "inputs": { + "operation": { + "id": "abdfce29-254b-4041-9950-58812b494caf", + "name": "operation", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, + "value": "DIV" + }, + "a": { + "id": "0a91cbbc-8051-4afa-827d-27e4447958e3", + "name": "a", + "fieldKind": "input", + "label": "Creativity", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0.3 + }, + "b": { + "id": "c6adb8a6-1153-4fe1-a975-ad55a4726dcf", + "name": "b", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 3.3 + } + }, + "outputs": { + "value": { + "id": "e56bf613-4186-4e73-98b4-840460847f93", + "name": "value", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + } + } + } + }, + "position": { + "x": -4007.507843708216, + "y": -621.6878478530825 + }, + "width": 320, + "height": 24 + }, + { + "id": "7dbb756b-7d79-431c-a46d-d8f7b082c127", + "type": "invocation", + "data": { + "id": "7dbb756b-7d79-431c-a46d-d8f7b082c127", + "type": "float_to_int", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "inputs": { + "value": { + "id": "f71591e3-d511-44d8-8141-ef6f9b76ff69", + "name": "value", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 + }, + "multiple": { + "id": "ecc95dc2-3c9f-4124-94e7-d21dc24d0dea", + "name": "multiple", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 8 + }, + "method": { + "id": "60546d62-469a-46d1-bfe5-f15fc3ec9133", + "name": "method", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, + "value": "Floor" + } + }, + "outputs": { + "value": { + "id": "9b6d4604-0dbc-4fde-9a1f-b619fb7ab5e2", + "name": "value", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": -4470.518114882552, + "y": -246.9687512362472 + }, + "width": 320, + "height": 24 + }, + { + "id": "5ca87ace-edf9-49c7-a424-cd42416b86a7", + "type": "invocation", + "data": { + "id": "5ca87ace-edf9-49c7-a424-cd42416b86a7", + "type": "image", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "inputs": { + "image": { + "id": "d726839c-212b-4723-ad69-37d4b9a60bc4", + "name": "image", + "fieldKind": "input", + "label": "Image to Upscale", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + } + }, + "outputs": { + "image": { + "id": "ee9021d1-67fe-4426-aff0-3d9ea4a3ef40", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "3ba04db1-a785-48c0-b266-bd456cdd39ff", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "37d3feb6-73be-4b69-aebb-fbd4e1ab2968", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": -4478.124655079993, + "y": -559.029825378111 + }, + "width": 320, + "height": 189 + }, + { + "id": "fad15012-0787-43a8-99dd-27f1518b5bc7", + "type": "invocation", + "data": { + "id": "fad15012-0787-43a8-99dd-27f1518b5bc7", + "type": "img_scale", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.2.0", + "inputs": { + "metadata": { + "id": "0e64b057-342f-47f4-b2cd-2f32657e8170", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "image": { + "id": "b1223ea8-ce92-4d0a-af0e-ccd2c622dac6", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "scale_factor": { + "id": "45531c37-9f28-4f7f-bf1a-c82f6b48d250", + "name": "scale_factor", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 3 + }, + "resample_mode": { + "id": "1b1e6725-8253-4ca7-ad60-494065d75253", + "name": "resample_mode", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, + "value": "lanczos" + } + }, + "outputs": { + "image": { + "id": "19160625-a6ba-47aa-ab80-61ce6c9405c0", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "e9fcbcd2-ba12-4725-8fdd-733e2a27e3fa", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "30b38439-cc0b-44e0-bd9c-53ed3417829c", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": -4478.200192078582, + "y": 3.422855503409039 + }, + "width": 320, + "height": 24 + }, + { + "id": "9b2d8c58-ce8f-4162-a5a1-48de854040d6", + "type": "invocation", + "data": { + "id": "9b2d8c58-ce8f-4162-a5a1-48de854040d6", + "type": "compel", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "inputs": { + "prompt": { + "id": "521125b0-7e40-4ddb-853a-53adf0939f24", + "name": "prompt", + "fieldKind": "input", + "label": "Positive Prompt", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "" + }, + "clip": { + "id": "f5c8a31e-ab35-43b2-836a-662eb9f7c8f5", + "name": "clip", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } + } + }, + "outputs": { + "conditioning": { + "id": "3121af50-7c69-4cbf-ad04-002fa171de0d", + "name": "conditioning", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + } + } + }, + "position": { + "x": -4014.4136788915944, + "y": -1243.5677253775948 + }, + "width": 320, + "height": 219 + }, + { + "id": "947c3f88-0305-4695-8355-df4abac64b1c", + "type": "invocation", + "data": { + "id": "947c3f88-0305-4695-8355-df4abac64b1c", + "type": "compel", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "inputs": { + "prompt": { + "id": "51118c53-bc79-4633-867a-cb48ca7385ae", + "name": "prompt", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "StringField" + }, + "value": "" + }, + "clip": { + "id": "e70de740-ad11-4761-8279-150ba527d7c7", + "name": "clip", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } + } + }, + "outputs": { + "conditioning": { + "id": "770dae76-23d5-41fc-8b42-b94ab341f036", + "name": "conditioning", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + } + } + }, + "position": { + "x": -4014.4136788915944, + "y": -968.5677253775948 + }, + "width": 320, + "height": 219 + }, + { + "id": "b3513fed-ed42-408d-b382-128fdb0de523", + "type": "invocation", + "data": { + "id": "b3513fed-ed42-408d-b382-128fdb0de523", + "type": "noise", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.1", + "inputs": { + "seed": { + "id": "4416b4f5-00b6-4ec3-8f9a-169b46744590", + "name": "seed", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 1 + }, + "width": { + "id": "dd9d05d5-dce9-40d6-90a2-1b0384f5a26e", + "name": "width", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + }, + "height": { + "id": "90bcf269-32d3-4056-b83b-d73eb2f4e07b", + "name": "height", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + }, + "use_cpu": { + "id": "b4b5f463-c3d9-4a02-87ad-d339c8a1504a", + "name": "use_cpu", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": true + } + }, + "outputs": { + "noise": { + "id": "98ae3703-2f01-4c60-8364-0b4f2941ff20", + "name": "noise", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "width": { + "id": "8a3a2b8e-7d49-467d-9fc3-d871f30ba4be", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "3c8a0a4a-7546-47e9-aac8-6e79ad496852", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": -3661.44600187038, + "y": -86.98974389852648 + }, + "width": 320, + "height": 24 + }, + { + "id": "40de95ee-ebb5-43f7-a31a-299e76c8a5d5", + "type": "invocation", + "data": { + "id": "40de95ee-ebb5-43f7-a31a-299e76c8a5d5", + "type": "iterate", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.1.0", + "inputs": { + "collection": { + "id": "e43583e9-40c0-437c-8e30-5659080bc7c2", + "name": "collection", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": true, + "isCollectionOrScalar": false, + "name": "CollectionField" + } + } + }, + "outputs": { + "item": { + "id": "f1361b3d-fac4-4f7c-a02d-1abacefb235c", + "name": "item", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "CollectionItemField" + } + }, + "index": { + "id": "1314c769-d526-4c32-b1e1-382ca8bedbfe", + "name": "index", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "total": { + "id": "50daab4e-5302-40f6-88d0-8cf758de23c3", + "name": "total", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": -3651.5370216396627, + "y": 81.15992554066929 + }, + "width": 320, + "height": 24 + }, + { + "id": "857eb5ce-8e5e-4bda-8a33-3e52e57db67b", + "type": "invocation", + "data": { + "id": "857eb5ce-8e5e-4bda-8a33-3e52e57db67b", + "type": "tile_to_properties", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "inputs": { + "tile": { + "id": "1ab68ace-f778-44e7-8737-5062d56ca386", + "name": "tile", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "Tile" + } + } + }, + "outputs": { + "coords_top": { + "id": "8d4afe9f-159c-41df-bc2a-b253d4e925bd", + "name": "coords_top", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "coords_bottom": { + "id": "80045666-e047-42d7-8f29-09c6d3bc45d6", + "name": "coords_bottom", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "coords_left": { + "id": "06bdad45-3f4f-47be-9c2a-9ea0224a8cc5", + "name": "coords_left", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "coords_right": { + "id": "2b901623-4aa0-4573-8b4c-5437c36f9158", + "name": "coords_right", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "width": { + "id": "c5afe347-1584-47f2-90c4-41f3a0d85b03", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "e59e07e8-d20a-4a4c-89ed-c3b8264e6e64", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "overlap_top": { + "id": "1d721fe2-b3d5-4f68-96d2-5ead65c66c58", + "name": "overlap_top", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "overlap_bottom": { + "id": "d478b7a1-d87c-4156-b435-e72f3d9d66bc", + "name": "overlap_bottom", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "overlap_left": { + "id": "4fb54cd2-1c93-45da-bbb6-f3e63723c832", + "name": "overlap_left", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "overlap_right": { + "id": "b85afef8-7eda-4c13-ba4e-9afa7f8e1a9b", + "name": "overlap_right", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": -3653.3418661289197, + "y": 134.9675219108736 + }, + "width": 320, + "height": 24 + }, + { + "id": "36d25df7-6408-442b-89e2-b9aba11a72c3", + "type": "invocation", + "data": { + "id": "36d25df7-6408-442b-89e2-b9aba11a72c3", + "type": "img_crop", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.2.0", + "inputs": { + "metadata": { + "id": "977a07c4-34c0-420c-82c0-0e887142a343", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "image": { + "id": "05d1a40f-3a2b-48e1-8835-a4eafeee95a1", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "x": { + "id": "f150d607-e367-4c48-953f-2dad94c29a80", + "name": "x", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "y": { + "id": "0f905f70-3d7e-436f-a216-2f00425fe5a1", + "name": "y", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "width": { + "id": "1afe44d9-88ef-4f6a-995d-c21f32be8daf", + "name": "width", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + }, + "height": { + "id": "c337d0c8-f1d7-4039-849a-dc52d814cf38", + "name": "height", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + } + }, + "outputs": { + "image": { + "id": "c119b74a-e89e-4d24-b404-44c7e26a221a", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "96bd6254-5e4b-40c2-b31d-f3e60338700c", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "2f9253d3-01f7-4c5b-a27d-f139c3e6ae29", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": -3253.380472583465, + "y": -29.08699277598673 + }, + "width": 320, + "height": 24 + }, + { + "id": "338b883c-3728-4f18-b3a6-6e7190c2f850", + "type": "invocation", + "data": { + "id": "338b883c-3728-4f18-b3a6-6e7190c2f850", + "type": "i2l", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "inputs": { + "image": { + "id": "8399b2a5-2f35-4cba-8db5-1b0530dfb891", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "vae": { + "id": "d06acc3b-8f43-4fe8-afe1-05a4858c994a", + "name": "vae", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } + }, + "tiled": { + "id": "16555094-353b-4424-9984-5ecbaaf530df", + "name": "tiled", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": false + }, + "fp32": { + "id": "941a119a-bf06-47ff-9e1a-91580ad21ea0", + "name": "fp32", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": false + } + }, + "outputs": { + "latents": { + "id": "a864e559-2252-402e-82c5-5a1056d2801b", + "name": "latents", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "width": { + "id": "ff465bee-e1df-4380-84ca-5e909d237b7a", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "ec3402b6-6bbb-472e-a270-902156ecbc6a", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": -2908.4791167517287, + "y": -408.87504820159086 + }, + "width": 320, + "height": 24 + }, + { + "id": "d334f2da-016a-4524-9911-bdab85546888", + "type": "invocation", + "data": { + "id": "d334f2da-016a-4524-9911-bdab85546888", + "type": "controlnet", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.1.1", + "inputs": { + "image": { + "id": "4024804e-450c-4d06-ba2e-ad9cae2df3d4", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "control_model": { + "id": "17dc258d-9251-4442-bfb2-eabf92c874c9", + "name": "control_model", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ControlNetModelField" + }, + "value": { + "model_name": "tile", + "base_model": "sd-1" + } + }, + "control_weight": { + "id": "e03ca9bb-9675-401f-899f-612f64d1fdff", + "name": "control_weight", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "FloatField" + }, + "value": 1 + }, + "begin_step_percent": { + "id": "27aa1f02-429f-4138-9581-5ad17f6aa4fc", + "name": "begin_step_percent", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 + }, + "end_step_percent": { + "id": "641fa5b4-3588-489c-bf30-e9bdb61c5ddf", + "name": "end_step_percent", + "fieldKind": "input", + "label": "Structural Control", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 1 + }, + "control_mode": { + "id": "92f970f8-8c41-49dd-aaba-f4edee3dc2cc", + "name": "control_mode", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, + "value": "more_control" + }, + "resize_mode": { + "id": "2d354911-0b7a-4fb2-9606-e6b8da305dab", + "name": "resize_mode", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, + "value": "just_resize" + } + }, + "outputs": { + "control": { + "id": "9358bb0b-91e7-4919-b62e-72ca38909cc0", + "name": "control", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ControlField" + } + } + } + }, + "position": { + "x": -2481.9569385477016, + "y": -181.06590482739782 + }, + "width": 320, + "height": 451 + }, + { + "id": "1011539e-85de-4e02-a003-0b22358491b8", + "type": "invocation", + "data": { + "id": "1011539e-85de-4e02-a003-0b22358491b8", + "type": "denoise_latents", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.5.1", + "inputs": { + "positive_conditioning": { + "id": "5c9bfc87-020a-4523-8fe5-01806050e1ce", + "name": "positive_conditioning", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + }, + "negative_conditioning": { + "id": "6e500cd5-d146-4af6-a657-f03ada787d77", + "name": "negative_conditioning", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ConditioningField" + } + }, + "noise": { + "id": "c7b7d1ab-e4e8-45b8-b743-05dfac50ebf7", + "name": "noise", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "steps": { + "id": "6d2b7b88-1abc-40b9-b22c-81936c6338d9", + "name": "steps", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 35 + }, + "cfg_scale": { + "id": "64bb1555-d2e9-4f9d-a03e-0ca8c47b573f", + "name": "cfg_scale", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "FloatField" + }, + "value": 4 + }, + "denoising_start": { + "id": "f571390a-01f2-4c77-b903-020742606e42", + "name": "denoising_start", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0.75 + }, + "denoising_end": { + "id": "047c9764-6c16-44c2-bddd-06b173dea40d", + "name": "denoising_end", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 1 + }, + "scheduler": { + "id": "3241bf2a-c32e-4c39-9fd9-d56717c5716e", + "name": "scheduler", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "SchedulerField" + }, + "value": "unipc" + }, + "unet": { + "id": "09d864e1-c1bb-418f-a273-3b66093b44fd", + "name": "unet", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "UNetField" + } + }, + "control": { + "id": "95d15488-c49e-49b9-bc40-933ed5789f9c", + "name": "control", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "ControlField" + } + }, + "ip_adapter": { + "id": "597d08fa-afac-4b5c-aa36-84d80a7c4e0b", + "name": "ip_adapter", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "IPAdapterField" + } + }, + "t2i_adapter": { + "id": "3bbbb638-805d-4753-9e1e-c65b2855a758", + "name": "t2i_adapter", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "T2IAdapterField" + } + }, + "cfg_rescale_multiplier": { + "id": "45124a3c-454c-47fc-9e70-450741ae61ca", + "name": "cfg_rescale_multiplier", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 + }, + "latents": { + "id": "9dce213f-c109-4f3d-9a2a-bee180ce2fb8", + "name": "latents", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "denoise_mask": { + "id": "82a884da-9994-4ee2-957d-845c59910bcb", + "name": "denoise_mask", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "DenoiseMaskField" + } + } + }, + "outputs": { + "latents": { + "id": "96e37296-015c-4d50-9e67-82cf9210eb18", + "name": "latents", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "width": { + "id": "0979c96a-e281-4e59-aa04-b64d655c1398", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "b518453f-e5e1-4fa8-8680-2904962852f0", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": -2493.8519134413505, + "y": -1006.415909408244 + }, + "width": 320, + "height": 612 + }, + { + "id": "b76fe66f-7884-43ad-b72c-fadc81d7a73c", + "type": "invocation", + "data": { + "id": "b76fe66f-7884-43ad-b72c-fadc81d7a73c", + "type": "l2i", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.2.0", + "inputs": { + "metadata": { + "id": "c1d525dc-e26f-4f1e-91d0-463a0c29a238", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "latents": { + "id": "2da05fe5-ef61-4a63-a851-55a73c0fbbf7", + "name": "latents", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "vae": { + "id": "84bf30f2-fbc5-4c6f-87fd-18bf325dd976", + "name": "vae", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } + }, + "tiled": { + "id": "e57f105f-fe9e-4858-b97e-b8550b7119fc", + "name": "tiled", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": false + }, + "fp32": { + "id": "552072da-7812-4653-8603-ea73dd368027", + "name": "fp32", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BooleanField" + }, + "value": false + } + }, + "outputs": { + "image": { + "id": "5893fcb1-82eb-4ac3-8973-138404f43138", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "3d6f5bb3-015d-41f2-9292-cbc4693ceffe", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "62d1f3f6-bd59-4b64-b6e5-0a17bdfe06ec", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": -1999.770193862987, + "y": -1075 + }, + "width": 320, + "height": 224 + }, + { + "id": "ab6f5dda-4b60-4ddf-99f2-f61fb5937527", + "type": "invocation", + "data": { + "id": "ab6f5dda-4b60-4ddf-99f2-f61fb5937527", + "type": "pair_tile_image", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "inputs": { + "image": { + "id": "f7dd7e8a-0cdf-4e11-b879-902c46120ccc", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "tile": { + "id": "8f74c192-6f71-43d6-8c71-9e0d5db27494", + "name": "tile", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "Tile" + } + } + }, + "outputs": { + "tile_with_image": { + "id": "a409c935-3475-4588-a489-71cd25a870a5", + "name": "tile_with_image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "TileWithImage" + } + } + } + }, + "position": { + "x": -1528.3086883131245, + "y": -847.9775129915614 + }, + "width": 320, + "height": 135 + }, + { + "id": "ca0d20d1-918f-44e0-8fc3-4704dc41f4da", + "type": "invocation", + "data": { + "id": "ca0d20d1-918f-44e0-8fc3-4704dc41f4da", + "type": "collect", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "inputs": { + "item": { + "id": "84aff42a-1bff-434f-87f7-9f00031f53bf", + "name": "item", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "CollectionItemField" + } + } + }, + "outputs": { + "collection": { + "id": "7c9d37d2-9437-4e53-9f19-c429dd7d875b", + "name": "collection", + "fieldKind": "output", + "type": { + "isCollection": true, + "isCollectionOrScalar": false, + "name": "CollectionField" + } + } + } + }, + "position": { + "x": -1528.3086883131245, + "y": -647.9775129915615 + }, + "width": 320, + "height": 87 + }, + { + "id": "7cedc866-2095-4bda-aa15-23f15d6273cb", + "type": "invocation", + "data": { + "id": "7cedc866-2095-4bda-aa15-23f15d6273cb", + "type": "merge_tiles_to_image", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": false, + "version": "1.1.0", + "inputs": { + "metadata": { + "id": "e84d21d9-dfe4-40b9-ae82-ef09f690e088", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "tiles_with_images": { + "id": "0890d582-c521-4b9e-b483-22fd20d750d0", + "name": "tiles_with_images", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": true, + "isCollectionOrScalar": false, + "name": "TileWithImage" + } + }, + "blend_amount": { + "id": "628083f2-b511-4862-8169-45d29b1a8caf", + "name": "blend_amount", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 32 + }, + "blend_mode": { + "id": "cbeb9607-554d-44db-a023-13b953c25381", + "name": "blend_mode", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, + "value": "Seam" + } + }, + "outputs": { + "image": { + "id": "d95762fb-e567-40f7-96d7-27884ddfb124", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "789e595e-75e6-4857-9e8b-ec7f1f7c3f84", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "e2faab47-3a28-4f93-b202-da5fc77a8c47", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": -1528.3086883131245, + "y": -522.9775129915615 + }, + "width": 320, + "height": 247 + }, + { + "id": "234192f1-ee96-49be-a5d1-bad4c52a9012", + "type": "invocation", + "data": { + "id": "234192f1-ee96-49be-a5d1-bad4c52a9012", + "type": "save_image", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": false, + "useCache": false, + "version": "1.2.0", + "inputs": { + "metadata": { + "id": "c4de0a6e-2eb3-45cc-b7cf-e881cf0ff1df", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "image": { + "id": "3df32731-cc12-449e-b9c1-88e3d187cab0", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "board": { + "id": "07135787-90f1-4a5e-80f8-038429301bb5", + "name": "board", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "BoardField" + } + } + }, + "outputs": { + "image": { + "id": "a7053752-f8d8-48cc-9ee6-ac16ceacab36", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "3208e788-ffd4-4d1c-961f-f6f3ef8a6852", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "c354e825-e46f-457a-9937-1d057b2cda50", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": -1128.3086883131245, + "y": -522.9775129915615 + }, + "width": 320, + "height": 241 + }, + { + "id": "54dd79ec-fb65-45a6-a5d7-f20109f88b49", + "type": "invocation", + "data": { + "id": "54dd79ec-fb65-45a6-a5d7-f20109f88b49", + "type": "crop_latents", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "inputs": { + "latents": { + "id": "d759d88e-a030-402f-a076-4fb40ddccb19", + "name": "latents", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "x": { + "id": "4e071700-cf0b-42c1-a7d7-943fdafa2a32", + "name": "x", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "y": { + "id": "04ab80ec-e464-4682-aebe-8ce8a23df284", + "name": "y", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "width": { + "id": "93247201-bfa7-425f-b67f-768ef84f152a", + "name": "width", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "height": { + "id": "2ee694cd-aaba-4a65-bf58-1e3ccf44ea87", + "name": "height", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + } + }, + "outputs": { + "latents": { + "id": "3b5be4fa-8555-432e-a5c3-4a6d3e19e0dc", + "name": "latents", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "LatentsField" + } + }, + "width": { + "id": "911083f7-f39e-4ecd-8233-ebd544264958", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "949c5c09-9c64-48ea-aa5d-aa83693291e1", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": -3253.7161754850986, + "y": -78.2819050861178 + }, + "width": 320, + "height": 24 + }, + { + "id": "287f134f-da8d-41d1-884e-5940e8f7b816", + "type": "invocation", + "data": { + "id": "287f134f-da8d-41d1-884e-5940e8f7b816", + "type": "ip_adapter", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.1.1", + "inputs": { + "image": { + "id": "ccbc635a-aac3-4601-bb73-93ef7e240d97", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "ImageField" + } + }, + "ip_adapter_model": { + "id": "b6253c55-423c-4010-9b7e-1e9085b06118", + "name": "ip_adapter_model", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IPAdapterModelField" + }, + "value": { + "model_name": "ip_adapter_plus_sd15", + "base_model": "sd-1" + } + }, + "weight": { + "id": "6ec84b66-7d91-40ad-994f-002d0d09d0bd", + "name": "weight", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": true, + "name": "FloatField" + }, + "value": 0.2 + }, + "begin_step_percent": { + "id": "740eefce-6e3a-46dd-beab-64aa0ed1051f", + "name": "begin_step_percent", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 + }, + "end_step_percent": { + "id": "754f0b18-d7e4-4afa-81c9-43cdeddc5342", + "name": "end_step_percent", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 1 + } + }, + "outputs": { + "ip_adapter": { + "id": "c72f09f7-4cdd-4282-8b56-a3757060f6bb", + "name": "ip_adapter", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IPAdapterField" + } + } + } + }, + "position": { + "x": -2855.8555540799207, + "y": -183.58854843775742 + }, + "width": 320, + "height": 341 + }, + { + "id": "1f86c8bf-06f9-4e28-abee-02f46f445ac4", + "type": "invocation", + "data": { + "id": "1f86c8bf-06f9-4e28-abee-02f46f445ac4", + "type": "calculate_image_tiles_even_split", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.1.0", + "inputs": { + "image_width": { + "id": "f2644471-405c-4dc8-85ab-3ca7e5ac627e", + "name": "image_width", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 1024 + }, + "image_height": { + "id": "b2299311-c895-4ee8-a187-1138dfe66265", + "name": "image_height", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 1024 + }, + "num_tiles_x": { + "id": "b97c22b2-3055-4bf3-b482-3fbb6ebd272a", + "name": "num_tiles_x", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 2 + }, + "num_tiles_y": { + "id": "51cf107d-2e08-4e39-b6b7-ca1bdec2e021", + "name": "num_tiles_y", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 2 + }, + "overlap": { + "id": "ea31fddd-9de6-4e2c-83b4-e81bd5366010", + "name": "overlap", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 128 + } + }, + "outputs": { + "tiles": { + "id": "8eda7e0a-620a-4559-b52f-31d851988cb4", + "name": "tiles", + "fieldKind": "output", + "type": { + "isCollection": true, + "isCollectionOrScalar": false, + "name": "Tile" + } + } + } + }, + "position": { + "x": -4101.266011341878, + "y": -49.381989859546415 + }, + "width": 320, + "height": 24 + }, + { + "id": "86fce904-9dc2-466f-837a-92fe15969b51", + "type": "invocation", + "data": { + "id": "86fce904-9dc2-466f-837a-92fe15969b51", + "type": "integer", + "label": "Scale Factor", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "inputs": { + "value": { + "id": "9ba98457-5a93-4b31-bea9-16b7779a2064", + "name": "value", + "fieldKind": "input", + "label": "Scale Factor", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 2 + } + }, + "outputs": { + "value": { + "id": "094295ce-6d43-45bd-9b49-9ab7cd47f598", + "name": "value", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": -4476.853041598589, + "y": -41.810810454906914 + }, + "width": 320, + "height": 24 + }, + { + "id": "2ff466b8-5e2a-4d8f-923a-a3884c7ecbc5", + "type": "invocation", + "data": { + "id": "2ff466b8-5e2a-4d8f-923a-a3884c7ecbc5", + "type": "main_model_loader", + "label": "", + "isOpen": true, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "inputs": { + "model": { + "id": "3e18c38b-a255-4124-9b7a-625400577065", + "name": "model", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MainModelField" + }, + "value": { + "model_name": "stable-diffusion-v1-5", + "base_model": "sd-1", + "model_type": "main" + } + } + }, + "outputs": { + "vae": { + "id": "ff9e0f73-c1f6-4c55-ab5c-561c8de8b44f", + "name": "vae", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "VaeField" + } + }, + "clip": { + "id": "e19ea6f8-402e-4e34-946f-be42fac9fda3", + "name": "clip", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ClipField" + } + }, + "unet": { + "id": "69a030e6-5980-45b1-a1e4-af5c9ca27705", + "name": "unet", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "UNetField" + } + } + } + }, + "position": { + "x": -4490.268183442608, + "y": -1114.7976814000015 + }, + "width": 320, + "height": 193 + }, + { + "id": "f5d9bf3b-2646-4b17-9894-20fd2b4218ea", + "type": "invocation", + "data": { + "id": "f5d9bf3b-2646-4b17-9894-20fd2b4218ea", + "type": "float_to_int", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "inputs": { + "value": { + "id": "f71591e3-d511-44d8-8141-ef6f9b76ff69", + "name": "value", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 + }, + "multiple": { + "id": "ecc95dc2-3c9f-4124-94e7-d21dc24d0dea", + "name": "multiple", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 8 + }, + "method": { + "id": "60546d62-469a-46d1-bfe5-f15fc3ec9133", + "name": "method", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, + "value": "Floor" + } + }, + "outputs": { + "value": { + "id": "9b6d4604-0dbc-4fde-9a1f-b619fb7ab5e2", + "name": "value", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": -4472.251829335153, + "y": -287.93974602686 + }, + "width": 320, + "height": 24 + }, + { + "id": "23546dd5-a0ec-4842-9ad0-3857899b607a", + "type": "invocation", + "data": { + "id": "23546dd5-a0ec-4842-9ad0-3857899b607a", + "type": "img_crop", + "label": "Compatibility Cropping Mo8", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.2.0", + "inputs": { + "metadata": { + "id": "a330b568-df87-4a89-9c69-446912b8346d", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "image": { + "id": "7eaf8051-b9cb-450c-8f5c-f66470bfdef9", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "x": { + "id": "5dac8c5a-bf78-4704-ac73-6dec8c1d6232", + "name": "x", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "y": { + "id": "b1d96577-44a5-4581-abb4-3b0b91a97ecd", + "name": "y", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "width": { + "id": "a12ab043-5ccc-424c-9df9-39c30b582270", + "name": "width", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + }, + "height": { + "id": "87c6f9ad-a0ee-4b11-8491-d07496cefa39", + "name": "height", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 512 + } + }, + "outputs": { + "image": { + "id": "f535c601-fc54-46c5-9264-0f8554d1cf30", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "48db9864-5b3b-4a90-a42c-e5926a9c4008", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "341f6b31-2497-47e7-8e4e-b2b011103527", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": -4470.138475621539, + "y": -201.36850691108262 + }, + "width": 320, + "height": 24 + }, + { + "id": "3f99d25c-6b43-44ec-a61a-c7ff91712621", + "type": "invocation", + "data": { + "id": "3f99d25c-6b43-44ec-a61a-c7ff91712621", + "type": "unsharp_mask", + "label": "Sharpening", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.2.0", + "inputs": { + "metadata": { + "id": "1ee3a7cd-8b35-46c0-b73b-00a85e618608", + "name": "metadata", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "MetadataField" + } + }, + "image": { + "id": "2a456cd8-5638-4548-9d8b-6c9cc5bb5ce3", + "name": "image", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "radius": { + "id": "9dc1071f-4a6d-42d5-94dd-8ca581cfc9aa", + "name": "radius", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 2 + }, + "strength": { + "id": "8b690a35-2708-42f3-9c32-46ef27ce7201", + "name": "strength", + "fieldKind": "input", + "label": "Sharpen Strength", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 50 + } + }, + "outputs": { + "image": { + "id": "8e038f60-d858-44c4-a168-3ce5f3ac3c65", + "name": "image", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "ImageField" + } + }, + "width": { + "id": "6205ee60-6b6b-4e6c-b2a9-cb381fc8d22c", + "name": "width", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + }, + "height": { + "id": "cbee91bd-31f6-45d5-958e-269c69da8330", + "name": "height", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": -2904.1636287554056, + "y": -339.7161193204281 + }, + "width": 320, + "height": 24 + }, + { + "id": "157d5318-fbc1-43e5-9ed4-5bbeda0594b0", + "type": "invocation", + "data": { + "id": "157d5318-fbc1-43e5-9ed4-5bbeda0594b0", + "type": "float_math", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "inputs": { + "operation": { + "id": "ba14e021-7ed4-4f56-ace4-db33f8bc1d8a", + "name": "operation", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, + "value": "SUB" + }, + "a": { + "id": "bc672f7a-bee1-4610-bd1a-4f207615ca87", + "name": "a", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0.8 + }, + "b": { + "id": "599ffa9a-6431-438d-a63c-c8bec80f3174", + "name": "b", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 1 + } + }, + "outputs": { + "value": { + "id": "474b602a-dd21-4df9-9d48-5e325a4e4a01", + "name": "value", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + } + } + } + }, + "position": { + "x": -4009.026283214496, + "y": -574.9200068395512 + }, + "width": 320, + "height": 24 + }, + { + "id": "43515ab9-b46b-47db-bb46-7e0273c01d1a", + "type": "invocation", + "data": { + "id": "43515ab9-b46b-47db-bb46-7e0273c01d1a", + "type": "rand_int", + "label": "", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": false, + "version": "1.0.0", + "inputs": { + "low": { + "id": "c9a6b1f3-f809-4fbe-9858-43e4e0b77861", + "name": "low", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 0 + }, + "high": { + "id": "daa00853-0039-4849-9cc3-5975002df5d4", + "name": "high", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 2147483647 + } + }, + "outputs": { + "value": { + "id": "80187504-b76e-4735-bf4f-b02ecd398678", + "name": "value", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": -3658.0647708234524, + "y": -136.19433892512953 + }, + "width": 320, + "height": 24 + }, + { + "id": "e9b5a7e1-6e8a-4b95-aa7c-c92ba15080bb", + "type": "invocation", + "data": { + "id": "e9b5a7e1-6e8a-4b95-aa7c-c92ba15080bb", + "type": "float_to_int", + "label": "Multiple Check", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "inputs": { + "value": { + "id": "1554add4-fb98-4d55-a56c-96f269b70bd8", + "name": "value", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0 + }, + "multiple": { + "id": "62dd31fb-ca03-4c64-9031-b7750effa58b", + "name": "multiple", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + }, + "value": 8 + }, + "method": { + "id": "b4ed9dcf-16a7-4bc4-83e6-94b80c7b1d77", + "name": "method", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, + "value": "Nearest" + } + }, + "outputs": { + "value": { + "id": "ba1b7bcc-ca53-4ebe-992d-378373a16f2d", + "name": "value", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "IntegerField" + } + } + } + }, + "position": { + "x": -4092.2410416963758, + "y": -180.31086509172079 + }, + "width": 320, + "height": 24 + }, + { + "id": "f87a3783-ac5c-43f8-8f97-6688a2aefba5", + "type": "invocation", + "data": { + "id": "f87a3783-ac5c-43f8-8f97-6688a2aefba5", + "type": "float_math", + "label": "Pixel Summation", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "inputs": { + "operation": { + "id": "76f062dc-c925-40ae-bd00-63be99b295b6", + "name": "operation", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, + "value": "ADD" + }, + "a": { + "id": "a5cc821b-7978-4ad9-91b3-1ae45f650d87", + "name": "a", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 1 + }, + "b": { + "id": "2cad036c-73ed-4ce3-b9aa-7b21b993f35b", + "name": "b", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 1 + } + }, + "outputs": { + "value": { + "id": "20e1d294-cc54-46fb-9d6f-3105596e97a0", + "name": "value", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + } + } + } + }, + "position": { + "x": -4096.902679890686, + "y": -279.75914657034684 + }, + "width": 320, + "height": 24 + }, + { + "id": "d62d4d15-e03a-4c10-86ba-3e58da98d2a4", + "type": "invocation", + "data": { + "id": "d62d4d15-e03a-4c10-86ba-3e58da98d2a4", + "type": "float_math", + "label": "Overlap Calc", + "isOpen": false, + "notes": "", + "isIntermediate": true, + "useCache": true, + "version": "1.0.0", + "inputs": { + "operation": { + "id": "5813a0ec-13a9-4494-82de-3c1b04d31271", + "name": "operation", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "EnumField" + }, + "value": "MUL" + }, + "a": { + "id": "2f807176-2cf2-4abd-b776-8ac048bb76bd", + "name": "a", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 1 + }, + "b": { + "id": "ee51fcda-bc3c-457c-80bd-343075754ddb", + "name": "b", + "fieldKind": "input", + "label": "", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + }, + "value": 0.075 + } + }, + "outputs": { + "value": { + "id": "5c4cb142-d8fe-45c8-909b-121883e067b0", + "name": "value", + "fieldKind": "output", + "type": { + "isCollection": false, + "isCollectionOrScalar": false, + "name": "FloatField" + } + } + } + }, + "position": { + "x": -4095.348800492582, + "y": -230.03500583103383 + }, + "width": 320, + "height": 24 + } + ], + "edges": [ + { + "id": "3f99d25c-6b43-44ec-a61a-c7ff91712621-338b883c-3728-4f18-b3a6-6e7190c2f850-collapsed", + "type": "collapsed", + "source": "3f99d25c-6b43-44ec-a61a-c7ff91712621", + "target": "338b883c-3728-4f18-b3a6-6e7190c2f850" + }, + { + "id": "36d25df7-6408-442b-89e2-b9aba11a72c3-3f99d25c-6b43-44ec-a61a-c7ff91712621-collapsed", + "type": "collapsed", + "source": "36d25df7-6408-442b-89e2-b9aba11a72c3", + "target": "3f99d25c-6b43-44ec-a61a-c7ff91712621" + }, + { + "id": "b875cae6-d8a3-4fdc-b969-4d53cbd03f9a-157d5318-fbc1-43e5-9ed4-5bbeda0594b0-collapsed", + "type": "collapsed", + "source": "b875cae6-d8a3-4fdc-b969-4d53cbd03f9a", + "target": "157d5318-fbc1-43e5-9ed4-5bbeda0594b0" + }, + { + "id": "fad15012-0787-43a8-99dd-27f1518b5bc7-b3513fed-ed42-408d-b382-128fdb0de523-collapsed", + "type": "collapsed", + "source": "fad15012-0787-43a8-99dd-27f1518b5bc7", + "target": "b3513fed-ed42-408d-b382-128fdb0de523" + }, + { + "id": "fad15012-0787-43a8-99dd-27f1518b5bc7-36d25df7-6408-442b-89e2-b9aba11a72c3-collapsed", + "type": "collapsed", + "source": "fad15012-0787-43a8-99dd-27f1518b5bc7", + "target": "36d25df7-6408-442b-89e2-b9aba11a72c3" + }, + { + "id": "fad15012-0787-43a8-99dd-27f1518b5bc7-1f86c8bf-06f9-4e28-abee-02f46f445ac4-collapsed", + "type": "collapsed", + "source": "fad15012-0787-43a8-99dd-27f1518b5bc7", + "target": "1f86c8bf-06f9-4e28-abee-02f46f445ac4" + }, + { + "id": "86fce904-9dc2-466f-837a-92fe15969b51-fad15012-0787-43a8-99dd-27f1518b5bc7-collapsed", + "type": "collapsed", + "source": "86fce904-9dc2-466f-837a-92fe15969b51", + "target": "fad15012-0787-43a8-99dd-27f1518b5bc7" + }, + { + "id": "23546dd5-a0ec-4842-9ad0-3857899b607a-fad15012-0787-43a8-99dd-27f1518b5bc7-collapsed", + "type": "collapsed", + "source": "23546dd5-a0ec-4842-9ad0-3857899b607a", + "target": "fad15012-0787-43a8-99dd-27f1518b5bc7" + }, + { + "id": "1f86c8bf-06f9-4e28-abee-02f46f445ac4-40de95ee-ebb5-43f7-a31a-299e76c8a5d5-collapsed", + "type": "collapsed", + "source": "1f86c8bf-06f9-4e28-abee-02f46f445ac4", + "target": "40de95ee-ebb5-43f7-a31a-299e76c8a5d5" + }, + { + "id": "86fce904-9dc2-466f-837a-92fe15969b51-1f86c8bf-06f9-4e28-abee-02f46f445ac4-collapsed", + "type": "collapsed", + "source": "86fce904-9dc2-466f-837a-92fe15969b51", + "target": "1f86c8bf-06f9-4e28-abee-02f46f445ac4" + }, + { + "id": "e9b5a7e1-6e8a-4b95-aa7c-c92ba15080bb-1f86c8bf-06f9-4e28-abee-02f46f445ac4-collapsed", + "type": "collapsed", + "source": "e9b5a7e1-6e8a-4b95-aa7c-c92ba15080bb", + "target": "1f86c8bf-06f9-4e28-abee-02f46f445ac4" + }, + { + "id": "f5d9bf3b-2646-4b17-9894-20fd2b4218ea-23546dd5-a0ec-4842-9ad0-3857899b607a-collapsed", + "type": "collapsed", + "source": "f5d9bf3b-2646-4b17-9894-20fd2b4218ea", + "target": "23546dd5-a0ec-4842-9ad0-3857899b607a" + }, + { + "id": "7dbb756b-7d79-431c-a46d-d8f7b082c127-23546dd5-a0ec-4842-9ad0-3857899b607a-collapsed", + "type": "collapsed", + "source": "7dbb756b-7d79-431c-a46d-d8f7b082c127", + "target": "23546dd5-a0ec-4842-9ad0-3857899b607a" + }, + { + "id": "23546dd5-a0ec-4842-9ad0-3857899b607a-f87a3783-ac5c-43f8-8f97-6688a2aefba5-collapsed", + "type": "collapsed", + "source": "23546dd5-a0ec-4842-9ad0-3857899b607a", + "target": "f87a3783-ac5c-43f8-8f97-6688a2aefba5" + }, + { + "id": "f87a3783-ac5c-43f8-8f97-6688a2aefba5-d62d4d15-e03a-4c10-86ba-3e58da98d2a4-collapsed", + "type": "collapsed", + "source": "f87a3783-ac5c-43f8-8f97-6688a2aefba5", + "target": "d62d4d15-e03a-4c10-86ba-3e58da98d2a4" + }, + { + "id": "d62d4d15-e03a-4c10-86ba-3e58da98d2a4-e9b5a7e1-6e8a-4b95-aa7c-c92ba15080bb-collapsed", + "type": "collapsed", + "source": "d62d4d15-e03a-4c10-86ba-3e58da98d2a4", + "target": "e9b5a7e1-6e8a-4b95-aa7c-c92ba15080bb" + }, + { + "id": "b3513fed-ed42-408d-b382-128fdb0de523-54dd79ec-fb65-45a6-a5d7-f20109f88b49-collapsed", + "type": "collapsed", + "source": "b3513fed-ed42-408d-b382-128fdb0de523", + "target": "54dd79ec-fb65-45a6-a5d7-f20109f88b49" + }, + { + "id": "43515ab9-b46b-47db-bb46-7e0273c01d1a-b3513fed-ed42-408d-b382-128fdb0de523-collapsed", + "type": "collapsed", + "source": "43515ab9-b46b-47db-bb46-7e0273c01d1a", + "target": "b3513fed-ed42-408d-b382-128fdb0de523" + }, + { + "id": "857eb5ce-8e5e-4bda-8a33-3e52e57db67b-54dd79ec-fb65-45a6-a5d7-f20109f88b49-collapsed", + "type": "collapsed", + "source": "857eb5ce-8e5e-4bda-8a33-3e52e57db67b", + "target": "54dd79ec-fb65-45a6-a5d7-f20109f88b49" + }, + { + "id": "40de95ee-ebb5-43f7-a31a-299e76c8a5d5-857eb5ce-8e5e-4bda-8a33-3e52e57db67b-collapsed", + "type": "collapsed", + "source": "40de95ee-ebb5-43f7-a31a-299e76c8a5d5", + "target": "857eb5ce-8e5e-4bda-8a33-3e52e57db67b" + }, + { + "id": "857eb5ce-8e5e-4bda-8a33-3e52e57db67b-36d25df7-6408-442b-89e2-b9aba11a72c3-collapsed", + "type": "collapsed", + "source": "857eb5ce-8e5e-4bda-8a33-3e52e57db67b", + "target": "36d25df7-6408-442b-89e2-b9aba11a72c3" + }, + { + "id": "reactflow__edge-fad15012-0787-43a8-99dd-27f1518b5bc7width-b3513fed-ed42-408d-b382-128fdb0de523width", + "type": "default", + "source": "fad15012-0787-43a8-99dd-27f1518b5bc7", + "target": "b3513fed-ed42-408d-b382-128fdb0de523", + "sourceHandle": "width", + "targetHandle": "width" + }, + { + "id": "reactflow__edge-fad15012-0787-43a8-99dd-27f1518b5bc7height-b3513fed-ed42-408d-b382-128fdb0de523height", + "type": "default", + "source": "fad15012-0787-43a8-99dd-27f1518b5bc7", + "target": "b3513fed-ed42-408d-b382-128fdb0de523", + "sourceHandle": "height", + "targetHandle": "height" + }, + { + "id": "reactflow__edge-40de95ee-ebb5-43f7-a31a-299e76c8a5d5item-857eb5ce-8e5e-4bda-8a33-3e52e57db67btile", + "type": "default", + "source": "40de95ee-ebb5-43f7-a31a-299e76c8a5d5", + "target": "857eb5ce-8e5e-4bda-8a33-3e52e57db67b", + "sourceHandle": "item", + "targetHandle": "tile" + }, + { + "id": "reactflow__edge-fad15012-0787-43a8-99dd-27f1518b5bc7image-36d25df7-6408-442b-89e2-b9aba11a72c3image", + "type": "default", + "source": "fad15012-0787-43a8-99dd-27f1518b5bc7", + "target": "36d25df7-6408-442b-89e2-b9aba11a72c3", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-857eb5ce-8e5e-4bda-8a33-3e52e57db67bcoords_top-36d25df7-6408-442b-89e2-b9aba11a72c3y", + "type": "default", + "source": "857eb5ce-8e5e-4bda-8a33-3e52e57db67b", + "target": "36d25df7-6408-442b-89e2-b9aba11a72c3", + "sourceHandle": "coords_top", + "targetHandle": "y" + }, + { + "id": "reactflow__edge-857eb5ce-8e5e-4bda-8a33-3e52e57db67bcoords_left-36d25df7-6408-442b-89e2-b9aba11a72c3x", + "type": "default", + "source": "857eb5ce-8e5e-4bda-8a33-3e52e57db67b", + "target": "36d25df7-6408-442b-89e2-b9aba11a72c3", + "sourceHandle": "coords_left", + "targetHandle": "x" + }, + { + "id": "reactflow__edge-857eb5ce-8e5e-4bda-8a33-3e52e57db67bwidth-36d25df7-6408-442b-89e2-b9aba11a72c3width", + "type": "default", + "source": "857eb5ce-8e5e-4bda-8a33-3e52e57db67b", + "target": "36d25df7-6408-442b-89e2-b9aba11a72c3", + "sourceHandle": "width", + "targetHandle": "width" + }, + { + "id": "reactflow__edge-857eb5ce-8e5e-4bda-8a33-3e52e57db67bheight-36d25df7-6408-442b-89e2-b9aba11a72c3height", + "type": "default", + "source": "857eb5ce-8e5e-4bda-8a33-3e52e57db67b", + "target": "36d25df7-6408-442b-89e2-b9aba11a72c3", + "sourceHandle": "height", + "targetHandle": "height" + }, + { + "id": "reactflow__edge-9b2d8c58-ce8f-4162-a5a1-48de854040d6conditioning-1011539e-85de-4e02-a003-0b22358491b8positive_conditioning", + "type": "default", + "source": "9b2d8c58-ce8f-4162-a5a1-48de854040d6", + "target": "1011539e-85de-4e02-a003-0b22358491b8", + "sourceHandle": "conditioning", + "targetHandle": "positive_conditioning" + }, + { + "id": "reactflow__edge-947c3f88-0305-4695-8355-df4abac64b1cconditioning-1011539e-85de-4e02-a003-0b22358491b8negative_conditioning", + "type": "default", + "source": "947c3f88-0305-4695-8355-df4abac64b1c", + "target": "1011539e-85de-4e02-a003-0b22358491b8", + "sourceHandle": "conditioning", + "targetHandle": "negative_conditioning" + }, + { + "id": "reactflow__edge-338b883c-3728-4f18-b3a6-6e7190c2f850latents-1011539e-85de-4e02-a003-0b22358491b8latents", + "type": "default", + "source": "338b883c-3728-4f18-b3a6-6e7190c2f850", + "target": "1011539e-85de-4e02-a003-0b22358491b8", + "sourceHandle": "latents", + "targetHandle": "latents" + }, + { + "id": "reactflow__edge-1011539e-85de-4e02-a003-0b22358491b8latents-b76fe66f-7884-43ad-b72c-fadc81d7a73clatents", + "type": "default", + "source": "1011539e-85de-4e02-a003-0b22358491b8", + "target": "b76fe66f-7884-43ad-b72c-fadc81d7a73c", + "sourceHandle": "latents", + "targetHandle": "latents" + }, + { + "id": "reactflow__edge-b76fe66f-7884-43ad-b72c-fadc81d7a73cimage-ab6f5dda-4b60-4ddf-99f2-f61fb5937527image", + "type": "default", + "source": "b76fe66f-7884-43ad-b72c-fadc81d7a73c", + "target": "ab6f5dda-4b60-4ddf-99f2-f61fb5937527", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-40de95ee-ebb5-43f7-a31a-299e76c8a5d5item-ab6f5dda-4b60-4ddf-99f2-f61fb5937527tile", + "type": "default", + "source": "40de95ee-ebb5-43f7-a31a-299e76c8a5d5", + "target": "ab6f5dda-4b60-4ddf-99f2-f61fb5937527", + "sourceHandle": "item", + "targetHandle": "tile" + }, + { + "id": "reactflow__edge-ab6f5dda-4b60-4ddf-99f2-f61fb5937527tile_with_image-ca0d20d1-918f-44e0-8fc3-4704dc41f4daitem", + "type": "default", + "source": "ab6f5dda-4b60-4ddf-99f2-f61fb5937527", + "target": "ca0d20d1-918f-44e0-8fc3-4704dc41f4da", + "sourceHandle": "tile_with_image", + "targetHandle": "item" + }, + { + "id": "reactflow__edge-ca0d20d1-918f-44e0-8fc3-4704dc41f4dacollection-7cedc866-2095-4bda-aa15-23f15d6273cbtiles_with_images", + "type": "default", + "source": "ca0d20d1-918f-44e0-8fc3-4704dc41f4da", + "target": "7cedc866-2095-4bda-aa15-23f15d6273cb", + "sourceHandle": "collection", + "targetHandle": "tiles_with_images" + }, + { + "id": "reactflow__edge-7cedc866-2095-4bda-aa15-23f15d6273cbimage-234192f1-ee96-49be-a5d1-bad4c52a9012image", + "type": "default", + "source": "7cedc866-2095-4bda-aa15-23f15d6273cb", + "target": "234192f1-ee96-49be-a5d1-bad4c52a9012", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-b3513fed-ed42-408d-b382-128fdb0de523noise-54dd79ec-fb65-45a6-a5d7-f20109f88b49latents", + "type": "default", + "source": "b3513fed-ed42-408d-b382-128fdb0de523", + "target": "54dd79ec-fb65-45a6-a5d7-f20109f88b49", + "sourceHandle": "noise", + "targetHandle": "latents" + }, + { + "id": "reactflow__edge-857eb5ce-8e5e-4bda-8a33-3e52e57db67bwidth-54dd79ec-fb65-45a6-a5d7-f20109f88b49width", + "type": "default", + "source": "857eb5ce-8e5e-4bda-8a33-3e52e57db67b", + "target": "54dd79ec-fb65-45a6-a5d7-f20109f88b49", + "sourceHandle": "width", + "targetHandle": "width" + }, + { + "id": "reactflow__edge-857eb5ce-8e5e-4bda-8a33-3e52e57db67bheight-54dd79ec-fb65-45a6-a5d7-f20109f88b49height", + "type": "default", + "source": "857eb5ce-8e5e-4bda-8a33-3e52e57db67b", + "target": "54dd79ec-fb65-45a6-a5d7-f20109f88b49", + "sourceHandle": "height", + "targetHandle": "height" + }, + { + "id": "reactflow__edge-857eb5ce-8e5e-4bda-8a33-3e52e57db67bcoords_left-54dd79ec-fb65-45a6-a5d7-f20109f88b49x", + "type": "default", + "source": "857eb5ce-8e5e-4bda-8a33-3e52e57db67b", + "target": "54dd79ec-fb65-45a6-a5d7-f20109f88b49", + "sourceHandle": "coords_left", + "targetHandle": "x" + }, + { + "id": "reactflow__edge-857eb5ce-8e5e-4bda-8a33-3e52e57db67bcoords_top-54dd79ec-fb65-45a6-a5d7-f20109f88b49y", + "type": "default", + "source": "857eb5ce-8e5e-4bda-8a33-3e52e57db67b", + "target": "54dd79ec-fb65-45a6-a5d7-f20109f88b49", + "sourceHandle": "coords_top", + "targetHandle": "y" + }, + { + "id": "reactflow__edge-54dd79ec-fb65-45a6-a5d7-f20109f88b49latents-1011539e-85de-4e02-a003-0b22358491b8noise", + "type": "default", + "source": "54dd79ec-fb65-45a6-a5d7-f20109f88b49", + "target": "1011539e-85de-4e02-a003-0b22358491b8", + "sourceHandle": "latents", + "targetHandle": "noise" + }, + { + "id": "reactflow__edge-287f134f-da8d-41d1-884e-5940e8f7b816ip_adapter-1011539e-85de-4e02-a003-0b22358491b8ip_adapter", + "type": "default", + "source": "287f134f-da8d-41d1-884e-5940e8f7b816", + "target": "1011539e-85de-4e02-a003-0b22358491b8", + "sourceHandle": "ip_adapter", + "targetHandle": "ip_adapter" + }, + { + "id": "reactflow__edge-36d25df7-6408-442b-89e2-b9aba11a72c3image-287f134f-da8d-41d1-884e-5940e8f7b816image", + "type": "default", + "source": "36d25df7-6408-442b-89e2-b9aba11a72c3", + "target": "287f134f-da8d-41d1-884e-5940e8f7b816", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-1f86c8bf-06f9-4e28-abee-02f46f445ac4tiles-40de95ee-ebb5-43f7-a31a-299e76c8a5d5collection", + "type": "default", + "source": "1f86c8bf-06f9-4e28-abee-02f46f445ac4", + "target": "40de95ee-ebb5-43f7-a31a-299e76c8a5d5", + "sourceHandle": "tiles", + "targetHandle": "collection" + }, + { + "id": "reactflow__edge-fad15012-0787-43a8-99dd-27f1518b5bc7width-1f86c8bf-06f9-4e28-abee-02f46f445ac4image_width", + "type": "default", + "source": "fad15012-0787-43a8-99dd-27f1518b5bc7", + "target": "1f86c8bf-06f9-4e28-abee-02f46f445ac4", + "sourceHandle": "width", + "targetHandle": "image_width" + }, + { + "id": "reactflow__edge-fad15012-0787-43a8-99dd-27f1518b5bc7height-1f86c8bf-06f9-4e28-abee-02f46f445ac4image_height", + "type": "default", + "source": "fad15012-0787-43a8-99dd-27f1518b5bc7", + "target": "1f86c8bf-06f9-4e28-abee-02f46f445ac4", + "sourceHandle": "height", + "targetHandle": "image_height" + }, + { + "id": "reactflow__edge-86fce904-9dc2-466f-837a-92fe15969b51value-fad15012-0787-43a8-99dd-27f1518b5bc7scale_factor", + "type": "default", + "source": "86fce904-9dc2-466f-837a-92fe15969b51", + "target": "fad15012-0787-43a8-99dd-27f1518b5bc7", + "sourceHandle": "value", + "targetHandle": "scale_factor" + }, + { + "id": "reactflow__edge-86fce904-9dc2-466f-837a-92fe15969b51value-1f86c8bf-06f9-4e28-abee-02f46f445ac4num_tiles_x", + "type": "default", + "source": "86fce904-9dc2-466f-837a-92fe15969b51", + "target": "1f86c8bf-06f9-4e28-abee-02f46f445ac4", + "sourceHandle": "value", + "targetHandle": "num_tiles_x" + }, + { + "id": "reactflow__edge-86fce904-9dc2-466f-837a-92fe15969b51value-1f86c8bf-06f9-4e28-abee-02f46f445ac4num_tiles_y", + "type": "default", + "source": "86fce904-9dc2-466f-837a-92fe15969b51", + "target": "1f86c8bf-06f9-4e28-abee-02f46f445ac4", + "sourceHandle": "value", + "targetHandle": "num_tiles_y" + }, + { + "id": "reactflow__edge-2ff466b8-5e2a-4d8f-923a-a3884c7ecbc5clip-9b2d8c58-ce8f-4162-a5a1-48de854040d6clip", + "type": "default", + "source": "2ff466b8-5e2a-4d8f-923a-a3884c7ecbc5", + "target": "9b2d8c58-ce8f-4162-a5a1-48de854040d6", + "sourceHandle": "clip", + "targetHandle": "clip" + }, + { + "id": "reactflow__edge-2ff466b8-5e2a-4d8f-923a-a3884c7ecbc5clip-947c3f88-0305-4695-8355-df4abac64b1cclip", + "type": "default", + "source": "2ff466b8-5e2a-4d8f-923a-a3884c7ecbc5", + "target": "947c3f88-0305-4695-8355-df4abac64b1c", + "sourceHandle": "clip", + "targetHandle": "clip" + }, + { + "id": "reactflow__edge-5ca87ace-edf9-49c7-a424-cd42416b86a7width-f5d9bf3b-2646-4b17-9894-20fd2b4218eavalue", + "type": "default", + "source": "5ca87ace-edf9-49c7-a424-cd42416b86a7", + "target": "f5d9bf3b-2646-4b17-9894-20fd2b4218ea", + "sourceHandle": "width", + "targetHandle": "value" + }, + { + "id": "reactflow__edge-5ca87ace-edf9-49c7-a424-cd42416b86a7height-7dbb756b-7d79-431c-a46d-d8f7b082c127value", + "type": "default", + "source": "5ca87ace-edf9-49c7-a424-cd42416b86a7", + "target": "7dbb756b-7d79-431c-a46d-d8f7b082c127", + "sourceHandle": "height", + "targetHandle": "value" + }, + { + "id": "reactflow__edge-f5d9bf3b-2646-4b17-9894-20fd2b4218eavalue-23546dd5-a0ec-4842-9ad0-3857899b607awidth", + "type": "default", + "source": "f5d9bf3b-2646-4b17-9894-20fd2b4218ea", + "target": "23546dd5-a0ec-4842-9ad0-3857899b607a", + "sourceHandle": "value", + "targetHandle": "width" + }, + { + "id": "reactflow__edge-7dbb756b-7d79-431c-a46d-d8f7b082c127value-23546dd5-a0ec-4842-9ad0-3857899b607aheight", + "type": "default", + "source": "7dbb756b-7d79-431c-a46d-d8f7b082c127", + "target": "23546dd5-a0ec-4842-9ad0-3857899b607a", + "sourceHandle": "value", + "targetHandle": "height" + }, + { + "id": "reactflow__edge-23546dd5-a0ec-4842-9ad0-3857899b607aimage-fad15012-0787-43a8-99dd-27f1518b5bc7image", + "type": "default", + "source": "23546dd5-a0ec-4842-9ad0-3857899b607a", + "target": "fad15012-0787-43a8-99dd-27f1518b5bc7", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-5ca87ace-edf9-49c7-a424-cd42416b86a7image-23546dd5-a0ec-4842-9ad0-3857899b607aimage", + "type": "default", + "source": "5ca87ace-edf9-49c7-a424-cd42416b86a7", + "target": "23546dd5-a0ec-4842-9ad0-3857899b607a", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-d334f2da-016a-4524-9911-bdab85546888control-1011539e-85de-4e02-a003-0b22358491b8control", + "type": "default", + "source": "d334f2da-016a-4524-9911-bdab85546888", + "target": "1011539e-85de-4e02-a003-0b22358491b8", + "sourceHandle": "control", + "targetHandle": "control" + }, + { + "id": "reactflow__edge-36d25df7-6408-442b-89e2-b9aba11a72c3image-3f99d25c-6b43-44ec-a61a-c7ff91712621image", + "type": "default", + "source": "36d25df7-6408-442b-89e2-b9aba11a72c3", + "target": "3f99d25c-6b43-44ec-a61a-c7ff91712621", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-3f99d25c-6b43-44ec-a61a-c7ff91712621image-338b883c-3728-4f18-b3a6-6e7190c2f850image", + "type": "default", + "source": "3f99d25c-6b43-44ec-a61a-c7ff91712621", + "target": "338b883c-3728-4f18-b3a6-6e7190c2f850", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-3f99d25c-6b43-44ec-a61a-c7ff91712621image-d334f2da-016a-4524-9911-bdab85546888image", + "type": "default", + "source": "3f99d25c-6b43-44ec-a61a-c7ff91712621", + "target": "d334f2da-016a-4524-9911-bdab85546888", + "sourceHandle": "image", + "targetHandle": "image" + }, + { + "id": "reactflow__edge-b875cae6-d8a3-4fdc-b969-4d53cbd03f9avalue-157d5318-fbc1-43e5-9ed4-5bbeda0594b0b", + "type": "default", + "source": "b875cae6-d8a3-4fdc-b969-4d53cbd03f9a", + "target": "157d5318-fbc1-43e5-9ed4-5bbeda0594b0", + "sourceHandle": "value", + "targetHandle": "b" + }, + { + "id": "reactflow__edge-157d5318-fbc1-43e5-9ed4-5bbeda0594b0value-1011539e-85de-4e02-a003-0b22358491b8denoising_start", + "type": "default", + "source": "157d5318-fbc1-43e5-9ed4-5bbeda0594b0", + "target": "1011539e-85de-4e02-a003-0b22358491b8", + "sourceHandle": "value", + "targetHandle": "denoising_start" + }, + { + "id": "reactflow__edge-43515ab9-b46b-47db-bb46-7e0273c01d1avalue-b3513fed-ed42-408d-b382-128fdb0de523seed", + "type": "default", + "source": "43515ab9-b46b-47db-bb46-7e0273c01d1a", + "target": "b3513fed-ed42-408d-b382-128fdb0de523", + "sourceHandle": "value", + "targetHandle": "seed" + }, + { + "id": "reactflow__edge-e9b5a7e1-6e8a-4b95-aa7c-c92ba15080bbvalue-1f86c8bf-06f9-4e28-abee-02f46f445ac4overlap", + "type": "default", + "source": "e9b5a7e1-6e8a-4b95-aa7c-c92ba15080bb", + "target": "1f86c8bf-06f9-4e28-abee-02f46f445ac4", + "sourceHandle": "value", + "targetHandle": "overlap" + }, + { + "id": "reactflow__edge-23546dd5-a0ec-4842-9ad0-3857899b607awidth-f87a3783-ac5c-43f8-8f97-6688a2aefba5a", + "type": "default", + "source": "23546dd5-a0ec-4842-9ad0-3857899b607a", + "target": "f87a3783-ac5c-43f8-8f97-6688a2aefba5", + "sourceHandle": "width", + "targetHandle": "a" + }, + { + "id": "reactflow__edge-23546dd5-a0ec-4842-9ad0-3857899b607aheight-f87a3783-ac5c-43f8-8f97-6688a2aefba5b", + "type": "default", + "source": "23546dd5-a0ec-4842-9ad0-3857899b607a", + "target": "f87a3783-ac5c-43f8-8f97-6688a2aefba5", + "sourceHandle": "height", + "targetHandle": "b" + }, + { + "id": "reactflow__edge-f87a3783-ac5c-43f8-8f97-6688a2aefba5value-d62d4d15-e03a-4c10-86ba-3e58da98d2a4a", + "type": "default", + "source": "f87a3783-ac5c-43f8-8f97-6688a2aefba5", + "target": "d62d4d15-e03a-4c10-86ba-3e58da98d2a4", + "sourceHandle": "value", + "targetHandle": "a" + }, + { + "id": "reactflow__edge-d62d4d15-e03a-4c10-86ba-3e58da98d2a4value-e9b5a7e1-6e8a-4b95-aa7c-c92ba15080bbvalue", + "type": "default", + "source": "d62d4d15-e03a-4c10-86ba-3e58da98d2a4", + "target": "e9b5a7e1-6e8a-4b95-aa7c-c92ba15080bb", + "sourceHandle": "value", + "targetHandle": "value" + }, + { + "id": "reactflow__edge-2ff466b8-5e2a-4d8f-923a-a3884c7ecbc5vae-b76fe66f-7884-43ad-b72c-fadc81d7a73cvae", + "type": "default", + "source": "2ff466b8-5e2a-4d8f-923a-a3884c7ecbc5", + "target": "b76fe66f-7884-43ad-b72c-fadc81d7a73c", + "sourceHandle": "vae", + "targetHandle": "vae" + }, + { + "id": "reactflow__edge-2ff466b8-5e2a-4d8f-923a-a3884c7ecbc5vae-338b883c-3728-4f18-b3a6-6e7190c2f850vae", + "type": "default", + "source": "2ff466b8-5e2a-4d8f-923a-a3884c7ecbc5", + "target": "338b883c-3728-4f18-b3a6-6e7190c2f850", + "sourceHandle": "vae", + "targetHandle": "vae" + }, + { + "id": "reactflow__edge-2ff466b8-5e2a-4d8f-923a-a3884c7ecbc5unet-1011539e-85de-4e02-a003-0b22358491b8unet", + "type": "default", + "source": "2ff466b8-5e2a-4d8f-923a-a3884c7ecbc5", + "target": "1011539e-85de-4e02-a003-0b22358491b8", + "sourceHandle": "unet", + "targetHandle": "unet" + } + ] +} \ No newline at end of file diff --git a/invokeai/app/services/workflow_records/workflow_records_base.py b/invokeai/app/services/workflow_records/workflow_records_base.py index d5a4b25ce4..499b0f005d 100644 --- a/invokeai/app/services/workflow_records/workflow_records_base.py +++ b/invokeai/app/services/workflow_records/workflow_records_base.py @@ -1,17 +1,50 @@ from abc import ABC, abstractmethod +from typing import Optional -from invokeai.app.invocations.baseinvocation import WorkflowField +from invokeai.app.services.shared.pagination import PaginatedResults +from invokeai.app.services.shared.sqlite.sqlite_common import SQLiteDirection +from invokeai.app.services.workflow_records.workflow_records_common import ( + Workflow, + WorkflowCategory, + WorkflowRecordDTO, + WorkflowRecordListItemDTO, + WorkflowRecordOrderBy, + WorkflowWithoutID, +) class WorkflowRecordsStorageBase(ABC): """Base class for workflow storage services.""" @abstractmethod - def get(self, workflow_id: str) -> WorkflowField: + def get(self, workflow_id: str) -> WorkflowRecordDTO: """Get workflow by id.""" pass @abstractmethod - def create(self, workflow: WorkflowField) -> WorkflowField: + def create(self, workflow: WorkflowWithoutID) -> WorkflowRecordDTO: """Creates a workflow.""" pass + + @abstractmethod + def update(self, workflow: Workflow) -> WorkflowRecordDTO: + """Updates a workflow.""" + pass + + @abstractmethod + def delete(self, workflow_id: str) -> None: + """Deletes a workflow.""" + pass + + @abstractmethod + def get_many( + self, + page: int, + per_page: int, + order_by: WorkflowRecordOrderBy, + direction: SQLiteDirection, + category: WorkflowCategory, + query: Optional[str], + ) -> PaginatedResults[WorkflowRecordListItemDTO]: + """Gets many workflows.""" + pass diff --git a/invokeai/app/services/workflow_records/workflow_records_common.py b/invokeai/app/services/workflow_records/workflow_records_common.py index 3a2b13f565..e7f3d4295f 100644 --- a/invokeai/app/services/workflow_records/workflow_records_common.py +++ b/invokeai/app/services/workflow_records/workflow_records_common.py @@ -1,2 +1,118 @@ +import datetime +from enum import Enum +from typing import Any, Union + +import semver +from pydantic import BaseModel, ConfigDict, Field, JsonValue, TypeAdapter, field_validator + +from invokeai.app.util.metaenum import MetaEnum + +__workflow_meta_version__ = semver.Version.parse("1.0.0") + + +class ExposedField(BaseModel): + nodeId: str + fieldName: str + + class WorkflowNotFoundError(Exception): """Raised when a workflow is not found""" + + +class WorkflowRecordOrderBy(str, Enum, metaclass=MetaEnum): + """The order by options for workflow records""" + + CreatedAt = "created_at" + UpdatedAt = "updated_at" + OpenedAt = "opened_at" + Name = "name" + + +class WorkflowCategory(str, Enum, metaclass=MetaEnum): + User = "user" + Default = "default" + + +class WorkflowMeta(BaseModel): + version: str = Field(description="The version of the workflow schema.") + category: WorkflowCategory = Field( + default=WorkflowCategory.User, description="The category of the workflow (user or default)." + ) + + @field_validator("version") + def validate_version(cls, version: str): + try: + semver.Version.parse(version) + return version + except Exception: + raise ValueError(f"Invalid workflow meta version: {version}") + + def to_semver(self) -> semver.Version: + return semver.Version.parse(self.version) + + +class WorkflowWithoutID(BaseModel): + name: str = Field(description="The name of the workflow.") + author: str = Field(description="The author of the workflow.") + description: str = Field(description="The description of the workflow.") + version: str = Field(description="The version of the workflow.") + contact: str = Field(description="The contact of the workflow.") + tags: str = Field(description="The tags of the workflow.") + notes: str = Field(description="The notes of the workflow.") + exposedFields: list[ExposedField] = Field(description="The exposed fields of the workflow.") + meta: WorkflowMeta = Field(description="The meta of the workflow.") + # TODO: nodes and edges are very loosely typed + nodes: list[dict[str, JsonValue]] = Field(description="The nodes of the workflow.") + edges: list[dict[str, JsonValue]] = Field(description="The edges of the workflow.") + + model_config = ConfigDict(extra="ignore") + + +WorkflowWithoutIDValidator = TypeAdapter(WorkflowWithoutID) + + +class UnsafeWorkflowWithVersion(BaseModel): + """ + This utility model only requires a workflow to have a valid version string. + It is used to validate a workflow version without having to validate the entire workflow. + """ + + meta: WorkflowMeta = Field(description="The meta of the workflow.") + + +UnsafeWorkflowWithVersionValidator = TypeAdapter(UnsafeWorkflowWithVersion) + + +class Workflow(WorkflowWithoutID): + id: str = Field(description="The id of the workflow.") + + +WorkflowValidator = TypeAdapter(Workflow) + + +class WorkflowRecordDTOBase(BaseModel): + workflow_id: str = Field(description="The id of the workflow.") + name: str = Field(description="The name of the workflow.") + created_at: Union[datetime.datetime, str] = Field(description="The created timestamp of the workflow.") + updated_at: Union[datetime.datetime, str] = Field(description="The updated timestamp of the workflow.") + opened_at: Union[datetime.datetime, str] = Field(description="The opened timestamp of the workflow.") + + +class WorkflowRecordDTO(WorkflowRecordDTOBase): + workflow: Workflow = Field(description="The workflow.") + + @classmethod + def from_dict(cls, data: dict[str, Any]) -> "WorkflowRecordDTO": + data["workflow"] = WorkflowValidator.validate_json(data.get("workflow", "")) + return WorkflowRecordDTOValidator.validate_python(data) + + +WorkflowRecordDTOValidator = TypeAdapter(WorkflowRecordDTO) + + +class WorkflowRecordListItemDTO(WorkflowRecordDTOBase): + description: str = Field(description="The description of the workflow.") + category: WorkflowCategory = Field(description="The description of the workflow.") + + +WorkflowRecordListItemDTOValidator = TypeAdapter(WorkflowRecordListItemDTO) diff --git a/invokeai/app/services/workflow_records/workflow_records_sqlite.py b/invokeai/app/services/workflow_records/workflow_records_sqlite.py index b0952e8234..af0bad8260 100644 --- a/invokeai/app/services/workflow_records/workflow_records_sqlite.py +++ b/invokeai/app/services/workflow_records/workflow_records_sqlite.py @@ -1,37 +1,53 @@ -import sqlite3 -import threading +from pathlib import Path +from typing import Optional -from invokeai.app.invocations.baseinvocation import WorkflowField, WorkflowFieldValidator from invokeai.app.services.invoker import Invoker -from invokeai.app.services.shared.sqlite import SqliteDatabase +from invokeai.app.services.shared.pagination import PaginatedResults +from invokeai.app.services.shared.sqlite.sqlite_common import SQLiteDirection +from invokeai.app.services.shared.sqlite.sqlite_database import SqliteDatabase from invokeai.app.services.workflow_records.workflow_records_base import WorkflowRecordsStorageBase -from invokeai.app.services.workflow_records.workflow_records_common import WorkflowNotFoundError +from invokeai.app.services.workflow_records.workflow_records_common import ( + Workflow, + WorkflowCategory, + WorkflowNotFoundError, + WorkflowRecordDTO, + WorkflowRecordListItemDTO, + WorkflowRecordListItemDTOValidator, + WorkflowRecordOrderBy, + WorkflowWithoutID, + WorkflowWithoutIDValidator, +) from invokeai.app.util.misc import uuid_string class SqliteWorkflowRecordsStorage(WorkflowRecordsStorageBase): - _invoker: Invoker - _conn: sqlite3.Connection - _cursor: sqlite3.Cursor - _lock: threading.RLock - def __init__(self, db: SqliteDatabase) -> None: super().__init__() self._lock = db.lock self._conn = db.conn self._cursor = self._conn.cursor() - self._create_tables() def start(self, invoker: Invoker) -> None: self._invoker = invoker + self._sync_default_workflows() - def get(self, workflow_id: str) -> WorkflowField: + def get(self, workflow_id: str) -> WorkflowRecordDTO: + """Gets a workflow by ID. Updates the opened_at column.""" try: self._lock.acquire() self._cursor.execute( """--sql - SELECT workflow - FROM workflows + UPDATE workflow_library + SET opened_at = STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') + WHERE workflow_id = ?; + """, + (workflow_id,), + ) + self._conn.commit() + self._cursor.execute( + """--sql + SELECT workflow_id, workflow, name, created_at, updated_at, opened_at + FROM workflow_library WHERE workflow_id = ?; """, (workflow_id,), @@ -39,25 +55,28 @@ class SqliteWorkflowRecordsStorage(WorkflowRecordsStorageBase): row = self._cursor.fetchone() if row is None: raise WorkflowNotFoundError(f"Workflow with id {workflow_id} not found") - return WorkflowFieldValidator.validate_json(row[0]) + return WorkflowRecordDTO.from_dict(dict(row)) except Exception: self._conn.rollback() raise finally: self._lock.release() - def create(self, workflow: WorkflowField) -> WorkflowField: + def create(self, workflow: WorkflowWithoutID) -> WorkflowRecordDTO: try: - # workflows do not have ids until they are saved - workflow_id = uuid_string() - workflow.root["id"] = workflow_id + # Only user workflows may be created by this method + assert workflow.meta.category is WorkflowCategory.User + workflow_with_id = Workflow(**workflow.model_dump(), id=uuid_string()) self._lock.acquire() self._cursor.execute( """--sql - INSERT INTO workflows(workflow) - VALUES (?); + INSERT OR IGNORE INTO workflow_library ( + workflow_id, + workflow + ) + VALUES (?, ?); """, - (workflow.model_dump_json(),), + (workflow_with_id.id, workflow_with_id.model_dump_json()), ) self._conn.commit() except Exception: @@ -65,35 +84,148 @@ class SqliteWorkflowRecordsStorage(WorkflowRecordsStorageBase): raise finally: self._lock.release() - return self.get(workflow_id) + return self.get(workflow_with_id.id) - def _create_tables(self) -> None: + def update(self, workflow: Workflow) -> WorkflowRecordDTO: try: self._lock.acquire() self._cursor.execute( """--sql - CREATE TABLE IF NOT EXISTS workflows ( - workflow TEXT NOT NULL, - workflow_id TEXT GENERATED ALWAYS AS (json_extract(workflow, '$.id')) VIRTUAL NOT NULL UNIQUE, -- gets implicit index - created_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), - updated_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')) -- updated via trigger - ); - """ + UPDATE workflow_library + SET workflow = ? + WHERE workflow_id = ? AND category = 'user'; + """, + (workflow.model_dump_json(), workflow.id), ) - - self._cursor.execute( - """--sql - CREATE TRIGGER IF NOT EXISTS tg_workflows_updated_at - AFTER UPDATE - ON workflows FOR EACH ROW - BEGIN - UPDATE workflows - SET updated_at = STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') - WHERE workflow_id = old.workflow_id; - END; - """ - ) - + self._conn.commit() + except Exception: + self._conn.rollback() + raise + finally: + self._lock.release() + return self.get(workflow.id) + + def delete(self, workflow_id: str) -> None: + try: + self._lock.acquire() + self._cursor.execute( + """--sql + DELETE from workflow_library + WHERE workflow_id = ? AND category = 'user'; + """, + (workflow_id,), + ) + self._conn.commit() + except Exception: + self._conn.rollback() + raise + finally: + self._lock.release() + return None + + def get_many( + self, + page: int, + per_page: int, + order_by: WorkflowRecordOrderBy, + direction: SQLiteDirection, + category: WorkflowCategory, + query: Optional[str] = None, + ) -> PaginatedResults[WorkflowRecordListItemDTO]: + try: + self._lock.acquire() + # sanitize! + assert order_by in WorkflowRecordOrderBy + assert direction in SQLiteDirection + assert category in WorkflowCategory + count_query = "SELECT COUNT(*) FROM workflow_library WHERE category = ?" + main_query = """ + SELECT + workflow_id, + category, + name, + description, + created_at, + updated_at, + opened_at + FROM workflow_library + WHERE category = ? + """ + main_params: list[int | str] = [category.value] + count_params: list[int | str] = [category.value] + stripped_query = query.strip() if query else None + if stripped_query: + wildcard_query = "%" + stripped_query + "%" + main_query += " AND name LIKE ? OR description LIKE ? " + count_query += " AND name LIKE ? OR description LIKE ?;" + main_params.extend([wildcard_query, wildcard_query]) + count_params.extend([wildcard_query, wildcard_query]) + + main_query += f" ORDER BY {order_by.value} {direction.value} LIMIT ? OFFSET ?;" + main_params.extend([per_page, page * per_page]) + self._cursor.execute(main_query, main_params) + rows = self._cursor.fetchall() + workflows = [WorkflowRecordListItemDTOValidator.validate_python(dict(row)) for row in rows] + + self._cursor.execute(count_query, count_params) + total = self._cursor.fetchone()[0] + pages = total // per_page + (total % per_page > 0) + + return PaginatedResults( + items=workflows, + page=page, + per_page=per_page, + pages=pages, + total=total, + ) + except Exception: + self._conn.rollback() + raise + finally: + self._lock.release() + + def _sync_default_workflows(self) -> None: + """Syncs default workflows to the database. Internal use only.""" + + """ + An enhancement might be to only update workflows that have changed. This would require stable + default workflow IDs, and properly incrementing the workflow version. + + It's much simpler to just replace them all with whichever workflows are in the directory. + + The downside is that the `updated_at` and `opened_at` timestamps for default workflows are + meaningless, as they are overwritten every time the server starts. + """ + + try: + self._lock.acquire() + workflows: list[Workflow] = [] + workflows_dir = Path(__file__).parent / Path("default_workflows") + workflow_paths = workflows_dir.glob("*.json") + for path in workflow_paths: + bytes_ = path.read_bytes() + workflow_without_id = WorkflowWithoutIDValidator.validate_json(bytes_) + workflow = Workflow(**workflow_without_id.model_dump(), id=uuid_string()) + workflows.append(workflow) + # Only default workflows may be managed by this method + assert all(w.meta.category is WorkflowCategory.Default for w in workflows) + self._cursor.execute( + """--sql + DELETE FROM workflow_library + WHERE category = 'default'; + """ + ) + for w in workflows: + self._cursor.execute( + """--sql + INSERT OR REPLACE INTO workflow_library ( + workflow_id, + workflow + ) + VALUES (?, ?); + """, + (w.id, w.model_dump_json()), + ) self._conn.commit() except Exception: self._conn.rollback() diff --git a/invokeai/app/util/ti_utils.py b/invokeai/app/util/ti_utils.py new file mode 100644 index 0000000000..a66a832b42 --- /dev/null +++ b/invokeai/app/util/ti_utils.py @@ -0,0 +1,8 @@ +import re + + +def extract_ti_triggers_from_prompt(prompt: str) -> list[str]: + ti_triggers = [] + for trigger in re.findall(r"<[a-zA-Z0-9., _-]+>", prompt): + ti_triggers.append(trigger) + return ti_triggers diff --git a/invokeai/backend/install/check_root.py b/invokeai/backend/install/check_root.py index 6ee2aa34b7..ee264016b4 100644 --- a/invokeai/backend/install/check_root.py +++ b/invokeai/backend/install/check_root.py @@ -28,7 +28,7 @@ def check_invokeai_root(config: InvokeAIAppConfig): print("== STARTUP ABORTED ==") print("** One or more necessary files is missing from your InvokeAI root directory **") print("** Please rerun the configuration script to fix this problem. **") - print("** From the launcher, selection option [7]. **") + print("** From the launcher, selection option [6]. **") print( '** From the command line, activate the virtual environment and run "invokeai-configure --yes --skip-sd-weights" **' ) diff --git a/invokeai/backend/model_management/detect_baked_in_vae.py b/invokeai/backend/model_management/detect_baked_in_vae.py new file mode 100644 index 0000000000..9118438548 --- /dev/null +++ b/invokeai/backend/model_management/detect_baked_in_vae.py @@ -0,0 +1,31 @@ +# Copyright (c) 2024 Lincoln Stein and the InvokeAI Development Team +""" +This module exports the function has_baked_in_sdxl_vae(). +It returns True if an SDXL checkpoint model has the original SDXL 1.0 VAE, +which doesn't work properly in fp16 mode. +""" + +import hashlib +from pathlib import Path + +from safetensors.torch import load_file + +SDXL_1_0_VAE_HASH = "bc40b16c3a0fa4625abdfc01c04ffc21bf3cefa6af6c7768ec61eb1f1ac0da51" + + +def has_baked_in_sdxl_vae(checkpoint_path: Path) -> bool: + """Return true if the checkpoint contains a custom (non SDXL-1.0) VAE.""" + hash = _vae_hash(checkpoint_path) + return hash != SDXL_1_0_VAE_HASH + + +def _vae_hash(checkpoint_path: Path) -> str: + checkpoint = load_file(checkpoint_path, device="cpu") + vae_keys = [x for x in checkpoint.keys() if x.startswith("first_stage_model.")] + hash = hashlib.new("sha256") + for key in vae_keys: + value = checkpoint[key] + hash.update(bytes(key, "UTF-8")) + hash.update(bytes(str(value), "UTF-8")) + + return hash.hexdigest() diff --git a/invokeai/backend/model_management/lora.py b/invokeai/backend/model_management/lora.py index 3d2136659f..d72f55794d 100644 --- a/invokeai/backend/model_management/lora.py +++ b/invokeai/backend/model_management/lora.py @@ -13,6 +13,7 @@ from safetensors.torch import load_file from transformers import CLIPTextModel, CLIPTokenizer from invokeai.app.shared.models import FreeUConfig +from invokeai.backend.model_management.model_load_optimizations import skip_torch_weight_init from .models.lora import LoRAModel @@ -211,11 +212,17 @@ class ModelPatcher: for i in range(ti_embedding.shape[0]): new_tokens_added += ti_tokenizer.add_tokens(_get_trigger(ti_name, i)) - # modify text_encoder - text_encoder.resize_token_embeddings(init_tokens_count + new_tokens_added, pad_to_multiple_of) + # Modify text_encoder. + # resize_token_embeddings(...) constructs a new torch.nn.Embedding internally. Initializing the weights of + # this embedding is slow and unnecessary, so we wrap this step in skip_torch_weight_init() to save some + # time. + with skip_torch_weight_init(): + text_encoder.resize_token_embeddings(init_tokens_count + new_tokens_added, pad_to_multiple_of) model_embeddings = text_encoder.get_input_embeddings() - for ti_name, _ in ti_list: + for ti_name, ti in ti_list: + ti_embedding = _get_ti_embedding(text_encoder.get_input_embeddings(), ti) + ti_tokens = [] for i in range(ti_embedding.shape[0]): embedding = ti_embedding[i] diff --git a/invokeai/backend/model_management/model_probe.py b/invokeai/backend/model_management/model_probe.py index af4f3f2a62..74b1b72d31 100644 --- a/invokeai/backend/model_management/model_probe.py +++ b/invokeai/backend/model_management/model_probe.py @@ -32,6 +32,8 @@ class ModelProbeInfo(object): upcast_attention: bool format: Literal["diffusers", "checkpoint", "lycoris", "olive", "onnx"] image_size: int + name: Optional[str] = None + description: Optional[str] = None class ProbeBase(object): @@ -113,12 +115,16 @@ class ModelProbe(object): base_type = probe.get_base_type() variant_type = probe.get_variant_type() prediction_type = probe.get_scheduler_prediction_type() + name = cls.get_model_name(model_path) + description = f"{base_type.value} {model_type.value} model {name}" format = probe.get_format() model_info = ModelProbeInfo( model_type=model_type, base_type=base_type, variant_type=variant_type, prediction_type=prediction_type, + name=name, + description=description, upcast_attention=( base_type == BaseModelType.StableDiffusion2 and prediction_type == SchedulerPredictionType.VPrediction @@ -142,6 +148,13 @@ class ModelProbe(object): return model_info + @classmethod + def get_model_name(cls, model_path: Path) -> str: + if model_path.suffix in {".safetensors", ".bin", ".pt", ".ckpt"}: + return model_path.stem + else: + return model_path.name + @classmethod def get_model_type_from_checkpoint(cls, model_path: Path, checkpoint: dict) -> ModelType: if model_path.suffix not in (".bin", ".pt", ".ckpt", ".safetensors", ".pth"): @@ -357,6 +370,8 @@ class LoRACheckpointProbe(CheckpointProbeBase): return BaseModelType.StableDiffusion1 elif token_vector_length == 1024: return BaseModelType.StableDiffusion2 + elif token_vector_length == 1280: + return BaseModelType.StableDiffusionXL # recognizes format at https://civitai.com/models/224641 elif token_vector_length == 2048: return BaseModelType.StableDiffusionXL else: @@ -376,7 +391,7 @@ class TextualInversionCheckpointProbe(CheckpointProbeBase): elif "clip_g" in checkpoint: token_dim = checkpoint["clip_g"].shape[-1] else: - token_dim = list(checkpoint.values())[0].shape[0] + token_dim = list(checkpoint.values())[0].shape[-1] if token_dim == 768: return BaseModelType.StableDiffusion1 elif token_dim == 1024: diff --git a/invokeai/backend/model_management/models/sdxl.py b/invokeai/backend/model_management/models/sdxl.py index 41586e35b9..53c080fa66 100644 --- a/invokeai/backend/model_management/models/sdxl.py +++ b/invokeai/backend/model_management/models/sdxl.py @@ -1,11 +1,16 @@ import json import os from enum import Enum +from pathlib import Path from typing import Literal, Optional from omegaconf import OmegaConf from pydantic import Field +from invokeai.app.services.config import InvokeAIAppConfig +from invokeai.backend.model_management.detect_baked_in_vae import has_baked_in_sdxl_vae +from invokeai.backend.util.logging import InvokeAILogger + from .base import ( BaseModelType, DiffusersModel, @@ -116,14 +121,28 @@ class StableDiffusionXLModel(DiffusersModel): # The convert script adapted from the diffusers package uses # strings for the base model type. To avoid making too many # source code changes, we simply translate here + if Path(output_path).exists(): + return output_path + if isinstance(config, cls.CheckpointConfig): from invokeai.backend.model_management.models.stable_diffusion import _convert_ckpt_and_cache + # Hack in VAE-fp16 fix - If model sdxl-vae-fp16-fix is installed, + # then we bake it into the converted model unless there is already + # a nonstandard VAE installed. + kwargs = {} + app_config = InvokeAIAppConfig.get_config() + vae_path = app_config.models_path / "sdxl/vae/sdxl-vae-fp16-fix" + if vae_path.exists() and not has_baked_in_sdxl_vae(Path(model_path)): + InvokeAILogger.get_logger().warning("No baked-in VAE detected. Inserting sdxl-vae-fp16-fix.") + kwargs["vae_path"] = vae_path + return _convert_ckpt_and_cache( version=base_model, model_config=config, output_path=output_path, use_safetensors=False, # corrupts sdxl models for some reason + **kwargs, ) else: return model_path diff --git a/invokeai/backend/model_management/util.py b/invokeai/backend/model_management/util.py index 6d70107c93..f4737d9f0b 100644 --- a/invokeai/backend/model_management/util.py +++ b/invokeai/backend/model_management/util.py @@ -9,7 +9,7 @@ def lora_token_vector_length(checkpoint: dict) -> int: :param checkpoint: The checkpoint """ - def _get_shape_1(key, tensor, checkpoint): + def _get_shape_1(key: str, tensor, checkpoint) -> int: lora_token_vector_length = None if "." not in key: @@ -57,6 +57,10 @@ def lora_token_vector_length(checkpoint: dict) -> int: for key, tensor in checkpoint.items(): if key.startswith("lora_unet_") and ("_attn2_to_k." in key or "_attn2_to_v." in key): lora_token_vector_length = _get_shape_1(key, tensor, checkpoint) + elif key.startswith("lora_unet_") and ( + "time_emb_proj.lora_down" in key + ): # recognizes format at https://civitai.com/models/224641 + lora_token_vector_length = _get_shape_1(key, tensor, checkpoint) elif key.startswith("lora_te") and "_self_attn_" in key: tmp_length = _get_shape_1(key, tensor, checkpoint) if key.startswith("lora_te_"): diff --git a/invokeai/backend/model_manager/__init__.py b/invokeai/backend/model_manager/__init__.py new file mode 100644 index 0000000000..0f16852c93 --- /dev/null +++ b/invokeai/backend/model_manager/__init__.py @@ -0,0 +1,31 @@ +"""Re-export frequently-used symbols from the Model Manager backend.""" + +from .config import ( + AnyModelConfig, + BaseModelType, + InvalidModelConfigException, + ModelConfigFactory, + ModelFormat, + ModelRepoVariant, + ModelType, + ModelVariantType, + SchedulerPredictionType, + SubModelType, +) +from .probe import ModelProbe +from .search import ModelSearch + +__all__ = [ + "AnyModelConfig", + "BaseModelType", + "ModelRepoVariant", + "InvalidModelConfigException", + "ModelConfigFactory", + "ModelFormat", + "ModelProbe", + "ModelSearch", + "ModelType", + "ModelVariantType", + "SchedulerPredictionType", + "SubModelType", +] diff --git a/invokeai/backend/model_manager/config.py b/invokeai/backend/model_manager/config.py index 457e6b0823..964cc19f19 100644 --- a/invokeai/backend/model_manager/config.py +++ b/invokeai/backend/model_manager/config.py @@ -23,7 +23,7 @@ from enum import Enum from typing import Literal, Optional, Type, Union from pydantic import BaseModel, ConfigDict, Field, TypeAdapter -from typing_extensions import Annotated +from typing_extensions import Annotated, Any, Dict class InvalidModelConfigException(Exception): @@ -99,6 +99,17 @@ class SchedulerPredictionType(str, Enum): Sample = "sample" +class ModelRepoVariant(str, Enum): + """Various hugging face variants on the diffusers format.""" + + DEFAULT = "default" # model files without "fp16" or other qualifier + FP16 = "fp16" + FP32 = "fp32" + ONNX = "onnx" + OPENVINO = "openvino" + FLAX = "flax" + + class ModelConfigBase(BaseModel): """Base class for model configuration information.""" @@ -122,7 +133,7 @@ class ModelConfigBase(BaseModel): validate_assignment=True, ) - def update(self, attributes: dict): + def update(self, attributes: Dict[str, Any]) -> None: """Update the object with fields in dict.""" for key, value in attributes.items(): setattr(self, key, value) # may raise a validation error @@ -195,8 +206,6 @@ class MainCheckpointConfig(_CheckpointConfig, _MainConfig): """Model config for main checkpoint models.""" type: Literal[ModelType.Main] = ModelType.Main - # Note that we do not need prediction_type or upcast_attention here - # because they are provided in the checkpoint's own config file. class MainDiffusersConfig(_DiffusersConfig, _MainConfig): diff --git a/invokeai/backend/model_manager/metadata/__init__.py b/invokeai/backend/model_manager/metadata/__init__.py new file mode 100644 index 0000000000..672e378c7f --- /dev/null +++ b/invokeai/backend/model_manager/metadata/__init__.py @@ -0,0 +1,50 @@ +""" +Initialization file for invokeai.backend.model_manager.metadata + +Usage: + +from invokeai.backend.model_manager.metadata import( + AnyModelRepoMetadata, + CommercialUsage, + LicenseRestrictions, + HuggingFaceMetadata, + CivitaiMetadata, +) + +from invokeai.backend.model_manager.metadata.fetch import CivitaiMetadataFetch + +data = CivitaiMetadataFetch().from_url("https://civitai.com/models/206883/split") +assert isinstance(data, CivitaiMetadata) +if data.allow_commercial_use: + print("Commercial use of this model is allowed") +""" +from .fetch import CivitaiMetadataFetch, HuggingFaceMetadataFetch +from .metadata_base import ( + AnyModelRepoMetadata, + AnyModelRepoMetadataValidator, + BaseMetadata, + CivitaiMetadata, + CommercialUsage, + HuggingFaceMetadata, + LicenseRestrictions, + ModelMetadataWithFiles, + RemoteModelFile, + UnknownMetadataException, +) +from .metadata_store import ModelMetadataStore + +__all__ = [ + "AnyModelRepoMetadata", + "AnyModelRepoMetadataValidator", + "CivitaiMetadata", + "CivitaiMetadataFetch", + "CommercialUsage", + "HuggingFaceMetadata", + "HuggingFaceMetadataFetch", + "LicenseRestrictions", + "ModelMetadataStore", + "BaseMetadata", + "ModelMetadataWithFiles", + "RemoteModelFile", + "UnknownMetadataException", +] diff --git a/invokeai/backend/model_manager/metadata/fetch/__init__.py b/invokeai/backend/model_manager/metadata/fetch/__init__.py new file mode 100644 index 0000000000..597446c29f --- /dev/null +++ b/invokeai/backend/model_manager/metadata/fetch/__init__.py @@ -0,0 +1,21 @@ +""" +Initialization file for invokeai.backend.model_manager.metadata.fetch + +Usage: +from invokeai.backend.model_manager.metadata.fetch import ( + CivitaiMetadataFetch, + HuggingFaceMetadataFetch, +) +from invokeai.backend.model_manager.metadata import CivitaiMetadata + +data = CivitaiMetadataFetch().from_url("https://civitai.com/models/206883/split") +assert isinstance(data, CivitaiMetadata) +if data.allow_commercial_use: + print("Commercial use of this model is allowed") +""" + +from .civitai import CivitaiMetadataFetch +from .fetch_base import ModelMetadataFetchBase +from .huggingface import HuggingFaceMetadataFetch + +__all__ = ["ModelMetadataFetchBase", "CivitaiMetadataFetch", "HuggingFaceMetadataFetch"] diff --git a/invokeai/backend/model_manager/metadata/fetch/civitai.py b/invokeai/backend/model_manager/metadata/fetch/civitai.py new file mode 100644 index 0000000000..4f52f6f930 --- /dev/null +++ b/invokeai/backend/model_manager/metadata/fetch/civitai.py @@ -0,0 +1,187 @@ +# Copyright (c) 2023 Lincoln D. Stein and the InvokeAI Development Team + +""" +This module fetches model metadata objects from the Civitai model repository. +In addition to the `from_url()` and `from_id()` methods inherited from the +`ModelMetadataFetchBase` base class. + +Civitai has two separate ID spaces: a model ID and a version ID. The +version ID corresponds to a specific model, and is the ID accepted by +`from_id()`. The model ID corresponds to a family of related models, +such as different training checkpoints or 16 vs 32-bit versions. The +`from_civitai_modelid()` method will accept a model ID and return the +metadata from the default version within this model set. The default +version is the same as what the user sees when they click on a model's +thumbnail. + +Usage: + +from invokeai.backend.model_manager.metadata.fetch import CivitaiMetadataFetch + +fetcher = CivitaiMetadataFetch() +metadata = fetcher.from_url("https://civitai.com/models/206883/split") +print(metadata.trained_words) +""" + +import re +from datetime import datetime +from pathlib import Path +from typing import Any, Dict, Optional + +import requests +from pydantic.networks import AnyHttpUrl +from requests.sessions import Session + +from ..metadata_base import ( + AnyModelRepoMetadata, + CivitaiMetadata, + CommercialUsage, + LicenseRestrictions, + RemoteModelFile, + UnknownMetadataException, +) +from .fetch_base import ModelMetadataFetchBase + +CIVITAI_MODEL_PAGE_RE = r"https?://civitai.com/models/(\d+)" +CIVITAI_VERSION_PAGE_RE = r"https?://civitai.com/models/(\d+)\?modelVersionId=(\d+)" +CIVITAI_DOWNLOAD_RE = r"https?://civitai.com/api/download/models/(\d+)" + +CIVITAI_VERSION_ENDPOINT = "https://civitai.com/api/v1/model-versions/" +CIVITAI_MODEL_ENDPOINT = "https://civitai.com/api/v1/models/" + + +class CivitaiMetadataFetch(ModelMetadataFetchBase): + """Fetch model metadata from Civitai.""" + + def __init__(self, session: Optional[Session] = None): + """ + Initialize the fetcher with an optional requests.sessions.Session object. + + By providing a configurable Session object, we can support unit tests on + this module without an internet connection. + """ + self._requests = session or requests.Session() + + def from_url(self, url: AnyHttpUrl) -> AnyModelRepoMetadata: + """ + Given a URL to a CivitAI model or version page, return a ModelMetadata object. + + In the event that the URL points to a model page without the particular version + indicated, the default model version is returned. Otherwise, the requested version + is returned. + """ + if match := re.match(CIVITAI_VERSION_PAGE_RE, str(url), re.IGNORECASE): + model_id = match.group(1) + version_id = match.group(2) + return self.from_civitai_versionid(int(version_id), int(model_id)) + elif match := re.match(CIVITAI_MODEL_PAGE_RE, str(url), re.IGNORECASE): + model_id = match.group(1) + return self.from_civitai_modelid(int(model_id)) + elif match := re.match(CIVITAI_DOWNLOAD_RE, str(url), re.IGNORECASE): + version_id = match.group(1) + return self.from_civitai_versionid(int(version_id)) + raise UnknownMetadataException("The url '{url}' does not match any known Civitai URL patterns") + + def from_id(self, id: str) -> AnyModelRepoMetadata: + """ + Given a Civitai model version ID, return a ModelRepoMetadata object. + + May raise an `UnknownMetadataException`. + """ + return self.from_civitai_versionid(int(id)) + + def from_civitai_modelid(self, model_id: int) -> CivitaiMetadata: + """ + Return metadata from the default version of the indicated model. + + May raise an `UnknownMetadataException`. + """ + model_url = CIVITAI_MODEL_ENDPOINT + str(model_id) + model_json = self._requests.get(model_url).json() + return self._from_model_json(model_json) + + def _from_model_json(self, model_json: Dict[str, Any], version_id: Optional[int] = None) -> CivitaiMetadata: + try: + version_id = version_id or model_json["modelVersions"][0]["id"] + except TypeError as excp: + raise UnknownMetadataException from excp + + # loop till we find the section containing the version requested + version_sections = [x for x in model_json["modelVersions"] if x["id"] == version_id] + if not version_sections: + raise UnknownMetadataException(f"Version {version_id} not found in model metadata") + + version_json = version_sections[0] + safe_thumbnails = [x["url"] for x in version_json["images"] if x["nsfw"] == "None"] + + # Civitai has one "primary" file plus others such as VAEs. We only fetch the primary. + primary = [x for x in version_json["files"] if x.get("primary")] + assert len(primary) == 1 + primary_file = primary[0] + + url = primary_file["downloadUrl"] + if "?" not in url: # work around apparent bug in civitai api + metadata_string = "" + for key, value in primary_file["metadata"].items(): + if not value: + continue + metadata_string += f"&{key}={value}" + url = url + f"?type={primary_file['type']}{metadata_string}" + model_files = [ + RemoteModelFile( + url=url, + path=Path(primary_file["name"]), + size=int(primary_file["sizeKB"] * 1024), + sha256=primary_file["hashes"]["SHA256"], + ) + ] + return CivitaiMetadata( + id=model_json["id"], + name=version_json["name"], + version_id=version_json["id"], + version_name=version_json["name"], + created=datetime.fromisoformat(_fix_timezone(version_json["createdAt"])), + updated=datetime.fromisoformat(_fix_timezone(version_json["updatedAt"])), + published=datetime.fromisoformat(_fix_timezone(version_json["publishedAt"])), + base_model_trained_on=version_json["baseModel"], # note - need a dictionary to turn into a BaseModelType + files=model_files, + download_url=version_json["downloadUrl"], + thumbnail_url=safe_thumbnails[0] if safe_thumbnails else None, + author=model_json["creator"]["username"], + description=model_json["description"], + version_description=version_json["description"] or "", + tags=model_json["tags"], + trained_words=version_json["trainedWords"], + nsfw=model_json["nsfw"], + restrictions=LicenseRestrictions( + AllowNoCredit=model_json["allowNoCredit"], + AllowCommercialUse=CommercialUsage(model_json["allowCommercialUse"]), + AllowDerivatives=model_json["allowDerivatives"], + AllowDifferentLicense=model_json["allowDifferentLicense"], + ), + ) + + def from_civitai_versionid(self, version_id: int, model_id: Optional[int] = None) -> CivitaiMetadata: + """ + Return a CivitaiMetadata object given a model version id. + + May raise an `UnknownMetadataException`. + """ + if model_id is None: + version_url = CIVITAI_VERSION_ENDPOINT + str(version_id) + version = self._requests.get(version_url).json() + model_id = version["modelId"] + + model_url = CIVITAI_MODEL_ENDPOINT + str(model_id) + model_json = self._requests.get(model_url).json() + return self._from_model_json(model_json, version_id) + + @classmethod + def from_json(cls, json: str) -> CivitaiMetadata: + """Given the JSON representation of the metadata, return the corresponding Pydantic object.""" + metadata = CivitaiMetadata.model_validate_json(json) + return metadata + + +def _fix_timezone(date: str) -> str: + return re.sub(r"Z$", "+00:00", date) diff --git a/invokeai/backend/model_manager/metadata/fetch/fetch_base.py b/invokeai/backend/model_manager/metadata/fetch/fetch_base.py new file mode 100644 index 0000000000..58b65b6947 --- /dev/null +++ b/invokeai/backend/model_manager/metadata/fetch/fetch_base.py @@ -0,0 +1,61 @@ +# Copyright (c) 2023 Lincoln D. Stein and the InvokeAI Development Team + +""" +This module is the base class for subclasses that fetch metadata from model repositories + +Usage: + +from invokeai.backend.model_manager.metadata.fetch import CivitAIMetadataFetch + +fetcher = CivitaiMetadataFetch() +metadata = fetcher.from_url("https://civitai.com/models/206883/split") +print(metadata.trained_words) +""" + +from abc import ABC, abstractmethod +from typing import Optional + +from pydantic.networks import AnyHttpUrl +from requests.sessions import Session + +from ..metadata_base import AnyModelRepoMetadata, AnyModelRepoMetadataValidator + + +class ModelMetadataFetchBase(ABC): + """Fetch metadata from remote generative model repositories.""" + + @abstractmethod + def __init__(self, session: Optional[Session] = None): + """ + Initialize the fetcher with an optional requests.sessions.Session object. + + By providing a configurable Session object, we can support unit tests on + this module without an internet connection. + """ + pass + + @abstractmethod + def from_url(self, url: AnyHttpUrl) -> AnyModelRepoMetadata: + """ + Given a URL to a model repository, return a ModelMetadata object. + + This method will raise a `UnknownMetadataException` + in the event that the requested model metadata is not found at the provided location. + """ + pass + + @abstractmethod + def from_id(self, id: str) -> AnyModelRepoMetadata: + """ + Given an ID for a model, return a ModelMetadata object. + + This method will raise a `UnknownMetadataException` + in the event that the requested model's metadata is not found at the provided id. + """ + pass + + @classmethod + def from_json(cls, json: str) -> AnyModelRepoMetadata: + """Given the JSON representation of the metadata, return the corresponding Pydantic object.""" + metadata = AnyModelRepoMetadataValidator.validate_json(json) + return metadata diff --git a/invokeai/backend/model_manager/metadata/fetch/huggingface.py b/invokeai/backend/model_manager/metadata/fetch/huggingface.py new file mode 100644 index 0000000000..5d1eb0cc9e --- /dev/null +++ b/invokeai/backend/model_manager/metadata/fetch/huggingface.py @@ -0,0 +1,92 @@ +# Copyright (c) 2023 Lincoln D. Stein and the InvokeAI Development Team + +""" +This module fetches model metadata objects from the HuggingFace model repository, +using either a `repo_id` or the model page URL. + +Usage: + +from invokeai.backend.model_manager.metadata.fetch import HuggingFaceMetadataFetch + +fetcher = HuggingFaceMetadataFetch() +metadata = fetcher.from_url("https://huggingface.co/stabilityai/sdxl-turbo") +print(metadata.tags) +""" + +import re +from pathlib import Path +from typing import Optional + +import requests +from huggingface_hub import HfApi, configure_http_backend, hf_hub_url +from huggingface_hub.utils._errors import RepositoryNotFoundError +from pydantic.networks import AnyHttpUrl +from requests.sessions import Session + +from ..metadata_base import ( + AnyModelRepoMetadata, + HuggingFaceMetadata, + RemoteModelFile, + UnknownMetadataException, +) +from .fetch_base import ModelMetadataFetchBase + +HF_MODEL_RE = r"https?://huggingface.co/([\w\-.]+/[\w\-.]+)" + + +class HuggingFaceMetadataFetch(ModelMetadataFetchBase): + """Fetch model metadata from HuggingFace.""" + + def __init__(self, session: Optional[Session] = None): + """ + Initialize the fetcher with an optional requests.sessions.Session object. + + By providing a configurable Session object, we can support unit tests on + this module without an internet connection. + """ + self._requests = session or requests.Session() + configure_http_backend(backend_factory=lambda: self._requests) + + @classmethod + def from_json(cls, json: str) -> HuggingFaceMetadata: + """Given the JSON representation of the metadata, return the corresponding Pydantic object.""" + metadata = HuggingFaceMetadata.model_validate_json(json) + return metadata + + def from_id(self, id: str) -> AnyModelRepoMetadata: + """Return a HuggingFaceMetadata object given the model's repo_id.""" + try: + model_info = HfApi().model_info(repo_id=id, files_metadata=True) + except RepositoryNotFoundError as excp: + raise UnknownMetadataException(f"'{id}' not found. See trace for details.") from excp + + _, name = id.split("/") + return HuggingFaceMetadata( + id=model_info.id, + author=model_info.author, + name=name, + last_modified=model_info.last_modified, + tag_dict=model_info.card_data.to_dict() if model_info.card_data else {}, + tags=model_info.tags, + files=[ + RemoteModelFile( + url=hf_hub_url(id, x.rfilename), + path=Path(name, x.rfilename), + size=x.size, + sha256=x.lfs.get("sha256") if x.lfs else None, + ) + for x in model_info.siblings + ], + ) + + def from_url(self, url: AnyHttpUrl) -> AnyModelRepoMetadata: + """ + Return a HuggingFaceMetadata object given the model's web page URL. + + In the case of an invalid or missing URL, raises a ModelNotFound exception. + """ + if match := re.match(HF_MODEL_RE, str(url), re.IGNORECASE): + repo_id = match.group(1) + return self.from_id(repo_id) + else: + raise UnknownMetadataException(f"'{url}' does not look like a HuggingFace model page") diff --git a/invokeai/backend/model_manager/metadata/metadata_base.py b/invokeai/backend/model_manager/metadata/metadata_base.py new file mode 100644 index 0000000000..5aa883d26d --- /dev/null +++ b/invokeai/backend/model_manager/metadata/metadata_base.py @@ -0,0 +1,202 @@ +# Copyright (c) 2023 Lincoln D. Stein and the InvokeAI Development Team + +"""This module defines core text-to-image model metadata fields. + +Metadata comprises any descriptive information that is not essential +for getting the model to run. For example "author" is metadata, while +"type", "base" and "format" are not. The latter fields are part of the +model's config, as defined in invokeai.backend.model_manager.config. + +Note that the "name" and "description" are also present in `config` +records. This is intentional. The config record fields are intended to +be editable by the user as a form of customization. The metadata +versions of these fields are intended to be kept in sync with the +remote repo. +""" + +from datetime import datetime +from enum import Enum +from pathlib import Path +from typing import Any, Dict, List, Literal, Optional, Set, Tuple, Union + +from huggingface_hub import configure_http_backend, hf_hub_url +from pydantic import BaseModel, Field, TypeAdapter +from pydantic.networks import AnyHttpUrl +from requests.sessions import Session +from typing_extensions import Annotated + +from invokeai.backend.model_manager import ModelRepoVariant + +from ..util import select_hf_files + + +class UnknownMetadataException(Exception): + """Raised when no metadata is available for a model.""" + + +class CommercialUsage(str, Enum): + """Type of commercial usage allowed.""" + + No = "None" + Image = "Image" + Rent = "Rent" + RentCivit = "RentCivit" + Sell = "Sell" + + +class LicenseRestrictions(BaseModel): + """Broad categories of licensing restrictions.""" + + AllowNoCredit: bool = Field( + description="if true, model can be redistributed without crediting author", default=False + ) + AllowDerivatives: bool = Field(description="if true, derivatives of this model can be redistributed", default=False) + AllowDifferentLicense: bool = Field( + description="if true, derivatives of this model be redistributed under a different license", default=False + ) + AllowCommercialUse: CommercialUsage = Field( + description="Type of commercial use allowed or 'No' if no commercial use is allowed.", default_factory=set + ) + + +class RemoteModelFile(BaseModel): + """Information about a downloadable file that forms part of a model.""" + + url: AnyHttpUrl = Field(description="The url to download this model file") + path: Path = Field(description="The path to the file, relative to the model root") + size: int = Field(description="The size of this file, in bytes") + sha256: Optional[str] = Field(description="SHA256 hash of this model (not always available)", default=None) + + +class ModelMetadataBase(BaseModel): + """Base class for model metadata information.""" + + name: str = Field(description="model's name") + author: str = Field(description="model's author") + tags: Set[str] = Field(description="tags provided by model source") + + +class BaseMetadata(ModelMetadataBase): + """Adds typing data for discriminated union.""" + + type: Literal["basemetadata"] = "basemetadata" + + +class ModelMetadataWithFiles(ModelMetadataBase): + """Base class for metadata that contains a list of downloadable model file(s).""" + + files: List[RemoteModelFile] = Field(description="model files and their sizes", default_factory=list) + + def download_urls( + self, + variant: Optional[ModelRepoVariant] = None, + subfolder: Optional[Path] = None, + session: Optional[Session] = None, + ) -> List[RemoteModelFile]: + """ + Return a list of URLs needed to download the model. + + :param variant: Return files needed to reconstruct the indicated variant (e.g. ModelRepoVariant('fp16')) + :param subfolder: Return files in the designated subfolder only + :param session: A request.Session object for offline testing + + Note that the "variant" and "subfolder" concepts currently only apply to HuggingFace. + However Civitai does have fields for the precision and format of its models, and may + provide variant selection criteria in the future. + """ + return self.files + + +class CivitaiMetadata(ModelMetadataWithFiles): + """Extended metadata fields provided by Civitai.""" + + type: Literal["civitai"] = "civitai" + id: int = Field(description="Civitai version identifier") + version_name: str = Field(description="Version identifier, such as 'V2-alpha'") + version_id: int = Field(description="Civitai model version identifier") + created: datetime = Field(description="date the model was created") + updated: datetime = Field(description="date the model was last modified") + published: datetime = Field(description="date the model was published to Civitai") + description: str = Field(description="text description of model; may contain HTML") + version_description: str = Field( + description="text description of the model's reversion; usually change history; may contain HTML" + ) + nsfw: bool = Field(description="whether the model tends to generate NSFW content", default=False) + restrictions: LicenseRestrictions = Field(description="license terms", default_factory=LicenseRestrictions) + trained_words: Set[str] = Field(description="words to trigger the model", default_factory=set) + download_url: AnyHttpUrl = Field(description="download URL for this model") + base_model_trained_on: str = Field(description="base model on which this model was trained (currently not an enum)") + thumbnail_url: Optional[AnyHttpUrl] = Field(description="a thumbnail image for this model", default=None) + weight_minmax: Tuple[float, float] = Field( + description="minimum and maximum slider values for a LoRA or other secondary model", default=(-1.0, +2.0) + ) # note: For future use + + @property + def credit_required(self) -> bool: + """Return True if you must give credit for derivatives of this model and images generated from it.""" + return not self.restrictions.AllowNoCredit + + @property + def allow_commercial_use(self) -> bool: + """Return True if commercial use is allowed.""" + return self.restrictions.AllowCommercialUse != CommercialUsage("None") + + @property + def allow_derivatives(self) -> bool: + """Return True if derivatives of this model can be redistributed.""" + return self.restrictions.AllowDerivatives + + @property + def allow_different_license(self) -> bool: + """Return true if derivatives of this model can use a different license.""" + return self.restrictions.AllowDifferentLicense + + +class HuggingFaceMetadata(ModelMetadataWithFiles): + """Extended metadata fields provided by HuggingFace.""" + + type: Literal["huggingface"] = "huggingface" + id: str = Field(description="huggingface model id") + tag_dict: Dict[str, Any] + last_modified: datetime = Field(description="date of last commit to repo") + + def download_urls( + self, + variant: Optional[ModelRepoVariant] = None, + subfolder: Optional[Path] = None, + session: Optional[Session] = None, + ) -> List[RemoteModelFile]: + """ + Return list of downloadable files, filtering by variant and subfolder, if any. + + :param variant: Return model files needed to reconstruct the indicated variant + :param subfolder: Return model files from the designated subfolder only + :param session: A request.Session object used for internet-free testing + + Note that there is special variant-filtering behavior here: + When the fp16 variant is requested and not available, the + full-precision model is returned. + """ + session = session or Session() + configure_http_backend(backend_factory=lambda: session) # used in testing + + paths = select_hf_files.filter_files( + [x.path for x in self.files], variant, subfolder + ) # all files in the model + prefix = f"{subfolder}/" if subfolder else "" + + # the next step reads model_index.json to determine which subdirectories belong + # to the model + if Path(f"{prefix}model_index.json") in paths: + url = hf_hub_url(self.id, filename="model_index.json", subfolder=subfolder) + resp = session.get(url) + resp.raise_for_status() + submodels = resp.json() + paths = [Path(subfolder or "", x) for x in paths if Path(x).parent.as_posix() in submodels] + paths.insert(0, Path(f"{prefix}model_index.json")) + + return [x for x in self.files if x.path in paths] + + +AnyModelRepoMetadata = Annotated[Union[BaseMetadata, HuggingFaceMetadata, CivitaiMetadata], Field(discriminator="type")] +AnyModelRepoMetadataValidator = TypeAdapter(AnyModelRepoMetadata) diff --git a/invokeai/backend/model_manager/metadata/metadata_store.py b/invokeai/backend/model_manager/metadata/metadata_store.py new file mode 100644 index 0000000000..684409fc3b --- /dev/null +++ b/invokeai/backend/model_manager/metadata/metadata_store.py @@ -0,0 +1,221 @@ +# Copyright (c) 2023 Lincoln D. Stein and the InvokeAI Development Team +""" +SQL Storage for Model Metadata +""" + +import sqlite3 +from typing import List, Optional, Set, Tuple + +from invokeai.app.services.shared.sqlite.sqlite_database import SqliteDatabase + +from .fetch import ModelMetadataFetchBase +from .metadata_base import AnyModelRepoMetadata, UnknownMetadataException + + +class ModelMetadataStore: + """Store, search and fetch model metadata retrieved from remote repositories.""" + + def __init__(self, db: SqliteDatabase): + """ + Initialize a new object from preexisting sqlite3 connection and threading lock objects. + + :param conn: sqlite3 connection object + :param lock: threading Lock object + """ + super().__init__() + self._db = db + self._cursor = self._db.conn.cursor() + + def add_metadata(self, model_key: str, metadata: AnyModelRepoMetadata) -> None: + """ + Add a block of repo metadata to a model record. + + The model record config must already exist in the database with the + same key. Otherwise a FOREIGN KEY constraint exception will be raised. + + :param model_key: Existing model key in the `model_config` table + :param metadata: ModelRepoMetadata object to store + """ + json_serialized = metadata.model_dump_json() + with self._db.lock: + try: + self._cursor.execute( + """--sql + INSERT INTO model_metadata( + id, + metadata + ) + VALUES (?,?); + """, + ( + model_key, + json_serialized, + ), + ) + self._update_tags(model_key, metadata.tags) + self._db.conn.commit() + except sqlite3.IntegrityError as excp: # FOREIGN KEY error: the key was not in model_config table + self._db.conn.rollback() + raise UnknownMetadataException from excp + except sqlite3.Error as excp: + self._db.conn.rollback() + raise excp + + def get_metadata(self, model_key: str) -> AnyModelRepoMetadata: + """Retrieve the ModelRepoMetadata corresponding to model key.""" + with self._db.lock: + self._cursor.execute( + """--sql + SELECT metadata FROM model_metadata + WHERE id=?; + """, + (model_key,), + ) + rows = self._cursor.fetchone() + if not rows: + raise UnknownMetadataException("model metadata not found") + return ModelMetadataFetchBase.from_json(rows[0]) + + def list_all_metadata(self) -> List[Tuple[str, AnyModelRepoMetadata]]: # key, metadata + """Dump out all the metadata.""" + with self._db.lock: + self._cursor.execute( + """--sql + SELECT id,metadata FROM model_metadata; + """, + (), + ) + rows = self._cursor.fetchall() + return [(x[0], ModelMetadataFetchBase.from_json(x[1])) for x in rows] + + def update_metadata(self, model_key: str, metadata: AnyModelRepoMetadata) -> AnyModelRepoMetadata: + """ + Update metadata corresponding to the model with the indicated key. + + :param model_key: Existing model key in the `model_config` table + :param metadata: ModelRepoMetadata object to update + """ + json_serialized = metadata.model_dump_json() # turn it into a json string. + with self._db.lock: + try: + self._cursor.execute( + """--sql + UPDATE model_metadata + SET + metadata=? + WHERE id=?; + """, + (json_serialized, model_key), + ) + if self._cursor.rowcount == 0: + raise UnknownMetadataException("model metadata not found") + self._update_tags(model_key, metadata.tags) + self._db.conn.commit() + except sqlite3.Error as e: + self._db.conn.rollback() + raise e + + return self.get_metadata(model_key) + + def list_tags(self) -> Set[str]: + """Return all tags in the tags table.""" + self._cursor.execute( + """--sql + select tag_text from tags; + """ + ) + return {x[0] for x in self._cursor.fetchall()} + + def search_by_tag(self, tags: Set[str]) -> Set[str]: + """Return the keys of models containing all of the listed tags.""" + with self._db.lock: + try: + matches: Optional[Set[str]] = None + for tag in tags: + self._cursor.execute( + """--sql + SELECT a.model_id FROM model_tags AS a, + tags AS b + WHERE a.tag_id=b.tag_id + AND b.tag_text=?; + """, + (tag,), + ) + model_keys = {x[0] for x in self._cursor.fetchall()} + if matches is None: + matches = model_keys + matches = matches.intersection(model_keys) + except sqlite3.Error as e: + raise e + return matches if matches else set() + + def search_by_author(self, author: str) -> Set[str]: + """Return the keys of models authored by the indicated author.""" + self._cursor.execute( + """--sql + SELECT id FROM model_metadata + WHERE author=?; + """, + (author,), + ) + return {x[0] for x in self._cursor.fetchall()} + + def search_by_name(self, name: str) -> Set[str]: + """ + Return the keys of models with the indicated name. + + Note that this is the name of the model given to it by + the remote source. The user may have changed the local + name. The local name will be located in the model config + record object. + """ + self._cursor.execute( + """--sql + SELECT id FROM model_metadata + WHERE name=?; + """, + (name,), + ) + return {x[0] for x in self._cursor.fetchall()} + + def _update_tags(self, model_key: str, tags: Set[str]) -> None: + """Update tags for the model referenced by model_key.""" + # remove previous tags from this model + self._cursor.execute( + """--sql + DELETE FROM model_tags + WHERE model_id=?; + """, + (model_key,), + ) + + for tag in tags: + self._cursor.execute( + """--sql + INSERT OR IGNORE INTO tags ( + tag_text + ) + VALUES (?); + """, + (tag,), + ) + self._cursor.execute( + """--sql + SELECT tag_id + FROM tags + WHERE tag_text = ? + LIMIT 1; + """, + (tag,), + ) + tag_id = self._cursor.fetchone()[0] + self._cursor.execute( + """--sql + INSERT OR IGNORE INTO model_tags ( + model_id, + tag_id + ) + VALUES (?,?); + """, + (model_key, tag_id), + ) diff --git a/invokeai/backend/model_manager/migrate_to_db.py b/invokeai/backend/model_manager/migrate_to_db.py deleted file mode 100644 index e962a7c28b..0000000000 --- a/invokeai/backend/model_manager/migrate_to_db.py +++ /dev/null @@ -1,93 +0,0 @@ -# Copyright (c) 2023 Lincoln D. Stein -"""Migrate from the InvokeAI v2 models.yaml format to the v3 sqlite format.""" - -from hashlib import sha1 - -from omegaconf import DictConfig, OmegaConf -from pydantic import TypeAdapter - -from invokeai.app.services.config import InvokeAIAppConfig -from invokeai.app.services.model_records import ( - DuplicateModelException, - ModelRecordServiceSQL, -) -from invokeai.app.services.shared.sqlite import SqliteDatabase -from invokeai.backend.model_manager.config import ( - AnyModelConfig, - BaseModelType, - ModelType, -) -from invokeai.backend.model_manager.hash import FastModelHash -from invokeai.backend.util.logging import InvokeAILogger - -ModelsValidator = TypeAdapter(AnyModelConfig) - - -class MigrateModelYamlToDb: - """ - Migrate the InvokeAI models.yaml format (VERSION 3.0.0) to SQL3 database format (VERSION 3.2.0) - - The class has one externally useful method, migrate(), which scans the - currently models.yaml file and imports all its entries into invokeai.db. - - Use this way: - - from invokeai.backend.model_manager/migrate_to_db import MigrateModelYamlToDb - MigrateModelYamlToDb().migrate() - - """ - - config: InvokeAIAppConfig - logger: InvokeAILogger - - def __init__(self): - self.config = InvokeAIAppConfig.get_config() - self.config.parse_args() - self.logger = InvokeAILogger.get_logger() - - def get_db(self) -> ModelRecordServiceSQL: - """Fetch the sqlite3 database for this installation.""" - db = SqliteDatabase(self.config, self.logger) - return ModelRecordServiceSQL(db) - - def get_yaml(self) -> DictConfig: - """Fetch the models.yaml DictConfig for this installation.""" - yaml_path = self.config.model_conf_path - return OmegaConf.load(yaml_path) - - def migrate(self): - """Do the migration from models.yaml to invokeai.db.""" - db = self.get_db() - yaml = self.get_yaml() - - for model_key, stanza in yaml.items(): - if model_key == "__metadata__": - assert ( - stanza["version"] == "3.0.0" - ), f"This script works on version 3.0.0 yaml files, but your configuration points to a {stanza['version']} version" - continue - - base_type, model_type, model_name = str(model_key).split("/") - hash = FastModelHash.hash(self.config.models_path / stanza.path) - new_key = sha1(model_key.encode("utf-8")).hexdigest() - - stanza["base"] = BaseModelType(base_type) - stanza["type"] = ModelType(model_type) - stanza["name"] = model_name - stanza["original_hash"] = hash - stanza["current_hash"] = hash - - new_config = ModelsValidator.validate_python(stanza) - self.logger.info(f"Adding model {model_name} with key {model_key}") - try: - db.add_model(new_key, new_config) - except DuplicateModelException: - self.logger.warning(f"Model {model_name} is already in the database") - - -def main(): - MigrateModelYamlToDb().migrate() - - -if __name__ == "__main__": - main() diff --git a/invokeai/backend/model_manager/probe.py b/invokeai/backend/model_manager/probe.py new file mode 100644 index 0000000000..cd048d2fe7 --- /dev/null +++ b/invokeai/backend/model_manager/probe.py @@ -0,0 +1,686 @@ +import json +import re +from pathlib import Path +from typing import Any, Dict, Literal, Optional, Union + +import safetensors.torch +import torch +from picklescan.scanner import scan_file_path + +from invokeai.backend.model_management.models.base import read_checkpoint_meta +from invokeai.backend.model_management.models.ip_adapter import IPAdapterModelFormat +from invokeai.backend.model_management.util import lora_token_vector_length +from invokeai.backend.util.util import SilenceWarnings + +from .config import ( + AnyModelConfig, + BaseModelType, + InvalidModelConfigException, + ModelConfigFactory, + ModelFormat, + ModelType, + ModelVariantType, + SchedulerPredictionType, +) +from .hash import FastModelHash + +CkptType = Dict[str, Any] + +LEGACY_CONFIGS: Dict[BaseModelType, Dict[ModelVariantType, Union[str, Dict[SchedulerPredictionType, str]]]] = { + BaseModelType.StableDiffusion1: { + ModelVariantType.Normal: "v1-inference.yaml", + ModelVariantType.Inpaint: "v1-inpainting-inference.yaml", + }, + BaseModelType.StableDiffusion2: { + ModelVariantType.Normal: { + SchedulerPredictionType.Epsilon: "v2-inference.yaml", + SchedulerPredictionType.VPrediction: "v2-inference-v.yaml", + }, + ModelVariantType.Inpaint: { + SchedulerPredictionType.Epsilon: "v2-inpainting-inference.yaml", + SchedulerPredictionType.VPrediction: "v2-inpainting-inference-v.yaml", + }, + }, + BaseModelType.StableDiffusionXL: { + ModelVariantType.Normal: "sd_xl_base.yaml", + }, + BaseModelType.StableDiffusionXLRefiner: { + ModelVariantType.Normal: "sd_xl_refiner.yaml", + }, +} + + +class ProbeBase(object): + """Base class for probes.""" + + def __init__(self, model_path: Path): + self.model_path = model_path + + def get_base_type(self) -> BaseModelType: + """Get model base type.""" + raise NotImplementedError + + def get_format(self) -> ModelFormat: + """Get model file format.""" + raise NotImplementedError + + def get_variant_type(self) -> Optional[ModelVariantType]: + """Get model variant type.""" + return None + + def get_scheduler_prediction_type(self) -> Optional[SchedulerPredictionType]: + """Get model scheduler prediction type.""" + return None + + +class ModelProbe(object): + PROBES: Dict[str, Dict[ModelType, type[ProbeBase]]] = { + "diffusers": {}, + "checkpoint": {}, + "onnx": {}, + } + + CLASS2TYPE = { + "StableDiffusionPipeline": ModelType.Main, + "StableDiffusionInpaintPipeline": ModelType.Main, + "StableDiffusionXLPipeline": ModelType.Main, + "StableDiffusionXLImg2ImgPipeline": ModelType.Main, + "StableDiffusionXLInpaintPipeline": ModelType.Main, + "LatentConsistencyModelPipeline": ModelType.Main, + "AutoencoderKL": ModelType.Vae, + "AutoencoderTiny": ModelType.Vae, + "ControlNetModel": ModelType.ControlNet, + "CLIPVisionModelWithProjection": ModelType.CLIPVision, + "T2IAdapter": ModelType.T2IAdapter, + } + + @classmethod + def register_probe( + cls, format: Literal["diffusers", "checkpoint", "onnx"], model_type: ModelType, probe_class: type[ProbeBase] + ) -> None: + cls.PROBES[format][model_type] = probe_class + + @classmethod + def heuristic_probe( + cls, + model_path: Path, + fields: Optional[Dict[str, Any]] = None, + ) -> AnyModelConfig: + return cls.probe(model_path, fields) + + @classmethod + def probe( + cls, + model_path: Path, + fields: Optional[Dict[str, Any]] = None, + ) -> AnyModelConfig: + """ + Probe the model at model_path and return its configuration record. + + :param model_path: Path to the model file (checkpoint) or directory (diffusers). + :param fields: An optional dictionary that can be used to override probed + fields. Typically used for fields that don't probe well, such as prediction_type. + + Returns: The appropriate model configuration derived from ModelConfigBase. + """ + if fields is None: + fields = {} + + format_type = ModelFormat.Diffusers if model_path.is_dir() else ModelFormat.Checkpoint + model_info = None + model_type = None + if format_type == "diffusers": + model_type = cls.get_model_type_from_folder(model_path) + else: + model_type = cls.get_model_type_from_checkpoint(model_path) + format_type = ModelFormat.Onnx if model_type == ModelType.ONNX else format_type + + probe_class = cls.PROBES[format_type].get(model_type) + if not probe_class: + raise InvalidModelConfigException(f"Unhandled combination of {format_type} and {model_type}") + + hash = FastModelHash.hash(model_path) + probe = probe_class(model_path) + + fields["path"] = model_path.as_posix() + fields["type"] = fields.get("type") or model_type + fields["base"] = fields.get("base") or probe.get_base_type() + fields["variant"] = fields.get("variant") or probe.get_variant_type() + fields["prediction_type"] = fields.get("prediction_type") or probe.get_scheduler_prediction_type() + fields["name"] = fields.get("name") or cls.get_model_name(model_path) + fields["description"] = ( + fields.get("description") or f"{fields['base'].value} {fields['type'].value} model {fields['name']}" + ) + fields["format"] = fields.get("format") or probe.get_format() + fields["original_hash"] = fields.get("original_hash") or hash + fields["current_hash"] = fields.get("current_hash") or hash + + # additional fields needed for main and controlnet models + if fields["type"] in [ModelType.Main, ModelType.ControlNet] and fields["format"] == ModelFormat.Checkpoint: + fields["config"] = cls._get_checkpoint_config_path( + model_path, + model_type=fields["type"], + base_type=fields["base"], + variant_type=fields["variant"], + prediction_type=fields["prediction_type"], + ).as_posix() + + # additional fields needed for main non-checkpoint models + elif fields["type"] == ModelType.Main and fields["format"] in [ + ModelFormat.Onnx, + ModelFormat.Olive, + ModelFormat.Diffusers, + ]: + fields["upcast_attention"] = fields.get("upcast_attention") or ( + fields["base"] == BaseModelType.StableDiffusion2 + and fields["prediction_type"] == SchedulerPredictionType.VPrediction + ) + + model_info = ModelConfigFactory.make_config(fields) + return model_info + + @classmethod + def get_model_name(cls, model_path: Path) -> str: + if model_path.suffix in {".safetensors", ".bin", ".pt", ".ckpt"}: + return model_path.stem + else: + return model_path.name + + @classmethod + def get_model_type_from_checkpoint(cls, model_path: Path, checkpoint: Optional[CkptType] = None) -> ModelType: + if model_path.suffix not in (".bin", ".pt", ".ckpt", ".safetensors", ".pth"): + raise InvalidModelConfigException(f"{model_path}: unrecognized suffix") + + if model_path.name == "learned_embeds.bin": + return ModelType.TextualInversion + + ckpt = checkpoint if checkpoint else read_checkpoint_meta(model_path, scan=True) + ckpt = ckpt.get("state_dict", ckpt) + + for key in ckpt.keys(): + if any(key.startswith(v) for v in {"cond_stage_model.", "first_stage_model.", "model.diffusion_model."}): + return ModelType.Main + elif any(key.startswith(v) for v in {"encoder.conv_in", "decoder.conv_in"}): + return ModelType.Vae + elif any(key.startswith(v) for v in {"lora_te_", "lora_unet_"}): + return ModelType.Lora + elif any(key.endswith(v) for v in {"to_k_lora.up.weight", "to_q_lora.down.weight"}): + return ModelType.Lora + elif any(key.startswith(v) for v in {"control_model", "input_blocks"}): + return ModelType.ControlNet + elif key in {"emb_params", "string_to_param"}: + return ModelType.TextualInversion + + else: + # diffusers-ti + if len(ckpt) < 10 and all(isinstance(v, torch.Tensor) for v in ckpt.values()): + return ModelType.TextualInversion + + raise InvalidModelConfigException(f"Unable to determine model type for {model_path}") + + @classmethod + def get_model_type_from_folder(cls, folder_path: Path) -> ModelType: + """Get the model type of a hugging-face style folder.""" + class_name = None + error_hint = None + for suffix in ["bin", "safetensors"]: + if (folder_path / f"learned_embeds.{suffix}").exists(): + return ModelType.TextualInversion + if (folder_path / f"pytorch_lora_weights.{suffix}").exists(): + return ModelType.Lora + if (folder_path / "unet/model.onnx").exists(): + return ModelType.ONNX + if (folder_path / "image_encoder.txt").exists(): + return ModelType.IPAdapter + + i = folder_path / "model_index.json" + c = folder_path / "config.json" + config_path = i if i.exists() else c if c.exists() else None + + if config_path: + with open(config_path, "r") as file: + conf = json.load(file) + if "_class_name" in conf: + class_name = conf["_class_name"] + elif "architectures" in conf: + class_name = conf["architectures"][0] + else: + class_name = None + else: + error_hint = f"No model_index.json or config.json found in {folder_path}." + + if class_name and (type := cls.CLASS2TYPE.get(class_name)): + return type + else: + error_hint = f"class {class_name} is not one of the supported classes [{', '.join(cls.CLASS2TYPE.keys())}]" + + # give up + raise InvalidModelConfigException( + f"Unable to determine model type for {folder_path}" + (f"; {error_hint}" if error_hint else "") + ) + + @classmethod + def _get_checkpoint_config_path( + cls, + model_path: Path, + model_type: ModelType, + base_type: BaseModelType, + variant_type: ModelVariantType, + prediction_type: SchedulerPredictionType, + ) -> Path: + # look for a YAML file adjacent to the model file first + possible_conf = model_path.with_suffix(".yaml") + if possible_conf.exists(): + return possible_conf.absolute() + + if model_type == ModelType.Main: + config_file = LEGACY_CONFIGS[base_type][variant_type] + if isinstance(config_file, dict): # need another tier for sd-2.x models + config_file = config_file[prediction_type] + elif model_type == ModelType.ControlNet: + config_file = ( + "../controlnet/cldm_v15.yaml" if base_type == BaseModelType("sd-1") else "../controlnet/cldm_v21.yaml" + ) + else: + raise InvalidModelConfigException( + f"{model_path}: Unrecognized combination of model_type={model_type}, base_type={base_type}" + ) + assert isinstance(config_file, str) + return Path(config_file) + + @classmethod + def _scan_and_load_checkpoint(cls, model_path: Path) -> CkptType: + with SilenceWarnings(): + if model_path.suffix.endswith((".ckpt", ".pt", ".bin")): + cls._scan_model(model_path.name, model_path) + model = torch.load(model_path) + assert isinstance(model, dict) + return model + else: + return safetensors.torch.load_file(model_path) + + @classmethod + def _scan_model(cls, model_name: str, checkpoint: Path) -> None: + """ + Apply picklescanner to the indicated checkpoint and issue a warning + and option to exit if an infected file is identified. + """ + # scan model + scan_result = scan_file_path(checkpoint) + if scan_result.infected_files != 0: + raise Exception("The model {model_name} is potentially infected by malware. Aborting import.") + + +# ##################################################3 +# Checkpoint probing +# ##################################################3 + + +class CheckpointProbeBase(ProbeBase): + def __init__(self, model_path: Path): + super().__init__(model_path) + self.checkpoint = ModelProbe._scan_and_load_checkpoint(model_path) + + def get_format(self) -> ModelFormat: + return ModelFormat("checkpoint") + + def get_variant_type(self) -> ModelVariantType: + model_type = ModelProbe.get_model_type_from_checkpoint(self.model_path, self.checkpoint) + if model_type != ModelType.Main: + return ModelVariantType.Normal + state_dict = self.checkpoint.get("state_dict") or self.checkpoint + in_channels = state_dict["model.diffusion_model.input_blocks.0.0.weight"].shape[1] + if in_channels == 9: + return ModelVariantType.Inpaint + elif in_channels == 5: + return ModelVariantType.Depth + elif in_channels == 4: + return ModelVariantType.Normal + else: + raise InvalidModelConfigException( + f"Cannot determine variant type (in_channels={in_channels}) at {self.model_path}" + ) + + +class PipelineCheckpointProbe(CheckpointProbeBase): + def get_base_type(self) -> BaseModelType: + checkpoint = self.checkpoint + state_dict = self.checkpoint.get("state_dict") or checkpoint + key_name = "model.diffusion_model.input_blocks.2.1.transformer_blocks.0.attn2.to_k.weight" + if key_name in state_dict and state_dict[key_name].shape[-1] == 768: + return BaseModelType.StableDiffusion1 + if key_name in state_dict and state_dict[key_name].shape[-1] == 1024: + return BaseModelType.StableDiffusion2 + key_name = "model.diffusion_model.input_blocks.4.1.transformer_blocks.0.attn2.to_k.weight" + if key_name in state_dict and state_dict[key_name].shape[-1] == 2048: + return BaseModelType.StableDiffusionXL + elif key_name in state_dict and state_dict[key_name].shape[-1] == 1280: + return BaseModelType.StableDiffusionXLRefiner + else: + raise InvalidModelConfigException("Cannot determine base type") + + def get_scheduler_prediction_type(self) -> SchedulerPredictionType: + """Return model prediction type.""" + type = self.get_base_type() + if type == BaseModelType.StableDiffusion2: + checkpoint = self.checkpoint + state_dict = self.checkpoint.get("state_dict") or checkpoint + key_name = "model.diffusion_model.input_blocks.2.1.transformer_blocks.0.attn2.to_k.weight" + if key_name in state_dict and state_dict[key_name].shape[-1] == 1024: + if "global_step" in checkpoint: + if checkpoint["global_step"] == 220000: + return SchedulerPredictionType.Epsilon + elif checkpoint["global_step"] == 110000: + return SchedulerPredictionType.VPrediction + return SchedulerPredictionType.VPrediction # a guess for sd2 ckpts + + elif type == BaseModelType.StableDiffusion1: + return SchedulerPredictionType.Epsilon # a reasonable guess for sd1 ckpts + else: + return SchedulerPredictionType.Epsilon + + +class VaeCheckpointProbe(CheckpointProbeBase): + def get_base_type(self) -> BaseModelType: + # I can't find any standalone 2.X VAEs to test with! + return BaseModelType.StableDiffusion1 + + +class LoRACheckpointProbe(CheckpointProbeBase): + """Class for LoRA checkpoints.""" + + def get_format(self) -> ModelFormat: + return ModelFormat("lycoris") + + def get_base_type(self) -> BaseModelType: + checkpoint = self.checkpoint + token_vector_length = lora_token_vector_length(checkpoint) + + if token_vector_length == 768: + return BaseModelType.StableDiffusion1 + elif token_vector_length == 1024: + return BaseModelType.StableDiffusion2 + elif token_vector_length == 1280: + return BaseModelType.StableDiffusionXL # recognizes format at https://civitai.com/models/224641 + elif token_vector_length == 2048: + return BaseModelType.StableDiffusionXL + else: + raise InvalidModelConfigException(f"Unknown LoRA type: {self.model_path}") + + +class TextualInversionCheckpointProbe(CheckpointProbeBase): + """Class for probing embeddings.""" + + def get_format(self) -> ModelFormat: + return ModelFormat.EmbeddingFile + + def get_base_type(self) -> BaseModelType: + checkpoint = self.checkpoint + if "string_to_token" in checkpoint: + token_dim = list(checkpoint["string_to_param"].values())[0].shape[-1] + elif "emb_params" in checkpoint: + token_dim = checkpoint["emb_params"].shape[-1] + elif "clip_g" in checkpoint: + token_dim = checkpoint["clip_g"].shape[-1] + else: + token_dim = list(checkpoint.values())[0].shape[0] + if token_dim == 768: + return BaseModelType.StableDiffusion1 + elif token_dim == 1024: + return BaseModelType.StableDiffusion2 + elif token_dim == 1280: + return BaseModelType.StableDiffusionXL + else: + raise InvalidModelConfigException(f"{self.model_path}: Could not determine base type") + + +class ControlNetCheckpointProbe(CheckpointProbeBase): + """Class for probing controlnets.""" + + def get_base_type(self) -> BaseModelType: + checkpoint = self.checkpoint + for key_name in ( + "control_model.input_blocks.2.1.transformer_blocks.0.attn2.to_k.weight", + "input_blocks.2.1.transformer_blocks.0.attn2.to_k.weight", + ): + if key_name not in checkpoint: + continue + if checkpoint[key_name].shape[-1] == 768: + return BaseModelType.StableDiffusion1 + elif checkpoint[key_name].shape[-1] == 1024: + return BaseModelType.StableDiffusion2 + raise InvalidModelConfigException("{self.model_path}: Unable to determine base type") + + +class IPAdapterCheckpointProbe(CheckpointProbeBase): + def get_base_type(self) -> BaseModelType: + raise NotImplementedError() + + +class CLIPVisionCheckpointProbe(CheckpointProbeBase): + def get_base_type(self) -> BaseModelType: + raise NotImplementedError() + + +class T2IAdapterCheckpointProbe(CheckpointProbeBase): + def get_base_type(self) -> BaseModelType: + raise NotImplementedError() + + +######################################################## +# classes for probing folders +####################################################### +class FolderProbeBase(ProbeBase): + def get_variant_type(self) -> ModelVariantType: + return ModelVariantType.Normal + + def get_format(self) -> ModelFormat: + return ModelFormat("diffusers") + + +class PipelineFolderProbe(FolderProbeBase): + def get_base_type(self) -> BaseModelType: + with open(self.model_path / "unet" / "config.json", "r") as file: + unet_conf = json.load(file) + if unet_conf["cross_attention_dim"] == 768: + return BaseModelType.StableDiffusion1 + elif unet_conf["cross_attention_dim"] == 1024: + return BaseModelType.StableDiffusion2 + elif unet_conf["cross_attention_dim"] == 1280: + return BaseModelType.StableDiffusionXLRefiner + elif unet_conf["cross_attention_dim"] == 2048: + return BaseModelType.StableDiffusionXL + else: + raise InvalidModelConfigException(f"Unknown base model for {self.model_path}") + + def get_scheduler_prediction_type(self) -> SchedulerPredictionType: + with open(self.model_path / "scheduler" / "scheduler_config.json", "r") as file: + scheduler_conf = json.load(file) + if scheduler_conf.get("prediction_type", "epsilon") == "v_prediction": + return SchedulerPredictionType.VPrediction + elif scheduler_conf.get("prediction_type", "epsilon") == "epsilon": + return SchedulerPredictionType.Epsilon + else: + raise InvalidModelConfigException("Unknown scheduler prediction type: {scheduler_conf['prediction_type']}") + + def get_variant_type(self) -> ModelVariantType: + # This only works for pipelines! Any kind of + # exception results in our returning the + # "normal" variant type + try: + config_file = self.model_path / "unet" / "config.json" + with open(config_file, "r") as file: + conf = json.load(file) + + in_channels = conf["in_channels"] + if in_channels == 9: + return ModelVariantType.Inpaint + elif in_channels == 5: + return ModelVariantType.Depth + elif in_channels == 4: + return ModelVariantType.Normal + except Exception: + pass + return ModelVariantType.Normal + + +class VaeFolderProbe(FolderProbeBase): + def get_base_type(self) -> BaseModelType: + if self._config_looks_like_sdxl(): + return BaseModelType.StableDiffusionXL + elif self._name_looks_like_sdxl(): + # but SD and SDXL VAE are the same shape (3-channel RGB to 4-channel float scaled down + # by a factor of 8), we can't necessarily tell them apart by config hyperparameters. + return BaseModelType.StableDiffusionXL + else: + return BaseModelType.StableDiffusion1 + + def _config_looks_like_sdxl(self) -> bool: + # config values that distinguish Stability's SD 1.x VAE from their SDXL VAE. + config_file = self.model_path / "config.json" + if not config_file.exists(): + raise InvalidModelConfigException(f"Cannot determine base type for {self.model_path}") + with open(config_file, "r") as file: + config = json.load(file) + return config.get("scaling_factor", 0) == 0.13025 and config.get("sample_size") in [512, 1024] + + def _name_looks_like_sdxl(self) -> bool: + return bool(re.search(r"xl\b", self._guess_name(), re.IGNORECASE)) + + def _guess_name(self) -> str: + name = self.model_path.name + if name == "vae": + name = self.model_path.parent.name + return name + + +class TextualInversionFolderProbe(FolderProbeBase): + def get_format(self) -> ModelFormat: + return ModelFormat.EmbeddingFolder + + def get_base_type(self) -> BaseModelType: + path = self.model_path / "learned_embeds.bin" + if not path.exists(): + raise InvalidModelConfigException( + f"{self.model_path.as_posix()} does not contain expected 'learned_embeds.bin' file" + ) + return TextualInversionCheckpointProbe(path).get_base_type() + + +class ONNXFolderProbe(FolderProbeBase): + def get_format(self) -> ModelFormat: + return ModelFormat("onnx") + + def get_base_type(self) -> BaseModelType: + return BaseModelType.StableDiffusion1 + + def get_variant_type(self) -> ModelVariantType: + return ModelVariantType.Normal + + +class ControlNetFolderProbe(FolderProbeBase): + def get_base_type(self) -> BaseModelType: + config_file = self.model_path / "config.json" + if not config_file.exists(): + raise InvalidModelConfigException(f"Cannot determine base type for {self.model_path}") + with open(config_file, "r") as file: + config = json.load(file) + # no obvious way to distinguish between sd2-base and sd2-768 + dimension = config["cross_attention_dim"] + base_model = ( + BaseModelType.StableDiffusion1 + if dimension == 768 + else ( + BaseModelType.StableDiffusion2 + if dimension == 1024 + else BaseModelType.StableDiffusionXL + if dimension == 2048 + else None + ) + ) + if not base_model: + raise InvalidModelConfigException(f"Unable to determine model base for {self.model_path}") + return base_model + + +class LoRAFolderProbe(FolderProbeBase): + def get_base_type(self) -> BaseModelType: + model_file = None + for suffix in ["safetensors", "bin"]: + base_file = self.model_path / f"pytorch_lora_weights.{suffix}" + if base_file.exists(): + model_file = base_file + break + if not model_file: + raise InvalidModelConfigException("Unknown LoRA format encountered") + return LoRACheckpointProbe(model_file).get_base_type() + + +class IPAdapterFolderProbe(FolderProbeBase): + def get_format(self) -> IPAdapterModelFormat: + return IPAdapterModelFormat.InvokeAI.value + + def get_base_type(self) -> BaseModelType: + model_file = self.model_path / "ip_adapter.bin" + if not model_file.exists(): + raise InvalidModelConfigException("Unknown IP-Adapter model format.") + + state_dict = torch.load(model_file, map_location="cpu") + cross_attention_dim = state_dict["ip_adapter"]["1.to_k_ip.weight"].shape[-1] + if cross_attention_dim == 768: + return BaseModelType.StableDiffusion1 + elif cross_attention_dim == 1024: + return BaseModelType.StableDiffusion2 + elif cross_attention_dim == 2048: + return BaseModelType.StableDiffusionXL + else: + raise InvalidModelConfigException( + f"IP-Adapter had unexpected cross-attention dimension: {cross_attention_dim}." + ) + + +class CLIPVisionFolderProbe(FolderProbeBase): + def get_base_type(self) -> BaseModelType: + return BaseModelType.Any + + +class T2IAdapterFolderProbe(FolderProbeBase): + def get_base_type(self) -> BaseModelType: + config_file = self.model_path / "config.json" + if not config_file.exists(): + raise InvalidModelConfigException(f"Cannot determine base type for {self.model_path}") + with open(config_file, "r") as file: + config = json.load(file) + + adapter_type = config.get("adapter_type", None) + if adapter_type == "full_adapter_xl": + return BaseModelType.StableDiffusionXL + elif adapter_type == "full_adapter" or "light_adapter": + # I haven't seen any T2I adapter models for SD2, so assume that this is an SD1 adapter. + return BaseModelType.StableDiffusion1 + else: + raise InvalidModelConfigException( + f"Unable to determine base model for '{self.model_path}' (adapter_type = {adapter_type})." + ) + + +############## register probe classes ###### +ModelProbe.register_probe("diffusers", ModelType.Main, PipelineFolderProbe) +ModelProbe.register_probe("diffusers", ModelType.Vae, VaeFolderProbe) +ModelProbe.register_probe("diffusers", ModelType.Lora, LoRAFolderProbe) +ModelProbe.register_probe("diffusers", ModelType.TextualInversion, TextualInversionFolderProbe) +ModelProbe.register_probe("diffusers", ModelType.ControlNet, ControlNetFolderProbe) +ModelProbe.register_probe("diffusers", ModelType.IPAdapter, IPAdapterFolderProbe) +ModelProbe.register_probe("diffusers", ModelType.CLIPVision, CLIPVisionFolderProbe) +ModelProbe.register_probe("diffusers", ModelType.T2IAdapter, T2IAdapterFolderProbe) + +ModelProbe.register_probe("checkpoint", ModelType.Main, PipelineCheckpointProbe) +ModelProbe.register_probe("checkpoint", ModelType.Vae, VaeCheckpointProbe) +ModelProbe.register_probe("checkpoint", ModelType.Lora, LoRACheckpointProbe) +ModelProbe.register_probe("checkpoint", ModelType.TextualInversion, TextualInversionCheckpointProbe) +ModelProbe.register_probe("checkpoint", ModelType.ControlNet, ControlNetCheckpointProbe) +ModelProbe.register_probe("checkpoint", ModelType.IPAdapter, IPAdapterCheckpointProbe) +ModelProbe.register_probe("checkpoint", ModelType.CLIPVision, CLIPVisionCheckpointProbe) +ModelProbe.register_probe("checkpoint", ModelType.T2IAdapter, T2IAdapterCheckpointProbe) + +ModelProbe.register_probe("onnx", ModelType.ONNX, ONNXFolderProbe) diff --git a/invokeai/backend/model_manager/search.py b/invokeai/backend/model_manager/search.py new file mode 100644 index 0000000000..4cc3caebe4 --- /dev/null +++ b/invokeai/backend/model_manager/search.py @@ -0,0 +1,190 @@ +# Copyright 2023, Lincoln D. Stein and the InvokeAI Team +""" +Abstract base class and implementation for recursive directory search for models. + +Example usage: +``` + from invokeai.backend.model_manager import ModelSearch, ModelProbe + + def find_main_models(model: Path) -> bool: + info = ModelProbe.probe(model) + if info.model_type == 'main' and info.base_type == 'sd-1': + return True + else: + return False + + search = ModelSearch(on_model_found=report_it) + found = search.search('/tmp/models') + print(found) # list of matching model paths + print(search.stats) # search stats +``` +""" + +import os +from abc import ABC, abstractmethod +from pathlib import Path +from typing import Callable, Optional, Set, Union + +from pydantic import BaseModel, Field + +from invokeai.backend.util.logging import InvokeAILogger + +default_logger = InvokeAILogger.get_logger() + + +class SearchStats(BaseModel): + items_scanned: int = 0 + models_found: int = 0 + models_filtered: int = 0 + + +class ModelSearchBase(ABC, BaseModel): + """ + Abstract directory traversal model search class + + Usage: + search = ModelSearchBase( + on_search_started = search_started_callback, + on_search_completed = search_completed_callback, + on_model_found = model_found_callback, + ) + models_found = search.search('/path/to/directory') + """ + + # fmt: off + on_search_started : Optional[Callable[[Path], None]] = Field(default=None, description="Called just before the search starts.") # noqa E221 + on_model_found : Optional[Callable[[Path], bool]] = Field(default=None, description="Called when a model is found.") # noqa E221 + on_search_completed : Optional[Callable[[Set[Path]], None]] = Field(default=None, description="Called when search is complete.") # noqa E221 + stats : SearchStats = Field(default_factory=SearchStats, description="Summary statistics after search") # noqa E221 + logger : InvokeAILogger = Field(default=default_logger, description="Logger instance.") # noqa E221 + # fmt: on + + class Config: + arbitrary_types_allowed = True + + @abstractmethod + def search_started(self) -> None: + """ + Called before the scan starts. + + Passes the root search directory to the Callable `on_search_started`. + """ + pass + + @abstractmethod + def model_found(self, model: Path) -> None: + """ + Called when a model is found during search. + + :param model: Model to process - could be a directory or checkpoint. + + Passes the model's Path to the Callable `on_model_found`. + This Callable receives the path to the model and returns a boolean + to indicate whether the model should be returned in the search + results. + """ + pass + + @abstractmethod + def search_completed(self) -> None: + """ + Called before the scan starts. + + Passes the Set of found model Paths to the Callable `on_search_completed`. + """ + pass + + @abstractmethod + def search(self, directory: Union[Path, str]) -> Set[Path]: + """ + Recursively search for models in `directory` and return a set of model paths. + + If provided, the `on_search_started`, `on_model_found` and `on_search_completed` + Callables will be invoked during the search. + """ + pass + + +class ModelSearch(ModelSearchBase): + """ + Implementation of ModelSearch with callbacks. + Usage: + search = ModelSearch() + search.model_found = lambda path : 'anime' in path.as_posix() + found = search.list_models(['/tmp/models1','/tmp/models2']) + # returns all models that have 'anime' in the path + """ + + models_found: Set[Path] = Field(default=None) + scanned_dirs: Set[Path] = Field(default=None) + pruned_paths: Set[Path] = Field(default=None) + + def search_started(self) -> None: + self.models_found = set() + self.scanned_dirs = set() + self.pruned_paths = set() + if self.on_search_started: + self.on_search_started(self._directory) + + def model_found(self, model: Path) -> None: + self.stats.models_found += 1 + if not self.on_model_found or self.on_model_found(model): + self.stats.models_filtered += 1 + self.models_found.add(model) + + def search_completed(self) -> None: + if self.on_search_completed: + self.on_search_completed(self._models_found) + + def search(self, directory: Union[Path, str]) -> Set[Path]: + self._directory = Path(directory) + self.stats = SearchStats() # zero out + self.search_started() # This will initialize _models_found to empty + self._walk_directory(directory) + self.search_completed() + return self.models_found + + def _walk_directory(self, path: Union[Path, str]) -> None: + for root, dirs, files in os.walk(path, followlinks=True): + # don't descend into directories that start with a "." + # to avoid the Mac .DS_STORE issue. + if str(Path(root).name).startswith("."): + self.pruned_paths.add(Path(root)) + if any(Path(root).is_relative_to(x) for x in self.pruned_paths): + continue + + self.stats.items_scanned += len(dirs) + len(files) + for d in dirs: + path = Path(root) / d + if path.parent in self.scanned_dirs: + self.scanned_dirs.add(path) + continue + if any( + (path / x).exists() + for x in [ + "config.json", + "model_index.json", + "learned_embeds.bin", + "pytorch_lora_weights.bin", + "image_encoder.txt", + ] + ): + self.scanned_dirs.add(path) + try: + self.model_found(path) + except KeyboardInterrupt: + raise + except Exception as e: + self.logger.warning(str(e)) + + for f in files: + path = Path(root) / f + if path.parent in self.scanned_dirs: + continue + if path.suffix in {".ckpt", ".bin", ".pth", ".safetensors", ".pt"}: + try: + self.model_found(path) + except KeyboardInterrupt: + raise + except Exception as e: + self.logger.warning(str(e)) diff --git a/invokeai/backend/model_manager/util/select_hf_files.py b/invokeai/backend/model_manager/util/select_hf_files.py new file mode 100644 index 0000000000..6976059044 --- /dev/null +++ b/invokeai/backend/model_manager/util/select_hf_files.py @@ -0,0 +1,132 @@ +# Copyright (c) 2023 Lincoln D. Stein and the InvokeAI Development Team +""" +Select the files from a HuggingFace repository needed for a particular model variant. + +Usage: +``` +from invokeai.backend.model_manager.util.select_hf_files import select_hf_model_files +from invokeai.backend.model_manager.metadata.fetch import HuggingFaceMetadataFetch + +metadata = HuggingFaceMetadataFetch().from_url("https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0") +files_to_download = select_hf_model_files(metadata.files, variant='onnx') +``` +""" + +import re +from pathlib import Path +from typing import Dict, List, Optional, Set + +from ..config import ModelRepoVariant + + +def filter_files( + files: List[Path], + variant: Optional[ModelRepoVariant] = None, + subfolder: Optional[Path] = None, +) -> List[Path]: + """ + Take a list of files in a HuggingFace repo root and return paths to files needed to load the model. + + :param files: List of files relative to the repo root. + :param subfolder: Filter by the indicated subfolder. + :param variant: Filter by files belonging to a particular variant, such as fp16. + + The file list can be obtained from the `files` field of HuggingFaceMetadata, + as defined in `invokeai.backend.model_manager.metadata.metadata_base`. + """ + variant = variant or ModelRepoVariant.DEFAULT + paths: List[Path] = [] + + # Start by filtering on model file extensions, discarding images, docs, etc + for file in files: + if file.name.endswith((".json", ".txt")): + paths.append(file) + elif file.name.endswith(("learned_embeds.bin", "ip_adapter.bin", "lora_weights.safetensors")): + paths.append(file) + # BRITTLENESS WARNING!! + # Diffusers models always seem to have "model" in their name, and the regex filter below is applied to avoid + # downloading random checkpoints that might also be in the repo. However there is no guarantee + # that a checkpoint doesn't contain "model" in its name, and no guarantee that future diffusers models + # will adhere to this naming convention, so this is an area of brittleness. + elif re.search(r"model(\.[^.]+)?\.(safetensors|bin|onnx|xml|pth|pt|ckpt|msgpack)$", file.name): + paths.append(file) + + # limit search to subfolder if requested + if subfolder: + paths = [x for x in paths if x.parent == Path(subfolder)] + + # _filter_by_variant uniquifies the paths and returns a set + return sorted(_filter_by_variant(paths, variant)) + + +def _filter_by_variant(files: List[Path], variant: ModelRepoVariant) -> Set[Path]: + """Select the proper variant files from a list of HuggingFace repo_id paths.""" + result = set() + basenames: Dict[Path, Path] = {} + for path in files: + if path.suffix == ".onnx": + if variant == ModelRepoVariant.ONNX: + result.add(path) + + elif "openvino_model" in path.name: + if variant == ModelRepoVariant.OPENVINO: + result.add(path) + + elif "flax_model" in path.name: + if variant == ModelRepoVariant.FLAX: + result.add(path) + + elif path.suffix in [".json", ".txt"]: + result.add(path) + + elif path.suffix in [".bin", ".safetensors", ".pt", ".ckpt"] and variant in [ + ModelRepoVariant.FP16, + ModelRepoVariant.FP32, + ModelRepoVariant.DEFAULT, + ]: + parent = path.parent + suffixes = path.suffixes + if len(suffixes) == 2: + variant_label, suffix = suffixes + basename = parent / Path(path.stem).stem + else: + variant_label = "" + suffix = suffixes[0] + basename = parent / path.stem + + if previous := basenames.get(basename): + if ( + previous.suffix != ".safetensors" and suffix == ".safetensors" + ): # replace non-safetensors with safetensors when available + basenames[basename] = path + if variant_label == f".{variant}": + basenames[basename] = path + elif not variant_label and variant in [ModelRepoVariant.FP32, ModelRepoVariant.DEFAULT]: + basenames[basename] = path + else: + basenames[basename] = path + + else: + continue + + for v in basenames.values(): + result.add(v) + + # If one of the architecture-related variants was specified and no files matched other than + # config and text files then we return an empty list + if ( + variant + and variant in [ModelRepoVariant.ONNX, ModelRepoVariant.OPENVINO, ModelRepoVariant.FLAX] + and not any(variant.value in x.name for x in result) + ): + return set() + + # Prune folders that contain just a `config.json`. This happens when + # the requested variant (e.g. "onnx") is missing + directories: Dict[Path, int] = {} + for x in result: + if not x.parent: + continue + directories[x.parent] = directories.get(x.parent, 0) + 1 + + return {x for x in result if directories[x.parent] > 1 or x.name != "config.json"} diff --git a/invokeai/backend/stable_diffusion/diffusers_pipeline.py b/invokeai/backend/stable_diffusion/diffusers_pipeline.py index ae0cc17203..a85e3762dc 100644 --- a/invokeai/backend/stable_diffusion/diffusers_pipeline.py +++ b/invokeai/backend/stable_diffusion/diffusers_pipeline.py @@ -242,17 +242,6 @@ class StableDiffusionGeneratorPipeline(StableDiffusionPipeline): control_model: ControlNetModel = None, ): super().__init__( - vae, - text_encoder, - tokenizer, - unet, - scheduler, - safety_checker, - feature_extractor, - requires_safety_checker, - ) - - self.register_modules( vae=vae, text_encoder=text_encoder, tokenizer=tokenizer, @@ -260,9 +249,9 @@ class StableDiffusionGeneratorPipeline(StableDiffusionPipeline): scheduler=scheduler, safety_checker=safety_checker, feature_extractor=feature_extractor, - # FIXME: can't currently register control module - # control_model=control_model, + requires_safety_checker=requires_safety_checker, ) + self.invokeai_diffuser = InvokeAIDiffuserComponent(self.unet, self._unet_forward) self.control_model = control_model self.use_ip_adapter = False @@ -287,7 +276,11 @@ class StableDiffusionGeneratorPipeline(StableDiffusionPipeline): self.disable_attention_slicing() return elif config.attention_type == "torch-sdp": - raise Exception("torch-sdp attention slicing not yet implemented") + if hasattr(torch.nn.functional, "scaled_dot_product_attention"): + # diffusers enables sdp automatically + return + else: + raise Exception("torch-sdp attention slicing not available") # the remainder if this code is called when attention_type=='auto' if self.unet.device.type == "cuda": @@ -295,7 +288,7 @@ class StableDiffusionGeneratorPipeline(StableDiffusionPipeline): self.enable_xformers_memory_efficient_attention() return elif hasattr(torch.nn.functional, "scaled_dot_product_attention"): - # diffusers enable sdp automatically + # diffusers enables sdp automatically return if self.unet.device.type == "cpu" or self.unet.device.type == "mps": diff --git a/invokeai/backend/tiles/tiles.py b/invokeai/backend/tiles/tiles.py index 3a678d825e..3c400fc87c 100644 --- a/invokeai/backend/tiles/tiles.py +++ b/invokeai/backend/tiles/tiles.py @@ -3,7 +3,42 @@ from typing import Union import numpy as np -from invokeai.backend.tiles.utils import TBLR, Tile, paste +from invokeai.app.invocations.latent import LATENT_SCALE_FACTOR +from invokeai.backend.tiles.utils import TBLR, Tile, paste, seam_blend + + +def calc_overlap(tiles: list[Tile], num_tiles_x: int, num_tiles_y: int) -> list[Tile]: + """Calculate and update the overlap of a list of tiles. + + Args: + tiles (list[Tile]): The list of tiles describing the locations of the respective `tile_images`. + num_tiles_x: the number of tiles on the x axis. + num_tiles_y: the number of tiles on the y axis. + """ + + def get_tile_or_none(idx_y: int, idx_x: int) -> Union[Tile, None]: + if idx_y < 0 or idx_y > num_tiles_y or idx_x < 0 or idx_x > num_tiles_x: + return None + return tiles[idx_y * num_tiles_x + idx_x] + + for tile_idx_y in range(num_tiles_y): + for tile_idx_x in range(num_tiles_x): + cur_tile = get_tile_or_none(tile_idx_y, tile_idx_x) + top_neighbor_tile = get_tile_or_none(tile_idx_y - 1, tile_idx_x) + left_neighbor_tile = get_tile_or_none(tile_idx_y, tile_idx_x - 1) + + assert cur_tile is not None + + # Update cur_tile top-overlap and corresponding top-neighbor bottom-overlap. + if top_neighbor_tile is not None: + cur_tile.overlap.top = max(0, top_neighbor_tile.coords.bottom - cur_tile.coords.top) + top_neighbor_tile.overlap.bottom = cur_tile.overlap.top + + # Update cur_tile left-overlap and corresponding left-neighbor right-overlap. + if left_neighbor_tile is not None: + cur_tile.overlap.left = max(0, left_neighbor_tile.coords.right - cur_tile.coords.left) + left_neighbor_tile.overlap.right = cur_tile.overlap.left + return tiles def calc_tiles_with_overlap( @@ -63,31 +98,133 @@ def calc_tiles_with_overlap( tiles.append(tile) - def get_tile_or_none(idx_y: int, idx_x: int) -> Union[Tile, None]: - if idx_y < 0 or idx_y > num_tiles_y or idx_x < 0 or idx_x > num_tiles_x: - return None - return tiles[idx_y * num_tiles_x + idx_x] + return calc_overlap(tiles, num_tiles_x, num_tiles_y) - # Iterate over tiles again and calculate overlaps. + +def calc_tiles_even_split( + image_height: int, image_width: int, num_tiles_x: int, num_tiles_y: int, overlap: int = 0 +) -> list[Tile]: + """Calculate the tile coordinates for a given image shape with the number of tiles requested. + + Args: + image_height (int): The image height in px. + image_width (int): The image width in px. + num_x_tiles (int): The number of tile to split the image into on the X-axis. + num_y_tiles (int): The number of tile to split the image into on the Y-axis. + overlap (int, optional): The overlap between adjacent tiles in pixels. Defaults to 0. + + Returns: + list[Tile]: A list of tiles that cover the image shape. Ordered from left-to-right, top-to-bottom. + """ + # Ensure the image is divisible by LATENT_SCALE_FACTOR + if image_width % LATENT_SCALE_FACTOR != 0 or image_height % LATENT_SCALE_FACTOR != 0: + raise ValueError(f"image size (({image_width}, {image_height})) must be divisible by {LATENT_SCALE_FACTOR}") + + # Calculate the tile size based on the number of tiles and overlap, and ensure it's divisible by 8 (rounding down) + if num_tiles_x > 1: + # ensure the overlap is not more than the maximum overlap if we only have 1 tile then we dont care about overlap + assert overlap <= image_width - (LATENT_SCALE_FACTOR * (num_tiles_x - 1)) + tile_size_x = LATENT_SCALE_FACTOR * math.floor( + ((image_width + overlap * (num_tiles_x - 1)) // num_tiles_x) / LATENT_SCALE_FACTOR + ) + assert overlap < tile_size_x + else: + tile_size_x = image_width + + if num_tiles_y > 1: + # ensure the overlap is not more than the maximum overlap if we only have 1 tile then we dont care about overlap + assert overlap <= image_height - (LATENT_SCALE_FACTOR * (num_tiles_y - 1)) + tile_size_y = LATENT_SCALE_FACTOR * math.floor( + ((image_height + overlap * (num_tiles_y - 1)) // num_tiles_y) / LATENT_SCALE_FACTOR + ) + assert overlap < tile_size_y + else: + tile_size_y = image_height + + # tiles[y * num_tiles_x + x] is the tile for the y'th row, x'th column. + tiles: list[Tile] = [] + + # Calculate tile coordinates. (Ignore overlap values for now.) for tile_idx_y in range(num_tiles_y): + # Calculate the top and bottom of the row + top = tile_idx_y * (tile_size_y - overlap) + bottom = min(top + tile_size_y, image_height) + # For the last row adjust bottom to be the height of the image + if tile_idx_y == num_tiles_y - 1: + bottom = image_height + for tile_idx_x in range(num_tiles_x): - cur_tile = get_tile_or_none(tile_idx_y, tile_idx_x) - top_neighbor_tile = get_tile_or_none(tile_idx_y - 1, tile_idx_x) - left_neighbor_tile = get_tile_or_none(tile_idx_y, tile_idx_x - 1) + # Calculate the left & right coordinate of each tile + left = tile_idx_x * (tile_size_x - overlap) + right = min(left + tile_size_x, image_width) + # For the last tile in the row adjust right to be the width of the image + if tile_idx_x == num_tiles_x - 1: + right = image_width - assert cur_tile is not None + tile = Tile( + coords=TBLR(top=top, bottom=bottom, left=left, right=right), + overlap=TBLR(top=0, bottom=0, left=0, right=0), + ) - # Update cur_tile top-overlap and corresponding top-neighbor bottom-overlap. - if top_neighbor_tile is not None: - cur_tile.overlap.top = max(0, top_neighbor_tile.coords.bottom - cur_tile.coords.top) - top_neighbor_tile.overlap.bottom = cur_tile.overlap.top + tiles.append(tile) - # Update cur_tile left-overlap and corresponding left-neighbor right-overlap. - if left_neighbor_tile is not None: - cur_tile.overlap.left = max(0, left_neighbor_tile.coords.right - cur_tile.coords.left) - left_neighbor_tile.overlap.right = cur_tile.overlap.left + return calc_overlap(tiles, num_tiles_x, num_tiles_y) - return tiles + +def calc_tiles_min_overlap( + image_height: int, + image_width: int, + tile_height: int, + tile_width: int, + min_overlap: int = 0, +) -> list[Tile]: + """Calculate the tile coordinates for a given image shape under a simple tiling scheme with overlaps. + + Args: + image_height (int): The image height in px. + image_width (int): The image width in px. + tile_height (int): The tile height in px. All tiles will have this height. + tile_width (int): The tile width in px. All tiles will have this width. + min_overlap (int): The target minimum overlap between adjacent tiles. If the tiles do not evenly cover the image + shape, then the overlap will be spread between the tiles. + + Returns: + list[Tile]: A list of tiles that cover the image shape. Ordered from left-to-right, top-to-bottom. + """ + + assert min_overlap < tile_height + assert min_overlap < tile_width + + # catches the cases when the tile size is larger than the images size and adjusts the tile size + if image_width < tile_width: + tile_width = image_width + + if image_height < tile_height: + tile_height = image_height + + num_tiles_x = math.ceil((image_width - min_overlap) / (tile_width - min_overlap)) + num_tiles_y = math.ceil((image_height - min_overlap) / (tile_height - min_overlap)) + + # tiles[y * num_tiles_x + x] is the tile for the y'th row, x'th column. + tiles: list[Tile] = [] + + # Calculate tile coordinates. (Ignore overlap values for now.) + for tile_idx_y in range(num_tiles_y): + top = (tile_idx_y * (image_height - tile_height)) // (num_tiles_y - 1) if num_tiles_y > 1 else 0 + bottom = top + tile_height + + for tile_idx_x in range(num_tiles_x): + left = (tile_idx_x * (image_width - tile_width)) // (num_tiles_x - 1) if num_tiles_x > 1 else 0 + right = left + tile_width + + tile = Tile( + coords=TBLR(top=top, bottom=bottom, left=left, right=right), + overlap=TBLR(top=0, bottom=0, left=0, right=0), + ) + + tiles.append(tile) + + return calc_overlap(tiles, num_tiles_x, num_tiles_y) def merge_tiles_with_linear_blending( @@ -199,3 +336,91 @@ def merge_tiles_with_linear_blending( ), mask=mask, ) + + +def merge_tiles_with_seam_blending( + dst_image: np.ndarray, tiles: list[Tile], tile_images: list[np.ndarray], blend_amount: int +): + """Merge a set of image tiles into `dst_image` with seam blending between the tiles. + + We expect every tile edge to either: + 1) have an overlap of 0, because it is aligned with the image edge, or + 2) have an overlap >= blend_amount. + If neither of these conditions are satisfied, we raise an exception. + + The seam blending is centered on a seam of least energy of the overlap between adjacent tiles. + + Args: + dst_image (np.ndarray): The destination image. Shape: (H, W, C). + tiles (list[Tile]): The list of tiles describing the locations of the respective `tile_images`. + tile_images (list[np.ndarray]): The tile images to merge into `dst_image`. + blend_amount (int): The amount of blending (in px) between adjacent overlapping tiles. + """ + # Sort tiles and images first by left x coordinate, then by top y coordinate. During tile processing, we want to + # iterate over tiles left-to-right, top-to-bottom. + tiles_and_images = list(zip(tiles, tile_images, strict=True)) + tiles_and_images = sorted(tiles_and_images, key=lambda x: x[0].coords.left) + tiles_and_images = sorted(tiles_and_images, key=lambda x: x[0].coords.top) + + # Organize tiles into rows. + tile_and_image_rows: list[list[tuple[Tile, np.ndarray]]] = [] + cur_tile_and_image_row: list[tuple[Tile, np.ndarray]] = [] + first_tile_in_cur_row, _ = tiles_and_images[0] + for tile_and_image in tiles_and_images: + tile, _ = tile_and_image + if not ( + tile.coords.top == first_tile_in_cur_row.coords.top + and tile.coords.bottom == first_tile_in_cur_row.coords.bottom + ): + # Store the previous row, and start a new one. + tile_and_image_rows.append(cur_tile_and_image_row) + cur_tile_and_image_row = [] + first_tile_in_cur_row, _ = tile_and_image + + cur_tile_and_image_row.append(tile_and_image) + tile_and_image_rows.append(cur_tile_and_image_row) + + for tile_and_image_row in tile_and_image_rows: + first_tile_in_row, _ = tile_and_image_row[0] + row_height = first_tile_in_row.coords.bottom - first_tile_in_row.coords.top + row_image = np.zeros((row_height, dst_image.shape[1], dst_image.shape[2]), dtype=dst_image.dtype) + + # Blend the tiles in the row horizontally. + for tile, tile_image in tile_and_image_row: + # We expect the tiles to be ordered left-to-right. + # For each tile: + # - extract the overlap regions and pass to seam_blend() + # - apply blended region to the row_image + # - apply the un-blended region to the row_image + tile_height, tile_width, _ = tile_image.shape + overlap_size = tile.overlap.left + # Left blending: + if overlap_size > 0: + assert overlap_size >= blend_amount + + overlap_coord_right = tile.coords.left + overlap_size + src_overlap = row_image[:, tile.coords.left : overlap_coord_right] + dst_overlap = tile_image[:, :overlap_size] + blended_overlap = seam_blend(src_overlap, dst_overlap, blend_amount, x_seam=False) + row_image[:, tile.coords.left : overlap_coord_right] = blended_overlap + row_image[:, overlap_coord_right : tile.coords.right] = tile_image[:, overlap_size:] + else: + # no overlap just paste the tile + row_image[:, tile.coords.left : tile.coords.right] = tile_image + + # Blend the row into the dst_image + # We assume that the entire row has the same vertical overlaps as the first_tile_in_row. + # Rows are processed in the same way as tiles (extract overlap, blend, apply) + row_overlap_size = first_tile_in_row.overlap.top + if row_overlap_size > 0: + assert row_overlap_size >= blend_amount + + overlap_coords_bottom = first_tile_in_row.coords.top + row_overlap_size + src_overlap = dst_image[first_tile_in_row.coords.top : overlap_coords_bottom, :] + dst_overlap = row_image[:row_overlap_size, :] + blended_overlap = seam_blend(src_overlap, dst_overlap, blend_amount, x_seam=True) + dst_image[first_tile_in_row.coords.top : overlap_coords_bottom, :] = blended_overlap + dst_image[overlap_coords_bottom : first_tile_in_row.coords.bottom, :] = row_image[row_overlap_size:, :] + else: + # no overlap just paste the row + dst_image[first_tile_in_row.coords.top : first_tile_in_row.coords.bottom, :] = row_image diff --git a/invokeai/backend/tiles/utils.py b/invokeai/backend/tiles/utils.py index 4ad40ffa35..dc6d914170 100644 --- a/invokeai/backend/tiles/utils.py +++ b/invokeai/backend/tiles/utils.py @@ -1,5 +1,7 @@ +import math from typing import Optional +import cv2 import numpy as np from pydantic import BaseModel, Field @@ -31,10 +33,10 @@ def paste(dst_image: np.ndarray, src_image: np.ndarray, box: TBLR, mask: Optiona """Paste a source image into a destination image. Args: - dst_image (torch.Tensor): The destination image to paste into. Shape: (H, W, C). - src_image (torch.Tensor): The source image to paste. Shape: (H, W, C). H and W must be compatible with 'box'. + dst_image (np.array): The destination image to paste into. Shape: (H, W, C). + src_image (np.array): The source image to paste. Shape: (H, W, C). H and W must be compatible with 'box'. box (TBLR): Box defining the region in the 'dst_image' where 'src_image' will be pasted. - mask (Optional[torch.Tensor]): A mask that defines the blending between 'src_image' and 'dst_image'. + mask (Optional[np.array]): A mask that defines the blending between 'src_image' and 'dst_image'. Range: [0.0, 1.0], Shape: (H, W). The output is calculate per-pixel according to `src * mask + dst * (1 - mask)`. """ @@ -45,3 +47,106 @@ def paste(dst_image: np.ndarray, src_image: np.ndarray, box: TBLR, mask: Optiona mask = np.expand_dims(mask, -1) dst_image_box = dst_image[box.top : box.bottom, box.left : box.right] dst_image[box.top : box.bottom, box.left : box.right] = src_image * mask + dst_image_box * (1.0 - mask) + + +def seam_blend(ia1: np.ndarray, ia2: np.ndarray, blend_amount: int, x_seam: bool) -> np.ndarray: + """Blend two overlapping tile sections using a seams to find a path. + + It is assumed that input images will be RGB np arrays and are the same size. + + Args: + ia1 (np.array): Image array 1 Shape: (H, W, C). + ia2 (np.array): Image array 2 Shape: (H, W, C). + x_seam (bool): If the images should be blended on the x axis or not. + blend_amount (int): The size of the blur to use on the seam. Half of this value will be used to avoid the edges of the image. + """ + assert ia1.shape == ia2.shape + assert ia2.size == ia2.size + + def shift(arr, num, fill_value=255.0): + result = np.full_like(arr, fill_value) + if num > 0: + result[num:] = arr[:-num] + elif num < 0: + result[:num] = arr[-num:] + else: + result[:] = arr + return result + + # Assume RGB and convert to grey + # Could offer other options for the luminance conversion + # BT.709 [0.2126, 0.7152, 0.0722], BT.2020 [0.2627, 0.6780, 0.0593]) + # it might not have a huge impact due to the blur that is applied over the seam + iag1 = np.dot(ia1, [0.2989, 0.5870, 0.1140]) # BT.601 perceived brightness + iag2 = np.dot(ia2, [0.2989, 0.5870, 0.1140]) + + # Calc Difference between the images + ia = iag2 - iag1 + + # If the seam is on the X-axis rotate the array so we can treat it like a vertical seam + if x_seam: + ia = np.rot90(ia, 1) + + # Calc max and min X & Y limits + # gutter is used to avoid the blur hitting the edge of the image + gutter = math.ceil(blend_amount / 2) if blend_amount > 0 else 0 + max_y, max_x = ia.shape + max_x -= gutter + min_x = gutter + + # Calc the energy in the difference + # Could offer different energy calculations e.g. Sobel or Scharr + energy = np.abs(np.gradient(ia, axis=0)) + np.abs(np.gradient(ia, axis=1)) + + # Find the starting position of the seam + res = np.copy(energy) + for y in range(1, max_y): + row = res[y, :] + rowl = shift(row, -1) + rowr = shift(row, 1) + res[y, :] = res[y - 1, :] + np.min([row, rowl, rowr], axis=0) + + # create an array max_y long + lowest_energy_line = np.empty([max_y], dtype="uint16") + lowest_energy_line[max_y - 1] = np.argmin(res[max_y - 1, min_x : max_x - 1]) + + # Calc the path of the seam + # could offer options for larger search than just 1 pixel by adjusting lpos and rpos + for ypos in range(max_y - 2, -1, -1): + lowest_pos = lowest_energy_line[ypos + 1] + lpos = lowest_pos - 1 + rpos = lowest_pos + 1 + lpos = np.clip(lpos, min_x, max_x - 1) + rpos = np.clip(rpos, min_x, max_x - 1) + lowest_energy_line[ypos] = np.argmin(energy[ypos, lpos : rpos + 1]) + lpos + + # Draw the mask + mask = np.zeros_like(ia) + for ypos in range(0, max_y): + to_fill = lowest_energy_line[ypos] + mask[ypos, :to_fill] = 1 + + # If the seam is on the X-axis rotate the array back + if x_seam: + mask = np.rot90(mask, 3) + + # blur the seam mask if required + if blend_amount > 0: + mask = cv2.blur(mask, (blend_amount, blend_amount)) + + # for visual debugging + # from PIL import Image + # m_image = Image.fromarray((mask * 255.0).astype("uint8")) + + # copy ia2 over ia1 while applying the seam mask + mask = np.expand_dims(mask, -1) + blended_image = ia1 * mask + ia2 * (1.0 - mask) + + # for visual debugging + # i1 = Image.fromarray(ia1.astype("uint8")) + # i2 = Image.fromarray(ia2.astype("uint8")) + # b_image = Image.fromarray(blended_image.astype("uint8")) + # print(f"{ia1.shape}, {ia2.shape}, {mask.shape}, {blended_image.shape}") + # print(f"{i1.size}, {i2.size}, {m_image.size}, {b_image.size}") + + return blended_image diff --git a/invokeai/backend/util/__init__.py b/invokeai/backend/util/__init__.py index 601aab00cb..87ae1480f5 100644 --- a/invokeai/backend/util/__init__.py +++ b/invokeai/backend/util/__init__.py @@ -11,4 +11,7 @@ from .devices import ( # noqa: F401 normalize_device, torch_dtype, ) +from .logging import InvokeAILogger from .util import Chdir, ask_user, download_with_resume, instantiate_from_config, url_attachment_name # noqa: F401 + +__all__ = ["Chdir", "InvokeAILogger", "choose_precision", "choose_torch_device"] diff --git a/invokeai/backend/util/devices.py b/invokeai/backend/util/devices.py index 84ca7ee02b..d6d3ad727f 100644 --- a/invokeai/backend/util/devices.py +++ b/invokeai/backend/util/devices.py @@ -1,11 +1,9 @@ from __future__ import annotations -import platform from contextlib import nullcontext from typing import Union import torch -from packaging import version from torch import autocast from invokeai.app.services.config import InvokeAIAppConfig @@ -36,18 +34,23 @@ def choose_precision(device: torch.device) -> str: if device.type == "cuda": device_name = torch.cuda.get_device_name(device) if not ("GeForce GTX 1660" in device_name or "GeForce GTX 1650" in device_name): - return "float16" - elif device.type == "mps" and version.parse(platform.mac_ver()[0]) < version.parse("14.0.0"): + if config.precision == "bfloat16": + return "bfloat16" + else: + return "float16" + elif device.type == "mps": return "float16" return "float32" def torch_dtype(device: torch.device) -> torch.dtype: - if config.full_precision: - return torch.float32 - if choose_precision(device) == "float16": + precision = choose_precision(device) + if precision == "float16": return torch.float16 + if precision == "bfloat16": + return torch.bfloat16 else: + # "auto", "autocast", "float32" return torch.float32 diff --git a/invokeai/configs/INITIAL_MODELS.yaml b/invokeai/configs/INITIAL_MODELS.yaml index 67fcad4055..c230665e3a 100644 --- a/invokeai/configs/INITIAL_MODELS.yaml +++ b/invokeai/configs/INITIAL_MODELS.yaml @@ -32,9 +32,9 @@ sd-1/main/Analog-Diffusion: description: An SD-1.5 model trained on diverse analog photographs (2.13 GB) repo_id: wavymulder/Analog-Diffusion recommended: False -sd-1/main/Deliberate: +sd-1/main/Deliberate_v5: description: Versatile model that produces detailed images up to 768px (4.27 GB) - repo_id: XpucT/Deliberate + path: https://huggingface.co/XpucT/Deliberate/resolve/main/Deliberate_v5.safetensors recommended: False sd-1/main/Dungeons-and-Diffusion: description: Dungeons & Dragons characters (2.13 GB) diff --git a/invokeai/frontend/install/invokeai_update.py b/invokeai/frontend/install/invokeai_update.py index 551f2acdf2..c6f06533c5 100644 --- a/invokeai/frontend/install/invokeai_update.py +++ b/invokeai/frontend/install/invokeai_update.py @@ -4,6 +4,7 @@ pip install . """ import os import platform +from distutils.version import LooseVersion import pkg_resources import psutil @@ -31,10 +32,6 @@ else: console = Console(style=Style(color="grey74", bgcolor="grey19")) -def get_versions() -> dict: - return requests.get(url=INVOKE_AI_REL).json() - - def invokeai_is_running() -> bool: for p in psutil.process_iter(): try: @@ -50,6 +47,20 @@ def invokeai_is_running() -> bool: return False +def get_pypi_versions(): + url = "https://pypi.org/pypi/invokeai/json" + try: + data = requests.get(url).json() + except Exception: + raise Exception("Unable to fetch version information from PyPi") + + versions = list(data["releases"].keys()) + versions.sort(key=LooseVersion, reverse=True) + latest_version = [v for v in versions if "rc" not in v][0] + latest_release_candidate = [v for v in versions if "rc" in v][0] + return latest_version, latest_release_candidate, versions + + def welcome(latest_release: str, latest_prerelease: str): @group() def text(): @@ -57,14 +68,10 @@ def welcome(latest_release: str, latest_prerelease: str): yield "" yield "This script will update InvokeAI to the latest release, or to the development version of your choice." yield "" - yield "When updating to an arbitrary tag or branch, be aware that the front end may be mismatched to the backend," - yield "making the web frontend unusable. Please downgrade to the latest release if this happens." - yield "" yield "[bold yellow]Options:" yield f"""[1] Update to the latest [bold]official release[/bold] ([italic]{latest_release}[/italic]) -[2] Update to the latest [bold]pre-release[/bold] (may be buggy; caveat emptor!) ([italic]{latest_prerelease}[/italic]) -[3] Manually enter the [bold]tag name[/bold] for the version you wish to update to -[4] Manually enter the [bold]branch name[/bold] for the version you wish to update to""" +[2] Update to the latest [bold]pre-release[/bold] (may be buggy, database backups are recommended before installation; caveat emptor!) ([italic]{latest_prerelease}[/italic]) +[3] Manually enter the [bold]version[/bold] you wish to update to""" console.rule() print( @@ -92,44 +99,35 @@ def get_extras(): def main(): - versions = get_versions() - released_versions = [x for x in versions if not (x["draft"] or x["prerelease"])] - prerelease_versions = [x for x in versions if not x["draft"] and x["prerelease"]] - latest_release = released_versions[0]["tag_name"] if len(released_versions) else None - latest_prerelease = prerelease_versions[0]["tag_name"] if len(prerelease_versions) else None - if invokeai_is_running(): print(":exclamation: [bold red]Please terminate all running instances of InvokeAI before updating.[/red bold]") input("Press any key to continue...") return + latest_release, latest_prerelease, versions = get_pypi_versions() + welcome(latest_release, latest_prerelease) - tag = None - branch = None - release = None - choice = Prompt.ask("Choice:", choices=["1", "2", "3", "4"], default="1") + release = latest_release + choice = Prompt.ask("Choice:", choices=["1", "2", "3"], default="1") if choice == "1": release = latest_release elif choice == "2": release = latest_prerelease elif choice == "3": - while not tag: - tag = Prompt.ask("Enter an InvokeAI tag name") - elif choice == "4": - while not branch: - branch = Prompt.ask("Enter an InvokeAI branch name") + while True: + release = Prompt.ask("Enter an InvokeAI version") + release.strip() + if release in versions: + break + print(f":exclamation: [bold red]'{release}' is not a recognized InvokeAI release.[/red bold]") extras = get_extras() - print(f":crossed_fingers: Upgrading to [yellow]{tag or release or branch}[/yellow]") - if release: - cmd = f'pip install "invokeai{extras} @ {INVOKE_AI_SRC}/{release}.zip" --use-pep517 --upgrade' - elif tag: - cmd = f'pip install "invokeai{extras} @ {INVOKE_AI_TAG}/{tag}.zip" --use-pep517 --upgrade' - else: - cmd = f'pip install "invokeai{extras} @ {INVOKE_AI_BRANCH}/{branch}.zip" --use-pep517 --upgrade' + print(f":crossed_fingers: Upgrading to [yellow]{release}[/yellow]") + cmd = f'pip install "invokeai{extras}=={release}" --use-pep517 --upgrade' + print("") print("") if os.system(cmd) == 0: diff --git a/invokeai/frontend/web/.eslintignore b/invokeai/frontend/web/.eslintignore index 235ace8f29..1cb448ea80 100644 --- a/invokeai/frontend/web/.eslintignore +++ b/invokeai/frontend/web/.eslintignore @@ -7,4 +7,4 @@ stats.html index.html .yarn/ *.scss -src/services/api/schema.d.ts +src/services/api/schema.ts diff --git a/invokeai/frontend/web/.eslintrc.js b/invokeai/frontend/web/.eslintrc.js index 2062de2cc7..955d37ef09 100644 --- a/invokeai/frontend/web/.eslintrc.js +++ b/invokeai/frontend/web/.eslintrc.js @@ -11,6 +11,7 @@ module.exports = { 'plugin:react-hooks/recommended', 'plugin:react/jsx-runtime', 'prettier', + 'plugin:storybook/recommended', ], parser: '@typescript-eslint/parser', parserOptions: { @@ -26,12 +27,17 @@ module.exports = { 'eslint-plugin-react-hooks', 'i18next', 'path', + 'unused-imports', + 'simple-import-sort', + 'eslint-plugin-import', + // These rules are too strict for normal usage, but are useful for optimizing rerenders + // '@arthurgeron/react-usememo', ], root: true, rules: { 'path/no-relative-imports': ['error', { maxDepth: 0 }], curly: 'error', - 'i18next/no-literal-string': 2, + 'i18next/no-literal-string': 'warn', 'react/jsx-no-bind': ['error', { allowBind: true }], 'react/jsx-curly-brace-presence': [ 'error', @@ -41,13 +47,33 @@ module.exports = { 'no-var': 'error', 'brace-style': 'error', 'prefer-template': 'error', + 'import/no-duplicates': 'error', radix: 'error', 'space-before-blocks': 'error', 'import/prefer-default-export': 'off', - '@typescript-eslint/no-unused-vars': [ + '@typescript-eslint/no-unused-vars': 'off', + 'unused-imports/no-unused-imports': 'error', + 'unused-imports/no-unused-vars': [ 'warn', - { varsIgnorePattern: '^_', argsIgnorePattern: '^_' }, + { + vars: 'all', + varsIgnorePattern: '^_', + args: 'after-used', + argsIgnorePattern: '^_', + }, ], + // These rules are too strict for normal usage, but are useful for optimizing rerenders + // '@arthurgeron/react-usememo/require-usememo': [ + // 'warn', + // { + // strict: false, + // checkHookReturnObject: false, + // fix: { addImports: true }, + // checkHookCalls: false, + + // }, + // ], + // '@arthurgeron/react-usememo/require-memo': 'warn', '@typescript-eslint/ban-ts-comment': 'warn', '@typescript-eslint/no-explicit-any': 'warn', '@typescript-eslint/no-empty-interface': [ @@ -56,7 +82,26 @@ module.exports = { allowSingleExtends: true, }, ], + '@typescript-eslint/consistent-type-imports': [ + 'error', + { + prefer: 'type-imports', + fixStyle: 'separate-type-imports', + disallowTypeAnnotations: true, + }, + ], + '@typescript-eslint/no-import-type-side-effects': 'error', + 'simple-import-sort/imports': 'error', + 'simple-import-sort/exports': 'error', }, + overrides: [ + { + files: ['*.stories.tsx'], + rules: { + 'i18next/no-literal-string': 'off', + }, + }, + ], settings: { react: { version: 'detect', diff --git a/invokeai/frontend/web/.gitignore b/invokeai/frontend/web/.gitignore index cacf107e1b..8e7ebc76a1 100644 --- a/invokeai/frontend/web/.gitignore +++ b/invokeai/frontend/web/.gitignore @@ -8,8 +8,10 @@ pnpm-debug.log* lerna-debug.log* node_modules +.pnpm-store # We want to distribute the repo -# dist +dist +dist/** dist-ssr *.local @@ -38,4 +40,4 @@ stats.html # Yalc .yalc -yalc.lock \ No newline at end of file +yalc.lock diff --git a/invokeai/frontend/web/.prettierignore b/invokeai/frontend/web/.prettierignore index 05782f1f53..0f53a0b0a8 100644 --- a/invokeai/frontend/web/.prettierignore +++ b/invokeai/frontend/web/.prettierignore @@ -1,5 +1,6 @@ dist/ public/locales/*.json +!public/locales/en.json .husky/ node_modules/ patches/ @@ -8,6 +9,8 @@ index.html .yarn/ .yalc/ *.scss -src/services/api/schema.d.ts +src/services/api/schema.ts static/ src/theme/css/overlayscrollbars.css +src/theme_/css/overlayscrollbars.css +pnpm-lock.yaml diff --git a/invokeai/frontend/web/.storybook/ReduxInit.tsx b/invokeai/frontend/web/.storybook/ReduxInit.tsx new file mode 100644 index 0000000000..9d46432603 --- /dev/null +++ b/invokeai/frontend/web/.storybook/ReduxInit.tsx @@ -0,0 +1,25 @@ +import { PropsWithChildren, memo, useEffect } from 'react'; +import { modelChanged } from '../src/features/parameters/store/generationSlice'; +import { useAppDispatch } from '../src/app/store/storeHooks'; +import { useGlobalModifiersInit } from '../src/common/hooks/useGlobalModifiers'; +/** + * Initializes some state for storybook. Must be in a different component + * so that it is run inside the redux context. + */ +export const ReduxInit = memo((props: PropsWithChildren) => { + const dispatch = useAppDispatch(); + useGlobalModifiersInit(); + useEffect(() => { + dispatch( + modelChanged({ + model_name: 'test_model', + base_model: 'sd-1', + model_type: 'main', + }) + ); + }, []); + + return props.children; +}); + +ReduxInit.displayName = 'ReduxInit'; diff --git a/invokeai/frontend/web/.storybook/main.ts b/invokeai/frontend/web/.storybook/main.ts new file mode 100644 index 0000000000..1663839903 --- /dev/null +++ b/invokeai/frontend/web/.storybook/main.ts @@ -0,0 +1,22 @@ +import type { StorybookConfig } from '@storybook/react-vite'; + +const config: StorybookConfig = { + stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'], + addons: [ + '@storybook/addon-links', + '@storybook/addon-essentials', + '@storybook/addon-interactions', + '@storybook/addon-storysource', + ], + framework: { + name: '@storybook/react-vite', + options: {}, + }, + docs: { + autodocs: 'tag', + }, + core: { + disableTelemetry: true, + }, +}; +export default config; diff --git a/invokeai/frontend/web/.storybook/manager.ts b/invokeai/frontend/web/.storybook/manager.ts new file mode 100644 index 0000000000..9d5347529a --- /dev/null +++ b/invokeai/frontend/web/.storybook/manager.ts @@ -0,0 +1,6 @@ +import { addons } from '@storybook/manager-api'; +import { themes } from '@storybook/theming'; + +addons.setConfig({ + theme: themes.dark, +}); diff --git a/invokeai/frontend/web/.storybook/preview.tsx b/invokeai/frontend/web/.storybook/preview.tsx new file mode 100644 index 0000000000..3d5c8d8493 --- /dev/null +++ b/invokeai/frontend/web/.storybook/preview.tsx @@ -0,0 +1,52 @@ +import { Preview } from '@storybook/react'; +import { themes } from '@storybook/theming'; +import i18n from 'i18next'; +import { initReactI18next } from 'react-i18next'; +import { Provider } from 'react-redux'; +import ThemeLocaleProvider from '../src/app/components/ThemeLocaleProvider'; +import { $baseUrl } from '../src/app/store/nanostores/baseUrl'; +import { createStore } from '../src/app/store/store'; +import { Container } from '@chakra-ui/react'; +// TODO: Disabled for IDE performance issues with our translation JSON +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +import translationEN from '../public/locales/en.json'; +import { ReduxInit } from './ReduxInit'; + +i18n.use(initReactI18next).init({ + lng: 'en', + resources: { + en: { translation: translationEN }, + }, + debug: true, + interpolation: { + escapeValue: false, + }, + returnNull: false, +}); + +const store = createStore(undefined, false); +$baseUrl.set('http://localhost:9090'); + +const preview: Preview = { + decorators: [ + (Story) => { + return ( + + + + + + + + ); + }, + ], + parameters: { + docs: { + theme: themes.dark, + }, + }, +}; + +export default preview; diff --git a/invokeai/frontend/web/.unimportedrc.json b/invokeai/frontend/web/.unimportedrc.json new file mode 100644 index 0000000000..733e958861 --- /dev/null +++ b/invokeai/frontend/web/.unimportedrc.json @@ -0,0 +1,15 @@ +{ + "entry": ["src/main.tsx"], + "extensions": [".ts", ".tsx"], + "ignorePatterns": [ + "**/node_modules/**", + "dist/**", + "public/**", + "**/*.stories.tsx", + "config/**" + ], + "ignoreUnresolved": [], + "ignoreUnimported": ["src/i18.d.ts", "vite.config.ts", "src/vite-env.d.ts"], + "respectGitignore": true, + "ignoreUnused": [] +} diff --git a/invokeai/frontend/web/.yarn/releases/yarn-1.22.19.cjs b/invokeai/frontend/web/.yarn/releases/yarn-1.22.19.cjs deleted file mode 100644 index e36f0e36c2..0000000000 --- a/invokeai/frontend/web/.yarn/releases/yarn-1.22.19.cjs +++ /dev/null @@ -1,193957 +0,0 @@ -#!/usr/bin/env node -module.exports = /******/ (function (modules) { - // webpackBootstrap - /******/ // The module cache - /******/ var installedModules = {}; - /******/ - /******/ // The require function - /******/ function __webpack_require__(moduleId) { - /******/ - /******/ // Check if module is in cache - /******/ if (installedModules[moduleId]) { - /******/ return installedModules[moduleId].exports; - /******/ - } - /******/ // Create a new module (and put it into the cache) - /******/ var module = (installedModules[moduleId] = { - /******/ i: moduleId, - /******/ l: false, - /******/ exports: {}, - /******/ - }); - /******/ - /******/ // Execute the module function - /******/ modules[moduleId].call( - module.exports, - module, - module.exports, - __webpack_require__ - ); - /******/ - /******/ // Flag the module as loaded - /******/ module.l = true; - /******/ - /******/ // Return the exports of the module - /******/ return module.exports; - /******/ - } - /******/ - /******/ - /******/ // expose the modules object (__webpack_modules__) - /******/ __webpack_require__.m = modules; - /******/ - /******/ // expose the module cache - /******/ __webpack_require__.c = installedModules; - /******/ - /******/ // identity function for calling harmony imports with the correct context - /******/ __webpack_require__.i = function (value) { - return value; - }; - /******/ - /******/ // define getter function for harmony exports - /******/ __webpack_require__.d = function (exports, name, getter) { - /******/ if (!__webpack_require__.o(exports, name)) { - /******/ Object.defineProperty(exports, name, { - /******/ configurable: false, - /******/ enumerable: true, - /******/ get: getter, - /******/ - }); - /******/ - } - /******/ - }; - /******/ - /******/ // getDefaultExport function for compatibility with non-harmony modules - /******/ __webpack_require__.n = function (module) { - /******/ var getter = - module && module.__esModule - ? /******/ function getDefault() { - return module['default']; - } - : /******/ function getModuleExports() { - return module; - }; - /******/ __webpack_require__.d(getter, 'a', getter); - /******/ return getter; - /******/ - }; - /******/ - /******/ // Object.prototype.hasOwnProperty.call - /******/ __webpack_require__.o = function (object, property) { - return Object.prototype.hasOwnProperty.call(object, property); - }; - /******/ - /******/ // __webpack_public_path__ - /******/ __webpack_require__.p = ''; - /******/ - /******/ // Load entry module and return exports - /******/ return __webpack_require__((__webpack_require__.s = 517)); - /******/ -})( - /************************************************************************/ - /******/ [ - /* 0 */ - /***/ function (module, exports) { - module.exports = require('path'); - - /***/ - }, - /* 1 */ - /***/ function (module, __webpack_exports__, __webpack_require__) { - 'use strict'; - /* harmony export (immutable) */ __webpack_exports__['a'] = __extends; - /* unused harmony export __assign */ - /* unused harmony export __rest */ - /* unused harmony export __decorate */ - /* unused harmony export __param */ - /* unused harmony export __metadata */ - /* unused harmony export __awaiter */ - /* unused harmony export __generator */ - /* unused harmony export __exportStar */ - /* unused harmony export __values */ - /* unused harmony export __read */ - /* unused harmony export __spread */ - /* unused harmony export __await */ - /* unused harmony export __asyncGenerator */ - /* unused harmony export __asyncDelegator */ - /* unused harmony export __asyncValues */ - /* unused harmony export __makeTemplateObject */ - /* unused harmony export __importStar */ - /* unused harmony export __importDefault */ - /*! ***************************************************************************** -Copyright (c) Microsoft Corporation. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at http://www.apache.org/licenses/LICENSE-2.0 - -THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED -WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, -MERCHANTABLITY OR NON-INFRINGEMENT. - -See the Apache Version 2.0 License for specific language governing permissions -and limitations under the License. -***************************************************************************** */ - /* global Reflect, Promise */ - - var extendStatics = function (d, b) { - extendStatics = - Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && - function (d, b) { - d.__proto__ = b; - }) || - function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - }; - return extendStatics(d, b); - }; - - function __extends(d, b) { - extendStatics(d, b); - function __() { - this.constructor = d; - } - d.prototype = - b === null - ? Object.create(b) - : ((__.prototype = b.prototype), new __()); - } - - var __assign = function () { - __assign = - Object.assign || - function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) - if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); - }; - - function __rest(s, e) { - var t = {}; - for (var p in s) - if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) - t[p] = s[p]; - if (s != null && typeof Object.getOwnPropertySymbols === 'function') - for ( - var i = 0, p = Object.getOwnPropertySymbols(s); - i < p.length; - i++ - ) - if (e.indexOf(p[i]) < 0) t[p[i]] = s[p[i]]; - return t; - } - - function __decorate(decorators, target, key, desc) { - var c = arguments.length, - r = - c < 3 - ? target - : desc === null - ? (desc = Object.getOwnPropertyDescriptor(target, key)) - : desc, - d; - if ( - typeof Reflect === 'object' && - typeof Reflect.decorate === 'function' - ) - r = Reflect.decorate(decorators, target, key, desc); - else - for (var i = decorators.length - 1; i >= 0; i--) - if ((d = decorators[i])) - r = - (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || - r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - } - - function __param(paramIndex, decorator) { - return function (target, key) { - decorator(target, key, paramIndex); - }; - } - - function __metadata(metadataKey, metadataValue) { - if ( - typeof Reflect === 'object' && - typeof Reflect.metadata === 'function' - ) - return Reflect.metadata(metadataKey, metadataValue); - } - - function __awaiter(thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator['throw'](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done - ? resolve(result.value) - : new P(function (resolve) { - resolve(result.value); - }).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - } - - function __generator(thisArg, body) { - var _ = { - label: 0, - sent: function () { - if (t[0] & 1) throw t[1]; - return t[1]; - }, - trys: [], - ops: [], - }, - f, - y, - t, - g; - return ( - (g = { next: verb(0), throw: verb(1), return: verb(2) }), - typeof Symbol === 'function' && - (g[Symbol.iterator] = function () { - return this; - }), - g - ); - function verb(n) { - return function (v) { - return step([n, v]); - }; - } - function step(op) { - if (f) throw new TypeError('Generator is already executing.'); - while (_) - try { - if ( - ((f = 1), - y && - (t = - op[0] & 2 - ? y['return'] - : op[0] - ? y['throw'] || ((t = y['return']) && t.call(y), 0) - : y.next) && - !(t = t.call(y, op[1])).done) - ) - return t; - if (((y = 0), t)) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: - case 1: - t = op; - break; - case 4: - _.label++; - return { value: op[1], done: false }; - case 5: - _.label++; - y = op[1]; - op = [0]; - continue; - case 7: - op = _.ops.pop(); - _.trys.pop(); - continue; - default: - if ( - !((t = _.trys), (t = t.length > 0 && t[t.length - 1])) && - (op[0] === 6 || op[0] === 2) - ) { - _ = 0; - continue; - } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { - _.label = op[1]; - break; - } - if (op[0] === 6 && _.label < t[1]) { - _.label = t[1]; - t = op; - break; - } - if (t && _.label < t[2]) { - _.label = t[2]; - _.ops.push(op); - break; - } - if (t[2]) _.ops.pop(); - _.trys.pop(); - continue; - } - op = body.call(thisArg, _); - } catch (e) { - op = [6, e]; - y = 0; - } finally { - f = t = 0; - } - if (op[0] & 5) throw op[1]; - return { value: op[0] ? op[1] : void 0, done: true }; - } - } - - function __exportStar(m, exports) { - for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; - } - - function __values(o) { - var m = typeof Symbol === 'function' && o[Symbol.iterator], - i = 0; - if (m) return m.call(o); - return { - next: function () { - if (o && i >= o.length) o = void 0; - return { value: o && o[i++], done: !o }; - }, - }; - } - - function __read(o, n) { - var m = typeof Symbol === 'function' && o[Symbol.iterator]; - if (!m) return o; - var i = m.call(o), - r, - ar = [], - e; - try { - while ((n === void 0 || n-- > 0) && !(r = i.next()).done) - ar.push(r.value); - } catch (error) { - e = { error: error }; - } finally { - try { - if (r && !r.done && (m = i['return'])) m.call(i); - } finally { - if (e) throw e.error; - } - } - return ar; - } - - function __spread() { - for (var ar = [], i = 0; i < arguments.length; i++) - ar = ar.concat(__read(arguments[i])); - return ar; - } - - function __await(v) { - return this instanceof __await ? ((this.v = v), this) : new __await(v); - } - - function __asyncGenerator(thisArg, _arguments, generator) { - if (!Symbol.asyncIterator) - throw new TypeError('Symbol.asyncIterator is not defined.'); - var g = generator.apply(thisArg, _arguments || []), - i, - q = []; - return ( - (i = {}), - verb('next'), - verb('throw'), - verb('return'), - (i[Symbol.asyncIterator] = function () { - return this; - }), - i - ); - function verb(n) { - if (g[n]) - i[n] = function (v) { - return new Promise(function (a, b) { - q.push([n, v, a, b]) > 1 || resume(n, v); - }); - }; - } - function resume(n, v) { - try { - step(g[n](v)); - } catch (e) { - settle(q[0][3], e); - } - } - function step(r) { - r.value instanceof __await - ? Promise.resolve(r.value.v).then(fulfill, reject) - : settle(q[0][2], r); - } - function fulfill(value) { - resume('next', value); - } - function reject(value) { - resume('throw', value); - } - function settle(f, v) { - if ((f(v), q.shift(), q.length)) resume(q[0][0], q[0][1]); - } - } - - function __asyncDelegator(o) { - var i, p; - return ( - (i = {}), - verb('next'), - verb('throw', function (e) { - throw e; - }), - verb('return'), - (i[Symbol.iterator] = function () { - return this; - }), - i - ); - function verb(n, f) { - i[n] = o[n] - ? function (v) { - return (p = !p) - ? { value: __await(o[n](v)), done: n === 'return' } - : f - ? f(v) - : v; - } - : f; - } - } - - function __asyncValues(o) { - if (!Symbol.asyncIterator) - throw new TypeError('Symbol.asyncIterator is not defined.'); - var m = o[Symbol.asyncIterator], - i; - return m - ? m.call(o) - : ((o = - typeof __values === 'function' - ? __values(o) - : o[Symbol.iterator]()), - (i = {}), - verb('next'), - verb('throw'), - verb('return'), - (i[Symbol.asyncIterator] = function () { - return this; - }), - i); - function verb(n) { - i[n] = - o[n] && - function (v) { - return new Promise(function (resolve, reject) { - (v = o[n](v)), settle(resolve, reject, v.done, v.value); - }); - }; - } - function settle(resolve, reject, d, v) { - Promise.resolve(v).then(function (v) { - resolve({ value: v, done: d }); - }, reject); - } - } - - function __makeTemplateObject(cooked, raw) { - if (Object.defineProperty) { - Object.defineProperty(cooked, 'raw', { value: raw }); - } else { - cooked.raw = raw; - } - return cooked; - } - - function __importStar(mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) - for (var k in mod) - if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; - result.default = mod; - return result; - } - - function __importDefault(mod) { - return mod && mod.__esModule ? mod : { default: mod }; - } - - /***/ - }, - /* 2 */ - /***/ function (module, exports, __webpack_require__) { - 'use strict'; - - exports.__esModule = true; - - var _promise = __webpack_require__(224); - - var _promise2 = _interopRequireDefault(_promise); - - function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { default: obj }; - } - - exports.default = function (fn) { - return function () { - var gen = fn.apply(this, arguments); - return new _promise2.default(function (resolve, reject) { - function step(key, arg) { - try { - var info = gen[key](arg); - var value = info.value; - } catch (error) { - reject(error); - return; - } - - if (info.done) { - resolve(value); - } else { - return _promise2.default.resolve(value).then( - function (value) { - step('next', value); - }, - function (err) { - step('throw', err); - } - ); - } - } - - return step('next'); - }); - }; - }; - - /***/ - }, - /* 3 */ - /***/ function (module, exports) { - module.exports = require('util'); - - /***/ - }, - /* 4 */ - /***/ function (module, exports) { - module.exports = require('fs'); - - /***/ - }, - /* 5 */ - /***/ function (module, exports, __webpack_require__) { - 'use strict'; - - Object.defineProperty(exports, '__esModule', { - value: true, - }); - exports.getFirstSuitableFolder = - exports.readFirstAvailableStream = - exports.makeTempDir = - exports.hardlinksWork = - exports.writeFilePreservingEol = - exports.getFileSizeOnDisk = - exports.walk = - exports.symlink = - exports.find = - exports.readJsonAndFile = - exports.readJson = - exports.readFileAny = - exports.hardlinkBulk = - exports.copyBulk = - exports.unlink = - exports.glob = - exports.link = - exports.chmod = - exports.lstat = - exports.exists = - exports.mkdirp = - exports.stat = - exports.access = - exports.rename = - exports.readdir = - exports.realpath = - exports.readlink = - exports.writeFile = - exports.open = - exports.readFileBuffer = - exports.lockQueue = - exports.constants = - undefined; - - var _asyncToGenerator2; - - function _load_asyncToGenerator() { - return (_asyncToGenerator2 = _interopRequireDefault( - __webpack_require__(2) - )); - } - - let buildActionsForCopy = (() => { - var _ref = (0, - (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( - queue, - events, - possibleExtraneous, - reporter - ) { - // - let build = (() => { - var _ref5 = (0, - (_asyncToGenerator2 || _load_asyncToGenerator()).default)( - function* (data) { - const src = data.src, - dest = data.dest, - type = data.type; - - const onFresh = data.onFresh || noop; - const onDone = data.onDone || noop; - - // TODO https://github.com/yarnpkg/yarn/issues/3751 - // related to bundled dependencies handling - if (files.has(dest.toLowerCase())) { - reporter.verbose( - `The case-insensitive file ${dest} shouldn't be copied twice in one bulk copy` - ); - } else { - files.add(dest.toLowerCase()); - } - - if (type === 'symlink') { - yield mkdirp((_path || _load_path()).default.dirname(dest)); - onFresh(); - actions.symlink.push({ - dest, - linkname: src, - }); - onDone(); - return; - } - - if ( - events.ignoreBasenames.indexOf( - (_path || _load_path()).default.basename(src) - ) >= 0 - ) { - // ignored file - return; - } - - const srcStat = yield lstat(src); - let srcFiles; - - if (srcStat.isDirectory()) { - srcFiles = yield readdir(src); - } - - let destStat; - try { - // try accessing the destination - destStat = yield lstat(dest); - } catch (e) { - // proceed if destination doesn't exist, otherwise error - if (e.code !== 'ENOENT') { - throw e; - } - } - - // if destination exists - if (destStat) { - const bothSymlinks = - srcStat.isSymbolicLink() && destStat.isSymbolicLink(); - const bothFolders = - srcStat.isDirectory() && destStat.isDirectory(); - const bothFiles = srcStat.isFile() && destStat.isFile(); - - // EINVAL access errors sometimes happen which shouldn't because node shouldn't be giving - // us modes that aren't valid. investigate this, it's generally safe to proceed. - - /* if (srcStat.mode !== destStat.mode) { - try { - await access(dest, srcStat.mode); - } catch (err) {} - } */ - - if (bothFiles && artifactFiles.has(dest)) { - // this file gets changed during build, likely by a custom install script. Don't bother checking it. - onDone(); - reporter.verbose( - reporter.lang('verboseFileSkipArtifact', src) - ); - return; - } - - if ( - bothFiles && - srcStat.size === destStat.size && - (0, (_fsNormalized || _load_fsNormalized()).fileDatesEqual)( - srcStat.mtime, - destStat.mtime - ) - ) { - // we can safely assume this is the same file - onDone(); - reporter.verbose( - reporter.lang( - 'verboseFileSkip', - src, - dest, - srcStat.size, - +srcStat.mtime - ) - ); - return; - } - - if (bothSymlinks) { - const srcReallink = yield readlink(src); - if (srcReallink === (yield readlink(dest))) { - // if both symlinks are the same then we can continue on - onDone(); - reporter.verbose( - reporter.lang( - 'verboseFileSkipSymlink', - src, - dest, - srcReallink - ) - ); - return; - } - } - - if (bothFolders) { - // mark files that aren't in this folder as possibly extraneous - const destFiles = yield readdir(dest); - invariant(srcFiles, 'src files not initialised'); - - for ( - var _iterator4 = destFiles, - _isArray4 = Array.isArray(_iterator4), - _i4 = 0, - _iterator4 = _isArray4 - ? _iterator4 - : _iterator4[Symbol.iterator](); - ; - - ) { - var _ref6; - - if (_isArray4) { - if (_i4 >= _iterator4.length) break; - _ref6 = _iterator4[_i4++]; - } else { - _i4 = _iterator4.next(); - if (_i4.done) break; - _ref6 = _i4.value; - } - - const file = _ref6; - - if (srcFiles.indexOf(file) < 0) { - const loc = (_path || _load_path()).default.join( - dest, - file - ); - possibleExtraneous.add(loc); - - if ((yield lstat(loc)).isDirectory()) { - for ( - var _iterator5 = yield readdir(loc), - _isArray5 = Array.isArray(_iterator5), - _i5 = 0, - _iterator5 = _isArray5 - ? _iterator5 - : _iterator5[Symbol.iterator](); - ; - - ) { - var _ref7; - - if (_isArray5) { - if (_i5 >= _iterator5.length) break; - _ref7 = _iterator5[_i5++]; - } else { - _i5 = _iterator5.next(); - if (_i5.done) break; - _ref7 = _i5.value; - } - - const file = _ref7; - - possibleExtraneous.add( - (_path || _load_path()).default.join(loc, file) - ); - } - } - } - } - } - } - - if (destStat && destStat.isSymbolicLink()) { - yield (0, (_fsNormalized || _load_fsNormalized()).unlink)( - dest - ); - destStat = null; - } - - if (srcStat.isSymbolicLink()) { - onFresh(); - const linkname = yield readlink(src); - actions.symlink.push({ - dest, - linkname, - }); - onDone(); - } else if (srcStat.isDirectory()) { - if (!destStat) { - reporter.verbose(reporter.lang('verboseFileFolder', dest)); - yield mkdirp(dest); - } - - const destParts = dest.split( - (_path || _load_path()).default.sep - ); - while (destParts.length) { - files.add( - destParts - .join((_path || _load_path()).default.sep) - .toLowerCase() - ); - destParts.pop(); - } - - // push all files to queue - invariant(srcFiles, 'src files not initialised'); - let remaining = srcFiles.length; - if (!remaining) { - onDone(); - } - for ( - var _iterator6 = srcFiles, - _isArray6 = Array.isArray(_iterator6), - _i6 = 0, - _iterator6 = _isArray6 - ? _iterator6 - : _iterator6[Symbol.iterator](); - ; - - ) { - var _ref8; - - if (_isArray6) { - if (_i6 >= _iterator6.length) break; - _ref8 = _iterator6[_i6++]; - } else { - _i6 = _iterator6.next(); - if (_i6.done) break; - _ref8 = _i6.value; - } - - const file = _ref8; - - queue.push({ - dest: (_path || _load_path()).default.join(dest, file), - onFresh, - onDone: (function (_onDone) { - function onDone() { - return _onDone.apply(this, arguments); - } - - onDone.toString = function () { - return _onDone.toString(); - }; - - return onDone; - })(function () { - if (--remaining === 0) { - onDone(); - } - }), - src: (_path || _load_path()).default.join(src, file), - }); - } - } else if (srcStat.isFile()) { - onFresh(); - actions.file.push({ - src, - dest, - atime: srcStat.atime, - mtime: srcStat.mtime, - mode: srcStat.mode, - }); - onDone(); - } else { - throw new Error(`unsure how to copy this: ${src}`); - } - } - ); - - return function build(_x5) { - return _ref5.apply(this, arguments); - }; - })(); - - const artifactFiles = new Set(events.artifactFiles || []); - const files = new Set(); - - // initialise events - for ( - var _iterator = queue, - _isArray = Array.isArray(_iterator), - _i = 0, - _iterator = _isArray ? _iterator : _iterator[Symbol.iterator](); - ; - - ) { - var _ref2; - - if (_isArray) { - if (_i >= _iterator.length) break; - _ref2 = _iterator[_i++]; - } else { - _i = _iterator.next(); - if (_i.done) break; - _ref2 = _i.value; - } - - const item = _ref2; - - const onDone = item.onDone; - item.onDone = function () { - events.onProgress(item.dest); - if (onDone) { - onDone(); - } - }; - } - events.onStart(queue.length); - - // start building actions - const actions = { - file: [], - symlink: [], - link: [], - }; - - // custom concurrency logic as we're always executing stacks of CONCURRENT_QUEUE_ITEMS queue items - // at a time due to the requirement to push items onto the queue - while (queue.length) { - const items = queue.splice(0, CONCURRENT_QUEUE_ITEMS); - yield Promise.all(items.map(build)); - } - - // simulate the existence of some files to prevent considering them extraneous - for ( - var _iterator2 = artifactFiles, - _isArray2 = Array.isArray(_iterator2), - _i2 = 0, - _iterator2 = _isArray2 - ? _iterator2 - : _iterator2[Symbol.iterator](); - ; - - ) { - var _ref3; - - if (_isArray2) { - if (_i2 >= _iterator2.length) break; - _ref3 = _iterator2[_i2++]; - } else { - _i2 = _iterator2.next(); - if (_i2.done) break; - _ref3 = _i2.value; - } - - const file = _ref3; - - if (possibleExtraneous.has(file)) { - reporter.verbose( - reporter.lang('verboseFilePhantomExtraneous', file) - ); - possibleExtraneous.delete(file); - } - } - - for ( - var _iterator3 = possibleExtraneous, - _isArray3 = Array.isArray(_iterator3), - _i3 = 0, - _iterator3 = _isArray3 - ? _iterator3 - : _iterator3[Symbol.iterator](); - ; - - ) { - var _ref4; - - if (_isArray3) { - if (_i3 >= _iterator3.length) break; - _ref4 = _iterator3[_i3++]; - } else { - _i3 = _iterator3.next(); - if (_i3.done) break; - _ref4 = _i3.value; - } - - const loc = _ref4; - - if (files.has(loc.toLowerCase())) { - possibleExtraneous.delete(loc); - } - } - - return actions; - }); - - return function buildActionsForCopy(_x, _x2, _x3, _x4) { - return _ref.apply(this, arguments); - }; - })(); - - let buildActionsForHardlink = (() => { - var _ref9 = (0, - (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( - queue, - events, - possibleExtraneous, - reporter - ) { - // - let build = (() => { - var _ref13 = (0, - (_asyncToGenerator2 || _load_asyncToGenerator()).default)( - function* (data) { - const src = data.src, - dest = data.dest; - - const onFresh = data.onFresh || noop; - const onDone = data.onDone || noop; - if (files.has(dest.toLowerCase())) { - // Fixes issue https://github.com/yarnpkg/yarn/issues/2734 - // When bulk hardlinking we have A -> B structure that we want to hardlink to A1 -> B1, - // package-linker passes that modules A1 and B1 need to be hardlinked, - // the recursive linking algorithm of A1 ends up scheduling files in B1 to be linked twice which will case - // an exception. - onDone(); - return; - } - files.add(dest.toLowerCase()); - - if ( - events.ignoreBasenames.indexOf( - (_path || _load_path()).default.basename(src) - ) >= 0 - ) { - // ignored file - return; - } - - const srcStat = yield lstat(src); - let srcFiles; - - if (srcStat.isDirectory()) { - srcFiles = yield readdir(src); - } - - const destExists = yield exists(dest); - if (destExists) { - const destStat = yield lstat(dest); - - const bothSymlinks = - srcStat.isSymbolicLink() && destStat.isSymbolicLink(); - const bothFolders = - srcStat.isDirectory() && destStat.isDirectory(); - const bothFiles = srcStat.isFile() && destStat.isFile(); - - if (srcStat.mode !== destStat.mode) { - try { - yield access(dest, srcStat.mode); - } catch (err) { - // EINVAL access errors sometimes happen which shouldn't because node shouldn't be giving - // us modes that aren't valid. investigate this, it's generally safe to proceed. - reporter.verbose(err); - } - } - - if (bothFiles && artifactFiles.has(dest)) { - // this file gets changed during build, likely by a custom install script. Don't bother checking it. - onDone(); - reporter.verbose( - reporter.lang('verboseFileSkipArtifact', src) - ); - return; - } - - // correct hardlink - if ( - bothFiles && - srcStat.ino !== null && - srcStat.ino === destStat.ino - ) { - onDone(); - reporter.verbose( - reporter.lang('verboseFileSkip', src, dest, srcStat.ino) - ); - return; - } - - if (bothSymlinks) { - const srcReallink = yield readlink(src); - if (srcReallink === (yield readlink(dest))) { - // if both symlinks are the same then we can continue on - onDone(); - reporter.verbose( - reporter.lang( - 'verboseFileSkipSymlink', - src, - dest, - srcReallink - ) - ); - return; - } - } - - if (bothFolders) { - // mark files that aren't in this folder as possibly extraneous - const destFiles = yield readdir(dest); - invariant(srcFiles, 'src files not initialised'); - - for ( - var _iterator10 = destFiles, - _isArray10 = Array.isArray(_iterator10), - _i10 = 0, - _iterator10 = _isArray10 - ? _iterator10 - : _iterator10[Symbol.iterator](); - ; - - ) { - var _ref14; - - if (_isArray10) { - if (_i10 >= _iterator10.length) break; - _ref14 = _iterator10[_i10++]; - } else { - _i10 = _iterator10.next(); - if (_i10.done) break; - _ref14 = _i10.value; - } - - const file = _ref14; - - if (srcFiles.indexOf(file) < 0) { - const loc = (_path || _load_path()).default.join( - dest, - file - ); - possibleExtraneous.add(loc); - - if ((yield lstat(loc)).isDirectory()) { - for ( - var _iterator11 = yield readdir(loc), - _isArray11 = Array.isArray(_iterator11), - _i11 = 0, - _iterator11 = _isArray11 - ? _iterator11 - : _iterator11[Symbol.iterator](); - ; - - ) { - var _ref15; - - if (_isArray11) { - if (_i11 >= _iterator11.length) break; - _ref15 = _iterator11[_i11++]; - } else { - _i11 = _iterator11.next(); - if (_i11.done) break; - _ref15 = _i11.value; - } - - const file = _ref15; - - possibleExtraneous.add( - (_path || _load_path()).default.join(loc, file) - ); - } - } - } - } - } - } - - if (srcStat.isSymbolicLink()) { - onFresh(); - const linkname = yield readlink(src); - actions.symlink.push({ - dest, - linkname, - }); - onDone(); - } else if (srcStat.isDirectory()) { - reporter.verbose(reporter.lang('verboseFileFolder', dest)); - yield mkdirp(dest); - - const destParts = dest.split( - (_path || _load_path()).default.sep - ); - while (destParts.length) { - files.add( - destParts - .join((_path || _load_path()).default.sep) - .toLowerCase() - ); - destParts.pop(); - } - - // push all files to queue - invariant(srcFiles, 'src files not initialised'); - let remaining = srcFiles.length; - if (!remaining) { - onDone(); - } - for ( - var _iterator12 = srcFiles, - _isArray12 = Array.isArray(_iterator12), - _i12 = 0, - _iterator12 = _isArray12 - ? _iterator12 - : _iterator12[Symbol.iterator](); - ; - - ) { - var _ref16; - - if (_isArray12) { - if (_i12 >= _iterator12.length) break; - _ref16 = _iterator12[_i12++]; - } else { - _i12 = _iterator12.next(); - if (_i12.done) break; - _ref16 = _i12.value; - } - - const file = _ref16; - - queue.push({ - onFresh, - src: (_path || _load_path()).default.join(src, file), - dest: (_path || _load_path()).default.join(dest, file), - onDone: (function (_onDone2) { - function onDone() { - return _onDone2.apply(this, arguments); - } - - onDone.toString = function () { - return _onDone2.toString(); - }; - - return onDone; - })(function () { - if (--remaining === 0) { - onDone(); - } - }), - }); - } - } else if (srcStat.isFile()) { - onFresh(); - actions.link.push({ - src, - dest, - removeDest: destExists, - }); - onDone(); - } else { - throw new Error(`unsure how to copy this: ${src}`); - } - } - ); - - return function build(_x10) { - return _ref13.apply(this, arguments); - }; - })(); - - const artifactFiles = new Set(events.artifactFiles || []); - const files = new Set(); - - // initialise events - for ( - var _iterator7 = queue, - _isArray7 = Array.isArray(_iterator7), - _i7 = 0, - _iterator7 = _isArray7 - ? _iterator7 - : _iterator7[Symbol.iterator](); - ; - - ) { - var _ref10; - - if (_isArray7) { - if (_i7 >= _iterator7.length) break; - _ref10 = _iterator7[_i7++]; - } else { - _i7 = _iterator7.next(); - if (_i7.done) break; - _ref10 = _i7.value; - } - - const item = _ref10; - - const onDone = item.onDone || noop; - item.onDone = function () { - events.onProgress(item.dest); - onDone(); - }; - } - events.onStart(queue.length); - - // start building actions - const actions = { - file: [], - symlink: [], - link: [], - }; - - // custom concurrency logic as we're always executing stacks of CONCURRENT_QUEUE_ITEMS queue items - // at a time due to the requirement to push items onto the queue - while (queue.length) { - const items = queue.splice(0, CONCURRENT_QUEUE_ITEMS); - yield Promise.all(items.map(build)); - } - - // simulate the existence of some files to prevent considering them extraneous - for ( - var _iterator8 = artifactFiles, - _isArray8 = Array.isArray(_iterator8), - _i8 = 0, - _iterator8 = _isArray8 - ? _iterator8 - : _iterator8[Symbol.iterator](); - ; - - ) { - var _ref11; - - if (_isArray8) { - if (_i8 >= _iterator8.length) break; - _ref11 = _iterator8[_i8++]; - } else { - _i8 = _iterator8.next(); - if (_i8.done) break; - _ref11 = _i8.value; - } - - const file = _ref11; - - if (possibleExtraneous.has(file)) { - reporter.verbose( - reporter.lang('verboseFilePhantomExtraneous', file) - ); - possibleExtraneous.delete(file); - } - } - - for ( - var _iterator9 = possibleExtraneous, - _isArray9 = Array.isArray(_iterator9), - _i9 = 0, - _iterator9 = _isArray9 - ? _iterator9 - : _iterator9[Symbol.iterator](); - ; - - ) { - var _ref12; - - if (_isArray9) { - if (_i9 >= _iterator9.length) break; - _ref12 = _iterator9[_i9++]; - } else { - _i9 = _iterator9.next(); - if (_i9.done) break; - _ref12 = _i9.value; - } - - const loc = _ref12; - - if (files.has(loc.toLowerCase())) { - possibleExtraneous.delete(loc); - } - } - - return actions; - }); - - return function buildActionsForHardlink(_x6, _x7, _x8, _x9) { - return _ref9.apply(this, arguments); - }; - })(); - - let copyBulk = (exports.copyBulk = (() => { - var _ref17 = (0, - (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( - queue, - reporter, - _events - ) { - const events = { - onStart: (_events && _events.onStart) || noop, - onProgress: (_events && _events.onProgress) || noop, - possibleExtraneous: _events - ? _events.possibleExtraneous - : new Set(), - ignoreBasenames: (_events && _events.ignoreBasenames) || [], - artifactFiles: (_events && _events.artifactFiles) || [], - }; - - const actions = yield buildActionsForCopy( - queue, - events, - events.possibleExtraneous, - reporter - ); - events.onStart( - actions.file.length + actions.symlink.length + actions.link.length - ); - - const fileActions = actions.file; - - const currentlyWriting = new Map(); - - yield (_promise || _load_promise()).queue( - fileActions, - (() => { - var _ref18 = (0, - (_asyncToGenerator2 || _load_asyncToGenerator()).default)( - function* (data) { - let writePromise; - while ((writePromise = currentlyWriting.get(data.dest))) { - yield writePromise; - } - - reporter.verbose( - reporter.lang('verboseFileCopy', data.src, data.dest) - ); - const copier = (0, - (_fsNormalized || _load_fsNormalized()).copyFile)( - data, - function () { - return currentlyWriting.delete(data.dest); - } - ); - currentlyWriting.set(data.dest, copier); - events.onProgress(data.dest); - return copier; - } - ); - - return function (_x14) { - return _ref18.apply(this, arguments); - }; - })(), - CONCURRENT_QUEUE_ITEMS - ); - - // we need to copy symlinks last as they could reference files we were copying - const symlinkActions = actions.symlink; - yield (_promise || _load_promise()).queue( - symlinkActions, - function (data) { - const linkname = (_path || _load_path()).default.resolve( - (_path || _load_path()).default.dirname(data.dest), - data.linkname - ); - reporter.verbose( - reporter.lang('verboseFileSymlink', data.dest, linkname) - ); - return symlink(linkname, data.dest); - } - ); - }); - - return function copyBulk(_x11, _x12, _x13) { - return _ref17.apply(this, arguments); - }; - })()); - - let hardlinkBulk = (exports.hardlinkBulk = (() => { - var _ref19 = (0, - (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( - queue, - reporter, - _events - ) { - const events = { - onStart: (_events && _events.onStart) || noop, - onProgress: (_events && _events.onProgress) || noop, - possibleExtraneous: _events - ? _events.possibleExtraneous - : new Set(), - artifactFiles: (_events && _events.artifactFiles) || [], - ignoreBasenames: [], - }; - - const actions = yield buildActionsForHardlink( - queue, - events, - events.possibleExtraneous, - reporter - ); - events.onStart( - actions.file.length + actions.symlink.length + actions.link.length - ); - - const fileActions = actions.link; - - yield (_promise || _load_promise()).queue( - fileActions, - (() => { - var _ref20 = (0, - (_asyncToGenerator2 || _load_asyncToGenerator()).default)( - function* (data) { - reporter.verbose( - reporter.lang('verboseFileLink', data.src, data.dest) - ); - if (data.removeDest) { - yield (0, (_fsNormalized || _load_fsNormalized()).unlink)( - data.dest - ); - } - yield link(data.src, data.dest); - } - ); - - return function (_x18) { - return _ref20.apply(this, arguments); - }; - })(), - CONCURRENT_QUEUE_ITEMS - ); - - // we need to copy symlinks last as they could reference files we were copying - const symlinkActions = actions.symlink; - yield (_promise || _load_promise()).queue( - symlinkActions, - function (data) { - const linkname = (_path || _load_path()).default.resolve( - (_path || _load_path()).default.dirname(data.dest), - data.linkname - ); - reporter.verbose( - reporter.lang('verboseFileSymlink', data.dest, linkname) - ); - return symlink(linkname, data.dest); - } - ); - }); - - return function hardlinkBulk(_x15, _x16, _x17) { - return _ref19.apply(this, arguments); - }; - })()); - - let readFileAny = (exports.readFileAny = (() => { - var _ref21 = (0, - (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( - files - ) { - for ( - var _iterator13 = files, - _isArray13 = Array.isArray(_iterator13), - _i13 = 0, - _iterator13 = _isArray13 - ? _iterator13 - : _iterator13[Symbol.iterator](); - ; - - ) { - var _ref22; - - if (_isArray13) { - if (_i13 >= _iterator13.length) break; - _ref22 = _iterator13[_i13++]; - } else { - _i13 = _iterator13.next(); - if (_i13.done) break; - _ref22 = _i13.value; - } - - const file = _ref22; - - if (yield exists(file)) { - return readFile(file); - } - } - return null; - }); - - return function readFileAny(_x19) { - return _ref21.apply(this, arguments); - }; - })()); - - let readJson = (exports.readJson = (() => { - var _ref23 = (0, - (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( - loc - ) { - return (yield readJsonAndFile(loc)).object; - }); - - return function readJson(_x20) { - return _ref23.apply(this, arguments); - }; - })()); - - let readJsonAndFile = (exports.readJsonAndFile = (() => { - var _ref24 = (0, - (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( - loc - ) { - const file = yield readFile(loc); - try { - return { - object: (0, (_map || _load_map()).default)( - JSON.parse(stripBOM(file)) - ), - content: file, - }; - } catch (err) { - err.message = `${loc}: ${err.message}`; - throw err; - } - }); - - return function readJsonAndFile(_x21) { - return _ref24.apply(this, arguments); - }; - })()); - - let find = (exports.find = (() => { - var _ref25 = (0, - (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( - filename, - dir - ) { - const parts = dir.split((_path || _load_path()).default.sep); - - while (parts.length) { - const loc = parts - .concat(filename) - .join((_path || _load_path()).default.sep); - - if (yield exists(loc)) { - return loc; - } else { - parts.pop(); - } - } - - return false; - }); - - return function find(_x22, _x23) { - return _ref25.apply(this, arguments); - }; - })()); - - let symlink = (exports.symlink = (() => { - var _ref26 = (0, - (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( - src, - dest - ) { - if (process.platform !== 'win32') { - // use relative paths otherwise which will be retained if the directory is moved - src = (_path || _load_path()).default.relative( - (_path || _load_path()).default.dirname(dest), - src - ); - // When path.relative returns an empty string for the current directory, we should instead use - // '.', which is a valid fs.symlink target. - src = src || '.'; - } - - try { - const stats = yield lstat(dest); - if (stats.isSymbolicLink()) { - const resolved = dest; - if (resolved === src) { - return; - } - } - } catch (err) { - if (err.code !== 'ENOENT') { - throw err; - } - } - - // We use rimraf for unlink which never throws an ENOENT on missing target - yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(dest); - - if (process.platform === 'win32') { - // use directory junctions if possible on win32, this requires absolute paths - yield fsSymlink(src, dest, 'junction'); - } else { - yield fsSymlink(src, dest); - } - }); - - return function symlink(_x24, _x25) { - return _ref26.apply(this, arguments); - }; - })()); - - let walk = (exports.walk = (() => { - var _ref27 = (0, - (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( - dir, - relativeDir, - ignoreBasenames = new Set() - ) { - let files = []; - - let filenames = yield readdir(dir); - if (ignoreBasenames.size) { - filenames = filenames.filter(function (name) { - return !ignoreBasenames.has(name); - }); - } - - for ( - var _iterator14 = filenames, - _isArray14 = Array.isArray(_iterator14), - _i14 = 0, - _iterator14 = _isArray14 - ? _iterator14 - : _iterator14[Symbol.iterator](); - ; - - ) { - var _ref28; - - if (_isArray14) { - if (_i14 >= _iterator14.length) break; - _ref28 = _iterator14[_i14++]; - } else { - _i14 = _iterator14.next(); - if (_i14.done) break; - _ref28 = _i14.value; - } - - const name = _ref28; - - const relative = relativeDir - ? (_path || _load_path()).default.join(relativeDir, name) - : name; - const loc = (_path || _load_path()).default.join(dir, name); - const stat = yield lstat(loc); - - files.push({ - relative, - basename: name, - absolute: loc, - mtime: +stat.mtime, - }); - - if (stat.isDirectory()) { - files = files.concat(yield walk(loc, relative, ignoreBasenames)); - } - } - - return files; - }); - - return function walk(_x26, _x27) { - return _ref27.apply(this, arguments); - }; - })()); - - let getFileSizeOnDisk = (exports.getFileSizeOnDisk = (() => { - var _ref29 = (0, - (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( - loc - ) { - const stat = yield lstat(loc); - const size = stat.size, - blockSize = stat.blksize; - - return Math.ceil(size / blockSize) * blockSize; - }); - - return function getFileSizeOnDisk(_x28) { - return _ref29.apply(this, arguments); - }; - })()); - - let getEolFromFile = (() => { - var _ref30 = (0, - (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( - path - ) { - if (!(yield exists(path))) { - return undefined; - } - - const buffer = yield readFileBuffer(path); - - for (let i = 0; i < buffer.length; ++i) { - if (buffer[i] === cr) { - return '\r\n'; - } - if (buffer[i] === lf) { - return '\n'; - } - } - return undefined; - }); - - return function getEolFromFile(_x29) { - return _ref30.apply(this, arguments); - }; - })(); - - let writeFilePreservingEol = (exports.writeFilePreservingEol = (() => { - var _ref31 = (0, - (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( - path, - data - ) { - const eol = - (yield getEolFromFile(path)) || (_os || _load_os()).default.EOL; - if (eol !== '\n') { - data = data.replace(/\n/g, eol); - } - yield writeFile(path, data); - }); - - return function writeFilePreservingEol(_x30, _x31) { - return _ref31.apply(this, arguments); - }; - })()); - - let hardlinksWork = (exports.hardlinksWork = (() => { - var _ref32 = (0, - (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( - dir - ) { - const filename = 'test-file' + Math.random(); - const file = (_path || _load_path()).default.join(dir, filename); - const fileLink = (_path || _load_path()).default.join( - dir, - filename + '-link' - ); - try { - yield writeFile(file, 'test'); - yield link(file, fileLink); - } catch (err) { - return false; - } finally { - yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(file); - yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(fileLink); - } - return true; - }); - - return function hardlinksWork(_x32) { - return _ref32.apply(this, arguments); - }; - })()); - - // not a strict polyfill for Node's fs.mkdtemp - - let makeTempDir = (exports.makeTempDir = (() => { - var _ref33 = (0, - (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( - prefix - ) { - const dir = (_path || _load_path()).default.join( - (_os || _load_os()).default.tmpdir(), - `yarn-${prefix || ''}-${Date.now()}-${Math.random()}` - ); - yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(dir); - yield mkdirp(dir); - return dir; - }); - - return function makeTempDir(_x33) { - return _ref33.apply(this, arguments); - }; - })()); - - let readFirstAvailableStream = (exports.readFirstAvailableStream = - (() => { - var _ref34 = (0, - (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( - paths - ) { - for ( - var _iterator15 = paths, - _isArray15 = Array.isArray(_iterator15), - _i15 = 0, - _iterator15 = _isArray15 - ? _iterator15 - : _iterator15[Symbol.iterator](); - ; - - ) { - var _ref35; - - if (_isArray15) { - if (_i15 >= _iterator15.length) break; - _ref35 = _iterator15[_i15++]; - } else { - _i15 = _iterator15.next(); - if (_i15.done) break; - _ref35 = _i15.value; - } - - const path = _ref35; - - try { - const fd = yield open(path, 'r'); - return (_fs || _load_fs()).default.createReadStream(path, { - fd, - }); - } catch (err) { - // Try the next one - } - } - return null; - }); - - return function readFirstAvailableStream(_x34) { - return _ref34.apply(this, arguments); - }; - })()); - - let getFirstSuitableFolder = (exports.getFirstSuitableFolder = (() => { - var _ref36 = (0, - (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( - paths, - mode = constants.W_OK | constants.X_OK - ) { - const result = { - skipped: [], - folder: null, - }; - - for ( - var _iterator16 = paths, - _isArray16 = Array.isArray(_iterator16), - _i16 = 0, - _iterator16 = _isArray16 - ? _iterator16 - : _iterator16[Symbol.iterator](); - ; - - ) { - var _ref37; - - if (_isArray16) { - if (_i16 >= _iterator16.length) break; - _ref37 = _iterator16[_i16++]; - } else { - _i16 = _iterator16.next(); - if (_i16.done) break; - _ref37 = _i16.value; - } - - const folder = _ref37; - - try { - yield mkdirp(folder); - yield access(folder, mode); - - result.folder = folder; - - return result; - } catch (error) { - result.skipped.push({ - error, - folder, - }); - } - } - return result; - }); - - return function getFirstSuitableFolder(_x35) { - return _ref36.apply(this, arguments); - }; - })()); - - exports.copy = copy; - exports.readFile = readFile; - exports.readFileRaw = readFileRaw; - exports.normalizeOS = normalizeOS; - - var _fs; - - function _load_fs() { - return (_fs = _interopRequireDefault(__webpack_require__(4))); - } - - var _glob; - - function _load_glob() { - return (_glob = _interopRequireDefault(__webpack_require__(99))); - } - - var _os; - - function _load_os() { - return (_os = _interopRequireDefault(__webpack_require__(46))); - } - - var _path; - - function _load_path() { - return (_path = _interopRequireDefault(__webpack_require__(0))); - } - - var _blockingQueue; - - function _load_blockingQueue() { - return (_blockingQueue = _interopRequireDefault( - __webpack_require__(110) - )); - } - - var _promise; - - function _load_promise() { - return (_promise = _interopRequireWildcard(__webpack_require__(51))); - } - - var _promise2; - - function _load_promise2() { - return (_promise2 = __webpack_require__(51)); - } - - var _map; - - function _load_map() { - return (_map = _interopRequireDefault(__webpack_require__(29))); - } - - var _fsNormalized; - - function _load_fsNormalized() { - return (_fsNormalized = __webpack_require__(216)); - } - - function _interopRequireWildcard(obj) { - if (obj && obj.__esModule) { - return obj; - } else { - var newObj = {}; - if (obj != null) { - for (var key in obj) { - if (Object.prototype.hasOwnProperty.call(obj, key)) - newObj[key] = obj[key]; - } - } - newObj.default = obj; - return newObj; - } - } - - function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { default: obj }; - } - - const constants = (exports.constants = - typeof (_fs || _load_fs()).default.constants !== 'undefined' - ? (_fs || _load_fs()).default.constants - : { - R_OK: (_fs || _load_fs()).default.R_OK, - W_OK: (_fs || _load_fs()).default.W_OK, - X_OK: (_fs || _load_fs()).default.X_OK, - }); - - const lockQueue = (exports.lockQueue = new ( - _blockingQueue || _load_blockingQueue() - ).default('fs lock')); - - const readFileBuffer = (exports.readFileBuffer = (0, - (_promise2 || _load_promise2()).promisify)( - (_fs || _load_fs()).default.readFile - )); - const open = (exports.open = (0, - (_promise2 || _load_promise2()).promisify)( - (_fs || _load_fs()).default.open - )); - const writeFile = (exports.writeFile = (0, - (_promise2 || _load_promise2()).promisify)( - (_fs || _load_fs()).default.writeFile - )); - const readlink = (exports.readlink = (0, - (_promise2 || _load_promise2()).promisify)( - (_fs || _load_fs()).default.readlink - )); - const realpath = (exports.realpath = (0, - (_promise2 || _load_promise2()).promisify)( - (_fs || _load_fs()).default.realpath - )); - const readdir = (exports.readdir = (0, - (_promise2 || _load_promise2()).promisify)( - (_fs || _load_fs()).default.readdir - )); - const rename = (exports.rename = (0, - (_promise2 || _load_promise2()).promisify)( - (_fs || _load_fs()).default.rename - )); - const access = (exports.access = (0, - (_promise2 || _load_promise2()).promisify)( - (_fs || _load_fs()).default.access - )); - const stat = (exports.stat = (0, - (_promise2 || _load_promise2()).promisify)( - (_fs || _load_fs()).default.stat - )); - const mkdirp = (exports.mkdirp = (0, - (_promise2 || _load_promise2()).promisify)(__webpack_require__(145))); - const exists = (exports.exists = (0, - (_promise2 || _load_promise2()).promisify)( - (_fs || _load_fs()).default.exists, - true - )); - const lstat = (exports.lstat = (0, - (_promise2 || _load_promise2()).promisify)( - (_fs || _load_fs()).default.lstat - )); - const chmod = (exports.chmod = (0, - (_promise2 || _load_promise2()).promisify)( - (_fs || _load_fs()).default.chmod - )); - const link = (exports.link = (0, - (_promise2 || _load_promise2()).promisify)( - (_fs || _load_fs()).default.link - )); - const glob = (exports.glob = (0, - (_promise2 || _load_promise2()).promisify)( - (_glob || _load_glob()).default - )); - exports.unlink = (_fsNormalized || _load_fsNormalized()).unlink; - - // fs.copyFile uses the native file copying instructions on the system, performing much better - // than any JS-based solution and consumes fewer resources. Repeated testing to fine tune the - // concurrency level revealed 128 as the sweet spot on a quad-core, 16 CPU Intel system with SSD. - - const CONCURRENT_QUEUE_ITEMS = (_fs || _load_fs()).default.copyFile - ? 128 - : 4; - - const fsSymlink = (0, (_promise2 || _load_promise2()).promisify)( - (_fs || _load_fs()).default.symlink - ); - const invariant = __webpack_require__(9); - const stripBOM = __webpack_require__(160); - - const noop = () => {}; - - function copy(src, dest, reporter) { - return copyBulk([{ src, dest }], reporter); - } - - function _readFile(loc, encoding) { - return new Promise((resolve, reject) => { - (_fs || _load_fs()).default.readFile( - loc, - encoding, - function (err, content) { - if (err) { - reject(err); - } else { - resolve(content); - } - } - ); - }); - } - - function readFile(loc) { - return _readFile(loc, 'utf8').then(normalizeOS); - } - - function readFileRaw(loc) { - return _readFile(loc, 'binary'); - } - - function normalizeOS(body) { - return body.replace(/\r\n/g, '\n'); - } - - const cr = '\r'.charCodeAt(0); - const lf = '\n'.charCodeAt(0); - - /***/ - }, - /* 6 */ - /***/ function (module, exports, __webpack_require__) { - 'use strict'; - - Object.defineProperty(exports, '__esModule', { - value: true, - }); - class MessageError extends Error { - constructor(msg, code) { - super(msg); - this.code = code; - } - } - - exports.MessageError = MessageError; - class ProcessSpawnError extends MessageError { - constructor(msg, code, process) { - super(msg, code); - this.process = process; - } - } - - exports.ProcessSpawnError = ProcessSpawnError; - class SecurityError extends MessageError {} - - exports.SecurityError = SecurityError; - class ProcessTermError extends MessageError {} - - exports.ProcessTermError = ProcessTermError; - class ResponseError extends Error { - constructor(msg, responseCode) { - super(msg); - this.responseCode = responseCode; - } - } - - exports.ResponseError = ResponseError; - class OneTimePasswordError extends Error { - constructor(notice) { - super(); - this.notice = notice; - } - } - exports.OneTimePasswordError = OneTimePasswordError; - - /***/ - }, - /* 7 */ - /***/ function (module, __webpack_exports__, __webpack_require__) { - 'use strict'; - /* harmony export (binding) */ __webpack_require__.d( - __webpack_exports__, - 'a', - function () { - return Subscriber; - } - ); - /* unused harmony export SafeSubscriber */ - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = - __webpack_require__(1); - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_isFunction__ = - __webpack_require__(154); - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Observer__ = - __webpack_require__(420); - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Subscription__ = - __webpack_require__(25); - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__internal_symbol_rxSubscriber__ = - __webpack_require__(321); - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__config__ = - __webpack_require__(186); - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__util_hostReportError__ = - __webpack_require__(323); - /** PURE_IMPORTS_START tslib,_util_isFunction,_Observer,_Subscription,_internal_symbol_rxSubscriber,_config,_util_hostReportError PURE_IMPORTS_END */ - - var Subscriber = /*@__PURE__*/ (function (_super) { - __WEBPACK_IMPORTED_MODULE_0_tslib__['a' /* __extends */]( - Subscriber, - _super - ); - function Subscriber(destinationOrNext, error, complete) { - var _this = _super.call(this) || this; - _this.syncErrorValue = null; - _this.syncErrorThrown = false; - _this.syncErrorThrowable = false; - _this.isStopped = false; - _this._parentSubscription = null; - switch (arguments.length) { - case 0: - _this.destination = - __WEBPACK_IMPORTED_MODULE_2__Observer__['a' /* empty */]; - break; - case 1: - if (!destinationOrNext) { - _this.destination = - __WEBPACK_IMPORTED_MODULE_2__Observer__['a' /* empty */]; - break; - } - if (typeof destinationOrNext === 'object') { - if (destinationOrNext instanceof Subscriber) { - _this.syncErrorThrowable = - destinationOrNext.syncErrorThrowable; - _this.destination = destinationOrNext; - destinationOrNext.add(_this); - } else { - _this.syncErrorThrowable = true; - _this.destination = new SafeSubscriber( - _this, - destinationOrNext - ); - } - break; - } - default: - _this.syncErrorThrowable = true; - _this.destination = new SafeSubscriber( - _this, - destinationOrNext, - error, - complete - ); - break; - } - return _this; - } - Subscriber.prototype[ - __WEBPACK_IMPORTED_MODULE_4__internal_symbol_rxSubscriber__[ - 'a' /* rxSubscriber */ - ] - ] = function () { - return this; - }; - Subscriber.create = function (next, error, complete) { - var subscriber = new Subscriber(next, error, complete); - subscriber.syncErrorThrowable = false; - return subscriber; - }; - Subscriber.prototype.next = function (value) { - if (!this.isStopped) { - this._next(value); - } - }; - Subscriber.prototype.error = function (err) { - if (!this.isStopped) { - this.isStopped = true; - this._error(err); - } - }; - Subscriber.prototype.complete = function () { - if (!this.isStopped) { - this.isStopped = true; - this._complete(); - } - }; - Subscriber.prototype.unsubscribe = function () { - if (this.closed) { - return; - } - this.isStopped = true; - _super.prototype.unsubscribe.call(this); - }; - Subscriber.prototype._next = function (value) { - this.destination.next(value); - }; - Subscriber.prototype._error = function (err) { - this.destination.error(err); - this.unsubscribe(); - }; - Subscriber.prototype._complete = function () { - this.destination.complete(); - this.unsubscribe(); - }; - Subscriber.prototype._unsubscribeAndRecycle = function () { - var _a = this, - _parent = _a._parent, - _parents = _a._parents; - this._parent = null; - this._parents = null; - this.unsubscribe(); - this.closed = false; - this.isStopped = false; - this._parent = _parent; - this._parents = _parents; - this._parentSubscription = null; - return this; - }; - return Subscriber; - })(__WEBPACK_IMPORTED_MODULE_3__Subscription__['a' /* Subscription */]); - - var SafeSubscriber = /*@__PURE__*/ (function (_super) { - __WEBPACK_IMPORTED_MODULE_0_tslib__['a' /* __extends */]( - SafeSubscriber, - _super - ); - function SafeSubscriber( - _parentSubscriber, - observerOrNext, - error, - complete - ) { - var _this = _super.call(this) || this; - _this._parentSubscriber = _parentSubscriber; - var next; - var context = _this; - if ( - __webpack_require__.i( - __WEBPACK_IMPORTED_MODULE_1__util_isFunction__[ - 'a' /* isFunction */ - ] - )(observerOrNext) - ) { - next = observerOrNext; - } else if (observerOrNext) { - next = observerOrNext.next; - error = observerOrNext.error; - complete = observerOrNext.complete; - if ( - observerOrNext !== - __WEBPACK_IMPORTED_MODULE_2__Observer__['a' /* empty */] - ) { - context = Object.create(observerOrNext); - if ( - __webpack_require__.i( - __WEBPACK_IMPORTED_MODULE_1__util_isFunction__[ - 'a' /* isFunction */ - ] - )(context.unsubscribe) - ) { - _this.add(context.unsubscribe.bind(context)); - } - context.unsubscribe = _this.unsubscribe.bind(_this); - } - } - _this._context = context; - _this._next = next; - _this._error = error; - _this._complete = complete; - return _this; - } - SafeSubscriber.prototype.next = function (value) { - if (!this.isStopped && this._next) { - var _parentSubscriber = this._parentSubscriber; - if ( - !__WEBPACK_IMPORTED_MODULE_5__config__['a' /* config */] - .useDeprecatedSynchronousErrorHandling || - !_parentSubscriber.syncErrorThrowable - ) { - this.__tryOrUnsub(this._next, value); - } else if ( - this.__tryOrSetError(_parentSubscriber, this._next, value) - ) { - this.unsubscribe(); - } - } - }; - SafeSubscriber.prototype.error = function (err) { - if (!this.isStopped) { - var _parentSubscriber = this._parentSubscriber; - var useDeprecatedSynchronousErrorHandling = - __WEBPACK_IMPORTED_MODULE_5__config__['a' /* config */] - .useDeprecatedSynchronousErrorHandling; - if (this._error) { - if ( - !useDeprecatedSynchronousErrorHandling || - !_parentSubscriber.syncErrorThrowable - ) { - this.__tryOrUnsub(this._error, err); - this.unsubscribe(); - } else { - this.__tryOrSetError(_parentSubscriber, this._error, err); - this.unsubscribe(); - } - } else if (!_parentSubscriber.syncErrorThrowable) { - this.unsubscribe(); - if (useDeprecatedSynchronousErrorHandling) { - throw err; - } - __webpack_require__.i( - __WEBPACK_IMPORTED_MODULE_6__util_hostReportError__[ - 'a' /* hostReportError */ - ] - )(err); - } else { - if (useDeprecatedSynchronousErrorHandling) { - _parentSubscriber.syncErrorValue = err; - _parentSubscriber.syncErrorThrown = true; - } else { - __webpack_require__.i( - __WEBPACK_IMPORTED_MODULE_6__util_hostReportError__[ - 'a' /* hostReportError */ - ] - )(err); - } - this.unsubscribe(); - } - } - }; - SafeSubscriber.prototype.complete = function () { - var _this = this; - if (!this.isStopped) { - var _parentSubscriber = this._parentSubscriber; - if (this._complete) { - var wrappedComplete = function () { - return _this._complete.call(_this._context); - }; - if ( - !__WEBPACK_IMPORTED_MODULE_5__config__['a' /* config */] - .useDeprecatedSynchronousErrorHandling || - !_parentSubscriber.syncErrorThrowable - ) { - this.__tryOrUnsub(wrappedComplete); - this.unsubscribe(); - } else { - this.__tryOrSetError(_parentSubscriber, wrappedComplete); - this.unsubscribe(); - } - } else { - this.unsubscribe(); - } - } - }; - SafeSubscriber.prototype.__tryOrUnsub = function (fn, value) { - try { - fn.call(this._context, value); - } catch (err) { - this.unsubscribe(); - if ( - __WEBPACK_IMPORTED_MODULE_5__config__['a' /* config */] - .useDeprecatedSynchronousErrorHandling - ) { - throw err; - } else { - __webpack_require__.i( - __WEBPACK_IMPORTED_MODULE_6__util_hostReportError__[ - 'a' /* hostReportError */ - ] - )(err); - } - } - }; - SafeSubscriber.prototype.__tryOrSetError = function ( - parent, - fn, - value - ) { - if ( - !__WEBPACK_IMPORTED_MODULE_5__config__['a' /* config */] - .useDeprecatedSynchronousErrorHandling - ) { - throw new Error('bad call'); - } - try { - fn.call(this._context, value); - } catch (err) { - if ( - __WEBPACK_IMPORTED_MODULE_5__config__['a' /* config */] - .useDeprecatedSynchronousErrorHandling - ) { - parent.syncErrorValue = err; - parent.syncErrorThrown = true; - return true; - } else { - __webpack_require__.i( - __WEBPACK_IMPORTED_MODULE_6__util_hostReportError__[ - 'a' /* hostReportError */ - ] - )(err); - return true; - } - } - return false; - }; - SafeSubscriber.prototype._unsubscribe = function () { - var _parentSubscriber = this._parentSubscriber; - this._context = null; - this._parentSubscriber = null; - _parentSubscriber.unsubscribe(); - }; - return SafeSubscriber; - })(Subscriber); - - //# sourceMappingURL=Subscriber.js.map - - /***/ - }, - /* 8 */ - /***/ function (module, exports, __webpack_require__) { - 'use strict'; - - Object.defineProperty(exports, '__esModule', { - value: true, - }); - exports.getPathKey = getPathKey; - const os = __webpack_require__(46); - const path = __webpack_require__(0); - const userHome = __webpack_require__(67).default; - - var _require = __webpack_require__(222); - - const getCacheDir = _require.getCacheDir, - getConfigDir = _require.getConfigDir, - getDataDir = _require.getDataDir; - - const isWebpackBundle = __webpack_require__(278); - - const DEPENDENCY_TYPES = (exports.DEPENDENCY_TYPES = [ - 'devDependencies', - 'dependencies', - 'optionalDependencies', - 'peerDependencies', - ]); - const OWNED_DEPENDENCY_TYPES = (exports.OWNED_DEPENDENCY_TYPES = [ - 'devDependencies', - 'dependencies', - 'optionalDependencies', - ]); - - const RESOLUTIONS = (exports.RESOLUTIONS = 'resolutions'); - const MANIFEST_FIELDS = (exports.MANIFEST_FIELDS = [ - RESOLUTIONS, - ...DEPENDENCY_TYPES, - ]); - - const SUPPORTED_NODE_VERSIONS = (exports.SUPPORTED_NODE_VERSIONS = - '^4.8.0 || ^5.7.0 || ^6.2.2 || >=8.0.0'); - - const YARN_REGISTRY = (exports.YARN_REGISTRY = - 'https://registry.yarnpkg.com'); - const NPM_REGISTRY_RE = (exports.NPM_REGISTRY_RE = - /https?:\/\/registry\.npmjs\.org/g); - - const YARN_DOCS = (exports.YARN_DOCS = - 'https://yarnpkg.com/en/docs/cli/'); - const YARN_INSTALLER_SH = (exports.YARN_INSTALLER_SH = - 'https://yarnpkg.com/install.sh'); - const YARN_INSTALLER_MSI = (exports.YARN_INSTALLER_MSI = - 'https://yarnpkg.com/latest.msi'); - - const SELF_UPDATE_VERSION_URL = (exports.SELF_UPDATE_VERSION_URL = - 'https://yarnpkg.com/latest-version'); - - // cache version, bump whenever we make backwards incompatible changes - const CACHE_VERSION = (exports.CACHE_VERSION = 6); - - // lockfile version, bump whenever we make backwards incompatible changes - const LOCKFILE_VERSION = (exports.LOCKFILE_VERSION = 1); - - // max amount of network requests to perform concurrently - const NETWORK_CONCURRENCY = (exports.NETWORK_CONCURRENCY = 8); - - // HTTP timeout used when downloading packages - const NETWORK_TIMEOUT = (exports.NETWORK_TIMEOUT = 30 * 1000); // in milliseconds - - // max amount of child processes to execute concurrently - const CHILD_CONCURRENCY = (exports.CHILD_CONCURRENCY = 5); - - const REQUIRED_PACKAGE_KEYS = (exports.REQUIRED_PACKAGE_KEYS = [ - 'name', - 'version', - '_uid', - ]); - - function getPreferredCacheDirectories() { - const preferredCacheDirectories = [getCacheDir()]; - - if (process.getuid) { - // $FlowFixMe: process.getuid exists, dammit - preferredCacheDirectories.push( - path.join(os.tmpdir(), `.yarn-cache-${process.getuid()}`) - ); - } - - preferredCacheDirectories.push(path.join(os.tmpdir(), `.yarn-cache`)); - - return preferredCacheDirectories; - } - - const PREFERRED_MODULE_CACHE_DIRECTORIES = - (exports.PREFERRED_MODULE_CACHE_DIRECTORIES = - getPreferredCacheDirectories()); - const CONFIG_DIRECTORY = (exports.CONFIG_DIRECTORY = getConfigDir()); - const DATA_DIRECTORY = (exports.DATA_DIRECTORY = getDataDir()); - const LINK_REGISTRY_DIRECTORY = (exports.LINK_REGISTRY_DIRECTORY = - path.join(DATA_DIRECTORY, 'link')); - const GLOBAL_MODULE_DIRECTORY = (exports.GLOBAL_MODULE_DIRECTORY = - path.join(DATA_DIRECTORY, 'global')); - - const NODE_BIN_PATH = (exports.NODE_BIN_PATH = process.execPath); - const YARN_BIN_PATH = (exports.YARN_BIN_PATH = getYarnBinPath()); - - // Webpack needs to be configured with node.__dirname/__filename = false - function getYarnBinPath() { - if (isWebpackBundle) { - return __filename; - } else { - return path.join(__dirname, '..', 'bin', 'yarn.js'); - } - } - - const NODE_MODULES_FOLDER = (exports.NODE_MODULES_FOLDER = - 'node_modules'); - const NODE_PACKAGE_JSON = (exports.NODE_PACKAGE_JSON = 'package.json'); - - const PNP_FILENAME = (exports.PNP_FILENAME = '.pnp.js'); - - const POSIX_GLOBAL_PREFIX = (exports.POSIX_GLOBAL_PREFIX = `${ - process.env.DESTDIR || '' - }/usr/local`); - const FALLBACK_GLOBAL_PREFIX = (exports.FALLBACK_GLOBAL_PREFIX = - path.join(userHome, '.yarn')); - - const META_FOLDER = (exports.META_FOLDER = '.yarn-meta'); - const INTEGRITY_FILENAME = (exports.INTEGRITY_FILENAME = - '.yarn-integrity'); - const LOCKFILE_FILENAME = (exports.LOCKFILE_FILENAME = 'yarn.lock'); - const METADATA_FILENAME = (exports.METADATA_FILENAME = - '.yarn-metadata.json'); - const TARBALL_FILENAME = (exports.TARBALL_FILENAME = '.yarn-tarball.tgz'); - const CLEAN_FILENAME = (exports.CLEAN_FILENAME = '.yarnclean'); - - const NPM_LOCK_FILENAME = (exports.NPM_LOCK_FILENAME = - 'package-lock.json'); - const NPM_SHRINKWRAP_FILENAME = (exports.NPM_SHRINKWRAP_FILENAME = - 'npm-shrinkwrap.json'); - - const DEFAULT_INDENT = (exports.DEFAULT_INDENT = ' '); - const SINGLE_INSTANCE_PORT = (exports.SINGLE_INSTANCE_PORT = 31997); - const SINGLE_INSTANCE_FILENAME = (exports.SINGLE_INSTANCE_FILENAME = - '.yarn-single-instance'); - - const ENV_PATH_KEY = (exports.ENV_PATH_KEY = getPathKey( - process.platform, - process.env - )); - - function getPathKey(platform, env) { - let pathKey = 'PATH'; - - // windows calls its path "Path" usually, but this is not guaranteed. - if (platform === 'win32') { - pathKey = 'Path'; - - for (const key in env) { - if (key.toLowerCase() === 'path') { - pathKey = key; - } - } - } - - return pathKey; - } - - const VERSION_COLOR_SCHEME = (exports.VERSION_COLOR_SCHEME = { - major: 'red', - premajor: 'red', - minor: 'yellow', - preminor: 'yellow', - patch: 'green', - prepatch: 'green', - prerelease: 'red', - unchanged: 'white', - unknown: 'red', - }); - - /***/ - }, - /* 9 */ - /***/ function (module, exports, __webpack_require__) { - 'use strict'; - /** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - - /** - * Use invariant() to assert state which your program assumes to be true. - * - * Provide sprintf-style format (only %s is supported) and arguments - * to provide information about what broke and what you were - * expecting. - * - * The invariant message will be stripped in production, but the invariant - * will remain to ensure logic does not differ in production. - */ - - var NODE_ENV = process.env.NODE_ENV; - - var invariant = function (condition, format, a, b, c, d, e, f) { - if (NODE_ENV !== 'production') { - if (format === undefined) { - throw new Error('invariant requires an error message argument'); - } - } - - if (!condition) { - var error; - if (format === undefined) { - error = new Error( - 'Minified exception occurred; use the non-minified dev environment ' + - 'for the full error message and additional helpful warnings.' - ); - } else { - var args = [a, b, c, d, e, f]; - var argIndex = 0; - error = new Error( - format.replace(/%s/g, function () { - return args[argIndex++]; - }) - ); - error.name = 'Invariant Violation'; - } - - error.framesToPop = 1; // we don't care about invariant's own frame - throw error; - } - }; - - module.exports = invariant; - - /***/ - }, - /* 10 */ - /***/ function (module, exports, __webpack_require__) { - 'use strict'; - - var YAMLException = __webpack_require__(55); - - var TYPE_CONSTRUCTOR_OPTIONS = [ - 'kind', - 'resolve', - 'construct', - 'instanceOf', - 'predicate', - 'represent', - 'defaultStyle', - 'styleAliases', - ]; - - var YAML_NODE_KINDS = ['scalar', 'sequence', 'mapping']; - - function compileStyleAliases(map) { - var result = {}; - - if (map !== null) { - Object.keys(map).forEach(function (style) { - map[style].forEach(function (alias) { - result[String(alias)] = style; - }); - }); - } - - return result; - } - - function Type(tag, options) { - options = options || {}; - - Object.keys(options).forEach(function (name) { - if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) { - throw new YAMLException( - 'Unknown option "' + - name + - '" is met in definition of "' + - tag + - '" YAML type.' - ); - } - }); - - // TODO: Add tag format check. - this.tag = tag; - this.kind = options['kind'] || null; - this.resolve = - options['resolve'] || - function () { - return true; - }; - this.construct = - options['construct'] || - function (data) { - return data; - }; - this.instanceOf = options['instanceOf'] || null; - this.predicate = options['predicate'] || null; - this.represent = options['represent'] || null; - this.defaultStyle = options['defaultStyle'] || null; - this.styleAliases = compileStyleAliases( - options['styleAliases'] || null - ); - - if (YAML_NODE_KINDS.indexOf(this.kind) === -1) { - throw new YAMLException( - 'Unknown kind "' + - this.kind + - '" is specified for "' + - tag + - '" YAML type.' - ); - } - } - - module.exports = Type; - - /***/ - }, - /* 11 */ - /***/ function (module, exports) { - module.exports = require('crypto'); - - /***/ - }, - /* 12 */ - /***/ function (module, __webpack_exports__, __webpack_require__) { - 'use strict'; - /* harmony export (binding) */ __webpack_require__.d( - __webpack_exports__, - 'a', - function () { - return Observable; - } - ); - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__util_canReportError__ = - __webpack_require__(322); - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_toSubscriber__ = - __webpack_require__(932); - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__internal_symbol_observable__ = - __webpack_require__(118); - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_pipe__ = - __webpack_require__(324); - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__config__ = - __webpack_require__(186); - /** PURE_IMPORTS_START _util_canReportError,_util_toSubscriber,_internal_symbol_observable,_util_pipe,_config PURE_IMPORTS_END */ - - var Observable = /*@__PURE__*/ (function () { - function Observable(subscribe) { - this._isScalar = false; - if (subscribe) { - this._subscribe = subscribe; - } - } - Observable.prototype.lift = function (operator) { - var observable = new Observable(); - observable.source = this; - observable.operator = operator; - return observable; - }; - Observable.prototype.subscribe = function ( - observerOrNext, - error, - complete - ) { - var operator = this.operator; - var sink = __webpack_require__.i( - __WEBPACK_IMPORTED_MODULE_1__util_toSubscriber__[ - 'a' /* toSubscriber */ - ] - )(observerOrNext, error, complete); - if (operator) { - operator.call(sink, this.source); - } else { - sink.add( - this.source || - (__WEBPACK_IMPORTED_MODULE_4__config__['a' /* config */] - .useDeprecatedSynchronousErrorHandling && - !sink.syncErrorThrowable) - ? this._subscribe(sink) - : this._trySubscribe(sink) - ); - } - if ( - __WEBPACK_IMPORTED_MODULE_4__config__['a' /* config */] - .useDeprecatedSynchronousErrorHandling - ) { - if (sink.syncErrorThrowable) { - sink.syncErrorThrowable = false; - if (sink.syncErrorThrown) { - throw sink.syncErrorValue; - } - } - } - return sink; - }; - Observable.prototype._trySubscribe = function (sink) { - try { - return this._subscribe(sink); - } catch (err) { - if ( - __WEBPACK_IMPORTED_MODULE_4__config__['a' /* config */] - .useDeprecatedSynchronousErrorHandling - ) { - sink.syncErrorThrown = true; - sink.syncErrorValue = err; - } - if ( - __webpack_require__.i( - __WEBPACK_IMPORTED_MODULE_0__util_canReportError__[ - 'a' /* canReportError */ - ] - )(sink) - ) { - sink.error(err); - } else { - console.warn(err); - } - } - }; - Observable.prototype.forEach = function (next, promiseCtor) { - var _this = this; - promiseCtor = getPromiseCtor(promiseCtor); - return new promiseCtor(function (resolve, reject) { - var subscription; - subscription = _this.subscribe( - function (value) { - try { - next(value); - } catch (err) { - reject(err); - if (subscription) { - subscription.unsubscribe(); - } - } - }, - reject, - resolve - ); - }); - }; - Observable.prototype._subscribe = function (subscriber) { - var source = this.source; - return source && source.subscribe(subscriber); - }; - Observable.prototype[ - __WEBPACK_IMPORTED_MODULE_2__internal_symbol_observable__[ - 'a' /* observable */ - ] - ] = function () { - return this; - }; - Observable.prototype.pipe = function () { - var operations = []; - for (var _i = 0; _i < arguments.length; _i++) { - operations[_i] = arguments[_i]; - } - if (operations.length === 0) { - return this; - } - return __webpack_require__.i( - __WEBPACK_IMPORTED_MODULE_3__util_pipe__['b' /* pipeFromArray */] - )(operations)(this); - }; - Observable.prototype.toPromise = function (promiseCtor) { - var _this = this; - promiseCtor = getPromiseCtor(promiseCtor); - return new promiseCtor(function (resolve, reject) { - var value; - _this.subscribe( - function (x) { - return (value = x); - }, - function (err) { - return reject(err); - }, - function () { - return resolve(value); - } - ); - }); - }; - Observable.create = function (subscribe) { - return new Observable(subscribe); - }; - return Observable; - })(); - - function getPromiseCtor(promiseCtor) { - if (!promiseCtor) { - promiseCtor = - __WEBPACK_IMPORTED_MODULE_4__config__['a' /* config */].Promise || - Promise; - } - if (!promiseCtor) { - throw new Error('no Promise impl found'); - } - return promiseCtor; - } - //# sourceMappingURL=Observable.js.map - - /***/ - }, - /* 13 */ - /***/ function (module, __webpack_exports__, __webpack_require__) { - 'use strict'; - /* harmony export (binding) */ __webpack_require__.d( - __webpack_exports__, - 'a', - function () { - return OuterSubscriber; - } - ); - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = - __webpack_require__(1); - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = - __webpack_require__(7); - /** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ - - var OuterSubscriber = /*@__PURE__*/ (function (_super) { - __WEBPACK_IMPORTED_MODULE_0_tslib__['a' /* __extends */]( - OuterSubscriber, - _super - ); - function OuterSubscriber() { - return (_super !== null && _super.apply(this, arguments)) || this; - } - OuterSubscriber.prototype.notifyNext = function ( - outerValue, - innerValue, - outerIndex, - innerIndex, - innerSub - ) { - this.destination.next(innerValue); - }; - OuterSubscriber.prototype.notifyError = function (error, innerSub) { - this.destination.error(error); - }; - OuterSubscriber.prototype.notifyComplete = function (innerSub) { - this.destination.complete(); - }; - return OuterSubscriber; - })(__WEBPACK_IMPORTED_MODULE_1__Subscriber__['a' /* Subscriber */]); - - //# sourceMappingURL=OuterSubscriber.js.map - - /***/ - }, - /* 14 */ - /***/ function (module, __webpack_exports__, __webpack_require__) { - 'use strict'; - /* harmony export (immutable) */ __webpack_exports__['a'] = - subscribeToResult; - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__InnerSubscriber__ = - __webpack_require__(84); - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__subscribeTo__ = - __webpack_require__(446); - /** PURE_IMPORTS_START _InnerSubscriber,_subscribeTo PURE_IMPORTS_END */ - - function subscribeToResult( - outerSubscriber, - result, - outerValue, - outerIndex, - destination - ) { - if (destination === void 0) { - destination = new __WEBPACK_IMPORTED_MODULE_0__InnerSubscriber__[ - 'a' /* InnerSubscriber */ - ](outerSubscriber, outerValue, outerIndex); - } - if (destination.closed) { - return; - } - return __webpack_require__.i( - __WEBPACK_IMPORTED_MODULE_1__subscribeTo__['a' /* subscribeTo */] - )(result)(destination); - } - //# sourceMappingURL=subscribeToResult.js.map - - /***/ - }, - /* 15 */ - /***/ function (module, exports, __webpack_require__) { - 'use strict'; - /* eslint-disable node/no-deprecated-api */ - - var buffer = __webpack_require__(64); - var Buffer = buffer.Buffer; - - var safer = {}; - - var key; - - for (key in buffer) { - if (!buffer.hasOwnProperty(key)) continue; - if (key === 'SlowBuffer' || key === 'Buffer') continue; - safer[key] = buffer[key]; - } - - var Safer = (safer.Buffer = {}); - for (key in Buffer) { - if (!Buffer.hasOwnProperty(key)) continue; - if (key === 'allocUnsafe' || key === 'allocUnsafeSlow') continue; - Safer[key] = Buffer[key]; - } - - safer.Buffer.prototype = Buffer.prototype; - - if (!Safer.from || Safer.from === Uint8Array.from) { - Safer.from = function (value, encodingOrOffset, length) { - if (typeof value === 'number') { - throw new TypeError( - 'The "value" argument must not be of type number. Received type ' + - typeof value - ); - } - if (value && typeof value.length === 'undefined') { - throw new TypeError( - 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type ' + - typeof value - ); - } - return Buffer(value, encodingOrOffset, length); - }; - } - - if (!Safer.alloc) { - Safer.alloc = function (size, fill, encoding) { - if (typeof size !== 'number') { - throw new TypeError( - 'The "size" argument must be of type number. Received type ' + - typeof size - ); - } - if (size < 0 || size >= 2 * (1 << 30)) { - throw new RangeError( - 'The value "' + size + '" is invalid for option "size"' - ); - } - var buf = Buffer(size); - if (!fill || fill.length === 0) { - buf.fill(0); - } else if (typeof encoding === 'string') { - buf.fill(fill, encoding); - } else { - buf.fill(fill); - } - return buf; - }; - } - - if (!safer.kStringMaxLength) { - try { - safer.kStringMaxLength = process.binding('buffer').kStringMaxLength; - } catch (e) { - // we can't determine kStringMaxLength in environments where process.binding - // is unsupported, so let's not set it - } - } - - if (!safer.constants) { - safer.constants = { - MAX_LENGTH: safer.kMaxLength, - }; - if (safer.kStringMaxLength) { - safer.constants.MAX_STRING_LENGTH = safer.kStringMaxLength; - } - } - - module.exports = safer; - - /***/ - }, - /* 16 */ - /***/ function (module, exports, __webpack_require__) { - // Copyright (c) 2012, Mark Cavage. All rights reserved. - // Copyright 2015 Joyent, Inc. - - var assert = __webpack_require__(28); - var Stream = __webpack_require__(23).Stream; - var util = __webpack_require__(3); - - ///--- Globals - - /* JSSTYLED */ - var UUID_REGEXP = - /^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/; - - ///--- Internal - - function _capitalize(str) { - return str.charAt(0).toUpperCase() + str.slice(1); - } - - function _toss(name, expected, oper, arg, actual) { - throw new assert.AssertionError({ - message: util.format('%s (%s) is required', name, expected), - actual: actual === undefined ? typeof arg : actual(arg), - expected: expected, - operator: oper || '===', - stackStartFunction: _toss.caller, - }); - } - - function _getClass(arg) { - return Object.prototype.toString.call(arg).slice(8, -1); - } - - function noop() { - // Why even bother with asserts? - } - - ///--- Exports - - var types = { - bool: { - check: function (arg) { - return typeof arg === 'boolean'; - }, - }, - func: { - check: function (arg) { - return typeof arg === 'function'; - }, - }, - string: { - check: function (arg) { - return typeof arg === 'string'; - }, - }, - object: { - check: function (arg) { - return typeof arg === 'object' && arg !== null; - }, - }, - number: { - check: function (arg) { - return typeof arg === 'number' && !isNaN(arg); - }, - }, - finite: { - check: function (arg) { - return typeof arg === 'number' && !isNaN(arg) && isFinite(arg); - }, - }, - buffer: { - check: function (arg) { - return Buffer.isBuffer(arg); - }, - operator: 'Buffer.isBuffer', - }, - array: { - check: function (arg) { - return Array.isArray(arg); - }, - operator: 'Array.isArray', - }, - stream: { - check: function (arg) { - return arg instanceof Stream; - }, - operator: 'instanceof', - actual: _getClass, - }, - date: { - check: function (arg) { - return arg instanceof Date; - }, - operator: 'instanceof', - actual: _getClass, - }, - regexp: { - check: function (arg) { - return arg instanceof RegExp; - }, - operator: 'instanceof', - actual: _getClass, - }, - uuid: { - check: function (arg) { - return typeof arg === 'string' && UUID_REGEXP.test(arg); - }, - operator: 'isUUID', - }, - }; - - function _setExports(ndebug) { - var keys = Object.keys(types); - var out; - - /* re-export standard assert */ - if (process.env.NODE_NDEBUG) { - out = noop; - } else { - out = function (arg, msg) { - if (!arg) { - _toss(msg, 'true', arg); - } - }; - } - - /* standard checks */ - keys.forEach(function (k) { - if (ndebug) { - out[k] = noop; - return; - } - var type = types[k]; - out[k] = function (arg, msg) { - if (!type.check(arg)) { - _toss(msg, k, type.operator, arg, type.actual); - } - }; - }); - - /* optional checks */ - keys.forEach(function (k) { - var name = 'optional' + _capitalize(k); - if (ndebug) { - out[name] = noop; - return; - } - var type = types[k]; - out[name] = function (arg, msg) { - if (arg === undefined || arg === null) { - return; - } - if (!type.check(arg)) { - _toss(msg, k, type.operator, arg, type.actual); - } - }; - }); - - /* arrayOf checks */ - keys.forEach(function (k) { - var name = 'arrayOf' + _capitalize(k); - if (ndebug) { - out[name] = noop; - return; - } - var type = types[k]; - var expected = '[' + k + ']'; - out[name] = function (arg, msg) { - if (!Array.isArray(arg)) { - _toss(msg, expected, type.operator, arg, type.actual); - } - var i; - for (i = 0; i < arg.length; i++) { - if (!type.check(arg[i])) { - _toss(msg, expected, type.operator, arg, type.actual); - } - } - }; - }); - - /* optionalArrayOf checks */ - keys.forEach(function (k) { - var name = 'optionalArrayOf' + _capitalize(k); - if (ndebug) { - out[name] = noop; - return; - } - var type = types[k]; - var expected = '[' + k + ']'; - out[name] = function (arg, msg) { - if (arg === undefined || arg === null) { - return; - } - if (!Array.isArray(arg)) { - _toss(msg, expected, type.operator, arg, type.actual); - } - var i; - for (i = 0; i < arg.length; i++) { - if (!type.check(arg[i])) { - _toss(msg, expected, type.operator, arg, type.actual); - } - } - }; - }); - - /* re-export built-in assertions */ - Object.keys(assert).forEach(function (k) { - if (k === 'AssertionError') { - out[k] = assert[k]; - return; - } - if (ndebug) { - out[k] = noop; - return; - } - out[k] = assert[k]; - }); - - /* export ourselves (for unit tests _only_) */ - out._setExports = _setExports; - - return out; - } - - module.exports = _setExports(process.env.NODE_NDEBUG); - - /***/ - }, - /* 17 */ - /***/ function (module, exports) { - // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 - var global = (module.exports = - typeof window != 'undefined' && window.Math == Math - ? window - : typeof self != 'undefined' && self.Math == Math - ? self - : // eslint-disable-next-line no-new-func - Function('return this')()); - if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef - - /***/ - }, - /* 18 */ - /***/ function (module, exports, __webpack_require__) { - 'use strict'; - - Object.defineProperty(exports, '__esModule', { - value: true, - }); - exports.sortAlpha = sortAlpha; - exports.sortOptionsByFlags = sortOptionsByFlags; - exports.entries = entries; - exports.removePrefix = removePrefix; - exports.removeSuffix = removeSuffix; - exports.addSuffix = addSuffix; - exports.hyphenate = hyphenate; - exports.camelCase = camelCase; - exports.compareSortedArrays = compareSortedArrays; - exports.sleep = sleep; - const _camelCase = __webpack_require__(227); - - function sortAlpha(a, b) { - // sort alphabetically in a deterministic way - const shortLen = Math.min(a.length, b.length); - for (let i = 0; i < shortLen; i++) { - const aChar = a.charCodeAt(i); - const bChar = b.charCodeAt(i); - if (aChar !== bChar) { - return aChar - bChar; - } - } - return a.length - b.length; - } - - function sortOptionsByFlags(a, b) { - const aOpt = a.flags.replace(/-/g, ''); - const bOpt = b.flags.replace(/-/g, ''); - return sortAlpha(aOpt, bOpt); - } - - function entries(obj) { - const entries = []; - if (obj) { - for (const key in obj) { - entries.push([key, obj[key]]); - } - } - return entries; - } - - function removePrefix(pattern, prefix) { - if (pattern.startsWith(prefix)) { - pattern = pattern.slice(prefix.length); - } - - return pattern; - } - - function removeSuffix(pattern, suffix) { - if (pattern.endsWith(suffix)) { - return pattern.slice(0, -suffix.length); - } - - return pattern; - } - - function addSuffix(pattern, suffix) { - if (!pattern.endsWith(suffix)) { - return pattern + suffix; - } - - return pattern; - } - - function hyphenate(str) { - return str.replace(/[A-Z]/g, (match) => { - return '-' + match.charAt(0).toLowerCase(); - }); - } - - function camelCase(str) { - if (/[A-Z]/.test(str)) { - return null; - } else { - return _camelCase(str); - } - } - - function compareSortedArrays(array1, array2) { - if (array1.length !== array2.length) { - return false; - } - for (let i = 0, len = array1.length; i < len; i++) { - if (array1[i] !== array2[i]) { - return false; - } - } - return true; - } - - function sleep(ms) { - return new Promise((resolve) => { - setTimeout(resolve, ms); - }); - } - - /***/ - }, - /* 19 */ - /***/ function (module, exports, __webpack_require__) { - 'use strict'; - - Object.defineProperty(exports, '__esModule', { - value: true, - }); - exports.stringify = exports.parse = undefined; - - var _asyncToGenerator2; - - function _load_asyncToGenerator() { - return (_asyncToGenerator2 = _interopRequireDefault( - __webpack_require__(2) - )); - } - - var _parse; - - function _load_parse() { - return (_parse = __webpack_require__(106)); - } - - Object.defineProperty(exports, 'parse', { - enumerable: true, - get: function get() { - return _interopRequireDefault(_parse || _load_parse()).default; - }, - }); - - var _stringify; - - function _load_stringify() { - return (_stringify = __webpack_require__(200)); - } - - Object.defineProperty(exports, 'stringify', { - enumerable: true, - get: function get() { - return _interopRequireDefault(_stringify || _load_stringify()) - .default; - }, - }); - exports.implodeEntry = implodeEntry; - exports.explodeEntry = explodeEntry; - - var _misc; - - function _load_misc() { - return (_misc = __webpack_require__(18)); - } - - var _normalizePattern; - - function _load_normalizePattern() { - return (_normalizePattern = __webpack_require__(37)); - } - - var _parse2; - - function _load_parse2() { - return (_parse2 = _interopRequireDefault(__webpack_require__(106))); - } - - var _constants; - - function _load_constants() { - return (_constants = __webpack_require__(8)); - } - - var _fs; - - function _load_fs() { - return (_fs = _interopRequireWildcard(__webpack_require__(5))); - } - - function _interopRequireWildcard(obj) { - if (obj && obj.__esModule) { - return obj; - } else { - var newObj = {}; - if (obj != null) { - for (var key in obj) { - if (Object.prototype.hasOwnProperty.call(obj, key)) - newObj[key] = obj[key]; - } - } - newObj.default = obj; - return newObj; - } - } - - function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { default: obj }; - } - - const invariant = __webpack_require__(9); - - const path = __webpack_require__(0); - const ssri = __webpack_require__(65); - - function getName(pattern) { - return (0, - (_normalizePattern || _load_normalizePattern()).normalizePattern)( - pattern - ).name; - } - - function blankObjectUndefined(obj) { - return obj && Object.keys(obj).length ? obj : undefined; - } - - function keyForRemote(remote) { - return ( - remote.resolved || - (remote.reference && remote.hash - ? `${remote.reference}#${remote.hash}` - : null) - ); - } - - function serializeIntegrity(integrity) { - // We need this because `Integrity.toString()` does not use sorting to ensure a stable string output - // See https://git.io/vx2Hy - return integrity.toString().split(' ').sort().join(' '); - } - - function implodeEntry(pattern, obj) { - const inferredName = getName(pattern); - const integrity = obj.integrity - ? serializeIntegrity(obj.integrity) - : ''; - const imploded = { - name: inferredName === obj.name ? undefined : obj.name, - version: obj.version, - uid: obj.uid === obj.version ? undefined : obj.uid, - resolved: obj.resolved, - registry: obj.registry === 'npm' ? undefined : obj.registry, - dependencies: blankObjectUndefined(obj.dependencies), - optionalDependencies: blankObjectUndefined(obj.optionalDependencies), - permissions: blankObjectUndefined(obj.permissions), - prebuiltVariants: blankObjectUndefined(obj.prebuiltVariants), - }; - if (integrity) { - imploded.integrity = integrity; - } - return imploded; - } - - function explodeEntry(pattern, obj) { - obj.optionalDependencies = obj.optionalDependencies || {}; - obj.dependencies = obj.dependencies || {}; - obj.uid = obj.uid || obj.version; - obj.permissions = obj.permissions || {}; - obj.registry = obj.registry || 'npm'; - obj.name = obj.name || getName(pattern); - const integrity = obj.integrity; - if (integrity && integrity.isIntegrity) { - obj.integrity = ssri.parse(integrity); - } - return obj; - } - - class Lockfile { - constructor({ cache, source, parseResultType } = {}) { - this.source = source || ''; - this.cache = cache; - this.parseResultType = parseResultType; - } - - // source string if the `cache` was parsed - - // if true, we're parsing an old yarn file and need to update integrity fields - hasEntriesExistWithoutIntegrity() { - if (!this.cache) { - return false; - } - - for (const key in this.cache) { - // $FlowFixMe - `this.cache` is clearly defined at this point - if ( - !/^.*@(file:|http)/.test(key) && - this.cache[key] && - !this.cache[key].integrity - ) { - return true; - } - } - - return false; - } - - static fromDirectory(dir, reporter) { - return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( - function* () { - // read the manifest in this directory - const lockfileLoc = path.join( - dir, - (_constants || _load_constants()).LOCKFILE_FILENAME - ); - - let lockfile; - let rawLockfile = ''; - let parseResult; - - if (yield (_fs || _load_fs()).exists(lockfileLoc)) { - rawLockfile = yield (_fs || _load_fs()).readFile(lockfileLoc); - parseResult = (0, (_parse2 || _load_parse2()).default)( - rawLockfile, - lockfileLoc - ); - - if (reporter) { - if (parseResult.type === 'merge') { - reporter.info(reporter.lang('lockfileMerged')); - } else if (parseResult.type === 'conflict') { - reporter.warn(reporter.lang('lockfileConflict')); - } - } - - lockfile = parseResult.object; - } else if (reporter) { - reporter.info(reporter.lang('noLockfileFound')); - } - - if (lockfile && lockfile.__metadata) { - const lockfilev2 = lockfile; - lockfile = {}; - } - - return new Lockfile({ - cache: lockfile, - source: rawLockfile, - parseResultType: parseResult && parseResult.type, - }); - } - )(); - } - - getLocked(pattern) { - const cache = this.cache; - if (!cache) { - return undefined; - } - - const shrunk = pattern in cache && cache[pattern]; - - if (typeof shrunk === 'string') { - return this.getLocked(shrunk); - } else if (shrunk) { - explodeEntry(pattern, shrunk); - return shrunk; - } - - return undefined; - } - - removePattern(pattern) { - const cache = this.cache; - if (!cache) { - return; - } - delete cache[pattern]; - } - - getLockfile(patterns) { - const lockfile = {}; - const seen = new Map(); - - // order by name so that lockfile manifest is assigned to the first dependency with this manifest - // the others that have the same remoteKey will just refer to the first - // ordering allows for consistency in lockfile when it is serialized - const sortedPatternsKeys = Object.keys(patterns).sort( - (_misc || _load_misc()).sortAlpha - ); - - for ( - var _iterator = sortedPatternsKeys, - _isArray = Array.isArray(_iterator), - _i = 0, - _iterator = _isArray ? _iterator : _iterator[Symbol.iterator](); - ; - - ) { - var _ref; - - if (_isArray) { - if (_i >= _iterator.length) break; - _ref = _iterator[_i++]; - } else { - _i = _iterator.next(); - if (_i.done) break; - _ref = _i.value; - } - - const pattern = _ref; - - const pkg = patterns[pattern]; - const remote = pkg._remote, - ref = pkg._reference; - - invariant(ref, 'Package is missing a reference'); - invariant(remote, 'Package is missing a remote'); - - const remoteKey = keyForRemote(remote); - const seenPattern = remoteKey && seen.get(remoteKey); - if (seenPattern) { - // no point in duplicating it - lockfile[pattern] = seenPattern; - - // if we're relying on our name being inferred and two of the patterns have - // different inferred names then we need to set it - if (!seenPattern.name && getName(pattern) !== pkg.name) { - seenPattern.name = pkg.name; - } - continue; - } - const obj = implodeEntry(pattern, { - name: pkg.name, - version: pkg.version, - uid: pkg._uid, - resolved: remote.resolved, - integrity: remote.integrity, - registry: remote.registry, - dependencies: pkg.dependencies, - peerDependencies: pkg.peerDependencies, - optionalDependencies: pkg.optionalDependencies, - permissions: ref.permissions, - prebuiltVariants: pkg.prebuiltVariants, - }); - - lockfile[pattern] = obj; - - if (remoteKey) { - seen.set(remoteKey, obj); - } - } - - return lockfile; - } - } - exports.default = Lockfile; - - /***/ - }, - /* 20 */ - /***/ function (module, exports, __webpack_require__) { - 'use strict'; - - exports.__esModule = true; - - var _assign = __webpack_require__(559); - - var _assign2 = _interopRequireDefault(_assign); - - function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { default: obj }; - } - - exports.default = - _assign2.default || - function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - - return target; - }; - - /***/ - }, - /* 21 */ - /***/ function (module, exports, __webpack_require__) { - var store = __webpack_require__(133)('wks'); - var uid = __webpack_require__(137); - var Symbol = __webpack_require__(17).Symbol; - var USE_SYMBOL = typeof Symbol == 'function'; - - var $exports = (module.exports = function (name) { - return ( - store[name] || - (store[name] = - (USE_SYMBOL && Symbol[name]) || - (USE_SYMBOL ? Symbol : uid)('Symbol.' + name)) - ); - }); - - $exports.store = store; - - /***/ - }, - /* 22 */ - /***/ function (module, exports) { - exports = module.exports = SemVer; - - // The debug function is excluded entirely from the minified version. - /* nomin */ var debug; - /* nomin */ if ( - typeof process === 'object' && - /* nomin */ process.env && - /* nomin */ process.env.NODE_DEBUG && - /* nomin */ /\bsemver\b/i.test(process.env.NODE_DEBUG) - ) - /* nomin */ debug = function () { - /* nomin */ var args = Array.prototype.slice.call(arguments, 0); - /* nomin */ args.unshift('SEMVER'); - /* nomin */ console.log.apply(console, args); - /* nomin */ - }; - /* nomin */ - /* nomin */ else debug = function () {}; - - // Note: this is the semver.org version of the spec that it implements - // Not necessarily the package version of this code. - exports.SEMVER_SPEC_VERSION = '2.0.0'; - - var MAX_LENGTH = 256; - var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; - - // Max safe segment length for coercion. - var MAX_SAFE_COMPONENT_LENGTH = 16; - - // The actual regexps go on exports.re - var re = (exports.re = []); - var src = (exports.src = []); - var R = 0; - - // The following Regular Expressions can be used for tokenizing, - // validating, and parsing SemVer version strings. - - // ## Numeric Identifier - // A single `0`, or a non-zero digit followed by zero or more digits. - - var NUMERICIDENTIFIER = R++; - src[NUMERICIDENTIFIER] = '0|[1-9]\\d*'; - var NUMERICIDENTIFIERLOOSE = R++; - src[NUMERICIDENTIFIERLOOSE] = '[0-9]+'; - - // ## Non-numeric Identifier - // Zero or more digits, followed by a letter or hyphen, and then zero or - // more letters, digits, or hyphens. - - var NONNUMERICIDENTIFIER = R++; - src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*'; - - // ## Main Version - // Three dot-separated numeric identifiers. - - var MAINVERSION = R++; - src[MAINVERSION] = - '(' + - src[NUMERICIDENTIFIER] + - ')\\.' + - '(' + - src[NUMERICIDENTIFIER] + - ')\\.' + - '(' + - src[NUMERICIDENTIFIER] + - ')'; - - var MAINVERSIONLOOSE = R++; - src[MAINVERSIONLOOSE] = - '(' + - src[NUMERICIDENTIFIERLOOSE] + - ')\\.' + - '(' + - src[NUMERICIDENTIFIERLOOSE] + - ')\\.' + - '(' + - src[NUMERICIDENTIFIERLOOSE] + - ')'; - - // ## Pre-release Version Identifier - // A numeric identifier, or a non-numeric identifier. - - var PRERELEASEIDENTIFIER = R++; - src[PRERELEASEIDENTIFIER] = - '(?:' + src[NUMERICIDENTIFIER] + '|' + src[NONNUMERICIDENTIFIER] + ')'; - - var PRERELEASEIDENTIFIERLOOSE = R++; - src[PRERELEASEIDENTIFIERLOOSE] = - '(?:' + - src[NUMERICIDENTIFIERLOOSE] + - '|' + - src[NONNUMERICIDENTIFIER] + - ')'; - - // ## Pre-release Version - // Hyphen, followed by one or more dot-separated pre-release version - // identifiers. - - var PRERELEASE = R++; - src[PRERELEASE] = - '(?:-(' + - src[PRERELEASEIDENTIFIER] + - '(?:\\.' + - src[PRERELEASEIDENTIFIER] + - ')*))'; - - var PRERELEASELOOSE = R++; - src[PRERELEASELOOSE] = - '(?:-?(' + - src[PRERELEASEIDENTIFIERLOOSE] + - '(?:\\.' + - src[PRERELEASEIDENTIFIERLOOSE] + - ')*))'; - - // ## Build Metadata Identifier - // Any combination of digits, letters, or hyphens. - - var BUILDIDENTIFIER = R++; - src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+'; - - // ## Build Metadata - // Plus sign, followed by one or more period-separated build metadata - // identifiers. - - var BUILD = R++; - src[BUILD] = - '(?:\\+(' + - src[BUILDIDENTIFIER] + - '(?:\\.' + - src[BUILDIDENTIFIER] + - ')*))'; - - // ## Full Version String - // A main version, followed optionally by a pre-release version and - // build metadata. - - // Note that the only major, minor, patch, and pre-release sections of - // the version string are capturing groups. The build metadata is not a - // capturing group, because it should not ever be used in version - // comparison. - - var FULL = R++; - var FULLPLAIN = - 'v?' + src[MAINVERSION] + src[PRERELEASE] + '?' + src[BUILD] + '?'; - - src[FULL] = '^' + FULLPLAIN + '$'; - - // like full, but allows v1.2.3 and =1.2.3, which people do sometimes. - // also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty - // common in the npm registry. - var LOOSEPLAIN = - '[v=\\s]*' + - src[MAINVERSIONLOOSE] + - src[PRERELEASELOOSE] + - '?' + - src[BUILD] + - '?'; - - var LOOSE = R++; - src[LOOSE] = '^' + LOOSEPLAIN + '$'; - - var GTLT = R++; - src[GTLT] = '((?:<|>)?=?)'; - - // Something like "2.*" or "1.2.x". - // Note that "x.x" is a valid xRange identifer, meaning "any version" - // Only the first item is strictly required. - var XRANGEIDENTIFIERLOOSE = R++; - src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*'; - var XRANGEIDENTIFIER = R++; - src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*'; - - var XRANGEPLAIN = R++; - src[XRANGEPLAIN] = - '[v=\\s]*(' + - src[XRANGEIDENTIFIER] + - ')' + - '(?:\\.(' + - src[XRANGEIDENTIFIER] + - ')' + - '(?:\\.(' + - src[XRANGEIDENTIFIER] + - ')' + - '(?:' + - src[PRERELEASE] + - ')?' + - src[BUILD] + - '?' + - ')?)?'; - - var XRANGEPLAINLOOSE = R++; - src[XRANGEPLAINLOOSE] = - '[v=\\s]*(' + - src[XRANGEIDENTIFIERLOOSE] + - ')' + - '(?:\\.(' + - src[XRANGEIDENTIFIERLOOSE] + - ')' + - '(?:\\.(' + - src[XRANGEIDENTIFIERLOOSE] + - ')' + - '(?:' + - src[PRERELEASELOOSE] + - ')?' + - src[BUILD] + - '?' + - ')?)?'; - - var XRANGE = R++; - src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$'; - var XRANGELOOSE = R++; - src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$'; - - // Coercion. - // Extract anything that could conceivably be a part of a valid semver - var COERCE = R++; - src[COERCE] = - '(?:^|[^\\d])' + - '(\\d{1,' + - MAX_SAFE_COMPONENT_LENGTH + - '})' + - '(?:\\.(\\d{1,' + - MAX_SAFE_COMPONENT_LENGTH + - '}))?' + - '(?:\\.(\\d{1,' + - MAX_SAFE_COMPONENT_LENGTH + - '}))?' + - '(?:$|[^\\d])'; - - // Tilde ranges. - // Meaning is "reasonably at or greater than" - var LONETILDE = R++; - src[LONETILDE] = '(?:~>?)'; - - var TILDETRIM = R++; - src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+'; - re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g'); - var tildeTrimReplace = '$1~'; - - var TILDE = R++; - src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$'; - var TILDELOOSE = R++; - src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$'; - - // Caret ranges. - // Meaning is "at least and backwards compatible with" - var LONECARET = R++; - src[LONECARET] = '(?:\\^)'; - - var CARETTRIM = R++; - src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+'; - re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g'); - var caretTrimReplace = '$1^'; - - var CARET = R++; - src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$'; - var CARETLOOSE = R++; - src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$'; - - // A simple gt/lt/eq thing, or just "" to indicate "any version" - var COMPARATORLOOSE = R++; - src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$'; - var COMPARATOR = R++; - src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$'; - - // An expression to strip any whitespace between the gtlt and the thing - // it modifies, so that `> 1.2.3` ==> `>1.2.3` - var COMPARATORTRIM = R++; - src[COMPARATORTRIM] = - '(\\s*)' + - src[GTLT] + - '\\s*(' + - LOOSEPLAIN + - '|' + - src[XRANGEPLAIN] + - ')'; - - // this one has to use the /g flag - re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g'); - var comparatorTrimReplace = '$1$2$3'; - - // Something like `1.2.3 - 1.2.4` - // Note that these all use the loose form, because they'll be - // checked against either the strict or loose comparator form - // later. - var HYPHENRANGE = R++; - src[HYPHENRANGE] = - '^\\s*(' + - src[XRANGEPLAIN] + - ')' + - '\\s+-\\s+' + - '(' + - src[XRANGEPLAIN] + - ')' + - '\\s*$'; - - var HYPHENRANGELOOSE = R++; - src[HYPHENRANGELOOSE] = - '^\\s*(' + - src[XRANGEPLAINLOOSE] + - ')' + - '\\s+-\\s+' + - '(' + - src[XRANGEPLAINLOOSE] + - ')' + - '\\s*$'; - - // Star ranges basically just allow anything at all. - var STAR = R++; - src[STAR] = '(<|>)?=?\\s*\\*'; - - // Compile to actual regexp objects. - // All are flag-free, unless they were created above with a flag. - for (var i = 0; i < R; i++) { - debug(i, src[i]); - if (!re[i]) re[i] = new RegExp(src[i]); - } - - exports.parse = parse; - function parse(version, loose) { - if (version instanceof SemVer) return version; - - if (typeof version !== 'string') return null; - - if (version.length > MAX_LENGTH) return null; - - var r = loose ? re[LOOSE] : re[FULL]; - if (!r.test(version)) return null; - - try { - return new SemVer(version, loose); - } catch (er) { - return null; - } - } - - exports.valid = valid; - function valid(version, loose) { - var v = parse(version, loose); - return v ? v.version : null; - } - - exports.clean = clean; - function clean(version, loose) { - var s = parse(version.trim().replace(/^[=v]+/, ''), loose); - return s ? s.version : null; - } - - exports.SemVer = SemVer; - - function SemVer(version, loose) { - if (version instanceof SemVer) { - if (version.loose === loose) return version; - else version = version.version; - } else if (typeof version !== 'string') { - throw new TypeError('Invalid Version: ' + version); - } - - if (version.length > MAX_LENGTH) - throw new TypeError( - 'version is longer than ' + MAX_LENGTH + ' characters' - ); - - if (!(this instanceof SemVer)) return new SemVer(version, loose); - - debug('SemVer', version, loose); - this.loose = loose; - var m = version.trim().match(loose ? re[LOOSE] : re[FULL]); - - if (!m) throw new TypeError('Invalid Version: ' + version); - - this.raw = version; - - // these are actually numbers - this.major = +m[1]; - this.minor = +m[2]; - this.patch = +m[3]; - - if (this.major > MAX_SAFE_INTEGER || this.major < 0) - throw new TypeError('Invalid major version'); - - if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) - throw new TypeError('Invalid minor version'); - - if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) - throw new TypeError('Invalid patch version'); - - // numberify any prerelease numeric ids - if (!m[4]) this.prerelease = []; - else - this.prerelease = m[4].split('.').map(function (id) { - if (/^[0-9]+$/.test(id)) { - var num = +id; - if (num >= 0 && num < MAX_SAFE_INTEGER) return num; - } - return id; - }); - - this.build = m[5] ? m[5].split('.') : []; - this.format(); - } - - SemVer.prototype.format = function () { - this.version = this.major + '.' + this.minor + '.' + this.patch; - if (this.prerelease.length) - this.version += '-' + this.prerelease.join('.'); - return this.version; - }; - - SemVer.prototype.toString = function () { - return this.version; - }; - - SemVer.prototype.compare = function (other) { - debug('SemVer.compare', this.version, this.loose, other); - if (!(other instanceof SemVer)) other = new SemVer(other, this.loose); - - return this.compareMain(other) || this.comparePre(other); - }; - - SemVer.prototype.compareMain = function (other) { - if (!(other instanceof SemVer)) other = new SemVer(other, this.loose); - - return ( - compareIdentifiers(this.major, other.major) || - compareIdentifiers(this.minor, other.minor) || - compareIdentifiers(this.patch, other.patch) - ); - }; - - SemVer.prototype.comparePre = function (other) { - if (!(other instanceof SemVer)) other = new SemVer(other, this.loose); - - // NOT having a prerelease is > having one - if (this.prerelease.length && !other.prerelease.length) return -1; - else if (!this.prerelease.length && other.prerelease.length) return 1; - else if (!this.prerelease.length && !other.prerelease.length) return 0; - - var i = 0; - do { - var a = this.prerelease[i]; - var b = other.prerelease[i]; - debug('prerelease compare', i, a, b); - if (a === undefined && b === undefined) return 0; - else if (b === undefined) return 1; - else if (a === undefined) return -1; - else if (a === b) continue; - else return compareIdentifiers(a, b); - } while (++i); - }; - - // preminor will bump the version up to the next minor release, and immediately - // down to pre-release. premajor and prepatch work the same way. - SemVer.prototype.inc = function (release, identifier) { - switch (release) { - case 'premajor': - this.prerelease.length = 0; - this.patch = 0; - this.minor = 0; - this.major++; - this.inc('pre', identifier); - break; - case 'preminor': - this.prerelease.length = 0; - this.patch = 0; - this.minor++; - this.inc('pre', identifier); - break; - case 'prepatch': - // If this is already a prerelease, it will bump to the next version - // drop any prereleases that might already exist, since they are not - // relevant at this point. - this.prerelease.length = 0; - this.inc('patch', identifier); - this.inc('pre', identifier); - break; - // If the input is a non-prerelease version, this acts the same as - // prepatch. - case 'prerelease': - if (this.prerelease.length === 0) this.inc('patch', identifier); - this.inc('pre', identifier); - break; - - case 'major': - // If this is a pre-major version, bump up to the same major version. - // Otherwise increment major. - // 1.0.0-5 bumps to 1.0.0 - // 1.1.0 bumps to 2.0.0 - if ( - this.minor !== 0 || - this.patch !== 0 || - this.prerelease.length === 0 - ) - this.major++; - this.minor = 0; - this.patch = 0; - this.prerelease = []; - break; - case 'minor': - // If this is a pre-minor version, bump up to the same minor version. - // Otherwise increment minor. - // 1.2.0-5 bumps to 1.2.0 - // 1.2.1 bumps to 1.3.0 - if (this.patch !== 0 || this.prerelease.length === 0) this.minor++; - this.patch = 0; - this.prerelease = []; - break; - case 'patch': - // If this is not a pre-release version, it will increment the patch. - // If it is a pre-release it will bump up to the same patch version. - // 1.2.0-5 patches to 1.2.0 - // 1.2.0 patches to 1.2.1 - if (this.prerelease.length === 0) this.patch++; - this.prerelease = []; - break; - // This probably shouldn't be used publicly. - // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction. - case 'pre': - if (this.prerelease.length === 0) this.prerelease = [0]; - else { - var i = this.prerelease.length; - while (--i >= 0) { - if (typeof this.prerelease[i] === 'number') { - this.prerelease[i]++; - i = -2; - } - } - if (i === -1) - // didn't increment anything - this.prerelease.push(0); - } - if (identifier) { - // 1.2.0-beta.1 bumps to 1.2.0-beta.2, - // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 - if (this.prerelease[0] === identifier) { - if (isNaN(this.prerelease[1])) - this.prerelease = [identifier, 0]; - } else this.prerelease = [identifier, 0]; - } - break; - - default: - throw new Error('invalid increment argument: ' + release); - } - this.format(); - this.raw = this.version; - return this; - }; - - exports.inc = inc; - function inc(version, release, loose, identifier) { - if (typeof loose === 'string') { - identifier = loose; - loose = undefined; - } - - try { - return new SemVer(version, loose).inc(release, identifier).version; - } catch (er) { - return null; - } - } - - exports.diff = diff; - function diff(version1, version2) { - if (eq(version1, version2)) { - return null; - } else { - var v1 = parse(version1); - var v2 = parse(version2); - if (v1.prerelease.length || v2.prerelease.length) { - for (var key in v1) { - if (key === 'major' || key === 'minor' || key === 'patch') { - if (v1[key] !== v2[key]) { - return 'pre' + key; - } - } - } - return 'prerelease'; - } - for (var key in v1) { - if (key === 'major' || key === 'minor' || key === 'patch') { - if (v1[key] !== v2[key]) { - return key; - } - } - } - } - } - - exports.compareIdentifiers = compareIdentifiers; - - var numeric = /^[0-9]+$/; - function compareIdentifiers(a, b) { - var anum = numeric.test(a); - var bnum = numeric.test(b); - - if (anum && bnum) { - a = +a; - b = +b; - } - - return anum && !bnum - ? -1 - : bnum && !anum - ? 1 - : a < b - ? -1 - : a > b - ? 1 - : 0; - } - - exports.rcompareIdentifiers = rcompareIdentifiers; - function rcompareIdentifiers(a, b) { - return compareIdentifiers(b, a); - } - - exports.major = major; - function major(a, loose) { - return new SemVer(a, loose).major; - } - - exports.minor = minor; - function minor(a, loose) { - return new SemVer(a, loose).minor; - } - - exports.patch = patch; - function patch(a, loose) { - return new SemVer(a, loose).patch; - } - - exports.compare = compare; - function compare(a, b, loose) { - return new SemVer(a, loose).compare(new SemVer(b, loose)); - } - - exports.compareLoose = compareLoose; - function compareLoose(a, b) { - return compare(a, b, true); - } - - exports.rcompare = rcompare; - function rcompare(a, b, loose) { - return compare(b, a, loose); - } - - exports.sort = sort; - function sort(list, loose) { - return list.sort(function (a, b) { - return exports.compare(a, b, loose); - }); - } - - exports.rsort = rsort; - function rsort(list, loose) { - return list.sort(function (a, b) { - return exports.rcompare(a, b, loose); - }); - } - - exports.gt = gt; - function gt(a, b, loose) { - return compare(a, b, loose) > 0; - } - - exports.lt = lt; - function lt(a, b, loose) { - return compare(a, b, loose) < 0; - } - - exports.eq = eq; - function eq(a, b, loose) { - return compare(a, b, loose) === 0; - } - - exports.neq = neq; - function neq(a, b, loose) { - return compare(a, b, loose) !== 0; - } - - exports.gte = gte; - function gte(a, b, loose) { - return compare(a, b, loose) >= 0; - } - - exports.lte = lte; - function lte(a, b, loose) { - return compare(a, b, loose) <= 0; - } - - exports.cmp = cmp; - function cmp(a, op, b, loose) { - var ret; - switch (op) { - case '===': - if (typeof a === 'object') a = a.version; - if (typeof b === 'object') b = b.version; - ret = a === b; - break; - case '!==': - if (typeof a === 'object') a = a.version; - if (typeof b === 'object') b = b.version; - ret = a !== b; - break; - case '': - case '=': - case '==': - ret = eq(a, b, loose); - break; - case '!=': - ret = neq(a, b, loose); - break; - case '>': - ret = gt(a, b, loose); - break; - case '>=': - ret = gte(a, b, loose); - break; - case '<': - ret = lt(a, b, loose); - break; - case '<=': - ret = lte(a, b, loose); - break; - default: - throw new TypeError('Invalid operator: ' + op); - } - return ret; - } - - exports.Comparator = Comparator; - function Comparator(comp, loose) { - if (comp instanceof Comparator) { - if (comp.loose === loose) return comp; - else comp = comp.value; - } - - if (!(this instanceof Comparator)) return new Comparator(comp, loose); - - debug('comparator', comp, loose); - this.loose = loose; - this.parse(comp); - - if (this.semver === ANY) this.value = ''; - else this.value = this.operator + this.semver.version; - - debug('comp', this); - } - - var ANY = {}; - Comparator.prototype.parse = function (comp) { - var r = this.loose ? re[COMPARATORLOOSE] : re[COMPARATOR]; - var m = comp.match(r); - - if (!m) throw new TypeError('Invalid comparator: ' + comp); - - this.operator = m[1]; - if (this.operator === '=') this.operator = ''; - - // if it literally is just '>' or '' then allow anything. - if (!m[2]) this.semver = ANY; - else this.semver = new SemVer(m[2], this.loose); - }; - - Comparator.prototype.toString = function () { - return this.value; - }; - - Comparator.prototype.test = function (version) { - debug('Comparator.test', version, this.loose); - - if (this.semver === ANY) return true; - - if (typeof version === 'string') - version = new SemVer(version, this.loose); - - return cmp(version, this.operator, this.semver, this.loose); - }; - - Comparator.prototype.intersects = function (comp, loose) { - if (!(comp instanceof Comparator)) { - throw new TypeError('a Comparator is required'); - } - - var rangeTmp; - - if (this.operator === '') { - rangeTmp = new Range(comp.value, loose); - return satisfies(this.value, rangeTmp, loose); - } else if (comp.operator === '') { - rangeTmp = new Range(this.value, loose); - return satisfies(comp.semver, rangeTmp, loose); - } - - var sameDirectionIncreasing = - (this.operator === '>=' || this.operator === '>') && - (comp.operator === '>=' || comp.operator === '>'); - var sameDirectionDecreasing = - (this.operator === '<=' || this.operator === '<') && - (comp.operator === '<=' || comp.operator === '<'); - var sameSemVer = this.semver.version === comp.semver.version; - var differentDirectionsInclusive = - (this.operator === '>=' || this.operator === '<=') && - (comp.operator === '>=' || comp.operator === '<='); - var oppositeDirectionsLessThan = - cmp(this.semver, '<', comp.semver, loose) && - (this.operator === '>=' || this.operator === '>') && - (comp.operator === '<=' || comp.operator === '<'); - var oppositeDirectionsGreaterThan = - cmp(this.semver, '>', comp.semver, loose) && - (this.operator === '<=' || this.operator === '<') && - (comp.operator === '>=' || comp.operator === '>'); - - return ( - sameDirectionIncreasing || - sameDirectionDecreasing || - (sameSemVer && differentDirectionsInclusive) || - oppositeDirectionsLessThan || - oppositeDirectionsGreaterThan - ); - }; - - exports.Range = Range; - function Range(range, loose) { - if (range instanceof Range) { - if (range.loose === loose) { - return range; - } else { - return new Range(range.raw, loose); - } - } - - if (range instanceof Comparator) { - return new Range(range.value, loose); - } - - if (!(this instanceof Range)) return new Range(range, loose); - - this.loose = loose; - - // First, split based on boolean or || - this.raw = range; - this.set = range - .split(/\s*\|\|\s*/) - .map(function (range) { - return this.parseRange(range.trim()); - }, this) - .filter(function (c) { - // throw out any that are not relevant for whatever reason - return c.length; - }); - - if (!this.set.length) { - throw new TypeError('Invalid SemVer Range: ' + range); - } - - this.format(); - } - - Range.prototype.format = function () { - this.range = this.set - .map(function (comps) { - return comps.join(' ').trim(); - }) - .join('||') - .trim(); - return this.range; - }; - - Range.prototype.toString = function () { - return this.range; - }; - - Range.prototype.parseRange = function (range) { - var loose = this.loose; - range = range.trim(); - debug('range', range, loose); - // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` - var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE]; - range = range.replace(hr, hyphenReplace); - debug('hyphen replace', range); - // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` - range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace); - debug('comparator trim', range, re[COMPARATORTRIM]); - - // `~ 1.2.3` => `~1.2.3` - range = range.replace(re[TILDETRIM], tildeTrimReplace); - - // `^ 1.2.3` => `^1.2.3` - range = range.replace(re[CARETTRIM], caretTrimReplace); - - // normalize spaces - range = range.split(/\s+/).join(' '); - - // At this point, the range is completely trimmed and - // ready to be split into comparators. - - var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR]; - var set = range - .split(' ') - .map(function (comp) { - return parseComparator(comp, loose); - }) - .join(' ') - .split(/\s+/); - if (this.loose) { - // in loose mode, throw out any that are not valid comparators - set = set.filter(function (comp) { - return !!comp.match(compRe); - }); - } - set = set.map(function (comp) { - return new Comparator(comp, loose); - }); - - return set; - }; - - Range.prototype.intersects = function (range, loose) { - if (!(range instanceof Range)) { - throw new TypeError('a Range is required'); - } - - return this.set.some(function (thisComparators) { - return thisComparators.every(function (thisComparator) { - return range.set.some(function (rangeComparators) { - return rangeComparators.every(function (rangeComparator) { - return thisComparator.intersects(rangeComparator, loose); - }); - }); - }); - }); - }; - - // Mostly just for testing and legacy API reasons - exports.toComparators = toComparators; - function toComparators(range, loose) { - return new Range(range, loose).set.map(function (comp) { - return comp - .map(function (c) { - return c.value; - }) - .join(' ') - .trim() - .split(' '); - }); - } - - // comprised of xranges, tildes, stars, and gtlt's at this point. - // already replaced the hyphen ranges - // turn into a set of JUST comparators. - function parseComparator(comp, loose) { - debug('comp', comp); - comp = replaceCarets(comp, loose); - debug('caret', comp); - comp = replaceTildes(comp, loose); - debug('tildes', comp); - comp = replaceXRanges(comp, loose); - debug('xrange', comp); - comp = replaceStars(comp, loose); - debug('stars', comp); - return comp; - } - - function isX(id) { - return !id || id.toLowerCase() === 'x' || id === '*'; - } - - // ~, ~> --> * (any, kinda silly) - // ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0 - // ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0 - // ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0 - // ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0 - // ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0 - function replaceTildes(comp, loose) { - return comp - .trim() - .split(/\s+/) - .map(function (comp) { - return replaceTilde(comp, loose); - }) - .join(' '); - } - - function replaceTilde(comp, loose) { - var r = loose ? re[TILDELOOSE] : re[TILDE]; - return comp.replace(r, function (_, M, m, p, pr) { - debug('tilde', comp, _, M, m, p, pr); - var ret; - - if (isX(M)) ret = ''; - else if (isX(m)) ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; - else if (isX(p)) - // ~1.2 == >=1.2.0 <1.3.0 - ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; - else if (pr) { - debug('replaceTilde pr', pr); - if (pr.charAt(0) !== '-') pr = '-' + pr; - ret = - '>=' + - M + - '.' + - m + - '.' + - p + - pr + - ' <' + - M + - '.' + - (+m + 1) + - '.0'; - } - // ~1.2.3 == >=1.2.3 <1.3.0 - else - ret = - '>=' + M + '.' + m + '.' + p + ' <' + M + '.' + (+m + 1) + '.0'; - - debug('tilde return', ret); - return ret; - }); - } - - // ^ --> * (any, kinda silly) - // ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0 - // ^2.0, ^2.0.x --> >=2.0.0 <3.0.0 - // ^1.2, ^1.2.x --> >=1.2.0 <2.0.0 - // ^1.2.3 --> >=1.2.3 <2.0.0 - // ^1.2.0 --> >=1.2.0 <2.0.0 - function replaceCarets(comp, loose) { - return comp - .trim() - .split(/\s+/) - .map(function (comp) { - return replaceCaret(comp, loose); - }) - .join(' '); - } - - function replaceCaret(comp, loose) { - debug('caret', comp, loose); - var r = loose ? re[CARETLOOSE] : re[CARET]; - return comp.replace(r, function (_, M, m, p, pr) { - debug('caret', comp, _, M, m, p, pr); - var ret; - - if (isX(M)) ret = ''; - else if (isX(m)) ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; - else if (isX(p)) { - if (M === '0') - ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; - else ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0'; - } else if (pr) { - debug('replaceCaret pr', pr); - if (pr.charAt(0) !== '-') pr = '-' + pr; - if (M === '0') { - if (m === '0') - ret = - '>=' + - M + - '.' + - m + - '.' + - p + - pr + - ' <' + - M + - '.' + - m + - '.' + - (+p + 1); - else - ret = - '>=' + - M + - '.' + - m + - '.' + - p + - pr + - ' <' + - M + - '.' + - (+m + 1) + - '.0'; - } else - ret = - '>=' + M + '.' + m + '.' + p + pr + ' <' + (+M + 1) + '.0.0'; - } else { - debug('no pr'); - if (M === '0') { - if (m === '0') - ret = - '>=' + - M + - '.' + - m + - '.' + - p + - ' <' + - M + - '.' + - m + - '.' + - (+p + 1); - else - ret = - '>=' + - M + - '.' + - m + - '.' + - p + - ' <' + - M + - '.' + - (+m + 1) + - '.0'; - } else - ret = '>=' + M + '.' + m + '.' + p + ' <' + (+M + 1) + '.0.0'; - } - - debug('caret return', ret); - return ret; - }); - } - - function replaceXRanges(comp, loose) { - debug('replaceXRanges', comp, loose); - return comp - .split(/\s+/) - .map(function (comp) { - return replaceXRange(comp, loose); - }) - .join(' '); - } - - function replaceXRange(comp, loose) { - comp = comp.trim(); - var r = loose ? re[XRANGELOOSE] : re[XRANGE]; - return comp.replace(r, function (ret, gtlt, M, m, p, pr) { - debug('xRange', comp, ret, gtlt, M, m, p, pr); - var xM = isX(M); - var xm = xM || isX(m); - var xp = xm || isX(p); - var anyX = xp; - - if (gtlt === '=' && anyX) gtlt = ''; - - if (xM) { - if (gtlt === '>' || gtlt === '<') { - // nothing is allowed - ret = '<0.0.0'; - } else { - // nothing is forbidden - ret = '*'; - } - } else if (gtlt && anyX) { - // replace X with 0 - if (xm) m = 0; - if (xp) p = 0; - - if (gtlt === '>') { - // >1 => >=2.0.0 - // >1.2 => >=1.3.0 - // >1.2.3 => >= 1.2.4 - gtlt = '>='; - if (xm) { - M = +M + 1; - m = 0; - p = 0; - } else if (xp) { - m = +m + 1; - p = 0; - } - } else if (gtlt === '<=') { - // <=0.7.x is actually <0.8.0, since any 0.7.x should - // pass. Similarly, <=7.x is actually <8.0.0, etc. - gtlt = '<'; - if (xm) M = +M + 1; - else m = +m + 1; - } - - ret = gtlt + M + '.' + m + '.' + p; - } else if (xm) { - ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; - } else if (xp) { - ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; - } - - debug('xRange return', ret); - - return ret; - }); - } - - // Because * is AND-ed with everything else in the comparator, - // and '' means "any version", just remove the *s entirely. - function replaceStars(comp, loose) { - debug('replaceStars', comp, loose); - // Looseness is ignored here. star is always as loose as it gets! - return comp.trim().replace(re[STAR], ''); - } - - // This function is passed to string.replace(re[HYPHENRANGE]) - // M, m, patch, prerelease, build - // 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 - // 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do - // 1.2 - 3.4 => >=1.2.0 <3.5.0 - function hyphenReplace( - $0, - from, - fM, - fm, - fp, - fpr, - fb, - to, - tM, - tm, - tp, - tpr, - tb - ) { - if (isX(fM)) from = ''; - else if (isX(fm)) from = '>=' + fM + '.0.0'; - else if (isX(fp)) from = '>=' + fM + '.' + fm + '.0'; - else from = '>=' + from; - - if (isX(tM)) to = ''; - else if (isX(tm)) to = '<' + (+tM + 1) + '.0.0'; - else if (isX(tp)) to = '<' + tM + '.' + (+tm + 1) + '.0'; - else if (tpr) to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr; - else to = '<=' + to; - - return (from + ' ' + to).trim(); - } - - // if ANY of the sets match ALL of its comparators, then pass - Range.prototype.test = function (version) { - if (!version) return false; - - if (typeof version === 'string') - version = new SemVer(version, this.loose); - - for (var i = 0; i < this.set.length; i++) { - if (testSet(this.set[i], version)) return true; - } - return false; - }; - - function testSet(set, version) { - for (var i = 0; i < set.length; i++) { - if (!set[i].test(version)) return false; - } - - if (version.prerelease.length) { - // Find the set of versions that are allowed to have prereleases - // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 - // That should allow `1.2.3-pr.2` to pass. - // However, `1.2.4-alpha.notready` should NOT be allowed, - // even though it's within the range set by the comparators. - for (var i = 0; i < set.length; i++) { - debug(set[i].semver); - if (set[i].semver === ANY) continue; - - if (set[i].semver.prerelease.length > 0) { - var allowed = set[i].semver; - if ( - allowed.major === version.major && - allowed.minor === version.minor && - allowed.patch === version.patch - ) - return true; - } - } - - // Version has a -pre, but it's not one of the ones we like. - return false; - } - - return true; - } - - exports.satisfies = satisfies; - function satisfies(version, range, loose) { - try { - range = new Range(range, loose); - } catch (er) { - return false; - } - return range.test(version); - } - - exports.maxSatisfying = maxSatisfying; - function maxSatisfying(versions, range, loose) { - var max = null; - var maxSV = null; - try { - var rangeObj = new Range(range, loose); - } catch (er) { - return null; - } - versions.forEach(function (v) { - if (rangeObj.test(v)) { - // satisfies(v, range, loose) - if (!max || maxSV.compare(v) === -1) { - // compare(max, v, true) - max = v; - maxSV = new SemVer(max, loose); - } - } - }); - return max; - } - - exports.minSatisfying = minSatisfying; - function minSatisfying(versions, range, loose) { - var min = null; - var minSV = null; - try { - var rangeObj = new Range(range, loose); - } catch (er) { - return null; - } - versions.forEach(function (v) { - if (rangeObj.test(v)) { - // satisfies(v, range, loose) - if (!min || minSV.compare(v) === 1) { - // compare(min, v, true) - min = v; - minSV = new SemVer(min, loose); - } - } - }); - return min; - } - - exports.validRange = validRange; - function validRange(range, loose) { - try { - // Return '*' instead of '' so that truthiness works. - // This will throw if it's invalid anyway - return new Range(range, loose).range || '*'; - } catch (er) { - return null; - } - } - - // Determine if version is less than all the versions possible in the range - exports.ltr = ltr; - function ltr(version, range, loose) { - return outside(version, range, '<', loose); - } - - // Determine if version is greater than all the versions possible in the range. - exports.gtr = gtr; - function gtr(version, range, loose) { - return outside(version, range, '>', loose); - } - - exports.outside = outside; - function outside(version, range, hilo, loose) { - version = new SemVer(version, loose); - range = new Range(range, loose); - - var gtfn, ltefn, ltfn, comp, ecomp; - switch (hilo) { - case '>': - gtfn = gt; - ltefn = lte; - ltfn = lt; - comp = '>'; - ecomp = '>='; - break; - case '<': - gtfn = lt; - ltefn = gte; - ltfn = gt; - comp = '<'; - ecomp = '<='; - break; - default: - throw new TypeError('Must provide a hilo val of "<" or ">"'); - } - - // If it satisifes the range it is not outside - if (satisfies(version, range, loose)) { - return false; - } - - // From now on, variable terms are as if we're in "gtr" mode. - // but note that everything is flipped for the "ltr" function. - - for (var i = 0; i < range.set.length; ++i) { - var comparators = range.set[i]; - - var high = null; - var low = null; - - comparators.forEach(function (comparator) { - if (comparator.semver === ANY) { - comparator = new Comparator('>=0.0.0'); - } - high = high || comparator; - low = low || comparator; - if (gtfn(comparator.semver, high.semver, loose)) { - high = comparator; - } else if (ltfn(comparator.semver, low.semver, loose)) { - low = comparator; - } - }); - - // If the edge version comparator has a operator then our version - // isn't outside it - if (high.operator === comp || high.operator === ecomp) { - return false; - } - - // If the lowest version comparator has an operator and our version - // is less than it then it isn't higher than the range - if ( - (!low.operator || low.operator === comp) && - ltefn(version, low.semver) - ) { - return false; - } else if (low.operator === ecomp && ltfn(version, low.semver)) { - return false; - } - } - return true; - } - - exports.prerelease = prerelease; - function prerelease(version, loose) { - var parsed = parse(version, loose); - return parsed && parsed.prerelease.length ? parsed.prerelease : null; - } - - exports.intersects = intersects; - function intersects(r1, r2, loose) { - r1 = new Range(r1, loose); - r2 = new Range(r2, loose); - return r1.intersects(r2); - } - - exports.coerce = coerce; - function coerce(version) { - if (version instanceof SemVer) return version; - - if (typeof version !== 'string') return null; - - var match = version.match(re[COERCE]); - - if (match == null) return null; - - return parse( - (match[1] || '0') + '.' + (match[2] || '0') + '.' + (match[3] || '0') - ); - } - - /***/ - }, - /* 23 */ - /***/ function (module, exports) { - module.exports = require('stream'); - - /***/ - }, - /* 24 */ - /***/ function (module, exports) { - module.exports = require('url'); - - /***/ - }, - /* 25 */ - /***/ function (module, __webpack_exports__, __webpack_require__) { - 'use strict'; - /* harmony export (binding) */ __webpack_require__.d( - __webpack_exports__, - 'a', - function () { - return Subscription; - } - ); - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__util_isArray__ = - __webpack_require__(41); - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_isObject__ = - __webpack_require__(444); - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_isFunction__ = - __webpack_require__(154); - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_tryCatch__ = - __webpack_require__(57); - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_errorObject__ = - __webpack_require__(48); - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__util_UnsubscriptionError__ = - __webpack_require__(441); - /** PURE_IMPORTS_START _util_isArray,_util_isObject,_util_isFunction,_util_tryCatch,_util_errorObject,_util_UnsubscriptionError PURE_IMPORTS_END */ - - var Subscription = /*@__PURE__*/ (function () { - function Subscription(unsubscribe) { - this.closed = false; - this._parent = null; - this._parents = null; - this._subscriptions = null; - if (unsubscribe) { - this._unsubscribe = unsubscribe; - } - } - Subscription.prototype.unsubscribe = function () { - var hasErrors = false; - var errors; - if (this.closed) { - return; - } - var _a = this, - _parent = _a._parent, - _parents = _a._parents, - _unsubscribe = _a._unsubscribe, - _subscriptions = _a._subscriptions; - this.closed = true; - this._parent = null; - this._parents = null; - this._subscriptions = null; - var index = -1; - var len = _parents ? _parents.length : 0; - while (_parent) { - _parent.remove(this); - _parent = (++index < len && _parents[index]) || null; - } - if ( - __webpack_require__.i( - __WEBPACK_IMPORTED_MODULE_2__util_isFunction__[ - 'a' /* isFunction */ - ] - )(_unsubscribe) - ) { - var trial = __webpack_require__ - .i( - __WEBPACK_IMPORTED_MODULE_3__util_tryCatch__['a' /* tryCatch */] - )(_unsubscribe) - .call(this); - if ( - trial === - __WEBPACK_IMPORTED_MODULE_4__util_errorObject__[ - 'a' /* errorObject */ - ] - ) { - hasErrors = true; - errors = - errors || - (__WEBPACK_IMPORTED_MODULE_4__util_errorObject__[ - 'a' /* errorObject */ - ].e instanceof - __WEBPACK_IMPORTED_MODULE_5__util_UnsubscriptionError__[ - 'a' /* UnsubscriptionError */ - ] - ? flattenUnsubscriptionErrors( - __WEBPACK_IMPORTED_MODULE_4__util_errorObject__[ - 'a' /* errorObject */ - ].e.errors - ) - : [ - __WEBPACK_IMPORTED_MODULE_4__util_errorObject__[ - 'a' /* errorObject */ - ].e, - ]); - } - } - if ( - __webpack_require__.i( - __WEBPACK_IMPORTED_MODULE_0__util_isArray__['a' /* isArray */] - )(_subscriptions) - ) { - index = -1; - len = _subscriptions.length; - while (++index < len) { - var sub = _subscriptions[index]; - if ( - __webpack_require__.i( - __WEBPACK_IMPORTED_MODULE_1__util_isObject__[ - 'a' /* isObject */ - ] - )(sub) - ) { - var trial = __webpack_require__ - .i( - __WEBPACK_IMPORTED_MODULE_3__util_tryCatch__[ - 'a' /* tryCatch */ - ] - )(sub.unsubscribe) - .call(sub); - if ( - trial === - __WEBPACK_IMPORTED_MODULE_4__util_errorObject__[ - 'a' /* errorObject */ - ] - ) { - hasErrors = true; - errors = errors || []; - var err = - __WEBPACK_IMPORTED_MODULE_4__util_errorObject__[ - 'a' /* errorObject */ - ].e; - if ( - err instanceof - __WEBPACK_IMPORTED_MODULE_5__util_UnsubscriptionError__[ - 'a' /* UnsubscriptionError */ - ] - ) { - errors = errors.concat( - flattenUnsubscriptionErrors(err.errors) - ); - } else { - errors.push(err); - } - } - } - } - } - if (hasErrors) { - throw new __WEBPACK_IMPORTED_MODULE_5__util_UnsubscriptionError__[ - 'a' /* UnsubscriptionError */ - ](errors); - } - }; - Subscription.prototype.add = function (teardown) { - if (!teardown || teardown === Subscription.EMPTY) { - return Subscription.EMPTY; - } - if (teardown === this) { - return this; - } - var subscription = teardown; - switch (typeof teardown) { - case 'function': - subscription = new Subscription(teardown); - case 'object': - if ( - subscription.closed || - typeof subscription.unsubscribe !== 'function' - ) { - return subscription; - } else if (this.closed) { - subscription.unsubscribe(); - return subscription; - } else if (typeof subscription._addParent !== 'function') { - var tmp = subscription; - subscription = new Subscription(); - subscription._subscriptions = [tmp]; - } - break; - default: - throw new Error( - 'unrecognized teardown ' + teardown + ' added to Subscription.' - ); - } - var subscriptions = this._subscriptions || (this._subscriptions = []); - subscriptions.push(subscription); - subscription._addParent(this); - return subscription; - }; - Subscription.prototype.remove = function (subscription) { - var subscriptions = this._subscriptions; - if (subscriptions) { - var subscriptionIndex = subscriptions.indexOf(subscription); - if (subscriptionIndex !== -1) { - subscriptions.splice(subscriptionIndex, 1); - } - } - }; - Subscription.prototype._addParent = function (parent) { - var _a = this, - _parent = _a._parent, - _parents = _a._parents; - if (!_parent || _parent === parent) { - this._parent = parent; - } else if (!_parents) { - this._parents = [parent]; - } else if (_parents.indexOf(parent) === -1) { - _parents.push(parent); - } - }; - Subscription.EMPTY = (function (empty) { - empty.closed = true; - return empty; - })(new Subscription()); - return Subscription; - })(); - - function flattenUnsubscriptionErrors(errors) { - return errors.reduce(function (errs, err) { - return errs.concat( - err instanceof - __WEBPACK_IMPORTED_MODULE_5__util_UnsubscriptionError__[ - 'a' /* UnsubscriptionError */ - ] - ? err.errors - : err - ); - }, []); - } - //# sourceMappingURL=Subscription.js.map - - /***/ - }, - /* 26 */ - /***/ function (module, exports, __webpack_require__) { - // Copyright 2015 Joyent, Inc. - - module.exports = { - bufferSplit: bufferSplit, - addRSAMissing: addRSAMissing, - calculateDSAPublic: calculateDSAPublic, - calculateED25519Public: calculateED25519Public, - calculateX25519Public: calculateX25519Public, - mpNormalize: mpNormalize, - mpDenormalize: mpDenormalize, - ecNormalize: ecNormalize, - countZeros: countZeros, - assertCompatible: assertCompatible, - isCompatible: isCompatible, - opensslKeyDeriv: opensslKeyDeriv, - opensshCipherInfo: opensshCipherInfo, - publicFromPrivateECDSA: publicFromPrivateECDSA, - zeroPadToLength: zeroPadToLength, - writeBitString: writeBitString, - readBitString: readBitString, - }; - - var assert = __webpack_require__(16); - var Buffer = __webpack_require__(15).Buffer; - var PrivateKey = __webpack_require__(33); - var Key = __webpack_require__(27); - var crypto = __webpack_require__(11); - var algs = __webpack_require__(32); - var asn1 = __webpack_require__(66); - - var ec, jsbn; - var nacl; - - var MAX_CLASS_DEPTH = 3; - - function isCompatible(obj, klass, needVer) { - if (obj === null || typeof obj !== 'object') return false; - if (needVer === undefined) needVer = klass.prototype._sshpkApiVersion; - if ( - obj instanceof klass && - klass.prototype._sshpkApiVersion[0] == needVer[0] - ) - return true; - var proto = Object.getPrototypeOf(obj); - var depth = 0; - while (proto.constructor.name !== klass.name) { - proto = Object.getPrototypeOf(proto); - if (!proto || ++depth > MAX_CLASS_DEPTH) return false; - } - if (proto.constructor.name !== klass.name) return false; - var ver = proto._sshpkApiVersion; - if (ver === undefined) ver = klass._oldVersionDetect(obj); - if (ver[0] != needVer[0] || ver[1] < needVer[1]) return false; - return true; - } - - function assertCompatible(obj, klass, needVer, name) { - if (name === undefined) name = 'object'; - assert.ok(obj, name + ' must not be null'); - assert.object(obj, name + ' must be an object'); - if (needVer === undefined) needVer = klass.prototype._sshpkApiVersion; - if ( - obj instanceof klass && - klass.prototype._sshpkApiVersion[0] == needVer[0] - ) - return; - var proto = Object.getPrototypeOf(obj); - var depth = 0; - while (proto.constructor.name !== klass.name) { - proto = Object.getPrototypeOf(proto); - assert.ok( - proto && ++depth <= MAX_CLASS_DEPTH, - name + ' must be a ' + klass.name + ' instance' - ); - } - assert.strictEqual( - proto.constructor.name, - klass.name, - name + ' must be a ' + klass.name + ' instance' - ); - var ver = proto._sshpkApiVersion; - if (ver === undefined) ver = klass._oldVersionDetect(obj); - assert.ok( - ver[0] == needVer[0] && ver[1] >= needVer[1], - name + - ' must be compatible with ' + - klass.name + - ' klass ' + - 'version ' + - needVer[0] + - '.' + - needVer[1] - ); - } - - var CIPHER_LEN = { - 'des-ede3-cbc': { key: 7, iv: 8 }, - 'aes-128-cbc': { key: 16, iv: 16 }, - }; - var PKCS5_SALT_LEN = 8; - - function opensslKeyDeriv(cipher, salt, passphrase, count) { - assert.buffer(salt, 'salt'); - assert.buffer(passphrase, 'passphrase'); - assert.number(count, 'iteration count'); - - var clen = CIPHER_LEN[cipher]; - assert.object(clen, 'supported cipher'); - - salt = salt.slice(0, PKCS5_SALT_LEN); - - var D, D_prev, bufs; - var material = Buffer.alloc(0); - while (material.length < clen.key + clen.iv) { - bufs = []; - if (D_prev) bufs.push(D_prev); - bufs.push(passphrase); - bufs.push(salt); - D = Buffer.concat(bufs); - for (var j = 0; j < count; ++j) - D = crypto.createHash('md5').update(D).digest(); - material = Buffer.concat([material, D]); - D_prev = D; - } - - return { - key: material.slice(0, clen.key), - iv: material.slice(clen.key, clen.key + clen.iv), - }; - } - - /* Count leading zero bits on a buffer */ - function countZeros(buf) { - var o = 0, - obit = 8; - while (o < buf.length) { - var mask = 1 << obit; - if ((buf[o] & mask) === mask) break; - obit--; - if (obit < 0) { - o++; - obit = 8; - } - } - return o * 8 + (8 - obit) - 1; - } - - function bufferSplit(buf, chr) { - assert.buffer(buf); - assert.string(chr); - - var parts = []; - var lastPart = 0; - var matches = 0; - for (var i = 0; i < buf.length; ++i) { - if (buf[i] === chr.charCodeAt(matches)) ++matches; - else if (buf[i] === chr.charCodeAt(0)) matches = 1; - else matches = 0; - - if (matches >= chr.length) { - var newPart = i + 1; - parts.push(buf.slice(lastPart, newPart - matches)); - lastPart = newPart; - matches = 0; - } - } - if (lastPart <= buf.length) parts.push(buf.slice(lastPart, buf.length)); - - return parts; - } - - function ecNormalize(buf, addZero) { - assert.buffer(buf); - if (buf[0] === 0x00 && buf[1] === 0x04) { - if (addZero) return buf; - return buf.slice(1); - } else if (buf[0] === 0x04) { - if (!addZero) return buf; - } else { - while (buf[0] === 0x00) buf = buf.slice(1); - if (buf[0] === 0x02 || buf[0] === 0x03) - throw new Error( - 'Compressed elliptic curve points ' + 'are not supported' - ); - if (buf[0] !== 0x04) - throw new Error('Not a valid elliptic curve point'); - if (!addZero) return buf; - } - var b = Buffer.alloc(buf.length + 1); - b[0] = 0x0; - buf.copy(b, 1); - return b; - } - - function readBitString(der, tag) { - if (tag === undefined) tag = asn1.Ber.BitString; - var buf = der.readString(tag, true); - assert.strictEqual( - buf[0], - 0x00, - 'bit strings with unused bits are ' + - 'not supported (0x' + - buf[0].toString(16) + - ')' - ); - return buf.slice(1); - } - - function writeBitString(der, buf, tag) { - if (tag === undefined) tag = asn1.Ber.BitString; - var b = Buffer.alloc(buf.length + 1); - b[0] = 0x00; - buf.copy(b, 1); - der.writeBuffer(b, tag); - } - - function mpNormalize(buf) { - assert.buffer(buf); - while (buf.length > 1 && buf[0] === 0x00 && (buf[1] & 0x80) === 0x00) - buf = buf.slice(1); - if ((buf[0] & 0x80) === 0x80) { - var b = Buffer.alloc(buf.length + 1); - b[0] = 0x00; - buf.copy(b, 1); - buf = b; - } - return buf; - } - - function mpDenormalize(buf) { - assert.buffer(buf); - while (buf.length > 1 && buf[0] === 0x00) buf = buf.slice(1); - return buf; - } - - function zeroPadToLength(buf, len) { - assert.buffer(buf); - assert.number(len); - while (buf.length > len) { - assert.equal(buf[0], 0x00); - buf = buf.slice(1); - } - while (buf.length < len) { - var b = Buffer.alloc(buf.length + 1); - b[0] = 0x00; - buf.copy(b, 1); - buf = b; - } - return buf; - } - - function bigintToMpBuf(bigint) { - var buf = Buffer.from(bigint.toByteArray()); - buf = mpNormalize(buf); - return buf; - } - - function calculateDSAPublic(g, p, x) { - assert.buffer(g); - assert.buffer(p); - assert.buffer(x); - try { - var bigInt = __webpack_require__(81).BigInteger; - } catch (e) { - throw new Error( - 'To load a PKCS#8 format DSA private key, ' + - 'the node jsbn library is required.' - ); - } - g = new bigInt(g); - p = new bigInt(p); - x = new bigInt(x); - var y = g.modPow(x, p); - var ybuf = bigintToMpBuf(y); - return ybuf; - } - - function calculateED25519Public(k) { - assert.buffer(k); - - if (nacl === undefined) nacl = __webpack_require__(76); - - var kp = nacl.sign.keyPair.fromSeed(new Uint8Array(k)); - return Buffer.from(kp.publicKey); - } - - function calculateX25519Public(k) { - assert.buffer(k); - - if (nacl === undefined) nacl = __webpack_require__(76); - - var kp = nacl.box.keyPair.fromSeed(new Uint8Array(k)); - return Buffer.from(kp.publicKey); - } - - function addRSAMissing(key) { - assert.object(key); - assertCompatible(key, PrivateKey, [1, 1]); - try { - var bigInt = __webpack_require__(81).BigInteger; - } catch (e) { - throw new Error( - 'To write a PEM private key from ' + - 'this source, the node jsbn lib is required.' - ); - } - - var d = new bigInt(key.part.d.data); - var buf; - - if (!key.part.dmodp) { - var p = new bigInt(key.part.p.data); - var dmodp = d.mod(p.subtract(1)); - - buf = bigintToMpBuf(dmodp); - key.part.dmodp = { name: 'dmodp', data: buf }; - key.parts.push(key.part.dmodp); - } - if (!key.part.dmodq) { - var q = new bigInt(key.part.q.data); - var dmodq = d.mod(q.subtract(1)); - - buf = bigintToMpBuf(dmodq); - key.part.dmodq = { name: 'dmodq', data: buf }; - key.parts.push(key.part.dmodq); - } - } - - function publicFromPrivateECDSA(curveName, priv) { - assert.string(curveName, 'curveName'); - assert.buffer(priv); - if (ec === undefined) ec = __webpack_require__(139); - if (jsbn === undefined) jsbn = __webpack_require__(81).BigInteger; - var params = algs.curves[curveName]; - var p = new jsbn(params.p); - var a = new jsbn(params.a); - var b = new jsbn(params.b); - var curve = new ec.ECCurveFp(p, a, b); - var G = curve.decodePointHex(params.G.toString('hex')); - - var d = new jsbn(mpNormalize(priv)); - var pub = G.multiply(d); - pub = Buffer.from(curve.encodePointHex(pub), 'hex'); - - var parts = []; - parts.push({ name: 'curve', data: Buffer.from(curveName) }); - parts.push({ name: 'Q', data: pub }); - - var key = new Key({ type: 'ecdsa', curve: curve, parts: parts }); - return key; - } - - function opensshCipherInfo(cipher) { - var inf = {}; - switch (cipher) { - case '3des-cbc': - inf.keySize = 24; - inf.blockSize = 8; - inf.opensslName = 'des-ede3-cbc'; - break; - case 'blowfish-cbc': - inf.keySize = 16; - inf.blockSize = 8; - inf.opensslName = 'bf-cbc'; - break; - case 'aes128-cbc': - case 'aes128-ctr': - case 'aes128-gcm@openssh.com': - inf.keySize = 16; - inf.blockSize = 16; - inf.opensslName = 'aes-128-' + cipher.slice(7, 10); - break; - case 'aes192-cbc': - case 'aes192-ctr': - case 'aes192-gcm@openssh.com': - inf.keySize = 24; - inf.blockSize = 16; - inf.opensslName = 'aes-192-' + cipher.slice(7, 10); - break; - case 'aes256-cbc': - case 'aes256-ctr': - case 'aes256-gcm@openssh.com': - inf.keySize = 32; - inf.blockSize = 16; - inf.opensslName = 'aes-256-' + cipher.slice(7, 10); - break; - default: - throw new Error('Unsupported openssl cipher "' + cipher + '"'); - } - return inf; - } - - /***/ - }, - /* 27 */ - /***/ function (module, exports, __webpack_require__) { - // Copyright 2017 Joyent, Inc. - - module.exports = Key; - - var assert = __webpack_require__(16); - var algs = __webpack_require__(32); - var crypto = __webpack_require__(11); - var Fingerprint = __webpack_require__(156); - var Signature = __webpack_require__(75); - var DiffieHellman = __webpack_require__(325).DiffieHellman; - var errs = __webpack_require__(74); - var utils = __webpack_require__(26); - var PrivateKey = __webpack_require__(33); - var edCompat; - - try { - edCompat = __webpack_require__(454); - } catch (e) { - /* Just continue through, and bail out if we try to use it. */ - } - - var InvalidAlgorithmError = errs.InvalidAlgorithmError; - var KeyParseError = errs.KeyParseError; - - var formats = {}; - formats['auto'] = __webpack_require__(455); - formats['pem'] = __webpack_require__(86); - formats['pkcs1'] = __webpack_require__(327); - formats['pkcs8'] = __webpack_require__(157); - formats['rfc4253'] = __webpack_require__(103); - formats['ssh'] = __webpack_require__(456); - formats['ssh-private'] = __webpack_require__(193); - formats['openssh'] = formats['ssh-private']; - formats['dnssec'] = __webpack_require__(326); - - function Key(opts) { - assert.object(opts, 'options'); - assert.arrayOfObject(opts.parts, 'options.parts'); - assert.string(opts.type, 'options.type'); - assert.optionalString(opts.comment, 'options.comment'); - - var algInfo = algs.info[opts.type]; - if (typeof algInfo !== 'object') - throw new InvalidAlgorithmError(opts.type); - - var partLookup = {}; - for (var i = 0; i < opts.parts.length; ++i) { - var part = opts.parts[i]; - partLookup[part.name] = part; - } - - this.type = opts.type; - this.parts = opts.parts; - this.part = partLookup; - this.comment = undefined; - this.source = opts.source; - - /* for speeding up hashing/fingerprint operations */ - this._rfc4253Cache = opts._rfc4253Cache; - this._hashCache = {}; - - var sz; - this.curve = undefined; - if (this.type === 'ecdsa') { - var curve = this.part.curve.data.toString(); - this.curve = curve; - sz = algs.curves[curve].size; - } else if (this.type === 'ed25519' || this.type === 'curve25519') { - sz = 256; - this.curve = 'curve25519'; - } else { - var szPart = this.part[algInfo.sizePart]; - sz = szPart.data.length; - sz = sz * 8 - utils.countZeros(szPart.data); - } - this.size = sz; - } - - Key.formats = formats; - - Key.prototype.toBuffer = function (format, options) { - if (format === undefined) format = 'ssh'; - assert.string(format, 'format'); - assert.object(formats[format], 'formats[format]'); - assert.optionalObject(options, 'options'); - - if (format === 'rfc4253') { - if (this._rfc4253Cache === undefined) - this._rfc4253Cache = formats['rfc4253'].write(this); - return this._rfc4253Cache; - } - - return formats[format].write(this, options); - }; - - Key.prototype.toString = function (format, options) { - return this.toBuffer(format, options).toString(); - }; - - Key.prototype.hash = function (algo) { - assert.string(algo, 'algorithm'); - algo = algo.toLowerCase(); - if (algs.hashAlgs[algo] === undefined) - throw new InvalidAlgorithmError(algo); - - if (this._hashCache[algo]) return this._hashCache[algo]; - var hash = crypto - .createHash(algo) - .update(this.toBuffer('rfc4253')) - .digest(); - this._hashCache[algo] = hash; - return hash; - }; - - Key.prototype.fingerprint = function (algo) { - if (algo === undefined) algo = 'sha256'; - assert.string(algo, 'algorithm'); - var opts = { - type: 'key', - hash: this.hash(algo), - algorithm: algo, - }; - return new Fingerprint(opts); - }; - - Key.prototype.defaultHashAlgorithm = function () { - var hashAlgo = 'sha1'; - if (this.type === 'rsa') hashAlgo = 'sha256'; - if (this.type === 'dsa' && this.size > 1024) hashAlgo = 'sha256'; - if (this.type === 'ed25519') hashAlgo = 'sha512'; - if (this.type === 'ecdsa') { - if (this.size <= 256) hashAlgo = 'sha256'; - else if (this.size <= 384) hashAlgo = 'sha384'; - else hashAlgo = 'sha512'; - } - return hashAlgo; - }; - - Key.prototype.createVerify = function (hashAlgo) { - if (hashAlgo === undefined) hashAlgo = this.defaultHashAlgorithm(); - assert.string(hashAlgo, 'hash algorithm'); - - /* ED25519 is not supported by OpenSSL, use a javascript impl. */ - if (this.type === 'ed25519' && edCompat !== undefined) - return new edCompat.Verifier(this, hashAlgo); - if (this.type === 'curve25519') - throw new Error( - 'Curve25519 keys are not suitable for ' + 'signing or verification' - ); - - var v, nm, err; - try { - nm = hashAlgo.toUpperCase(); - v = crypto.createVerify(nm); - } catch (e) { - err = e; - } - if ( - v === undefined || - (err instanceof Error && err.message.match(/Unknown message digest/)) - ) { - nm = 'RSA-'; - nm += hashAlgo.toUpperCase(); - v = crypto.createVerify(nm); - } - assert.ok(v, 'failed to create verifier'); - var oldVerify = v.verify.bind(v); - var key = this.toBuffer('pkcs8'); - var curve = this.curve; - var self = this; - v.verify = function (signature, fmt) { - if (Signature.isSignature(signature, [2, 0])) { - if (signature.type !== self.type) return false; - if (signature.hashAlgorithm && signature.hashAlgorithm !== hashAlgo) - return false; - if ( - signature.curve && - self.type === 'ecdsa' && - signature.curve !== curve - ) - return false; - return oldVerify(key, signature.toBuffer('asn1')); - } else if ( - typeof signature === 'string' || - Buffer.isBuffer(signature) - ) { - return oldVerify(key, signature, fmt); - - /* - * Avoid doing this on valid arguments, walking the prototype - * chain can be quite slow. - */ - } else if (Signature.isSignature(signature, [1, 0])) { - throw new Error( - 'signature was created by too old ' + - 'a version of sshpk and cannot be verified' - ); - } else { - throw new TypeError( - 'signature must be a string, ' + 'Buffer, or Signature object' - ); - } - }; - return v; - }; - - Key.prototype.createDiffieHellman = function () { - if (this.type === 'rsa') - throw new Error('RSA keys do not support Diffie-Hellman'); - - return new DiffieHellman(this); - }; - Key.prototype.createDH = Key.prototype.createDiffieHellman; - - Key.parse = function (data, format, options) { - if (typeof data !== 'string') assert.buffer(data, 'data'); - if (format === undefined) format = 'auto'; - assert.string(format, 'format'); - if (typeof options === 'string') options = { filename: options }; - assert.optionalObject(options, 'options'); - if (options === undefined) options = {}; - assert.optionalString(options.filename, 'options.filename'); - if (options.filename === undefined) options.filename = '(unnamed)'; - - assert.object(formats[format], 'formats[format]'); - - try { - var k = formats[format].read(data, options); - if (k instanceof PrivateKey) k = k.toPublic(); - if (!k.comment) k.comment = options.filename; - return k; - } catch (e) { - if (e.name === 'KeyEncryptedError') throw e; - throw new KeyParseError(options.filename, format, e); - } - }; - - Key.isKey = function (obj, ver) { - return utils.isCompatible(obj, Key, ver); - }; - - /* - * API versions for Key: - * [1,0] -- initial ver, may take Signature for createVerify or may not - * [1,1] -- added pkcs1, pkcs8 formats - * [1,2] -- added auto, ssh-private, openssh formats - * [1,3] -- added defaultHashAlgorithm - * [1,4] -- added ed support, createDH - * [1,5] -- first explicitly tagged version - * [1,6] -- changed ed25519 part names - */ - Key.prototype._sshpkApiVersion = [1, 6]; - - Key._oldVersionDetect = function (obj) { - assert.func(obj.toBuffer); - assert.func(obj.fingerprint); - if (obj.createDH) return [1, 4]; - if (obj.defaultHashAlgorithm) return [1, 3]; - if (obj.formats['auto']) return [1, 2]; - if (obj.formats['pkcs1']) return [1, 1]; - return [1, 0]; - }; - - /***/ - }, - /* 28 */ - /***/ function (module, exports) { - module.exports = require('assert'); - - /***/ - }, - /* 29 */ - /***/ function (module, exports, __webpack_require__) { - 'use strict'; - - Object.defineProperty(exports, '__esModule', { - value: true, - }); - exports.default = nullify; - function nullify(obj = {}) { - if (Array.isArray(obj)) { - for ( - var _iterator = obj, - _isArray = Array.isArray(_iterator), - _i = 0, - _iterator = _isArray ? _iterator : _iterator[Symbol.iterator](); - ; - - ) { - var _ref; - - if (_isArray) { - if (_i >= _iterator.length) break; - _ref = _iterator[_i++]; - } else { - _i = _iterator.next(); - if (_i.done) break; - _ref = _i.value; - } - - const item = _ref; - - nullify(item); - } - } else if ( - (obj !== null && typeof obj === 'object') || - typeof obj === 'function' - ) { - Object.setPrototypeOf(obj, null); - - // for..in can only be applied to 'object', not 'function' - if (typeof obj === 'object') { - for (const key in obj) { - nullify(obj[key]); - } - } - } - - return obj; - } - - /***/ - }, - /* 30 */ - /***/ function (module, exports, __webpack_require__) { - 'use strict'; - - const escapeStringRegexp = __webpack_require__(382); - const ansiStyles = __webpack_require__(474); - const stdoutColor = __webpack_require__(566).stdout; - - const template = __webpack_require__(567); - - const isSimpleWindowsTerm = - process.platform === 'win32' && - !(process.env.TERM || '').toLowerCase().startsWith('xterm'); - - // `supportsColor.level` → `ansiStyles.color[name]` mapping - const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m']; - - // `color-convert` models to exclude from the Chalk API due to conflicts and such - const skipModels = new Set(['gray']); - - const styles = Object.create(null); - - function applyOptions(obj, options) { - options = options || {}; - - // Detect level if not set manually - const scLevel = stdoutColor ? stdoutColor.level : 0; - obj.level = options.level === undefined ? scLevel : options.level; - obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0; - } - - function Chalk(options) { - // We check for this.template here since calling `chalk.constructor()` - // by itself will have a `this` of a previously constructed chalk object - if (!this || !(this instanceof Chalk) || this.template) { - const chalk = {}; - applyOptions(chalk, options); - - chalk.template = function () { - const args = [].slice.call(arguments); - return chalkTag.apply(null, [chalk.template].concat(args)); - }; - - Object.setPrototypeOf(chalk, Chalk.prototype); - Object.setPrototypeOf(chalk.template, chalk); - - chalk.template.constructor = Chalk; - - return chalk.template; - } - - applyOptions(this, options); - } - - // Use bright blue on Windows as the normal blue color is illegible - if (isSimpleWindowsTerm) { - ansiStyles.blue.open = '\u001B[94m'; - } - - for (const key of Object.keys(ansiStyles)) { - ansiStyles[key].closeRe = new RegExp( - escapeStringRegexp(ansiStyles[key].close), - 'g' - ); - - styles[key] = { - get() { - const codes = ansiStyles[key]; - return build.call( - this, - this._styles ? this._styles.concat(codes) : [codes], - this._empty, - key - ); - }, - }; - } - - styles.visible = { - get() { - return build.call(this, this._styles || [], true, 'visible'); - }, - }; - - ansiStyles.color.closeRe = new RegExp( - escapeStringRegexp(ansiStyles.color.close), - 'g' - ); - for (const model of Object.keys(ansiStyles.color.ansi)) { - if (skipModels.has(model)) { - continue; - } - - styles[model] = { - get() { - const level = this.level; - return function () { - const open = ansiStyles.color[levelMapping[level]][model].apply( - null, - arguments - ); - const codes = { - open, - close: ansiStyles.color.close, - closeRe: ansiStyles.color.closeRe, - }; - return build.call( - this, - this._styles ? this._styles.concat(codes) : [codes], - this._empty, - model - ); - }; - }, - }; - } - - ansiStyles.bgColor.closeRe = new RegExp( - escapeStringRegexp(ansiStyles.bgColor.close), - 'g' - ); - for (const model of Object.keys(ansiStyles.bgColor.ansi)) { - if (skipModels.has(model)) { - continue; - } - - const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); - styles[bgModel] = { - get() { - const level = this.level; - return function () { - const open = ansiStyles.bgColor[levelMapping[level]][model].apply( - null, - arguments - ); - const codes = { - open, - close: ansiStyles.bgColor.close, - closeRe: ansiStyles.bgColor.closeRe, - }; - return build.call( - this, - this._styles ? this._styles.concat(codes) : [codes], - this._empty, - model - ); - }; - }, - }; - } - - const proto = Object.defineProperties(() => {}, styles); - - function build(_styles, _empty, key) { - const builder = function () { - return applyStyle.apply(builder, arguments); - }; - - builder._styles = _styles; - builder._empty = _empty; - - const self = this; - - Object.defineProperty(builder, 'level', { - enumerable: true, - get() { - return self.level; - }, - set(level) { - self.level = level; - }, - }); - - Object.defineProperty(builder, 'enabled', { - enumerable: true, - get() { - return self.enabled; - }, - set(enabled) { - self.enabled = enabled; - }, - }); - - // See below for fix regarding invisible grey/dim combination on Windows - builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; - - // `__proto__` is used because we must return a function, but there is - // no way to create a function with a different prototype - builder.__proto__ = proto; // eslint-disable-line no-proto - - return builder; - } - - function applyStyle() { - // Support varags, but simply cast to string in case there's only one arg - const args = arguments; - const argsLen = args.length; - let str = String(arguments[0]); - - if (argsLen === 0) { - return ''; - } - - if (argsLen > 1) { - // Don't slice `arguments`, it prevents V8 optimizations - for (let a = 1; a < argsLen; a++) { - str += ' ' + args[a]; - } - } - - if (!this.enabled || this.level <= 0 || !str) { - return this._empty ? '' : str; - } - - // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe, - // see https://github.com/chalk/chalk/issues/58 - // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop. - const originalDim = ansiStyles.dim.open; - if (isSimpleWindowsTerm && this.hasGrey) { - ansiStyles.dim.open = ''; - } - - for (const code of this._styles.slice().reverse()) { - // Replace any instances already present with a re-opening code - // otherwise only the part of the string until said closing code - // will be colored, and the rest will simply be 'plain'. - str = code.open + str.replace(code.closeRe, code.open) + code.close; - - // Close the styling before a linebreak and reopen - // after next line to fix a bleed issue on macOS - // https://github.com/chalk/chalk/pull/92 - str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`); - } - - // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue - ansiStyles.dim.open = originalDim; - - return str; - } - - function chalkTag(chalk, strings) { - if (!Array.isArray(strings)) { - // If chalk() was called by itself or with a string, - // return the string itself as a string. - return [].slice.call(arguments, 1).join(' '); - } - - const args = [].slice.call(arguments, 2); - const parts = [strings.raw[0]]; - - for (let i = 1; i < strings.length; i++) { - parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&')); - parts.push(String(strings.raw[i])); - } - - return template(chalk, parts.join('')); - } - - Object.defineProperties(Chalk.prototype, styles); - - module.exports = Chalk(); // eslint-disable-line new-cap - module.exports.supportsColor = stdoutColor; - module.exports.default = module.exports; // For TypeScript - - /***/ - }, - /* 31 */ - /***/ function (module, exports) { - var core = (module.exports = { version: '2.5.7' }); - if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef - - /***/ - }, - /* 32 */ - /***/ function (module, exports, __webpack_require__) { - // Copyright 2015 Joyent, Inc. - - var Buffer = __webpack_require__(15).Buffer; - - var algInfo = { - dsa: { - parts: ['p', 'q', 'g', 'y'], - sizePart: 'p', - }, - rsa: { - parts: ['e', 'n'], - sizePart: 'n', - }, - ecdsa: { - parts: ['curve', 'Q'], - sizePart: 'Q', - }, - ed25519: { - parts: ['A'], - sizePart: 'A', - }, - }; - algInfo['curve25519'] = algInfo['ed25519']; - - var algPrivInfo = { - dsa: { - parts: ['p', 'q', 'g', 'y', 'x'], - }, - rsa: { - parts: ['n', 'e', 'd', 'iqmp', 'p', 'q'], - }, - ecdsa: { - parts: ['curve', 'Q', 'd'], - }, - ed25519: { - parts: ['A', 'k'], - }, - }; - algPrivInfo['curve25519'] = algPrivInfo['ed25519']; - - var hashAlgs = { - md5: true, - sha1: true, - sha256: true, - sha384: true, - sha512: true, - }; - - /* - * Taken from - * http://csrc.nist.gov/groups/ST/toolkit/documents/dss/NISTReCur.pdf - */ - var curves = { - nistp256: { - size: 256, - pkcs8oid: '1.2.840.10045.3.1.7', - p: Buffer.from( - ( - '00' + - 'ffffffff 00000001 00000000 00000000' + - '00000000 ffffffff ffffffff ffffffff' - ).replace(/ /g, ''), - 'hex' - ), - a: Buffer.from( - ( - '00' + - 'FFFFFFFF 00000001 00000000 00000000' + - '00000000 FFFFFFFF FFFFFFFF FFFFFFFC' - ).replace(/ /g, ''), - 'hex' - ), - b: Buffer.from( - ( - '5ac635d8 aa3a93e7 b3ebbd55 769886bc' + - '651d06b0 cc53b0f6 3bce3c3e 27d2604b' - ).replace(/ /g, ''), - 'hex' - ), - s: Buffer.from( - ('00' + 'c49d3608 86e70493 6a6678e1 139d26b7' + '819f7e90').replace( - / /g, - '' - ), - 'hex' - ), - n: Buffer.from( - ( - '00' + - 'ffffffff 00000000 ffffffff ffffffff' + - 'bce6faad a7179e84 f3b9cac2 fc632551' - ).replace(/ /g, ''), - 'hex' - ), - G: Buffer.from( - ( - '04' + - '6b17d1f2 e12c4247 f8bce6e5 63a440f2' + - '77037d81 2deb33a0 f4a13945 d898c296' + - '4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16' + - '2bce3357 6b315ece cbb64068 37bf51f5' - ).replace(/ /g, ''), - 'hex' - ), - }, - nistp384: { - size: 384, - pkcs8oid: '1.3.132.0.34', - p: Buffer.from( - ( - '00' + - 'ffffffff ffffffff ffffffff ffffffff' + - 'ffffffff ffffffff ffffffff fffffffe' + - 'ffffffff 00000000 00000000 ffffffff' - ).replace(/ /g, ''), - 'hex' - ), - a: Buffer.from( - ( - '00' + - 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + - 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE' + - 'FFFFFFFF 00000000 00000000 FFFFFFFC' - ).replace(/ /g, ''), - 'hex' - ), - b: Buffer.from( - ( - 'b3312fa7 e23ee7e4 988e056b e3f82d19' + - '181d9c6e fe814112 0314088f 5013875a' + - 'c656398d 8a2ed19d 2a85c8ed d3ec2aef' - ).replace(/ /g, ''), - 'hex' - ), - s: Buffer.from( - ('00' + 'a335926a a319a27a 1d00896a 6773a482' + '7acdac73').replace( - / /g, - '' - ), - 'hex' - ), - n: Buffer.from( - ( - '00' + - 'ffffffff ffffffff ffffffff ffffffff' + - 'ffffffff ffffffff c7634d81 f4372ddf' + - '581a0db2 48b0a77a ecec196a ccc52973' - ).replace(/ /g, ''), - 'hex' - ), - G: Buffer.from( - ( - '04' + - 'aa87ca22 be8b0537 8eb1c71e f320ad74' + - '6e1d3b62 8ba79b98 59f741e0 82542a38' + - '5502f25d bf55296c 3a545e38 72760ab7' + - '3617de4a 96262c6f 5d9e98bf 9292dc29' + - 'f8f41dbd 289a147c e9da3113 b5f0b8c0' + - '0a60b1ce 1d7e819d 7a431d7c 90ea0e5f' - ).replace(/ /g, ''), - 'hex' - ), - }, - nistp521: { - size: 521, - pkcs8oid: '1.3.132.0.35', - p: Buffer.from( - ( - '01ffffff ffffffff ffffffff ffffffff' + - 'ffffffff ffffffff ffffffff ffffffff' + - 'ffffffff ffffffff ffffffff ffffffff' + - 'ffffffff ffffffff ffffffff ffffffff' + - 'ffff' - ).replace(/ /g, ''), - 'hex' - ), - a: Buffer.from( - ( - '01FF' + - 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + - 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + - 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + - 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFC' - ).replace(/ /g, ''), - 'hex' - ), - b: Buffer.from( - ( - '51' + - '953eb961 8e1c9a1f 929a21a0 b68540ee' + - 'a2da725b 99b315f3 b8b48991 8ef109e1' + - '56193951 ec7e937b 1652c0bd 3bb1bf07' + - '3573df88 3d2c34f1 ef451fd4 6b503f00' - ).replace(/ /g, ''), - 'hex' - ), - s: Buffer.from( - ('00' + 'd09e8800 291cb853 96cc6717 393284aa' + 'a0da64ba').replace( - / /g, - '' - ), - 'hex' - ), - n: Buffer.from( - ( - '01ff' + - 'ffffffff ffffffff ffffffff ffffffff' + - 'ffffffff ffffffff ffffffff fffffffa' + - '51868783 bf2f966b 7fcc0148 f709a5d0' + - '3bb5c9b8 899c47ae bb6fb71e 91386409' - ).replace(/ /g, ''), - 'hex' - ), - G: Buffer.from( - ( - '04' + - '00c6 858e06b7 0404e9cd 9e3ecb66 2395b442' + - '9c648139 053fb521 f828af60 6b4d3dba' + - 'a14b5e77 efe75928 fe1dc127 a2ffa8de' + - '3348b3c1 856a429b f97e7e31 c2e5bd66' + - '0118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9' + - '98f54449 579b4468 17afbd17 273e662c' + - '97ee7299 5ef42640 c550b901 3fad0761' + - '353c7086 a272c240 88be9476 9fd16650' - ).replace(/ /g, ''), - 'hex' - ), - }, - }; - - module.exports = { - info: algInfo, - privInfo: algPrivInfo, - hashAlgs: hashAlgs, - curves: curves, - }; - - /***/ - }, - /* 33 */ - /***/ function (module, exports, __webpack_require__) { - // Copyright 2017 Joyent, Inc. - - module.exports = PrivateKey; - - var assert = __webpack_require__(16); - var Buffer = __webpack_require__(15).Buffer; - var algs = __webpack_require__(32); - var crypto = __webpack_require__(11); - var Fingerprint = __webpack_require__(156); - var Signature = __webpack_require__(75); - var errs = __webpack_require__(74); - var util = __webpack_require__(3); - var utils = __webpack_require__(26); - var dhe = __webpack_require__(325); - var generateECDSA = dhe.generateECDSA; - var generateED25519 = dhe.generateED25519; - var edCompat; - var nacl; - - try { - edCompat = __webpack_require__(454); - } catch (e) { - /* Just continue through, and bail out if we try to use it. */ - } - - var Key = __webpack_require__(27); - - var InvalidAlgorithmError = errs.InvalidAlgorithmError; - var KeyParseError = errs.KeyParseError; - var KeyEncryptedError = errs.KeyEncryptedError; - - var formats = {}; - formats['auto'] = __webpack_require__(455); - formats['pem'] = __webpack_require__(86); - formats['pkcs1'] = __webpack_require__(327); - formats['pkcs8'] = __webpack_require__(157); - formats['rfc4253'] = __webpack_require__(103); - formats['ssh-private'] = __webpack_require__(193); - formats['openssh'] = formats['ssh-private']; - formats['ssh'] = formats['ssh-private']; - formats['dnssec'] = __webpack_require__(326); - - function PrivateKey(opts) { - assert.object(opts, 'options'); - Key.call(this, opts); - - this._pubCache = undefined; - } - util.inherits(PrivateKey, Key); - - PrivateKey.formats = formats; - - PrivateKey.prototype.toBuffer = function (format, options) { - if (format === undefined) format = 'pkcs1'; - assert.string(format, 'format'); - assert.object(formats[format], 'formats[format]'); - assert.optionalObject(options, 'options'); - - return formats[format].write(this, options); - }; - - PrivateKey.prototype.hash = function (algo) { - return this.toPublic().hash(algo); - }; - - PrivateKey.prototype.toPublic = function () { - if (this._pubCache) return this._pubCache; - - var algInfo = algs.info[this.type]; - var pubParts = []; - for (var i = 0; i < algInfo.parts.length; ++i) { - var p = algInfo.parts[i]; - pubParts.push(this.part[p]); - } - - this._pubCache = new Key({ - type: this.type, - source: this, - parts: pubParts, - }); - if (this.comment) this._pubCache.comment = this.comment; - return this._pubCache; - }; - - PrivateKey.prototype.derive = function (newType) { - assert.string(newType, 'type'); - var priv, pub, pair; - - if (this.type === 'ed25519' && newType === 'curve25519') { - if (nacl === undefined) nacl = __webpack_require__(76); - - priv = this.part.k.data; - if (priv[0] === 0x00) priv = priv.slice(1); - - pair = nacl.box.keyPair.fromSecretKey(new Uint8Array(priv)); - pub = Buffer.from(pair.publicKey); - - return new PrivateKey({ - type: 'curve25519', - parts: [ - { name: 'A', data: utils.mpNormalize(pub) }, - { name: 'k', data: utils.mpNormalize(priv) }, - ], - }); - } else if (this.type === 'curve25519' && newType === 'ed25519') { - if (nacl === undefined) nacl = __webpack_require__(76); - - priv = this.part.k.data; - if (priv[0] === 0x00) priv = priv.slice(1); - - pair = nacl.sign.keyPair.fromSeed(new Uint8Array(priv)); - pub = Buffer.from(pair.publicKey); - - return new PrivateKey({ - type: 'ed25519', - parts: [ - { name: 'A', data: utils.mpNormalize(pub) }, - { name: 'k', data: utils.mpNormalize(priv) }, - ], - }); - } - throw new Error( - 'Key derivation not supported from ' + this.type + ' to ' + newType - ); - }; - - PrivateKey.prototype.createVerify = function (hashAlgo) { - return this.toPublic().createVerify(hashAlgo); - }; - - PrivateKey.prototype.createSign = function (hashAlgo) { - if (hashAlgo === undefined) hashAlgo = this.defaultHashAlgorithm(); - assert.string(hashAlgo, 'hash algorithm'); - - /* ED25519 is not supported by OpenSSL, use a javascript impl. */ - if (this.type === 'ed25519' && edCompat !== undefined) - return new edCompat.Signer(this, hashAlgo); - if (this.type === 'curve25519') - throw new Error( - 'Curve25519 keys are not suitable for ' + 'signing or verification' - ); - - var v, nm, err; - try { - nm = hashAlgo.toUpperCase(); - v = crypto.createSign(nm); - } catch (e) { - err = e; - } - if ( - v === undefined || - (err instanceof Error && err.message.match(/Unknown message digest/)) - ) { - nm = 'RSA-'; - nm += hashAlgo.toUpperCase(); - v = crypto.createSign(nm); - } - assert.ok(v, 'failed to create verifier'); - var oldSign = v.sign.bind(v); - var key = this.toBuffer('pkcs1'); - var type = this.type; - var curve = this.curve; - v.sign = function () { - var sig = oldSign(key); - if (typeof sig === 'string') sig = Buffer.from(sig, 'binary'); - sig = Signature.parse(sig, type, 'asn1'); - sig.hashAlgorithm = hashAlgo; - sig.curve = curve; - return sig; - }; - return v; - }; - - PrivateKey.parse = function (data, format, options) { - if (typeof data !== 'string') assert.buffer(data, 'data'); - if (format === undefined) format = 'auto'; - assert.string(format, 'format'); - if (typeof options === 'string') options = { filename: options }; - assert.optionalObject(options, 'options'); - if (options === undefined) options = {}; - assert.optionalString(options.filename, 'options.filename'); - if (options.filename === undefined) options.filename = '(unnamed)'; - - assert.object(formats[format], 'formats[format]'); - - try { - var k = formats[format].read(data, options); - assert.ok(k instanceof PrivateKey, 'key is not a private key'); - if (!k.comment) k.comment = options.filename; - return k; - } catch (e) { - if (e.name === 'KeyEncryptedError') throw e; - throw new KeyParseError(options.filename, format, e); - } - }; - - PrivateKey.isPrivateKey = function (obj, ver) { - return utils.isCompatible(obj, PrivateKey, ver); - }; - - PrivateKey.generate = function (type, options) { - if (options === undefined) options = {}; - assert.object(options, 'options'); - - switch (type) { - case 'ecdsa': - if (options.curve === undefined) options.curve = 'nistp256'; - assert.string(options.curve, 'options.curve'); - return generateECDSA(options.curve); - case 'ed25519': - return generateED25519(); - default: - throw new Error( - 'Key generation not supported with key ' + 'type "' + type + '"' - ); - } - }; - - /* - * API versions for PrivateKey: - * [1,0] -- initial ver - * [1,1] -- added auto, pkcs[18], openssh/ssh-private formats - * [1,2] -- added defaultHashAlgorithm - * [1,3] -- added derive, ed, createDH - * [1,4] -- first tagged version - * [1,5] -- changed ed25519 part names and format - */ - PrivateKey.prototype._sshpkApiVersion = [1, 5]; - - PrivateKey._oldVersionDetect = function (obj) { - assert.func(obj.toPublic); - assert.func(obj.createSign); - if (obj.derive) return [1, 3]; - if (obj.defaultHashAlgorithm) return [1, 2]; - if (obj.formats['auto']) return [1, 1]; - return [1, 0]; - }; - - /***/ - }, - /* 34 */ - /***/ function (module, exports, __webpack_require__) { - 'use strict'; - - Object.defineProperty(exports, '__esModule', { - value: true, - }); - exports.wrapLifecycle = - exports.run = - exports.install = - exports.Install = - undefined; - - var _extends2; - - function _load_extends() { - return (_extends2 = _interopRequireDefault(__webpack_require__(20))); - } - - var _asyncToGenerator2; - - function _load_asyncToGenerator() { - return (_asyncToGenerator2 = _interopRequireDefault( - __webpack_require__(2) - )); - } - - let install = (exports.install = (() => { - var _ref29 = (0, - (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( - config, - reporter, - flags, - lockfile - ) { - yield wrapLifecycle( - config, - flags, - (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( - function* () { - const install = new Install(flags, config, reporter, lockfile); - yield install.init(); - } - ) - ); - }); - - return function install(_x7, _x8, _x9, _x10) { - return _ref29.apply(this, arguments); - }; - })()); - - let run = (exports.run = (() => { - var _ref31 = (0, - (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( - config, - reporter, - flags, - args - ) { - let lockfile; - let error = 'installCommandRenamed'; - if (flags.lockfile === false) { - lockfile = new (_lockfile || _load_lockfile()).default(); - } else { - lockfile = yield ( - _lockfile || _load_lockfile() - ).default.fromDirectory(config.lockfileFolder, reporter); - } - - if (args.length) { - const exampleArgs = args.slice(); - - if (flags.saveDev) { - exampleArgs.push('--dev'); - } - if (flags.savePeer) { - exampleArgs.push('--peer'); - } - if (flags.saveOptional) { - exampleArgs.push('--optional'); - } - if (flags.saveExact) { - exampleArgs.push('--exact'); - } - if (flags.saveTilde) { - exampleArgs.push('--tilde'); - } - let command = 'add'; - if (flags.global) { - error = 'globalFlagRemoved'; - command = 'global add'; - } - throw new (_errors || _load_errors()).MessageError( - reporter.lang(error, `yarn ${command} ${exampleArgs.join(' ')}`) - ); - } - - yield install(config, reporter, flags, lockfile); - }); - - return function run(_x11, _x12, _x13, _x14) { - return _ref31.apply(this, arguments); - }; - })()); - - let wrapLifecycle = (exports.wrapLifecycle = (() => { - var _ref32 = (0, - (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ( - config, - flags, - factory - ) { - yield config.executeLifecycleScript('preinstall'); - - yield factory(); - - // npm behaviour, seems kinda funky but yay compatibility - yield config.executeLifecycleScript('install'); - yield config.executeLifecycleScript('postinstall'); - - if (!config.production) { - if (!config.disablePrepublish) { - yield config.executeLifecycleScript('prepublish'); - } - yield config.executeLifecycleScript('prepare'); - } - }); - - return function wrapLifecycle(_x15, _x16, _x17) { - return _ref32.apply(this, arguments); - }; - })()); - - exports.hasWrapper = hasWrapper; - exports.setFlags = setFlags; - - var _objectPath; - - function _load_objectPath() { - return (_objectPath = _interopRequireDefault(__webpack_require__(304))); - } - - var _hooks; - - function _load_hooks() { - return (_hooks = __webpack_require__(368)); - } - - var _index; - - function _load_index() { - return (_index = _interopRequireDefault(__webpack_require__(218))); - } - - var _errors; - - function _load_errors() { - return (_errors = __webpack_require__(6)); - } - - var _integrityChecker; - - function _load_integrityChecker() { - return (_integrityChecker = _interopRequireDefault( - __webpack_require__(206) - )); - } - - var _lockfile; - - function _load_lockfile() { - return (_lockfile = _interopRequireDefault(__webpack_require__(19))); - } - - var _lockfile2; - - function _load_lockfile2() { - return (_lockfile2 = __webpack_require__(19)); - } - - var _packageFetcher; - - function _load_packageFetcher() { - return (_packageFetcher = _interopRequireWildcard( - __webpack_require__(208) - )); - } - - var _packageInstallScripts; - - function _load_packageInstallScripts() { - return (_packageInstallScripts = _interopRequireDefault( - __webpack_require__(525) - )); - } - - var _packageCompatibility; - - function _load_packageCompatibility() { - return (_packageCompatibility = _interopRequireWildcard( - __webpack_require__(207) - )); - } - - var _packageResolver; - - function _load_packageResolver() { - return (_packageResolver = _interopRequireDefault( - __webpack_require__(360) - )); - } - - var _packageLinker; - - function _load_packageLinker() { - return (_packageLinker = _interopRequireDefault( - __webpack_require__(209) - )); - } - - var _index2; - - function _load_index2() { - return (_index2 = __webpack_require__(58)); - } - - var _index3; - - function _load_index3() { - return (_index3 = __webpack_require__(78)); - } - - var _autoclean; - - function _load_autoclean() { - return (_autoclean = __webpack_require__(348)); - } - - var _constants; - - function _load_constants() { - return (_constants = _interopRequireWildcard(__webpack_require__(8))); - } - - var _normalizePattern; - - function _load_normalizePattern() { - return (_normalizePattern = __webpack_require__(37)); - } - - var _fs; - - function _load_fs() { - return (_fs = _interopRequireWildcard(__webpack_require__(5))); - } - - var _map; - - function _load_map() { - return (_map = _interopRequireDefault(__webpack_require__(29))); - } - - var _yarnVersion; - - function _load_yarnVersion() { - return (_yarnVersion = __webpack_require__(105)); - } - - var _generatePnpMap; - - function _load_generatePnpMap() { - return (_generatePnpMap = __webpack_require__(547)); - } - - var _workspaceLayout; - - function _load_workspaceLayout() { - return (_workspaceLayout = _interopRequireDefault( - __webpack_require__(90) - )); - } - - var _resolutionMap; - - function _load_resolutionMap() { - return (_resolutionMap = _interopRequireDefault( - __webpack_require__(212) - )); - } - - var _guessName; - - function _load_guessName() { - return (_guessName = _interopRequireDefault(__webpack_require__(169))); - } - - var _audit; - - function _load_audit() { - return (_audit = _interopRequireDefault(__webpack_require__(347))); - } - - function _interopRequireWildcard(obj) { - if (obj && obj.__esModule) { - return obj; - } else { - var newObj = {}; - if (obj != null) { - for (var key in obj) { - if (Object.prototype.hasOwnProperty.call(obj, key)) - newObj[key] = obj[key]; - } - } - newObj.default = obj; - return newObj; - } - } - - function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { default: obj }; - } - - const deepEqual = __webpack_require__(599); - - const emoji = __webpack_require__(302); - const invariant = __webpack_require__(9); - const path = __webpack_require__(0); - const semver = __webpack_require__(22); - const uuid = __webpack_require__(120); - const ssri = __webpack_require__(65); - - const ONE_DAY = 1000 * 60 * 60 * 24; - - /** - * Try and detect the installation method for Yarn and provide a command to update it with. - */ - - function getUpdateCommand(installationMethod) { - if (installationMethod === 'tar') { - return `curl --compressed -o- -L ${ - (_constants || _load_constants()).YARN_INSTALLER_SH - } | bash`; - } - - if (installationMethod === 'homebrew') { - return 'brew upgrade yarn'; - } - - if (installationMethod === 'deb') { - return 'sudo apt-get update && sudo apt-get install yarn'; - } - - if (installationMethod === 'rpm') { - return 'sudo yum install yarn'; - } - - if (installationMethod === 'npm') { - return 'npm install --global yarn'; - } - - if (installationMethod === 'chocolatey') { - return 'choco upgrade yarn'; - } - - if (installationMethod === 'apk') { - return 'apk update && apk add -u yarn'; - } - - if (installationMethod === 'portage') { - return 'sudo emerge --sync && sudo emerge -au sys-apps/yarn'; - } - - return null; - } - - function getUpdateInstaller(installationMethod) { - // Windows - if (installationMethod === 'msi') { - return (_constants || _load_constants()).YARN_INSTALLER_MSI; - } - - return null; - } - - function normalizeFlags(config, rawFlags) { - const flags = { - // install - har: !!rawFlags.har, - ignorePlatform: !!rawFlags.ignorePlatform, - ignoreEngines: !!rawFlags.ignoreEngines, - ignoreScripts: !!rawFlags.ignoreScripts, - ignoreOptional: !!rawFlags.ignoreOptional, - force: !!rawFlags.force, - flat: !!rawFlags.flat, - lockfile: rawFlags.lockfile !== false, - pureLockfile: !!rawFlags.pureLockfile, - updateChecksums: !!rawFlags.updateChecksums, - skipIntegrityCheck: !!rawFlags.skipIntegrityCheck, - frozenLockfile: !!rawFlags.frozenLockfile, - linkDuplicates: !!rawFlags.linkDuplicates, - checkFiles: !!rawFlags.checkFiles, - audit: !!rawFlags.audit, - - // add - peer: !!rawFlags.peer, - dev: !!rawFlags.dev, - optional: !!rawFlags.optional, - exact: !!rawFlags.exact, - tilde: !!rawFlags.tilde, - ignoreWorkspaceRootCheck: !!rawFlags.ignoreWorkspaceRootCheck, - - // outdated, update-interactive - includeWorkspaceDeps: !!rawFlags.includeWorkspaceDeps, - - // add, remove, update - workspaceRootIsCwd: rawFlags.workspaceRootIsCwd !== false, - }; - - if (config.getOption('ignore-scripts')) { - flags.ignoreScripts = true; - } - - if (config.getOption('ignore-platform')) { - flags.ignorePlatform = true; - } - - if (config.getOption('ignore-engines')) { - flags.ignoreEngines = true; - } - - if (config.getOption('ignore-optional')) { - flags.ignoreOptional = true; - } - - if (config.getOption('force')) { - flags.force = true; - } - - return flags; - } - - class Install { - constructor(flags, config, reporter, lockfile) { - this.rootManifestRegistries = []; - this.rootPatternsToOrigin = (0, (_map || _load_map()).default)(); - this.lockfile = lockfile; - this.reporter = reporter; - this.config = config; - this.flags = normalizeFlags(config, flags); - this.resolutions = (0, (_map || _load_map()).default)(); // Legacy resolutions field used for flat install mode - this.resolutionMap = new ( - _resolutionMap || _load_resolutionMap() - ).default(config); // Selective resolutions for nested dependencies - this.resolver = new ( - _packageResolver || _load_packageResolver() - ).default(config, lockfile, this.resolutionMap); - this.integrityChecker = new ( - _integrityChecker || _load_integrityChecker() - ).default(config); - this.linker = new (_packageLinker || _load_packageLinker()).default( - config, - this.resolver - ); - this.scripts = new ( - _packageInstallScripts || _load_packageInstallScripts() - ).default(config, this.resolver, this.flags.force); - } - - /** - * Create a list of dependency requests from the current directories manifests. - */ - - fetchRequestFromCwd( - excludePatterns = [], - ignoreUnusedPatterns = false - ) { - var _this = this; - - return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( - function* () { - const patterns = []; - const deps = []; - let resolutionDeps = []; - const manifest = {}; - - const ignorePatterns = []; - const usedPatterns = []; - let workspaceLayout; - - // some commands should always run in the context of the entire workspace - const cwd = - _this.flags.includeWorkspaceDeps || - _this.flags.workspaceRootIsCwd - ? _this.config.lockfileFolder - : _this.config.cwd; - - // non-workspaces are always root, otherwise check for workspace root - const cwdIsRoot = - !_this.config.workspaceRootFolder || - _this.config.lockfileFolder === cwd; - - // exclude package names that are in install args - const excludeNames = []; - for ( - var _iterator = excludePatterns, - _isArray = Array.isArray(_iterator), - _i = 0, - _iterator = _isArray - ? _iterator - : _iterator[Symbol.iterator](); - ; - - ) { - var _ref; - - if (_isArray) { - if (_i >= _iterator.length) break; - _ref = _iterator[_i++]; - } else { - _i = _iterator.next(); - if (_i.done) break; - _ref = _i.value; - } - - const pattern = _ref; - - if ( - (0, (_index3 || _load_index3()).getExoticResolver)(pattern) - ) { - excludeNames.push( - (0, (_guessName || _load_guessName()).default)(pattern) - ); - } else { - // extract the name - const parts = (0, - (_normalizePattern || _load_normalizePattern()) - .normalizePattern)(pattern); - excludeNames.push(parts.name); - } - } - - const stripExcluded = function stripExcluded(manifest) { - for ( - var _iterator2 = excludeNames, - _isArray2 = Array.isArray(_iterator2), - _i2 = 0, - _iterator2 = _isArray2 - ? _iterator2 - : _iterator2[Symbol.iterator](); - ; - - ) { - var _ref2; - - if (_isArray2) { - if (_i2 >= _iterator2.length) break; - _ref2 = _iterator2[_i2++]; - } else { - _i2 = _iterator2.next(); - if (_i2.done) break; - _ref2 = _i2.value; - } - - const exclude = _ref2; - - if (manifest.dependencies && manifest.dependencies[exclude]) { - delete manifest.dependencies[exclude]; - } - if ( - manifest.devDependencies && - manifest.devDependencies[exclude] - ) { - delete manifest.devDependencies[exclude]; - } - if ( - manifest.optionalDependencies && - manifest.optionalDependencies[exclude] - ) { - delete manifest.optionalDependencies[exclude]; - } - } - }; - - for ( - var _iterator3 = Object.keys( - (_index2 || _load_index2()).registries - ), - _isArray3 = Array.isArray(_iterator3), - _i3 = 0, - _iterator3 = _isArray3 - ? _iterator3 - : _iterator3[Symbol.iterator](); - ; - - ) { - var _ref3; - - if (_isArray3) { - if (_i3 >= _iterator3.length) break; - _ref3 = _iterator3[_i3++]; - } else { - _i3 = _iterator3.next(); - if (_i3.done) break; - _ref3 = _i3.value; - } - - const registry = _ref3; - - const filename = (_index2 || _load_index2()).registries[ - registry - ].filename; - - const loc = path.join(cwd, filename); - if (!(yield (_fs || _load_fs()).exists(loc))) { - continue; - } - - _this.rootManifestRegistries.push(registry); - - const projectManifestJson = yield _this.config.readJson(loc); - yield (0, (_index || _load_index()).default)( - projectManifestJson, - cwd, - _this.config, - cwdIsRoot - ); - - Object.assign( - _this.resolutions, - projectManifestJson.resolutions - ); - Object.assign(manifest, projectManifestJson); - - _this.resolutionMap.init(_this.resolutions); - for ( - var _iterator4 = Object.keys( - _this.resolutionMap.resolutionsByPackage - ), - _isArray4 = Array.isArray(_iterator4), - _i4 = 0, - _iterator4 = _isArray4 - ? _iterator4 - : _iterator4[Symbol.iterator](); - ; - - ) { - var _ref4; - - if (_isArray4) { - if (_i4 >= _iterator4.length) break; - _ref4 = _iterator4[_i4++]; - } else { - _i4 = _iterator4.next(); - if (_i4.done) break; - _ref4 = _i4.value; - } - - const packageName = _ref4; - - const optional = - (_objectPath || _load_objectPath()).default.has( - manifest.optionalDependencies, - packageName - ) && _this.flags.ignoreOptional; - for ( - var _iterator8 = - _this.resolutionMap.resolutionsByPackage[packageName], - _isArray8 = Array.isArray(_iterator8), - _i8 = 0, - _iterator8 = _isArray8 - ? _iterator8 - : _iterator8[Symbol.iterator](); - ; - - ) { - var _ref9; - - if (_isArray8) { - if (_i8 >= _iterator8.length) break; - _ref9 = _iterator8[_i8++]; - } else { - _i8 = _iterator8.next(); - if (_i8.done) break; - _ref9 = _i8.value; - } - - const _ref8 = _ref9; - const pattern = _ref8.pattern; - - resolutionDeps = [ - ...resolutionDeps, - { registry, pattern, optional, hint: 'resolution' }, - ]; - } - } - - const pushDeps = function pushDeps( - depType, - manifest, - { hint, optional }, - isUsed - ) { - if (ignoreUnusedPatterns && !isUsed) { - return; - } - // We only take unused dependencies into consideration to get deterministic hoisting. - // Since flat mode doesn't care about hoisting and everything is top level and specified then we can safely - // leave these out. - if (_this.flags.flat && !isUsed) { - return; - } - const depMap = manifest[depType]; - for (const name in depMap) { - if (excludeNames.indexOf(name) >= 0) { - continue; - } - - let pattern = name; - if (!_this.lockfile.getLocked(pattern)) { - // when we use --save we save the dependency to the lockfile with just the name rather than the - // version combo - pattern += '@' + depMap[name]; - } - - // normalization made sure packages are mentioned only once - if (isUsed) { - usedPatterns.push(pattern); - } else { - ignorePatterns.push(pattern); - } - - _this.rootPatternsToOrigin[pattern] = depType; - patterns.push(pattern); - deps.push({ - pattern, - registry, - hint, - optional, - workspaceName: manifest.name, - workspaceLoc: manifest._loc, - }); - } - }; - - if (cwdIsRoot) { - pushDeps( - 'dependencies', - projectManifestJson, - { hint: null, optional: false }, - true - ); - pushDeps( - 'devDependencies', - projectManifestJson, - { hint: 'dev', optional: false }, - !_this.config.production - ); - pushDeps( - 'optionalDependencies', - projectManifestJson, - { hint: 'optional', optional: true }, - true - ); - } - - if (_this.config.workspaceRootFolder) { - const workspaceLoc = cwdIsRoot - ? loc - : path.join(_this.config.lockfileFolder, filename); - const workspacesRoot = path.dirname(workspaceLoc); - - let workspaceManifestJson = projectManifestJson; - if (!cwdIsRoot) { - // the manifest we read before was a child workspace, so get the root - workspaceManifestJson = yield _this.config.readJson( - workspaceLoc - ); - yield (0, (_index || _load_index()).default)( - workspaceManifestJson, - workspacesRoot, - _this.config, - true - ); - } - - const workspaces = yield _this.config.resolveWorkspaces( - workspacesRoot, - workspaceManifestJson - ); - workspaceLayout = new ( - _workspaceLayout || _load_workspaceLayout() - ).default(workspaces, _this.config); - - // add virtual manifest that depends on all workspaces, this way package hoisters and resolvers will work fine - const workspaceDependencies = (0, - (_extends2 || _load_extends()).default)( - {}, - workspaceManifestJson.dependencies - ); - for ( - var _iterator5 = Object.keys(workspaces), - _isArray5 = Array.isArray(_iterator5), - _i5 = 0, - _iterator5 = _isArray5 - ? _iterator5 - : _iterator5[Symbol.iterator](); - ; - - ) { - var _ref5; - - if (_isArray5) { - if (_i5 >= _iterator5.length) break; - _ref5 = _iterator5[_i5++]; - } else { - _i5 = _iterator5.next(); - if (_i5.done) break; - _ref5 = _i5.value; - } - - const workspaceName = _ref5; - - const workspaceManifest = - workspaces[workspaceName].manifest; - workspaceDependencies[workspaceName] = - workspaceManifest.version; - - // include dependencies from all workspaces - if (_this.flags.includeWorkspaceDeps) { - pushDeps( - 'dependencies', - workspaceManifest, - { hint: null, optional: false }, - true - ); - pushDeps( - 'devDependencies', - workspaceManifest, - { hint: 'dev', optional: false }, - !_this.config.production - ); - pushDeps( - 'optionalDependencies', - workspaceManifest, - { hint: 'optional', optional: true }, - true - ); - } - } - const virtualDependencyManifest = { - _uid: '', - name: `workspace-aggregator-${uuid.v4()}`, - version: '1.0.0', - _registry: 'npm', - _loc: workspacesRoot, - dependencies: workspaceDependencies, - devDependencies: (0, - (_extends2 || _load_extends()).default)( - {}, - workspaceManifestJson.devDependencies - ), - optionalDependencies: (0, - (_extends2 || _load_extends()).default)( - {}, - workspaceManifestJson.optionalDependencies - ), - private: workspaceManifestJson.private, - workspaces: workspaceManifestJson.workspaces, - }; - workspaceLayout.virtualManifestName = - virtualDependencyManifest.name; - const virtualDep = {}; - virtualDep[virtualDependencyManifest.name] = - virtualDependencyManifest.version; - workspaces[virtualDependencyManifest.name] = { - loc: workspacesRoot, - manifest: virtualDependencyManifest, - }; - - // ensure dependencies that should be excluded are stripped from the correct manifest - stripExcluded( - cwdIsRoot - ? virtualDependencyManifest - : workspaces[projectManifestJson.name].manifest - ); - - pushDeps( - 'workspaces', - { workspaces: virtualDep }, - { hint: 'workspaces', optional: false }, - true - ); - - const implicitWorkspaceDependencies = (0, - (_extends2 || _load_extends()).default)( - {}, - workspaceDependencies - ); - - for ( - var _iterator6 = (_constants || _load_constants()) - .OWNED_DEPENDENCY_TYPES, - _isArray6 = Array.isArray(_iterator6), - _i6 = 0, - _iterator6 = _isArray6 - ? _iterator6 - : _iterator6[Symbol.iterator](); - ; - - ) { - var _ref6; - - if (_isArray6) { - if (_i6 >= _iterator6.length) break; - _ref6 = _iterator6[_i6++]; - } else { - _i6 = _iterator6.next(); - if (_i6.done) break; - _ref6 = _i6.value; - } - - const type = _ref6; - - for ( - var _iterator7 = Object.keys( - projectManifestJson[type] || {} - ), - _isArray7 = Array.isArray(_iterator7), - _i7 = 0, - _iterator7 = _isArray7 - ? _iterator7 - : _iterator7[Symbol.iterator](); - ; - - ) { - var _ref7; - - if (_isArray7) { - if (_i7 >= _iterator7.length) break; - _ref7 = _iterator7[_i7++]; - } else { - _i7 = _iterator7.next(); - if (_i7.done) break; - _ref7 = _i7.value; - } - - const dependencyName = _ref7; - - delete implicitWorkspaceDependencies[dependencyName]; - } - } - - pushDeps( - 'dependencies', - { dependencies: implicitWorkspaceDependencies }, - { hint: 'workspaces', optional: false }, - true - ); - } - - break; - } - - // inherit root flat flag - if (manifest.flat) { - _this.flags.flat = true; - } - - return { - requests: [...resolutionDeps, ...deps], - patterns, - manifest, - usedPatterns, - ignorePatterns, - workspaceLayout, - }; - } - )(); - } - - /** - * TODO description - */ - - prepareRequests(requests) { - return requests; - } - - preparePatterns(patterns) { - return patterns; - } - preparePatternsForLinking(patterns, cwdManifest, cwdIsRoot) { - return patterns; - } - - prepareManifests() { - var _this2 = this; - - return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( - function* () { - const manifests = yield _this2.config.getRootManifests(); - return manifests; - } - )(); - } - - bailout(patterns, workspaceLayout) { - var _this3 = this; - - return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( - function* () { - // We don't want to skip the audit - it could yield important errors - if (_this3.flags.audit) { - return false; - } - // PNP is so fast that the integrity check isn't pertinent - if (_this3.config.plugnplayEnabled) { - return false; - } - if (_this3.flags.skipIntegrityCheck || _this3.flags.force) { - return false; - } - const lockfileCache = _this3.lockfile.cache; - if (!lockfileCache) { - return false; - } - const lockfileClean = - _this3.lockfile.parseResultType === 'success'; - const match = yield _this3.integrityChecker.check( - patterns, - lockfileCache, - _this3.flags, - workspaceLayout - ); - if ( - _this3.flags.frozenLockfile && - (!lockfileClean || match.missingPatterns.length > 0) - ) { - throw new (_errors || _load_errors()).MessageError( - _this3.reporter.lang('frozenLockfileError') - ); - } - - const haveLockfile = yield (_fs || _load_fs()).exists( - path.join( - _this3.config.lockfileFolder, - (_constants || _load_constants()).LOCKFILE_FILENAME - ) - ); - - const lockfileIntegrityPresent = - !_this3.lockfile.hasEntriesExistWithoutIntegrity(); - const integrityBailout = - lockfileIntegrityPresent || !_this3.config.autoAddIntegrity; - - if ( - match.integrityMatches && - haveLockfile && - lockfileClean && - integrityBailout - ) { - _this3.reporter.success(_this3.reporter.lang('upToDate')); - return true; - } - - if (match.integrityFileMissing && haveLockfile) { - // Integrity file missing, force script installations - _this3.scripts.setForce(true); - return false; - } - - if (match.hardRefreshRequired) { - // e.g. node version doesn't match, force script installations - _this3.scripts.setForce(true); - return false; - } - - if (!patterns.length && !match.integrityFileMissing) { - _this3.reporter.success( - _this3.reporter.lang('nothingToInstall') - ); - yield _this3.createEmptyManifestFolders(); - yield _this3.saveLockfileAndIntegrity( - patterns, - workspaceLayout - ); - return true; - } - - return false; - } - )(); - } - - /** - * Produce empty folders for all used root manifests. - */ - - createEmptyManifestFolders() { - var _this4 = this; - - return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( - function* () { - if (_this4.config.modulesFolder) { - // already created - return; - } - - for ( - var _iterator9 = _this4.rootManifestRegistries, - _isArray9 = Array.isArray(_iterator9), - _i9 = 0, - _iterator9 = _isArray9 - ? _iterator9 - : _iterator9[Symbol.iterator](); - ; - - ) { - var _ref10; - - if (_isArray9) { - if (_i9 >= _iterator9.length) break; - _ref10 = _iterator9[_i9++]; - } else { - _i9 = _iterator9.next(); - if (_i9.done) break; - _ref10 = _i9.value; - } - - const registryName = _ref10; - const folder = _this4.config.registries[registryName].folder; - - yield (_fs || _load_fs()).mkdirp( - path.join(_this4.config.lockfileFolder, folder) - ); - } - } - )(); - } - - /** - * TODO description - */ - - markIgnored(patterns) { - for ( - var _iterator10 = patterns, - _isArray10 = Array.isArray(_iterator10), - _i10 = 0, - _iterator10 = _isArray10 - ? _iterator10 - : _iterator10[Symbol.iterator](); - ; - - ) { - var _ref11; - - if (_isArray10) { - if (_i10 >= _iterator10.length) break; - _ref11 = _iterator10[_i10++]; - } else { - _i10 = _iterator10.next(); - if (_i10.done) break; - _ref11 = _i10.value; - } - - const pattern = _ref11; - - const manifest = this.resolver.getStrictResolvedPattern(pattern); - const ref = manifest._reference; - invariant(ref, 'expected package reference'); - - // just mark the package as ignored. if the package is used by a required package, the hoister - // will take care of that. - ref.ignore = true; - } - } - - /** - * helper method that gets only recent manifests - * used by global.ls command - */ - getFlattenedDeps() { - var _this5 = this; - - return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( - function* () { - var _ref12 = yield _this5.fetchRequestFromCwd(); - - const depRequests = _ref12.requests, - rawPatterns = _ref12.patterns; - - yield _this5.resolver.init(depRequests, {}); - - const manifests = yield ( - _packageFetcher || _load_packageFetcher() - ).fetch(_this5.resolver.getManifests(), _this5.config); - _this5.resolver.updateManifests(manifests); - - return _this5.flatten(rawPatterns); - } - )(); - } - - /** - * TODO description - */ - - init() { - var _this6 = this; - - return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( - function* () { - _this6.checkUpdate(); - - // warn if we have a shrinkwrap - if ( - yield (_fs || _load_fs()).exists( - path.join( - _this6.config.lockfileFolder, - (_constants || _load_constants()).NPM_SHRINKWRAP_FILENAME - ) - ) - ) { - _this6.reporter.warn(_this6.reporter.lang('shrinkwrapWarning')); - } - - // warn if we have an npm lockfile - if ( - yield (_fs || _load_fs()).exists( - path.join( - _this6.config.lockfileFolder, - (_constants || _load_constants()).NPM_LOCK_FILENAME - ) - ) - ) { - _this6.reporter.warn( - _this6.reporter.lang('npmLockfileWarning') - ); - } - - if (_this6.config.plugnplayEnabled) { - _this6.reporter.info( - _this6.reporter.lang('plugnplaySuggestV2L1') - ); - _this6.reporter.info( - _this6.reporter.lang('plugnplaySuggestV2L2') - ); - } - - let flattenedTopLevelPatterns = []; - const steps = []; - - var _ref13 = yield _this6.fetchRequestFromCwd(); - - const depRequests = _ref13.requests, - rawPatterns = _ref13.patterns, - ignorePatterns = _ref13.ignorePatterns, - workspaceLayout = _ref13.workspaceLayout, - manifest = _ref13.manifest; - - let topLevelPatterns = []; - - const artifacts = yield _this6.integrityChecker.getArtifacts(); - if (artifacts) { - _this6.linker.setArtifacts(artifacts); - _this6.scripts.setArtifacts(artifacts); - } - - if ( - ( - _packageCompatibility || _load_packageCompatibility() - ).shouldCheck(manifest, _this6.flags) - ) { - steps.push( - (() => { - var _ref14 = (0, - (_asyncToGenerator2 || _load_asyncToGenerator()).default)( - function* (curr, total) { - _this6.reporter.step( - curr, - total, - _this6.reporter.lang('checkingManifest'), - emoji.get('mag') - ); - yield _this6.checkCompatibility(); - } - ); - - return function (_x, _x2) { - return _ref14.apply(this, arguments); - }; - })() - ); - } - - const audit = new (_audit || _load_audit()).default( - _this6.config, - _this6.reporter, - { - groups: (_constants || _load_constants()) - .OWNED_DEPENDENCY_TYPES, - } - ); - let auditFoundProblems = false; - - steps.push(function (curr, total) { - return (0, (_hooks || _load_hooks()).callThroughHook)( - 'resolveStep', - (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( - function* () { - _this6.reporter.step( - curr, - total, - _this6.reporter.lang('resolvingPackages'), - emoji.get('mag') - ); - yield _this6.resolver.init( - _this6.prepareRequests(depRequests), - { - isFlat: _this6.flags.flat, - isFrozen: _this6.flags.frozenLockfile, - workspaceLayout, - } - ); - topLevelPatterns = _this6.preparePatterns(rawPatterns); - flattenedTopLevelPatterns = yield _this6.flatten( - topLevelPatterns - ); - return { - bailout: - !_this6.flags.audit && - (yield _this6.bailout( - topLevelPatterns, - workspaceLayout - )), - }; - } - ) - ); - }); - - if (_this6.flags.audit) { - steps.push(function (curr, total) { - return (0, (_hooks || _load_hooks()).callThroughHook)( - 'auditStep', - (0, - (_asyncToGenerator2 || _load_asyncToGenerator()).default)( - function* () { - _this6.reporter.step( - curr, - total, - _this6.reporter.lang('auditRunning'), - emoji.get('mag') - ); - if (_this6.flags.offline) { - _this6.reporter.warn( - _this6.reporter.lang('auditOffline') - ); - return { bailout: false }; - } - const preparedManifests = - yield _this6.prepareManifests(); - // $FlowFixMe - Flow considers `m` in the map operation to be "mixed", so does not recognize `m.object` - const mergedManifest = Object.assign( - {}, - ...Object.values(preparedManifests).map(function (m) { - return m.object; - }) - ); - const auditVulnerabilityCounts = - yield audit.performAudit( - mergedManifest, - _this6.lockfile, - _this6.resolver, - _this6.linker, - topLevelPatterns - ); - auditFoundProblems = - auditVulnerabilityCounts.info || - auditVulnerabilityCounts.low || - auditVulnerabilityCounts.moderate || - auditVulnerabilityCounts.high || - auditVulnerabilityCounts.critical; - return { - bailout: yield _this6.bailout( - topLevelPatterns, - workspaceLayout - ), - }; - } - ) - ); - }); - } - - steps.push(function (curr, total) { - return (0, (_hooks || _load_hooks()).callThroughHook)( - 'fetchStep', - (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( - function* () { - _this6.markIgnored(ignorePatterns); - _this6.reporter.step( - curr, - total, - _this6.reporter.lang('fetchingPackages'), - emoji.get('truck') - ); - const manifests = yield ( - _packageFetcher || _load_packageFetcher() - ).fetch(_this6.resolver.getManifests(), _this6.config); - _this6.resolver.updateManifests(manifests); - yield ( - _packageCompatibility || _load_packageCompatibility() - ).check( - _this6.resolver.getManifests(), - _this6.config, - _this6.flags.ignoreEngines - ); - } - ) - ); - }); - - steps.push(function (curr, total) { - return (0, (_hooks || _load_hooks()).callThroughHook)( - 'linkStep', - (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( - function* () { - // remove integrity hash to make this operation atomic - yield _this6.integrityChecker.removeIntegrityFile(); - _this6.reporter.step( - curr, - total, - _this6.reporter.lang('linkingDependencies'), - emoji.get('link') - ); - flattenedTopLevelPatterns = - _this6.preparePatternsForLinking( - flattenedTopLevelPatterns, - manifest, - _this6.config.lockfileFolder === _this6.config.cwd - ); - yield _this6.linker.init( - flattenedTopLevelPatterns, - workspaceLayout, - { - linkDuplicates: _this6.flags.linkDuplicates, - ignoreOptional: _this6.flags.ignoreOptional, - } - ); - } - ) - ); - }); - - if (_this6.config.plugnplayEnabled) { - steps.push(function (curr, total) { - return (0, (_hooks || _load_hooks()).callThroughHook)( - 'pnpStep', - (0, - (_asyncToGenerator2 || _load_asyncToGenerator()).default)( - function* () { - const pnpPath = `${_this6.config.lockfileFolder}/${ - (_constants || _load_constants()).PNP_FILENAME - }`; - - const code = yield (0, - (_generatePnpMap || _load_generatePnpMap()) - .generatePnpMap)( - _this6.config, - flattenedTopLevelPatterns, - { - resolver: _this6.resolver, - reporter: _this6.reporter, - targetPath: pnpPath, - workspaceLayout, - } - ); - - try { - const file = yield (_fs || _load_fs()).readFile( - pnpPath - ); - if (file === code) { - return; - } - } catch (error) {} - - yield (_fs || _load_fs()).writeFile(pnpPath, code); - yield (_fs || _load_fs()).chmod(pnpPath, 0o755); - } - ) - ); - }); - } - - steps.push(function (curr, total) { - return (0, (_hooks || _load_hooks()).callThroughHook)( - 'buildStep', - (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( - function* () { - _this6.reporter.step( - curr, - total, - _this6.flags.force - ? _this6.reporter.lang('rebuildingPackages') - : _this6.reporter.lang('buildingFreshPackages'), - emoji.get('hammer') - ); - - if (_this6.config.ignoreScripts) { - _this6.reporter.warn( - _this6.reporter.lang('ignoredScripts') - ); - } else { - yield _this6.scripts.init(flattenedTopLevelPatterns); - } - } - ) - ); - }); - - if (_this6.flags.har) { - steps.push( - (() => { - var _ref21 = (0, - (_asyncToGenerator2 || _load_asyncToGenerator()).default)( - function* (curr, total) { - const formattedDate = new Date() - .toISOString() - .replace(/:/g, '-'); - const filename = `yarn-install_${formattedDate}.har`; - _this6.reporter.step( - curr, - total, - _this6.reporter.lang('savingHar', filename), - emoji.get('black_circle_for_record') - ); - yield _this6.config.requestManager.saveHar(filename); - } - ); - - return function (_x3, _x4) { - return _ref21.apply(this, arguments); - }; - })() - ); - } - - if (yield _this6.shouldClean()) { - steps.push( - (() => { - var _ref22 = (0, - (_asyncToGenerator2 || _load_asyncToGenerator()).default)( - function* (curr, total) { - _this6.reporter.step( - curr, - total, - _this6.reporter.lang('cleaningModules'), - emoji.get('recycle') - ); - yield (0, (_autoclean || _load_autoclean()).clean)( - _this6.config, - _this6.reporter - ); - } - ); - - return function (_x5, _x6) { - return _ref22.apply(this, arguments); - }; - })() - ); - } - - let currentStep = 0; - for ( - var _iterator11 = steps, - _isArray11 = Array.isArray(_iterator11), - _i11 = 0, - _iterator11 = _isArray11 - ? _iterator11 - : _iterator11[Symbol.iterator](); - ; - - ) { - var _ref23; - - if (_isArray11) { - if (_i11 >= _iterator11.length) break; - _ref23 = _iterator11[_i11++]; - } else { - _i11 = _iterator11.next(); - if (_i11.done) break; - _ref23 = _i11.value; - } - - const step = _ref23; - - const stepResult = yield step(++currentStep, steps.length); - if (stepResult && stepResult.bailout) { - if (_this6.flags.audit) { - audit.summary(); - } - if (auditFoundProblems) { - _this6.reporter.warn( - _this6.reporter.lang('auditRunAuditForDetails') - ); - } - _this6.maybeOutputUpdate(); - return flattenedTopLevelPatterns; - } - } - - // fin! - if (_this6.flags.audit) { - audit.summary(); - } - if (auditFoundProblems) { - _this6.reporter.warn( - _this6.reporter.lang('auditRunAuditForDetails') - ); - } - yield _this6.saveLockfileAndIntegrity( - topLevelPatterns, - workspaceLayout - ); - yield _this6.persistChanges(); - _this6.maybeOutputUpdate(); - _this6.config.requestManager.clearCache(); - return flattenedTopLevelPatterns; - } - )(); - } - - checkCompatibility() { - var _this7 = this; - - return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( - function* () { - var _ref24 = yield _this7.fetchRequestFromCwd(); - - const manifest = _ref24.manifest; - - yield ( - _packageCompatibility || _load_packageCompatibility() - ).checkOne(manifest, _this7.config, _this7.flags.ignoreEngines); - } - )(); - } - - persistChanges() { - var _this8 = this; - - return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( - function* () { - // get all the different registry manifests in this folder - const manifests = yield _this8.config.getRootManifests(); - - if (yield _this8.applyChanges(manifests)) { - yield _this8.config.saveRootManifests(manifests); - } - } - )(); - } - - applyChanges(manifests) { - let hasChanged = false; - - if (this.config.plugnplayPersist) { - const object = manifests.npm.object; - - if (typeof object.installConfig !== 'object') { - object.installConfig = {}; - } - - if ( - this.config.plugnplayEnabled && - object.installConfig.pnp !== true - ) { - object.installConfig.pnp = true; - hasChanged = true; - } else if ( - !this.config.plugnplayEnabled && - typeof object.installConfig.pnp !== 'undefined' - ) { - delete object.installConfig.pnp; - hasChanged = true; - } - - if (Object.keys(object.installConfig).length === 0) { - delete object.installConfig; - } - } - - return Promise.resolve(hasChanged); - } - - /** - * Check if we should run the cleaning step. - */ - - shouldClean() { - return (_fs || _load_fs()).exists( - path.join( - this.config.lockfileFolder, - (_constants || _load_constants()).CLEAN_FILENAME - ) - ); - } - - /** - * TODO - */ - - flatten(patterns) { - var _this9 = this; - - return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( - function* () { - if (!_this9.flags.flat) { - return patterns; - } - - const flattenedPatterns = []; - - for ( - var _iterator12 = - _this9.resolver.getAllDependencyNamesByLevelOrder(patterns), - _isArray12 = Array.isArray(_iterator12), - _i12 = 0, - _iterator12 = _isArray12 - ? _iterator12 - : _iterator12[Symbol.iterator](); - ; - - ) { - var _ref25; - - if (_isArray12) { - if (_i12 >= _iterator12.length) break; - _ref25 = _iterator12[_i12++]; - } else { - _i12 = _iterator12.next(); - if (_i12.done) break; - _ref25 = _i12.value; - } - - const name = _ref25; - - const infos = _this9.resolver - .getAllInfoForPackageName(name) - .filter(function (manifest) { - const ref = manifest._reference; - invariant(ref, 'expected package reference'); - return !ref.ignore; - }); - - if (infos.length === 0) { - continue; - } - - if (infos.length === 1) { - // single version of this package - // take out a single pattern as multiple patterns may have resolved to this package - flattenedPatterns.push( - _this9.resolver.patternsByPackage[name][0] - ); - continue; - } - - const options = infos.map(function (info) { - const ref = info._reference; - invariant(ref, 'expected reference'); - return { - // TODO `and is required by {PARENT}`, - name: _this9.reporter.lang( - 'manualVersionResolutionOption', - ref.patterns.join(', '), - info.version - ), - - value: info.version, - }; - }); - const versions = infos.map(function (info) { - return info.version; - }); - let version; - - const resolutionVersion = _this9.resolutions[name]; - if ( - resolutionVersion && - versions.indexOf(resolutionVersion) >= 0 - ) { - // use json `resolution` version - version = resolutionVersion; - } else { - version = yield _this9.reporter.select( - _this9.reporter.lang('manualVersionResolution', name), - _this9.reporter.lang('answer'), - options - ); - _this9.resolutions[name] = version; - } - - flattenedPatterns.push( - _this9.resolver.collapseAllVersionsOfPackage(name, version) - ); - } - - // save resolutions to their appropriate root manifest - if (Object.keys(_this9.resolutions).length) { - const manifests = yield _this9.config.getRootManifests(); - - for (const name in _this9.resolutions) { - const version = _this9.resolutions[name]; - - const patterns = _this9.resolver.patternsByPackage[name]; - if (!patterns) { - continue; - } - - let manifest; - for ( - var _iterator13 = patterns, - _isArray13 = Array.isArray(_iterator13), - _i13 = 0, - _iterator13 = _isArray13 - ? _iterator13 - : _iterator13[Symbol.iterator](); - ; - - ) { - var _ref26; - - if (_isArray13) { - if (_i13 >= _iterator13.length) break; - _ref26 = _iterator13[_i13++]; - } else { - _i13 = _iterator13.next(); - if (_i13.done) break; - _ref26 = _i13.value; - } - - const pattern = _ref26; - - manifest = _this9.resolver.getResolvedPattern(pattern); - if (manifest) { - break; - } - } - invariant(manifest, 'expected manifest'); - - const ref = manifest._reference; - invariant(ref, 'expected reference'); - - const object = manifests[ref.registry].object; - object.resolutions = object.resolutions || {}; - object.resolutions[name] = version; - } - - yield _this9.config.saveRootManifests(manifests); - } - - return flattenedPatterns; - } - )(); - } - - /** - * Remove offline tarballs that are no longer required - */ - - pruneOfflineMirror(lockfile) { - var _this10 = this; - - return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( - function* () { - const mirror = _this10.config.getOfflineMirrorPath(); - if (!mirror) { - return; - } - - const requiredTarballs = new Set(); - for (const dependency in lockfile) { - const resolved = lockfile[dependency].resolved; - if (resolved) { - const basename = path.basename(resolved.split('#')[0]); - if (dependency[0] === '@' && basename[0] !== '@') { - requiredTarballs.add( - `${dependency.split('/')[0]}-${basename}` - ); - } - requiredTarballs.add(basename); - } - } - - const mirrorFiles = yield (_fs || _load_fs()).walk(mirror); - for ( - var _iterator14 = mirrorFiles, - _isArray14 = Array.isArray(_iterator14), - _i14 = 0, - _iterator14 = _isArray14 - ? _iterator14 - : _iterator14[Symbol.iterator](); - ; - - ) { - var _ref27; - - if (_isArray14) { - if (_i14 >= _iterator14.length) break; - _ref27 = _iterator14[_i14++]; - } else { - _i14 = _iterator14.next(); - if (_i14.done) break; - _ref27 = _i14.value; - } - - const file = _ref27; - - const isTarball = path.extname(file.basename) === '.tgz'; - // if using experimental-pack-script-packages-in-mirror flag, don't unlink prebuilt packages - const hasPrebuiltPackage = - file.relative.startsWith('prebuilt/'); - if ( - isTarball && - !hasPrebuiltPackage && - !requiredTarballs.has(file.basename) - ) { - yield (_fs || _load_fs()).unlink(file.absolute); - } - } - } - )(); - } - - /** - * Save updated integrity and lockfiles. - */ - - saveLockfileAndIntegrity(patterns, workspaceLayout) { - var _this11 = this; - - return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( - function* () { - const resolvedPatterns = {}; - Object.keys(_this11.resolver.patterns).forEach(function ( - pattern - ) { - if ( - !workspaceLayout || - !workspaceLayout.getManifestByPattern(pattern) - ) { - resolvedPatterns[pattern] = - _this11.resolver.patterns[pattern]; - } - }); - - // TODO this code is duplicated in a few places, need a common way to filter out workspace patterns from lockfile - patterns = patterns.filter(function (p) { - return ( - !workspaceLayout || !workspaceLayout.getManifestByPattern(p) - ); - }); - - const lockfileBasedOnResolver = - _this11.lockfile.getLockfile(resolvedPatterns); - - if (_this11.config.pruneOfflineMirror) { - yield _this11.pruneOfflineMirror(lockfileBasedOnResolver); - } - - // write integrity hash - if (!_this11.config.plugnplayEnabled) { - yield _this11.integrityChecker.save( - patterns, - lockfileBasedOnResolver, - _this11.flags, - workspaceLayout, - _this11.scripts.getArtifacts() - ); - } - - // --no-lockfile or --pure-lockfile or --frozen-lockfile - if ( - _this11.flags.lockfile === false || - _this11.flags.pureLockfile || - _this11.flags.frozenLockfile - ) { - return; - } - - const lockFileHasAllPatterns = patterns.every(function (p) { - return _this11.lockfile.getLocked(p); - }); - const lockfilePatternsMatch = Object.keys( - _this11.lockfile.cache || {} - ).every(function (p) { - return lockfileBasedOnResolver[p]; - }); - const resolverPatternsAreSameAsInLockfile = Object.keys( - lockfileBasedOnResolver - ).every(function (pattern) { - const manifest = _this11.lockfile.getLocked(pattern); - return ( - manifest && - manifest.resolved === - lockfileBasedOnResolver[pattern].resolved && - deepEqual( - manifest.prebuiltVariants, - lockfileBasedOnResolver[pattern].prebuiltVariants - ) - ); - }); - const integrityPatternsAreSameAsInLockfile = Object.keys( - lockfileBasedOnResolver - ).every(function (pattern) { - const existingIntegrityInfo = - lockfileBasedOnResolver[pattern].integrity; - if (!existingIntegrityInfo) { - // if this entry does not have an integrity, no need to re-write the lockfile because of it - return true; - } - const manifest = _this11.lockfile.getLocked(pattern); - if (manifest && manifest.integrity) { - const manifestIntegrity = ssri.stringify(manifest.integrity); - return manifestIntegrity === existingIntegrityInfo; - } - return false; - }); - - // remove command is followed by install with force, lockfile will be rewritten in any case then - if ( - !_this11.flags.force && - _this11.lockfile.parseResultType === 'success' && - lockFileHasAllPatterns && - lockfilePatternsMatch && - resolverPatternsAreSameAsInLockfile && - integrityPatternsAreSameAsInLockfile && - patterns.length - ) { - return; - } - - // build lockfile location - const loc = path.join( - _this11.config.lockfileFolder, - (_constants || _load_constants()).LOCKFILE_FILENAME - ); - - // write lockfile - const lockSource = (0, - (_lockfile2 || _load_lockfile2()).stringify)( - lockfileBasedOnResolver, - false, - _this11.config.enableLockfileVersions - ); - yield (_fs || _load_fs()).writeFilePreservingEol(loc, lockSource); - - _this11._logSuccessSaveLockfile(); - } - )(); - } - - _logSuccessSaveLockfile() { - this.reporter.success(this.reporter.lang('savedLockfile')); - } - - /** - * Load the dependency graph of the current install. Only does package resolving and wont write to the cwd. - */ - hydrate(ignoreUnusedPatterns) { - var _this12 = this; - - return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( - function* () { - const request = yield _this12.fetchRequestFromCwd( - [], - ignoreUnusedPatterns - ); - const depRequests = request.requests, - rawPatterns = request.patterns, - ignorePatterns = request.ignorePatterns, - workspaceLayout = request.workspaceLayout; - - yield _this12.resolver.init(depRequests, { - isFlat: _this12.flags.flat, - isFrozen: _this12.flags.frozenLockfile, - workspaceLayout, - }); - yield _this12.flatten(rawPatterns); - _this12.markIgnored(ignorePatterns); - - // fetch packages, should hit cache most of the time - const manifests = yield ( - _packageFetcher || _load_packageFetcher() - ).fetch(_this12.resolver.getManifests(), _this12.config); - _this12.resolver.updateManifests(manifests); - yield ( - _packageCompatibility || _load_packageCompatibility() - ).check( - _this12.resolver.getManifests(), - _this12.config, - _this12.flags.ignoreEngines - ); - - // expand minimal manifests - for ( - var _iterator15 = _this12.resolver.getManifests(), - _isArray15 = Array.isArray(_iterator15), - _i15 = 0, - _iterator15 = _isArray15 - ? _iterator15 - : _iterator15[Symbol.iterator](); - ; - - ) { - var _ref28; - - if (_isArray15) { - if (_i15 >= _iterator15.length) break; - _ref28 = _iterator15[_i15++]; - } else { - _i15 = _iterator15.next(); - if (_i15.done) break; - _ref28 = _i15.value; - } - - const manifest = _ref28; - - const ref = manifest._reference; - invariant(ref, 'expected reference'); - const type = ref.remote.type; - // link specifier won't ever hit cache - - let loc = ''; - if (type === 'link') { - continue; - } else if (type === 'workspace') { - if (!ref.remote.reference) { - continue; - } - loc = ref.remote.reference; - } else { - loc = _this12.config.generateModuleCachePath(ref); - } - const newPkg = yield _this12.config.readManifest(loc); - yield _this12.resolver.updateManifest(ref, newPkg); - } - - return request; - } - )(); - } - - /** - * Check for updates every day and output a nag message if there's a newer version. - */ - - checkUpdate() { - if (this.config.nonInteractive) { - // don't show upgrade dialog on CI or non-TTY terminals - return; - } - - // don't check if disabled - if (this.config.getOption('disable-self-update-check')) { - return; - } - - // only check for updates once a day - const lastUpdateCheck = - Number(this.config.getOption('lastUpdateCheck')) || 0; - if (lastUpdateCheck && Date.now() - lastUpdateCheck < ONE_DAY) { - return; - } - - // don't bug for updates on tagged releases - if ((_yarnVersion || _load_yarnVersion()).version.indexOf('-') >= 0) { - return; - } - - this._checkUpdate().catch(() => { - // swallow errors - }); - } - - _checkUpdate() { - var _this13 = this; - - return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)( - function* () { - let latestVersion = yield _this13.config.requestManager.request({ - url: (_constants || _load_constants()).SELF_UPDATE_VERSION_URL, - }); - invariant(typeof latestVersion === 'string', 'expected string'); - latestVersion = latestVersion.trim(); - if (!semver.valid(latestVersion)) { - return; - } - - // ensure we only check for updates periodically - _this13.config.registries.yarn.saveHomeConfig({ - lastUpdateCheck: Date.now(), - }); - - if ( - semver.gt( - latestVersion, - (_yarnVersion || _load_yarnVersion()).version - ) - ) { - const installationMethod = yield (0, - (_yarnVersion || _load_yarnVersion()).getInstallationMethod)(); - _this13.maybeOutputUpdate = function () { - _this13.reporter.warn( - _this13.reporter.lang( - 'yarnOutdated', - latestVersion, - (_yarnVersion || _load_yarnVersion()).version - ) - ); - - const command = getUpdateCommand(installationMethod); - if (command) { - _this13.reporter.info( - _this13.reporter.lang('yarnOutdatedCommand') - ); - _this13.reporter.command(command); - } else { - const installer = getUpdateInstaller(installationMethod); - if (installer) { - _this13.reporter.info( - _this13.reporter.lang( - 'yarnOutdatedInstaller', - installer - ) - ); - } - } - }; - } - } - )(); - } - - /** - * Method to override with a possible upgrade message. - */ - - maybeOutputUpdate() {} - } - - exports.Install = Install; - function hasWrapper(commander, args) { - return true; - } - - function setFlags(commander) { - commander.description( - 'Yarn install is used to install all dependencies for a project.' - ); - commander.usage('install [flags]'); - commander.option( - '-A, --audit', - 'Run vulnerability audit on installed packages' - ); - commander.option('-g, --global', 'DEPRECATED'); - commander.option( - '-S, --save', - 'DEPRECATED - save package to your `dependencies`' - ); - commander.option( - '-D, --save-dev', - 'DEPRECATED - save package to your `devDependencies`' - ); - commander.option( - '-P, --save-peer', - 'DEPRECATED - save package to your `peerDependencies`' - ); - commander.option( - '-O, --save-optional', - 'DEPRECATED - save package to your `optionalDependencies`' - ); - commander.option('-E, --save-exact', 'DEPRECATED'); - commander.option('-T, --save-tilde', 'DEPRECATED'); - } - - /***/ - }, - /* 35 */ - /***/ function (module, exports, __webpack_require__) { - var isObject = __webpack_require__(53); - module.exports = function (it) { - if (!isObject(it)) throw TypeError(it + ' is not an object!'); - return it; - }; - - /***/ - }, - /* 36 */ - /***/ function (module, __webpack_exports__, __webpack_require__) { - 'use strict'; - /* harmony export (binding) */ __webpack_require__.d( - __webpack_exports__, - 'b', - function () { - return SubjectSubscriber; - } - ); - /* harmony export (binding) */ __webpack_require__.d( - __webpack_exports__, - 'a', - function () { - return Subject; - } - ); - /* unused harmony export AnonymousSubject */ - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = - __webpack_require__(1); - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Observable__ = - __webpack_require__(12); - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Subscriber__ = - __webpack_require__(7); - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Subscription__ = - __webpack_require__(25); - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__ = - __webpack_require__(190); - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__SubjectSubscription__ = - __webpack_require__(422); - /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__internal_symbol_rxSubscriber__ = - __webpack_require__(321); - /** PURE_IMPORTS_START tslib,_Observable,_Subscriber,_Subscription,_util_ObjectUnsubscribedError,_SubjectSubscription,_internal_symbol_rxSubscriber PURE_IMPORTS_END */ - - var SubjectSubscriber = /*@__PURE__*/ (function (_super) { - __WEBPACK_IMPORTED_MODULE_0_tslib__['a' /* __extends */]( - SubjectSubscriber, - _super - ); - function SubjectSubscriber(destination) { - var _this = _super.call(this, destination) || this; - _this.destination = destination; - return _this; - } - return SubjectSubscriber; - })(__WEBPACK_IMPORTED_MODULE_2__Subscriber__['a' /* Subscriber */]); - - var Subject = /*@__PURE__*/ (function (_super) { - __WEBPACK_IMPORTED_MODULE_0_tslib__['a' /* __extends */]( - Subject, - _super - ); - function Subject() { - var _this = _super.call(this) || this; - _this.observers = []; - _this.closed = false; - _this.isStopped = false; - _this.hasError = false; - _this.thrownError = null; - return _this; - } - Subject.prototype[ - __WEBPACK_IMPORTED_MODULE_6__internal_symbol_rxSubscriber__[ - 'a' /* rxSubscriber */ - ] - ] = function () { - return new SubjectSubscriber(this); - }; - Subject.prototype.lift = function (operator) { - var subject = new AnonymousSubject(this, this); - subject.operator = operator; - return subject; - }; - Subject.prototype.next = function (value) { - if (this.closed) { - throw new __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__[ - 'a' /* ObjectUnsubscribedError */ - ](); - } - if (!this.isStopped) { - var observers = this.observers; - var len = observers.length; - var copy = observers.slice(); - for (var i = 0; i < len; i++) { - copy[i].next(value); - } - } - }; - Subject.prototype.error = function (err) { - if (this.closed) { - throw new __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__[ - 'a' /* ObjectUnsubscribedError */ - ](); - } - this.hasError = true; - this.thrownError = err; - this.isStopped = true; - var observers = this.observers; - var len = observers.length; - var copy = observers.slice(); - for (var i = 0; i < len; i++) { - copy[i].error(err); - } - this.observers.length = 0; - }; - Subject.prototype.complete = function () { - if (this.closed) { - throw new __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__[ - 'a' /* ObjectUnsubscribedError */ - ](); - } - this.isStopped = true; - var observers = this.observers; - var len = observers.length; - var copy = observers.slice(); - for (var i = 0; i < len; i++) { - copy[i].complete(); - } - this.observers.length = 0; - }; - Subject.prototype.unsubscribe = function () { - this.isStopped = true; - this.closed = true; - this.observers = null; - }; - Subject.prototype._trySubscribe = function (subscriber) { - if (this.closed) { - throw new __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__[ - 'a' /* ObjectUnsubscribedError */ - ](); - } else { - return _super.prototype._trySubscribe.call(this, subscriber); - } - }; - Subject.prototype._subscribe = function (subscriber) { - if (this.closed) { - throw new __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__[ - 'a' /* ObjectUnsubscribedError */ - ](); - } else if (this.hasError) { - subscriber.error(this.thrownError); - return __WEBPACK_IMPORTED_MODULE_3__Subscription__[ - 'a' /* Subscription */ - ].EMPTY; - } else if (this.isStopped) { - subscriber.complete(); - return __WEBPACK_IMPORTED_MODULE_3__Subscription__[ - 'a' /* Subscription */ - ].EMPTY; - } else { - this.observers.push(subscriber); - return new __WEBPACK_IMPORTED_MODULE_5__SubjectSubscription__[ - 'a' /* SubjectSubscription */ - ](this, subscriber); - } - }; - Subject.prototype.asObservable = function () { - var observable = new __WEBPACK_IMPORTED_MODULE_1__Observable__[ - 'a' /* Observable */ - ](); - observable.source = this; - return observable; - }; - Subject.create = function (destination, source) { - return new AnonymousSubject(destination, source); - }; - return Subject; - })(__WEBPACK_IMPORTED_MODULE_1__Observable__['a' /* Observable */]); - - var AnonymousSubject = /*@__PURE__*/ (function (_super) { - __WEBPACK_IMPORTED_MODULE_0_tslib__['a' /* __extends */]( - AnonymousSubject, - _super - ); - function AnonymousSubject(destination, source) { - var _this = _super.call(this) || this; - _this.destination = destination; - _this.source = source; - return _this; - } - AnonymousSubject.prototype.next = function (value) { - var destination = this.destination; - if (destination && destination.next) { - destination.next(value); - } - }; - AnonymousSubject.prototype.error = function (err) { - var destination = this.destination; - if (destination && destination.error) { - this.destination.error(err); - } - }; - AnonymousSubject.prototype.complete = function () { - var destination = this.destination; - if (destination && destination.complete) { - this.destination.complete(); - } - }; - AnonymousSubject.prototype._subscribe = function (subscriber) { - var source = this.source; - if (source) { - return this.source.subscribe(subscriber); - } else { - return __WEBPACK_IMPORTED_MODULE_3__Subscription__[ - 'a' /* Subscription */ - ].EMPTY; - } - }; - return AnonymousSubject; - })(Subject); - - //# sourceMappingURL=Subject.js.map - - /***/ - }, - /* 37 */ - /***/ function (module, exports, __webpack_require__) { - 'use strict'; - - Object.defineProperty(exports, '__esModule', { - value: true, - }); - exports.normalizePattern = normalizePattern; - - /** - * Explode and normalize a pattern into its name and range. - */ - - function normalizePattern(pattern) { - let hasVersion = false; - let range = 'latest'; - let name = pattern; - - // if we're a scope then remove the @ and add it back later - let isScoped = false; - if (name[0] === '@') { - isScoped = true; - name = name.slice(1); - } - - // take first part as the name - const parts = name.split('@'); - if (parts.length > 1) { - name = parts.shift(); - range = parts.join('@'); - - if (range) { - hasVersion = true; - } else { - range = '*'; - } - } - - // add back @ scope suffix - if (isScoped) { - name = `@${name}`; - } - - return { name, range, hasVersion }; - } - - /***/ - }, - /* 38 */ - /***/ function (module, exports, __webpack_require__) { - /* WEBPACK VAR INJECTION */ (function (module) { - var __WEBPACK_AMD_DEFINE_RESULT__; - /** - * @license - * Lodash - * Copyright JS Foundation and other contributors - * Released under MIT license - * Based on Underscore.js 1.8.3 - * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - */ - (function () { - /** Used as a safe reference for `undefined` in pre-ES5 environments. */ - var undefined; - - /** Used as the semantic version number. */ - var VERSION = '4.17.10'; - - /** Used as the size to enable large array optimizations. */ - var LARGE_ARRAY_SIZE = 200; - - /** Error message constants. */ - var CORE_ERROR_TEXT = - 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.', - FUNC_ERROR_TEXT = 'Expected a function'; - - /** Used to stand-in for `undefined` hash values. */ - var HASH_UNDEFINED = '__lodash_hash_undefined__'; - - /** Used as the maximum memoize cache size. */ - var MAX_MEMOIZE_SIZE = 500; - - /** Used as the internal argument placeholder. */ - var PLACEHOLDER = '__lodash_placeholder__'; - - /** Used to compose bitmasks for cloning. */ - var CLONE_DEEP_FLAG = 1, - CLONE_FLAT_FLAG = 2, - CLONE_SYMBOLS_FLAG = 4; - - /** Used to compose bitmasks for value comparisons. */ - var COMPARE_PARTIAL_FLAG = 1, - COMPARE_UNORDERED_FLAG = 2; - - /** Used to compose bitmasks for function metadata. */ - var WRAP_BIND_FLAG = 1, - WRAP_BIND_KEY_FLAG = 2, - WRAP_CURRY_BOUND_FLAG = 4, - WRAP_CURRY_FLAG = 8, - WRAP_CURRY_RIGHT_FLAG = 16, - WRAP_PARTIAL_FLAG = 32, - WRAP_PARTIAL_RIGHT_FLAG = 64, - WRAP_ARY_FLAG = 128, - WRAP_REARG_FLAG = 256, - WRAP_FLIP_FLAG = 512; - - /** Used as default options for `_.truncate`. */ - var DEFAULT_TRUNC_LENGTH = 30, - DEFAULT_TRUNC_OMISSION = '...'; - - /** Used to detect hot functions by number of calls within a span of milliseconds. */ - var HOT_COUNT = 800, - HOT_SPAN = 16; - - /** Used to indicate the type of lazy iteratees. */ - var LAZY_FILTER_FLAG = 1, - LAZY_MAP_FLAG = 2, - LAZY_WHILE_FLAG = 3; - - /** Used as references for various `Number` constants. */ - var INFINITY = 1 / 0, - MAX_SAFE_INTEGER = 9007199254740991, - MAX_INTEGER = 1.7976931348623157e308, - NAN = 0 / 0; - - /** Used as references for the maximum length and index of an array. */ - var MAX_ARRAY_LENGTH = 4294967295, - MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1, - HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1; - - /** Used to associate wrap methods with their bit flags. */ - var wrapFlags = [ - ['ary', WRAP_ARY_FLAG], - ['bind', WRAP_BIND_FLAG], - ['bindKey', WRAP_BIND_KEY_FLAG], - ['curry', WRAP_CURRY_FLAG], - ['curryRight', WRAP_CURRY_RIGHT_FLAG], - ['flip', WRAP_FLIP_FLAG], - ['partial', WRAP_PARTIAL_FLAG], - ['partialRight', WRAP_PARTIAL_RIGHT_FLAG], - ['rearg', WRAP_REARG_FLAG], - ]; - - /** `Object#toString` result references. */ - var argsTag = '[object Arguments]', - arrayTag = '[object Array]', - asyncTag = '[object AsyncFunction]', - boolTag = '[object Boolean]', - dateTag = '[object Date]', - domExcTag = '[object DOMException]', - errorTag = '[object Error]', - funcTag = '[object Function]', - genTag = '[object GeneratorFunction]', - mapTag = '[object Map]', - numberTag = '[object Number]', - nullTag = '[object Null]', - objectTag = '[object Object]', - promiseTag = '[object Promise]', - proxyTag = '[object Proxy]', - regexpTag = '[object RegExp]', - setTag = '[object Set]', - stringTag = '[object String]', - symbolTag = '[object Symbol]', - undefinedTag = '[object Undefined]', - weakMapTag = '[object WeakMap]', - weakSetTag = '[object WeakSet]'; - - var arrayBufferTag = '[object ArrayBuffer]', - dataViewTag = '[object DataView]', - float32Tag = '[object Float32Array]', - float64Tag = '[object Float64Array]', - int8Tag = '[object Int8Array]', - int16Tag = '[object Int16Array]', - int32Tag = '[object Int32Array]', - uint8Tag = '[object Uint8Array]', - uint8ClampedTag = '[object Uint8ClampedArray]', - uint16Tag = '[object Uint16Array]', - uint32Tag = '[object Uint32Array]'; - - /** Used to match empty string literals in compiled template source. */ - var reEmptyStringLeading = /\b__p \+= '';/g, - reEmptyStringMiddle = /\b(__p \+=) '' \+/g, - reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g; - - /** Used to match HTML entities and HTML characters. */ - var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g, - reUnescapedHtml = /[&<>"']/g, - reHasEscapedHtml = RegExp(reEscapedHtml.source), - reHasUnescapedHtml = RegExp(reUnescapedHtml.source); - - /** Used to match template delimiters. */ - var reEscape = /<%-([\s\S]+?)%>/g, - reEvaluate = /<%([\s\S]+?)%>/g, - reInterpolate = /<%=([\s\S]+?)%>/g; - - /** Used to match property names within property paths. */ - var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, - reIsPlainProp = /^\w*$/, - rePropName = - /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; - - /** - * Used to match `RegExp` - * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). - */ - var reRegExpChar = /[\\^$.*+?()[\]{}|]/g, - reHasRegExpChar = RegExp(reRegExpChar.source); - - /** Used to match leading and trailing whitespace. */ - var reTrim = /^\s+|\s+$/g, - reTrimStart = /^\s+/, - reTrimEnd = /\s+$/; - - /** Used to match wrap detail comments. */ - var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/, - reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/, - reSplitDetails = /,? & /; - - /** Used to match words composed of alphanumeric characters. */ - var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g; - - /** Used to match backslashes in property paths. */ - var reEscapeChar = /\\(\\)?/g; - - /** - * Used to match - * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components). - */ - var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g; - - /** Used to match `RegExp` flags from their coerced string values. */ - var reFlags = /\w*$/; - - /** Used to detect bad signed hexadecimal string values. */ - var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; - - /** Used to detect binary string values. */ - var reIsBinary = /^0b[01]+$/i; - - /** Used to detect host constructors (Safari). */ - var reIsHostCtor = /^\[object .+?Constructor\]$/; - - /** Used to detect octal string values. */ - var reIsOctal = /^0o[0-7]+$/i; - - /** Used to detect unsigned integer values. */ - var reIsUint = /^(?:0|[1-9]\d*)$/; - - /** Used to match Latin Unicode letters (excluding mathematical operators). */ - var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g; - - /** Used to ensure capturing order of template delimiters. */ - var reNoMatch = /($^)/; - - /** Used to match unescaped characters in compiled string literals. */ - var reUnescapedString = /['\n\r\u2028\u2029\\]/g; - - /** Used to compose unicode character classes. */ - var rsAstralRange = '\\ud800-\\udfff', - rsComboMarksRange = '\\u0300-\\u036f', - reComboHalfMarksRange = '\\ufe20-\\ufe2f', - rsComboSymbolsRange = '\\u20d0-\\u20ff', - rsComboRange = - rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, - rsDingbatRange = '\\u2700-\\u27bf', - rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff', - rsMathOpRange = '\\xac\\xb1\\xd7\\xf7', - rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf', - rsPunctuationRange = '\\u2000-\\u206f', - rsSpaceRange = - ' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000', - rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde', - rsVarRange = '\\ufe0e\\ufe0f', - rsBreakRange = - rsMathOpRange + - rsNonCharRange + - rsPunctuationRange + - rsSpaceRange; - - /** Used to compose unicode capture groups. */ - var rsApos = "['\u2019]", - rsAstral = '[' + rsAstralRange + ']', - rsBreak = '[' + rsBreakRange + ']', - rsCombo = '[' + rsComboRange + ']', - rsDigits = '\\d+', - rsDingbat = '[' + rsDingbatRange + ']', - rsLower = '[' + rsLowerRange + ']', - rsMisc = - '[^' + - rsAstralRange + - rsBreakRange + - rsDigits + - rsDingbatRange + - rsLowerRange + - rsUpperRange + - ']', - rsFitz = '\\ud83c[\\udffb-\\udfff]', - rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')', - rsNonAstral = '[^' + rsAstralRange + ']', - rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}', - rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]', - rsUpper = '[' + rsUpperRange + ']', - rsZWJ = '\\u200d'; - - /** Used to compose unicode regexes. */ - var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')', - rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')', - rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?', - rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?', - reOptMod = rsModifier + '?', - rsOptVar = '[' + rsVarRange + ']?', - rsOptJoin = - '(?:' + - rsZWJ + - '(?:' + - [rsNonAstral, rsRegional, rsSurrPair].join('|') + - ')' + - rsOptVar + - reOptMod + - ')*', - rsOrdLower = '\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])', - rsOrdUpper = '\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])', - rsSeq = rsOptVar + reOptMod + rsOptJoin, - rsEmoji = - '(?:' + - [rsDingbat, rsRegional, rsSurrPair].join('|') + - ')' + - rsSeq, - rsSymbol = - '(?:' + - [ - rsNonAstral + rsCombo + '?', - rsCombo, - rsRegional, - rsSurrPair, - rsAstral, - ].join('|') + - ')'; - - /** Used to match apostrophes. */ - var reApos = RegExp(rsApos, 'g'); - - /** - * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and - * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols). - */ - var reComboMark = RegExp(rsCombo, 'g'); - - /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */ - var reUnicode = RegExp( - rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, - 'g' - ); - - /** Used to match complex or compound words. */ - var reUnicodeWord = RegExp( - [ - rsUpper + - '?' + - rsLower + - '+' + - rsOptContrLower + - '(?=' + - [rsBreak, rsUpper, '$'].join('|') + - ')', - rsMiscUpper + - '+' + - rsOptContrUpper + - '(?=' + - [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + - ')', - rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower, - rsUpper + '+' + rsOptContrUpper, - rsOrdUpper, - rsOrdLower, - rsDigits, - rsEmoji, - ].join('|'), - 'g' - ); - - /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */ - var reHasUnicode = RegExp( - '[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']' - ); - - /** Used to detect strings that need a more robust regexp to match words. */ - var reHasUnicodeWord = - /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/; - - /** Used to assign default `context` object properties. */ - var contextProps = [ - 'Array', - 'Buffer', - 'DataView', - 'Date', - 'Error', - 'Float32Array', - 'Float64Array', - 'Function', - 'Int8Array', - 'Int16Array', - 'Int32Array', - 'Map', - 'Math', - 'Object', - 'Promise', - 'RegExp', - 'Set', - 'String', - 'Symbol', - 'TypeError', - 'Uint8Array', - 'Uint8ClampedArray', - 'Uint16Array', - 'Uint32Array', - 'WeakMap', - '_', - 'clearTimeout', - 'isFinite', - 'parseInt', - 'setTimeout', - ]; - - /** Used to make template sourceURLs easier to identify. */ - var templateCounter = -1; - - /** Used to identify `toStringTag` values of typed arrays. */ - var typedArrayTags = {}; - typedArrayTags[float32Tag] = - typedArrayTags[float64Tag] = - typedArrayTags[int8Tag] = - typedArrayTags[int16Tag] = - typedArrayTags[int32Tag] = - typedArrayTags[uint8Tag] = - typedArrayTags[uint8ClampedTag] = - typedArrayTags[uint16Tag] = - typedArrayTags[uint32Tag] = - true; - typedArrayTags[argsTag] = - typedArrayTags[arrayTag] = - typedArrayTags[arrayBufferTag] = - typedArrayTags[boolTag] = - typedArrayTags[dataViewTag] = - typedArrayTags[dateTag] = - typedArrayTags[errorTag] = - typedArrayTags[funcTag] = - typedArrayTags[mapTag] = - typedArrayTags[numberTag] = - typedArrayTags[objectTag] = - typedArrayTags[regexpTag] = - typedArrayTags[setTag] = - typedArrayTags[stringTag] = - typedArrayTags[weakMapTag] = - false; - - /** Used to identify `toStringTag` values supported by `_.clone`. */ - var cloneableTags = {}; - cloneableTags[argsTag] = - cloneableTags[arrayTag] = - cloneableTags[arrayBufferTag] = - cloneableTags[dataViewTag] = - cloneableTags[boolTag] = - cloneableTags[dateTag] = - cloneableTags[float32Tag] = - cloneableTags[float64Tag] = - cloneableTags[int8Tag] = - cloneableTags[int16Tag] = - cloneableTags[int32Tag] = - cloneableTags[mapTag] = - cloneableTags[numberTag] = - cloneableTags[objectTag] = - cloneableTags[regexpTag] = - cloneableTags[setTag] = - cloneableTags[stringTag] = - cloneableTags[symbolTag] = - cloneableTags[uint8Tag] = - cloneableTags[uint8ClampedTag] = - cloneableTags[uint16Tag] = - cloneableTags[uint32Tag] = - true; - cloneableTags[errorTag] = - cloneableTags[funcTag] = - cloneableTags[weakMapTag] = - false; - - /** Used to map Latin Unicode letters to basic Latin letters. */ - var deburredLetters = { - // Latin-1 Supplement block. - '\xc0': 'A', - '\xc1': 'A', - '\xc2': 'A', - '\xc3': 'A', - '\xc4': 'A', - '\xc5': 'A', - '\xe0': 'a', - '\xe1': 'a', - '\xe2': 'a', - '\xe3': 'a', - '\xe4': 'a', - '\xe5': 'a', - '\xc7': 'C', - '\xe7': 'c', - '\xd0': 'D', - '\xf0': 'd', - '\xc8': 'E', - '\xc9': 'E', - '\xca': 'E', - '\xcb': 'E', - '\xe8': 'e', - '\xe9': 'e', - '\xea': 'e', - '\xeb': 'e', - '\xcc': 'I', - '\xcd': 'I', - '\xce': 'I', - '\xcf': 'I', - '\xec': 'i', - '\xed': 'i', - '\xee': 'i', - '\xef': 'i', - '\xd1': 'N', - '\xf1': 'n', - '\xd2': 'O', - '\xd3': 'O', - '\xd4': 'O', - '\xd5': 'O', - '\xd6': 'O', - '\xd8': 'O', - '\xf2': 'o', - '\xf3': 'o', - '\xf4': 'o', - '\xf5': 'o', - '\xf6': 'o', - '\xf8': 'o', - '\xd9': 'U', - '\xda': 'U', - '\xdb': 'U', - '\xdc': 'U', - '\xf9': 'u', - '\xfa': 'u', - '\xfb': 'u', - '\xfc': 'u', - '\xdd': 'Y', - '\xfd': 'y', - '\xff': 'y', - '\xc6': 'Ae', - '\xe6': 'ae', - '\xde': 'Th', - '\xfe': 'th', - '\xdf': 'ss', - // Latin Extended-A block. - '\u0100': 'A', - '\u0102': 'A', - '\u0104': 'A', - '\u0101': 'a', - '\u0103': 'a', - '\u0105': 'a', - '\u0106': 'C', - '\u0108': 'C', - '\u010a': 'C', - '\u010c': 'C', - '\u0107': 'c', - '\u0109': 'c', - '\u010b': 'c', - '\u010d': 'c', - '\u010e': 'D', - '\u0110': 'D', - '\u010f': 'd', - '\u0111': 'd', - '\u0112': 'E', - '\u0114': 'E', - '\u0116': 'E', - '\u0118': 'E', - '\u011a': 'E', - '\u0113': 'e', - '\u0115': 'e', - '\u0117': 'e', - '\u0119': 'e', - '\u011b': 'e', - '\u011c': 'G', - '\u011e': 'G', - '\u0120': 'G', - '\u0122': 'G', - '\u011d': 'g', - '\u011f': 'g', - '\u0121': 'g', - '\u0123': 'g', - '\u0124': 'H', - '\u0126': 'H', - '\u0125': 'h', - '\u0127': 'h', - '\u0128': 'I', - '\u012a': 'I', - '\u012c': 'I', - '\u012e': 'I', - '\u0130': 'I', - '\u0129': 'i', - '\u012b': 'i', - '\u012d': 'i', - '\u012f': 'i', - '\u0131': 'i', - '\u0134': 'J', - '\u0135': 'j', - '\u0136': 'K', - '\u0137': 'k', - '\u0138': 'k', - '\u0139': 'L', - '\u013b': 'L', - '\u013d': 'L', - '\u013f': 'L', - '\u0141': 'L', - '\u013a': 'l', - '\u013c': 'l', - '\u013e': 'l', - '\u0140': 'l', - '\u0142': 'l', - '\u0143': 'N', - '\u0145': 'N', - '\u0147': 'N', - '\u014a': 'N', - '\u0144': 'n', - '\u0146': 'n', - '\u0148': 'n', - '\u014b': 'n', - '\u014c': 'O', - '\u014e': 'O', - '\u0150': 'O', - '\u014d': 'o', - '\u014f': 'o', - '\u0151': 'o', - '\u0154': 'R', - '\u0156': 'R', - '\u0158': 'R', - '\u0155': 'r', - '\u0157': 'r', - '\u0159': 'r', - '\u015a': 'S', - '\u015c': 'S', - '\u015e': 'S', - '\u0160': 'S', - '\u015b': 's', - '\u015d': 's', - '\u015f': 's', - '\u0161': 's', - '\u0162': 'T', - '\u0164': 'T', - '\u0166': 'T', - '\u0163': 't', - '\u0165': 't', - '\u0167': 't', - '\u0168': 'U', - '\u016a': 'U', - '\u016c': 'U', - '\u016e': 'U', - '\u0170': 'U', - '\u0172': 'U', - '\u0169': 'u', - '\u016b': 'u', - '\u016d': 'u', - '\u016f': 'u', - '\u0171': 'u', - '\u0173': 'u', - '\u0174': 'W', - '\u0175': 'w', - '\u0176': 'Y', - '\u0177': 'y', - '\u0178': 'Y', - '\u0179': 'Z', - '\u017b': 'Z', - '\u017d': 'Z', - '\u017a': 'z', - '\u017c': 'z', - '\u017e': 'z', - '\u0132': 'IJ', - '\u0133': 'ij', - '\u0152': 'Oe', - '\u0153': 'oe', - '\u0149': "'n", - '\u017f': 's', - }; - - /** Used to map characters to HTML entities. */ - var htmlEscapes = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''', - }; - - /** Used to map HTML entities to characters. */ - var htmlUnescapes = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - ''': "'", - }; - - /** Used to escape characters for inclusion in compiled string literals. */ - var stringEscapes = { - '\\': '\\', - "'": "'", - '\n': 'n', - '\r': 'r', - '\u2028': 'u2028', - '\u2029': 'u2029', - }; - - /** Built-in method references without a dependency on `root`. */ - var freeParseFloat = parseFloat, - freeParseInt = parseInt; - - /** Detect free variable `global` from Node.js. */ - var freeGlobal = - typeof global == 'object' && - global && - global.Object === Object && - global; - - /** Detect free variable `self`. */ - var freeSelf = - typeof self == 'object' && self && self.Object === Object && self; - - /** Used as a reference to the global object. */ - var root = freeGlobal || freeSelf || Function('return this')(); - - /** Detect free variable `exports`. */ - var freeExports = - typeof exports == 'object' && - exports && - !exports.nodeType && - exports; - - /** Detect free variable `module`. */ - var freeModule = - freeExports && - typeof module == 'object' && - module && - !module.nodeType && - module; - - /** Detect the popular CommonJS extension `module.exports`. */ - var moduleExports = freeModule && freeModule.exports === freeExports; - - /** Detect free variable `process` from Node.js. */ - var freeProcess = moduleExports && freeGlobal.process; - - /** Used to access faster Node.js helpers. */ - var nodeUtil = (function () { - try { - // Use `util.types` for Node.js 10+. - var types = - freeModule && - freeModule.require && - freeModule.require('util').types; - - if (types) { - return types; - } - - // Legacy `process.binding('util')` for Node.js < 10. - return ( - freeProcess && - freeProcess.binding && - freeProcess.binding('util') - ); - } catch (e) {} - })(); - - /* Node.js helper references. */ - var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer, - nodeIsDate = nodeUtil && nodeUtil.isDate, - nodeIsMap = nodeUtil && nodeUtil.isMap, - nodeIsRegExp = nodeUtil && nodeUtil.isRegExp, - nodeIsSet = nodeUtil && nodeUtil.isSet, - nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; - - /*--------------------------------------------------------------------------*/ - - /** - * A faster alternative to `Function#apply`, this function invokes `func` - * with the `this` binding of `thisArg` and the arguments of `args`. - * - * @private - * @param {Function} func The function to invoke. - * @param {*} thisArg The `this` binding of `func`. - * @param {Array} args The arguments to invoke `func` with. - * @returns {*} Returns the result of `func`. - */ - function apply(func, thisArg, args) { - switch (args.length) { - case 0: - return func.call(thisArg); - case 1: - return func.call(thisArg, args[0]); - case 2: - return func.call(thisArg, args[0], args[1]); - case 3: - return func.call(thisArg, args[0], args[1], args[2]); - } - return func.apply(thisArg, args); - } - - /** - * A specialized version of `baseAggregator` for arrays. - * - * @private - * @param {Array} [array] The array to iterate over. - * @param {Function} setter The function to set `accumulator` values. - * @param {Function} iteratee The iteratee to transform keys. - * @param {Object} accumulator The initial aggregated object. - * @returns {Function} Returns `accumulator`. - */ - function arrayAggregator(array, setter, iteratee, accumulator) { - var index = -1, - length = array == null ? 0 : array.length; - - while (++index < length) { - var value = array[index]; - setter(accumulator, value, iteratee(value), array); - } - return accumulator; - } - - /** - * A specialized version of `_.forEach` for arrays without support for - * iteratee shorthands. - * - * @private - * @param {Array} [array] The array to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array} Returns `array`. - */ - function arrayEach(array, iteratee) { - var index = -1, - length = array == null ? 0 : array.length; - - while (++index < length) { - if (iteratee(array[index], index, array) === false) { - break; - } - } - return array; - } - - /** - * A specialized version of `_.forEachRight` for arrays without support for - * iteratee shorthands. - * - * @private - * @param {Array} [array] The array to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array} Returns `array`. - */ - function arrayEachRight(array, iteratee) { - var length = array == null ? 0 : array.length; - - while (length--) { - if (iteratee(array[length], length, array) === false) { - break; - } - } - return array; - } - - /** - * A specialized version of `_.every` for arrays without support for - * iteratee shorthands. - * - * @private - * @param {Array} [array] The array to iterate over. - * @param {Function} predicate The function invoked per iteration. - * @returns {boolean} Returns `true` if all elements pass the predicate check, - * else `false`. - */ - function arrayEvery(array, predicate) { - var index = -1, - length = array == null ? 0 : array.length; - - while (++index < length) { - if (!predicate(array[index], index, array)) { - return false; - } - } - return true; - } - - /** - * A specialized version of `_.filter` for arrays without support for - * iteratee shorthands. - * - * @private - * @param {Array} [array] The array to iterate over. - * @param {Function} predicate The function invoked per iteration. - * @returns {Array} Returns the new filtered array. - */ - function arrayFilter(array, predicate) { - var index = -1, - length = array == null ? 0 : array.length, - resIndex = 0, - result = []; - - while (++index < length) { - var value = array[index]; - if (predicate(value, index, array)) { - result[resIndex++] = value; - } - } - return result; - } - - /** - * A specialized version of `_.includes` for arrays without support for - * specifying an index to search from. - * - * @private - * @param {Array} [array] The array to inspect. - * @param {*} target The value to search for. - * @returns {boolean} Returns `true` if `target` is found, else `false`. - */ - function arrayIncludes(array, value) { - var length = array == null ? 0 : array.length; - return !!length && baseIndexOf(array, value, 0) > -1; - } - - /** - * This function is like `arrayIncludes` except that it accepts a comparator. - * - * @private - * @param {Array} [array] The array to inspect. - * @param {*} target The value to search for. - * @param {Function} comparator The comparator invoked per element. - * @returns {boolean} Returns `true` if `target` is found, else `false`. - */ - function arrayIncludesWith(array, value, comparator) { - var index = -1, - length = array == null ? 0 : array.length; - - while (++index < length) { - if (comparator(value, array[index])) { - return true; - } - } - return false; - } - - /** - * A specialized version of `_.map` for arrays without support for iteratee - * shorthands. - * - * @private - * @param {Array} [array] The array to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array} Returns the new mapped array. - */ - function arrayMap(array, iteratee) { - var index = -1, - length = array == null ? 0 : array.length, - result = Array(length); - - while (++index < length) { - result[index] = iteratee(array[index], index, array); - } - return result; - } - - /** - * Appends the elements of `values` to `array`. - * - * @private - * @param {Array} array The array to modify. - * @param {Array} values The values to append. - * @returns {Array} Returns `array`. - */ - function arrayPush(array, values) { - var index = -1, - length = values.length, - offset = array.length; - - while (++index < length) { - array[offset + index] = values[index]; - } - return array; - } - - /** - * A specialized version of `_.reduce` for arrays without support for - * iteratee shorthands. - * - * @private - * @param {Array} [array] The array to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @param {*} [accumulator] The initial value. - * @param {boolean} [initAccum] Specify using the first element of `array` as - * the initial value. - * @returns {*} Returns the accumulated value. - */ - function arrayReduce(array, iteratee, accumulator, initAccum) { - var index = -1, - length = array == null ? 0 : array.length; - - if (initAccum && length) { - accumulator = array[++index]; - } - while (++index < length) { - accumulator = iteratee(accumulator, array[index], index, array); - } - return accumulator; - } - - /** - * A specialized version of `_.reduceRight` for arrays without support for - * iteratee shorthands. - * - * @private - * @param {Array} [array] The array to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @param {*} [accumulator] The initial value. - * @param {boolean} [initAccum] Specify using the last element of `array` as - * the initial value. - * @returns {*} Returns the accumulated value. - */ - function arrayReduceRight(array, iteratee, accumulator, initAccum) { - var length = array == null ? 0 : array.length; - if (initAccum && length) { - accumulator = array[--length]; - } - while (length--) { - accumulator = iteratee(accumulator, array[length], length, array); - } - return accumulator; - } - - /** - * A specialized version of `_.some` for arrays without support for iteratee - * shorthands. - * - * @private - * @param {Array} [array] The array to iterate over. - * @param {Function} predicate The function invoked per iteration. - * @returns {boolean} Returns `true` if any element passes the predicate check, - * else `false`. - */ - function arraySome(array, predicate) { - var index = -1, - length = array == null ? 0 : array.length; - - while (++index < length) { - if (predicate(array[index], index, array)) { - return true; - } - } - return false; - } - - /** - * Gets the size of an ASCII `string`. - * - * @private - * @param {string} string The string inspect. - * @returns {number} Returns the string size. - */ - var asciiSize = baseProperty('length'); - - /** - * Converts an ASCII `string` to an array. - * - * @private - * @param {string} string The string to convert. - * @returns {Array} Returns the converted array. - */ - function asciiToArray(string) { - return string.split(''); - } - - /** - * Splits an ASCII `string` into an array of its words. - * - * @private - * @param {string} The string to inspect. - * @returns {Array} Returns the words of `string`. - */ - function asciiWords(string) { - return string.match(reAsciiWord) || []; - } - - /** - * The base implementation of methods like `_.findKey` and `_.findLastKey`, - * without support for iteratee shorthands, which iterates over `collection` - * using `eachFunc`. - * - * @private - * @param {Array|Object} collection The collection to inspect. - * @param {Function} predicate The function invoked per iteration. - * @param {Function} eachFunc The function to iterate over `collection`. - * @returns {*} Returns the found element or its key, else `undefined`. - */ - function baseFindKey(collection, predicate, eachFunc) { - var result; - eachFunc(collection, function (value, key, collection) { - if (predicate(value, key, collection)) { - result = key; - return false; - } - }); - return result; - } - - /** - * The base implementation of `_.findIndex` and `_.findLastIndex` without - * support for iteratee shorthands. - * - * @private - * @param {Array} array The array to inspect. - * @param {Function} predicate The function invoked per iteration. - * @param {number} fromIndex The index to search from. - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {number} Returns the index of the matched value, else `-1`. - */ - function baseFindIndex(array, predicate, fromIndex, fromRight) { - var length = array.length, - index = fromIndex + (fromRight ? 1 : -1); - - while (fromRight ? index-- : ++index < length) { - if (predicate(array[index], index, array)) { - return index; - } - } - return -1; - } - - /** - * The base implementation of `_.indexOf` without `fromIndex` bounds checks. - * - * @private - * @param {Array} array The array to inspect. - * @param {*} value The value to search for. - * @param {number} fromIndex The index to search from. - * @returns {number} Returns the index of the matched value, else `-1`. - */ - function baseIndexOf(array, value, fromIndex) { - return value === value - ? strictIndexOf(array, value, fromIndex) - : baseFindIndex(array, baseIsNaN, fromIndex); - } - - /** - * This function is like `baseIndexOf` except that it accepts a comparator. - * - * @private - * @param {Array} array The array to inspect. - * @param {*} value The value to search for. - * @param {number} fromIndex The index to search from. - * @param {Function} comparator The comparator invoked per element. - * @returns {number} Returns the index of the matched value, else `-1`. - */ - function baseIndexOfWith(array, value, fromIndex, comparator) { - var index = fromIndex - 1, - length = array.length; - - while (++index < length) { - if (comparator(array[index], value)) { - return index; - } - } - return -1; - } - - /** - * The base implementation of `_.isNaN` without support for number objects. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. - */ - function baseIsNaN(value) { - return value !== value; - } - - /** - * The base implementation of `_.mean` and `_.meanBy` without support for - * iteratee shorthands. - * - * @private - * @param {Array} array The array to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {number} Returns the mean. - */ - function baseMean(array, iteratee) { - var length = array == null ? 0 : array.length; - return length ? baseSum(array, iteratee) / length : NAN; - } - - /** - * The base implementation of `_.property` without support for deep paths. - * - * @private - * @param {string} key The key of the property to get. - * @returns {Function} Returns the new accessor function. - */ - function baseProperty(key) { - return function (object) { - return object == null ? undefined : object[key]; - }; - } - - /** - * The base implementation of `_.propertyOf` without support for deep paths. - * - * @private - * @param {Object} object The object to query. - * @returns {Function} Returns the new accessor function. - */ - function basePropertyOf(object) { - return function (key) { - return object == null ? undefined : object[key]; - }; - } - - /** - * The base implementation of `_.reduce` and `_.reduceRight`, without support - * for iteratee shorthands, which iterates over `collection` using `eachFunc`. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @param {*} accumulator The initial value. - * @param {boolean} initAccum Specify using the first or last element of - * `collection` as the initial value. - * @param {Function} eachFunc The function to iterate over `collection`. - * @returns {*} Returns the accumulated value. - */ - function baseReduce( - collection, - iteratee, - accumulator, - initAccum, - eachFunc - ) { - eachFunc(collection, function (value, index, collection) { - accumulator = initAccum - ? ((initAccum = false), value) - : iteratee(accumulator, value, index, collection); - }); - return accumulator; - } - - /** - * The base implementation of `_.sortBy` which uses `comparer` to define the - * sort order of `array` and replaces criteria objects with their corresponding - * values. - * - * @private - * @param {Array} array The array to sort. - * @param {Function} comparer The function to define sort order. - * @returns {Array} Returns `array`. - */ - function baseSortBy(array, comparer) { - var length = array.length; - - array.sort(comparer); - while (length--) { - array[length] = array[length].value; - } - return array; - } - - /** - * The base implementation of `_.sum` and `_.sumBy` without support for - * iteratee shorthands. - * - * @private - * @param {Array} array The array to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {number} Returns the sum. - */ - function baseSum(array, iteratee) { - var result, - index = -1, - length = array.length; - - while (++index < length) { - var current = iteratee(array[index]); - if (current !== undefined) { - result = result === undefined ? current : result + current; - } - } - return result; - } - - /** - * The base implementation of `_.times` without support for iteratee shorthands - * or max array length checks. - * - * @private - * @param {number} n The number of times to invoke `iteratee`. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array} Returns the array of results. - */ - function baseTimes(n, iteratee) { - var index = -1, - result = Array(n); - - while (++index < n) { - result[index] = iteratee(index); - } - return result; - } - - /** - * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array - * of key-value pairs for `object` corresponding to the property names of `props`. - * - * @private - * @param {Object} object The object to query. - * @param {Array} props The property names to get values for. - * @returns {Object} Returns the key-value pairs. - */ - function baseToPairs(object, props) { - return arrayMap(props, function (key) { - return [key, object[key]]; - }); - } - - /** - * The base implementation of `_.unary` without support for storing metadata. - * - * @private - * @param {Function} func The function to cap arguments for. - * @returns {Function} Returns the new capped function. - */ - function baseUnary(func) { - return function (value) { - return func(value); - }; - } - - /** - * The base implementation of `_.values` and `_.valuesIn` which creates an - * array of `object` property values corresponding to the property names - * of `props`. - * - * @private - * @param {Object} object The object to query. - * @param {Array} props The property names to get values for. - * @returns {Object} Returns the array of property values. - */ - function baseValues(object, props) { - return arrayMap(props, function (key) { - return object[key]; - }); - } - - /** - * Checks if a `cache` value for `key` exists. - * - * @private - * @param {Object} cache The cache to query. - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ - function cacheHas(cache, key) { - return cache.has(key); - } - - /** - * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol - * that is not found in the character symbols. - * - * @private - * @param {Array} strSymbols The string symbols to inspect. - * @param {Array} chrSymbols The character symbols to find. - * @returns {number} Returns the index of the first unmatched string symbol. - */ - function charsStartIndex(strSymbols, chrSymbols) { - var index = -1, - length = strSymbols.length; - - while ( - ++index < length && - baseIndexOf(chrSymbols, strSymbols[index], 0) > -1 - ) {} - return index; - } - - /** - * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol - * that is not found in the character symbols. - * - * @private - * @param {Array} strSymbols The string symbols to inspect. - * @param {Array} chrSymbols The character symbols to find. - * @returns {number} Returns the index of the last unmatched string symbol. - */ - function charsEndIndex(strSymbols, chrSymbols) { - var index = strSymbols.length; - - while ( - index-- && - baseIndexOf(chrSymbols, strSymbols[index], 0) > -1 - ) {} - return index; - } - - /** - * Gets the number of `placeholder` occurrences in `array`. - * - * @private - * @param {Array} array The array to inspect. - * @param {*} placeholder The placeholder to search for. - * @returns {number} Returns the placeholder count. - */ - function countHolders(array, placeholder) { - var length = array.length, - result = 0; - - while (length--) { - if (array[length] === placeholder) { - ++result; - } - } - return result; - } - - /** - * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A - * letters to basic Latin letters. - * - * @private - * @param {string} letter The matched letter to deburr. - * @returns {string} Returns the deburred letter. - */ - var deburrLetter = basePropertyOf(deburredLetters); - - /** - * Used by `_.escape` to convert characters to HTML entities. - * - * @private - * @param {string} chr The matched character to escape. - * @returns {string} Returns the escaped character. - */ - var escapeHtmlChar = basePropertyOf(htmlEscapes); - - /** - * Used by `_.template` to escape characters for inclusion in compiled string literals. - * - * @private - * @param {string} chr The matched character to escape. - * @returns {string} Returns the escaped character. - */ - function escapeStringChar(chr) { - return '\\' + stringEscapes[chr]; - } - - /** - * Gets the value at `key` of `object`. - * - * @private - * @param {Object} [object] The object to query. - * @param {string} key The key of the property to get. - * @returns {*} Returns the property value. - */ - function getValue(object, key) { - return object == null ? undefined : object[key]; - } - - /** - * Checks if `string` contains Unicode symbols. - * - * @private - * @param {string} string The string to inspect. - * @returns {boolean} Returns `true` if a symbol is found, else `false`. - */ - function hasUnicode(string) { - return reHasUnicode.test(string); - } - - /** - * Checks if `string` contains a word composed of Unicode symbols. - * - * @private - * @param {string} string The string to inspect. - * @returns {boolean} Returns `true` if a word is found, else `false`. - */ - function hasUnicodeWord(string) { - return reHasUnicodeWord.test(string); - } - - /** - * Converts `iterator` to an array. - * - * @private - * @param {Object} iterator The iterator to convert. - * @returns {Array} Returns the converted array. - */ - function iteratorToArray(iterator) { - var data, - result = []; - - while (!(data = iterator.next()).done) { - result.push(data.value); - } - return result; - } - - /** - * Converts `map` to its key-value pairs. - * - * @private - * @param {Object} map The map to convert. - * @returns {Array} Returns the key-value pairs. - */ - function mapToArray(map) { - var index = -1, - result = Array(map.size); - - map.forEach(function (value, key) { - result[++index] = [key, value]; - }); - return result; - } - - /** - * Creates a unary function that invokes `func` with its argument transformed. - * - * @private - * @param {Function} func The function to wrap. - * @param {Function} transform The argument transform. - * @returns {Function} Returns the new function. - */ - function overArg(func, transform) { - return function (arg) { - return func(transform(arg)); - }; - } - - /** - * Replaces all `placeholder` elements in `array` with an internal placeholder - * and returns an array of their indexes. - * - * @private - * @param {Array} array The array to modify. - * @param {*} placeholder The placeholder to replace. - * @returns {Array} Returns the new array of placeholder indexes. - */ - function replaceHolders(array, placeholder) { - var index = -1, - length = array.length, - resIndex = 0, - result = []; - - while (++index < length) { - var value = array[index]; - if (value === placeholder || value === PLACEHOLDER) { - array[index] = PLACEHOLDER; - result[resIndex++] = index; - } - } - return result; - } - - /** - * Gets the value at `key`, unless `key` is "__proto__". - * - * @private - * @param {Object} object The object to query. - * @param {string} key The key of the property to get. - * @returns {*} Returns the property value. - */ - function safeGet(object, key) { - return key == '__proto__' ? undefined : object[key]; - } - - /** - * Converts `set` to an array of its values. - * - * @private - * @param {Object} set The set to convert. - * @returns {Array} Returns the values. - */ - function setToArray(set) { - var index = -1, - result = Array(set.size); - - set.forEach(function (value) { - result[++index] = value; - }); - return result; - } - - /** - * Converts `set` to its value-value pairs. - * - * @private - * @param {Object} set The set to convert. - * @returns {Array} Returns the value-value pairs. - */ - function setToPairs(set) { - var index = -1, - result = Array(set.size); - - set.forEach(function (value) { - result[++index] = [value, value]; - }); - return result; - } - - /** - * A specialized version of `_.indexOf` which performs strict equality - * comparisons of values, i.e. `===`. - * - * @private - * @param {Array} array The array to inspect. - * @param {*} value The value to search for. - * @param {number} fromIndex The index to search from. - * @returns {number} Returns the index of the matched value, else `-1`. - */ - function strictIndexOf(array, value, fromIndex) { - var index = fromIndex - 1, - length = array.length; - - while (++index < length) { - if (array[index] === value) { - return index; - } - } - return -1; - } - - /** - * A specialized version of `_.lastIndexOf` which performs strict equality - * comparisons of values, i.e. `===`. - * - * @private - * @param {Array} array The array to inspect. - * @param {*} value The value to search for. - * @param {number} fromIndex The index to search from. - * @returns {number} Returns the index of the matched value, else `-1`. - */ - function strictLastIndexOf(array, value, fromIndex) { - var index = fromIndex + 1; - while (index--) { - if (array[index] === value) { - return index; - } - } - return index; - } - - /** - * Gets the number of symbols in `string`. - * - * @private - * @param {string} string The string to inspect. - * @returns {number} Returns the string size. - */ - function stringSize(string) { - return hasUnicode(string) ? unicodeSize(string) : asciiSize(string); - } - - /** - * Converts `string` to an array. - * - * @private - * @param {string} string The string to convert. - * @returns {Array} Returns the converted array. - */ - function stringToArray(string) { - return hasUnicode(string) - ? unicodeToArray(string) - : asciiToArray(string); - } - - /** - * Used by `_.unescape` to convert HTML entities to characters. - * - * @private - * @param {string} chr The matched character to unescape. - * @returns {string} Returns the unescaped character. - */ - var unescapeHtmlChar = basePropertyOf(htmlUnescapes); - - /** - * Gets the size of a Unicode `string`. - * - * @private - * @param {string} string The string inspect. - * @returns {number} Returns the string size. - */ - function unicodeSize(string) { - var result = (reUnicode.lastIndex = 0); - while (reUnicode.test(string)) { - ++result; - } - return result; - } - - /** - * Converts a Unicode `string` to an array. - * - * @private - * @param {string} string The string to convert. - * @returns {Array} Returns the converted array. - */ - function unicodeToArray(string) { - return string.match(reUnicode) || []; - } - - /** - * Splits a Unicode `string` into an array of its words. - * - * @private - * @param {string} The string to inspect. - * @returns {Array} Returns the words of `string`. - */ - function unicodeWords(string) { - return string.match(reUnicodeWord) || []; - } - - /*--------------------------------------------------------------------------*/ - - /** - * Create a new pristine `lodash` function using the `context` object. - * - * @static - * @memberOf _ - * @since 1.1.0 - * @category Util - * @param {Object} [context=root] The context object. - * @returns {Function} Returns a new `lodash` function. - * @example - * - * _.mixin({ 'foo': _.constant('foo') }); - * - * var lodash = _.runInContext(); - * lodash.mixin({ 'bar': lodash.constant('bar') }); - * - * _.isFunction(_.foo); - * // => true - * _.isFunction(_.bar); - * // => false - * - * lodash.isFunction(lodash.foo); - * // => false - * lodash.isFunction(lodash.bar); - * // => true - * - * // Create a suped-up `defer` in Node.js. - * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer; - */ - var runInContext = function runInContext(context) { - context = - context == null - ? root - : _.defaults( - root.Object(), - context, - _.pick(root, contextProps) - ); - - /** Built-in constructor references. */ - var Array = context.Array, - Date = context.Date, - Error = context.Error, - Function = context.Function, - Math = context.Math, - Object = context.Object, - RegExp = context.RegExp, - String = context.String, - TypeError = context.TypeError; - - /** Used for built-in method references. */ - var arrayProto = Array.prototype, - funcProto = Function.prototype, - objectProto = Object.prototype; - - /** Used to detect overreaching core-js shims. */ - var coreJsData = context['__core-js_shared__']; - - /** Used to resolve the decompiled source of functions. */ - var funcToString = funcProto.toString; - - /** Used to check objects for own properties. */ - var hasOwnProperty = objectProto.hasOwnProperty; - - /** Used to generate unique IDs. */ - var idCounter = 0; - - /** Used to detect methods masquerading as native. */ - var maskSrcKey = (function () { - var uid = /[^.]+$/.exec( - (coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO) || - '' - ); - return uid ? 'Symbol(src)_1.' + uid : ''; - })(); - - /** - * Used to resolve the - * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) - * of values. - */ - var nativeObjectToString = objectProto.toString; - - /** Used to infer the `Object` constructor. */ - var objectCtorString = funcToString.call(Object); - - /** Used to restore the original `_` reference in `_.noConflict`. */ - var oldDash = root._; - - /** Used to detect if a method is native. */ - var reIsNative = RegExp( - '^' + - funcToString - .call(hasOwnProperty) - .replace(reRegExpChar, '\\$&') - .replace( - /hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, - '$1.*?' - ) + - '$' - ); - - /** Built-in value references. */ - var Buffer = moduleExports ? context.Buffer : undefined, - Symbol = context.Symbol, - Uint8Array = context.Uint8Array, - allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined, - getPrototype = overArg(Object.getPrototypeOf, Object), - objectCreate = Object.create, - propertyIsEnumerable = objectProto.propertyIsEnumerable, - splice = arrayProto.splice, - spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined, - symIterator = Symbol ? Symbol.iterator : undefined, - symToStringTag = Symbol ? Symbol.toStringTag : undefined; - - var defineProperty = (function () { - try { - var func = getNative(Object, 'defineProperty'); - func({}, '', {}); - return func; - } catch (e) {} - })(); - - /** Mocked built-ins. */ - var ctxClearTimeout = - context.clearTimeout !== root.clearTimeout && - context.clearTimeout, - ctxNow = Date && Date.now !== root.Date.now && Date.now, - ctxSetTimeout = - context.setTimeout !== root.setTimeout && context.setTimeout; - - /* Built-in method references for those with the same name as other `lodash` methods. */ - var nativeCeil = Math.ceil, - nativeFloor = Math.floor, - nativeGetSymbols = Object.getOwnPropertySymbols, - nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined, - nativeIsFinite = context.isFinite, - nativeJoin = arrayProto.join, - nativeKeys = overArg(Object.keys, Object), - nativeMax = Math.max, - nativeMin = Math.min, - nativeNow = Date.now, - nativeParseInt = context.parseInt, - nativeRandom = Math.random, - nativeReverse = arrayProto.reverse; - - /* Built-in method references that are verified to be native. */ - var DataView = getNative(context, 'DataView'), - Map = getNative(context, 'Map'), - Promise = getNative(context, 'Promise'), - Set = getNative(context, 'Set'), - WeakMap = getNative(context, 'WeakMap'), - nativeCreate = getNative(Object, 'create'); - - /** Used to store function metadata. */ - var metaMap = WeakMap && new WeakMap(); - - /** Used to lookup unminified function names. */ - var realNames = {}; - - /** Used to detect maps, sets, and weakmaps. */ - var dataViewCtorString = toSource(DataView), - mapCtorString = toSource(Map), - promiseCtorString = toSource(Promise), - setCtorString = toSource(Set), - weakMapCtorString = toSource(WeakMap); - - /** Used to convert symbols to primitives and strings. */ - var symbolProto = Symbol ? Symbol.prototype : undefined, - symbolValueOf = symbolProto ? symbolProto.valueOf : undefined, - symbolToString = symbolProto ? symbolProto.toString : undefined; - - /*------------------------------------------------------------------------*/ - - /** - * Creates a `lodash` object which wraps `value` to enable implicit method - * chain sequences. Methods that operate on and return arrays, collections, - * and functions can be chained together. Methods that retrieve a single value - * or may return a primitive value will automatically end the chain sequence - * and return the unwrapped value. Otherwise, the value must be unwrapped - * with `_#value`. - * - * Explicit chain sequences, which must be unwrapped with `_#value`, may be - * enabled using `_.chain`. - * - * The execution of chained methods is lazy, that is, it's deferred until - * `_#value` is implicitly or explicitly called. - * - * Lazy evaluation allows several methods to support shortcut fusion. - * Shortcut fusion is an optimization to merge iteratee calls; this avoids - * the creation of intermediate arrays and can greatly reduce the number of - * iteratee executions. Sections of a chain sequence qualify for shortcut - * fusion if the section is applied to an array and iteratees accept only - * one argument. The heuristic for whether a section qualifies for shortcut - * fusion is subject to change. - * - * Chaining is supported in custom builds as long as the `_#value` method is - * directly or indirectly included in the build. - * - * In addition to lodash methods, wrappers have `Array` and `String` methods. - * - * The wrapper `Array` methods are: - * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift` - * - * The wrapper `String` methods are: - * `replace` and `split` - * - * The wrapper methods that support shortcut fusion are: - * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`, - * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`, - * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray` - * - * The chainable wrapper methods are: - * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`, - * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`, - * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`, - * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`, - * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`, - * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`, - * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`, - * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`, - * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`, - * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`, - * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`, - * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`, - * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`, - * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`, - * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`, - * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`, - * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`, - * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`, - * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`, - * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`, - * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`, - * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`, - * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`, - * `zipObject`, `zipObjectDeep`, and `zipWith` - * - * The wrapper methods that are **not** chainable by default are: - * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`, - * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`, - * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`, - * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`, - * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`, - * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`, - * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`, - * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`, - * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`, - * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`, - * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`, - * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`, - * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`, - * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`, - * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`, - * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`, - * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`, - * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`, - * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`, - * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`, - * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`, - * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`, - * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`, - * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`, - * `upperFirst`, `value`, and `words` - * - * @name _ - * @constructor - * @category Seq - * @param {*} value The value to wrap in a `lodash` instance. - * @returns {Object} Returns the new `lodash` wrapper instance. - * @example - * - * function square(n) { - * return n * n; - * } - * - * var wrapped = _([1, 2, 3]); - * - * // Returns an unwrapped value. - * wrapped.reduce(_.add); - * // => 6 - * - * // Returns a wrapped value. - * var squares = wrapped.map(square); - * - * _.isArray(squares); - * // => false - * - * _.isArray(squares.value()); - * // => true - */ - function lodash(value) { - if ( - isObjectLike(value) && - !isArray(value) && - !(value instanceof LazyWrapper) - ) { - if (value instanceof LodashWrapper) { - return value; - } - if (hasOwnProperty.call(value, '__wrapped__')) { - return wrapperClone(value); - } - } - return new LodashWrapper(value); - } - - /** - * The base implementation of `_.create` without support for assigning - * properties to the created object. - * - * @private - * @param {Object} proto The object to inherit from. - * @returns {Object} Returns the new object. - */ - var baseCreate = (function () { - function object() {} - return function (proto) { - if (!isObject(proto)) { - return {}; - } - if (objectCreate) { - return objectCreate(proto); - } - object.prototype = proto; - var result = new object(); - object.prototype = undefined; - return result; - }; - })(); - - /** - * The function whose prototype chain sequence wrappers inherit from. - * - * @private - */ - function baseLodash() { - // No operation performed. - } - - /** - * The base constructor for creating `lodash` wrapper objects. - * - * @private - * @param {*} value The value to wrap. - * @param {boolean} [chainAll] Enable explicit method chain sequences. - */ - function LodashWrapper(value, chainAll) { - this.__wrapped__ = value; - this.__actions__ = []; - this.__chain__ = !!chainAll; - this.__index__ = 0; - this.__values__ = undefined; - } - - /** - * By default, the template delimiters used by lodash are like those in - * embedded Ruby (ERB) as well as ES2015 template strings. Change the - * following template settings to use alternative delimiters. - * - * @static - * @memberOf _ - * @type {Object} - */ - lodash.templateSettings = { - /** - * Used to detect `data` property values to be HTML-escaped. - * - * @memberOf _.templateSettings - * @type {RegExp} - */ - escape: reEscape, - - /** - * Used to detect code to be evaluated. - * - * @memberOf _.templateSettings - * @type {RegExp} - */ - evaluate: reEvaluate, - - /** - * Used to detect `data` property values to inject. - * - * @memberOf _.templateSettings - * @type {RegExp} - */ - interpolate: reInterpolate, - - /** - * Used to reference the data object in the template text. - * - * @memberOf _.templateSettings - * @type {string} - */ - variable: '', - - /** - * Used to import variables into the compiled template. - * - * @memberOf _.templateSettings - * @type {Object} - */ - imports: { - /** - * A reference to the `lodash` function. - * - * @memberOf _.templateSettings.imports - * @type {Function} - */ - _: lodash, - }, - }; - - // Ensure wrappers are instances of `baseLodash`. - lodash.prototype = baseLodash.prototype; - lodash.prototype.constructor = lodash; - - LodashWrapper.prototype = baseCreate(baseLodash.prototype); - LodashWrapper.prototype.constructor = LodashWrapper; - - /*------------------------------------------------------------------------*/ - - /** - * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation. - * - * @private - * @constructor - * @param {*} value The value to wrap. - */ - function LazyWrapper(value) { - this.__wrapped__ = value; - this.__actions__ = []; - this.__dir__ = 1; - this.__filtered__ = false; - this.__iteratees__ = []; - this.__takeCount__ = MAX_ARRAY_LENGTH; - this.__views__ = []; - } - - /** - * Creates a clone of the lazy wrapper object. - * - * @private - * @name clone - * @memberOf LazyWrapper - * @returns {Object} Returns the cloned `LazyWrapper` object. - */ - function lazyClone() { - var result = new LazyWrapper(this.__wrapped__); - result.__actions__ = copyArray(this.__actions__); - result.__dir__ = this.__dir__; - result.__filtered__ = this.__filtered__; - result.__iteratees__ = copyArray(this.__iteratees__); - result.__takeCount__ = this.__takeCount__; - result.__views__ = copyArray(this.__views__); - return result; - } - - /** - * Reverses the direction of lazy iteration. - * - * @private - * @name reverse - * @memberOf LazyWrapper - * @returns {Object} Returns the new reversed `LazyWrapper` object. - */ - function lazyReverse() { - if (this.__filtered__) { - var result = new LazyWrapper(this); - result.__dir__ = -1; - result.__filtered__ = true; - } else { - result = this.clone(); - result.__dir__ *= -1; - } - return result; - } - - /** - * Extracts the unwrapped value from its lazy wrapper. - * - * @private - * @name value - * @memberOf LazyWrapper - * @returns {*} Returns the unwrapped value. - */ - function lazyValue() { - var array = this.__wrapped__.value(), - dir = this.__dir__, - isArr = isArray(array), - isRight = dir < 0, - arrLength = isArr ? array.length : 0, - view = getView(0, arrLength, this.__views__), - start = view.start, - end = view.end, - length = end - start, - index = isRight ? end : start - 1, - iteratees = this.__iteratees__, - iterLength = iteratees.length, - resIndex = 0, - takeCount = nativeMin(length, this.__takeCount__); - - if ( - !isArr || - (!isRight && arrLength == length && takeCount == length) - ) { - return baseWrapperValue(array, this.__actions__); - } - var result = []; - - outer: while (length-- && resIndex < takeCount) { - index += dir; - - var iterIndex = -1, - value = array[index]; - - while (++iterIndex < iterLength) { - var data = iteratees[iterIndex], - iteratee = data.iteratee, - type = data.type, - computed = iteratee(value); - - if (type == LAZY_MAP_FLAG) { - value = computed; - } else if (!computed) { - if (type == LAZY_FILTER_FLAG) { - continue outer; - } else { - break outer; - } - } - } - result[resIndex++] = value; - } - return result; - } - - // Ensure `LazyWrapper` is an instance of `baseLodash`. - LazyWrapper.prototype = baseCreate(baseLodash.prototype); - LazyWrapper.prototype.constructor = LazyWrapper; - - /*------------------------------------------------------------------------*/ - - /** - * Creates a hash object. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ - function Hash(entries) { - var index = -1, - length = entries == null ? 0 : entries.length; - - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); - } - } - - /** - * Removes all key-value entries from the hash. - * - * @private - * @name clear - * @memberOf Hash - */ - function hashClear() { - this.__data__ = nativeCreate ? nativeCreate(null) : {}; - this.size = 0; - } - - /** - * Removes `key` and its value from the hash. - * - * @private - * @name delete - * @memberOf Hash - * @param {Object} hash The hash to modify. - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ - function hashDelete(key) { - var result = this.has(key) && delete this.__data__[key]; - this.size -= result ? 1 : 0; - return result; - } - - /** - * Gets the hash value for `key`. - * - * @private - * @name get - * @memberOf Hash - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ - function hashGet(key) { - var data = this.__data__; - if (nativeCreate) { - var result = data[key]; - return result === HASH_UNDEFINED ? undefined : result; - } - return hasOwnProperty.call(data, key) ? data[key] : undefined; - } - - /** - * Checks if a hash value for `key` exists. - * - * @private - * @name has - * @memberOf Hash - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ - function hashHas(key) { - var data = this.__data__; - return nativeCreate - ? data[key] !== undefined - : hasOwnProperty.call(data, key); - } - - /** - * Sets the hash `key` to `value`. - * - * @private - * @name set - * @memberOf Hash - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the hash instance. - */ - function hashSet(key, value) { - var data = this.__data__; - this.size += this.has(key) ? 0 : 1; - data[key] = - nativeCreate && value === undefined ? HASH_UNDEFINED : value; - return this; - } - - // Add methods to `Hash`. - Hash.prototype.clear = hashClear; - Hash.prototype['delete'] = hashDelete; - Hash.prototype.get = hashGet; - Hash.prototype.has = hashHas; - Hash.prototype.set = hashSet; - - /*------------------------------------------------------------------------*/ - - /** - * Creates an list cache object. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ - function ListCache(entries) { - var index = -1, - length = entries == null ? 0 : entries.length; - - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); - } - } - - /** - * Removes all key-value entries from the list cache. - * - * @private - * @name clear - * @memberOf ListCache - */ - function listCacheClear() { - this.__data__ = []; - this.size = 0; - } - - /** - * Removes `key` and its value from the list cache. - * - * @private - * @name delete - * @memberOf ListCache - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ - function listCacheDelete(key) { - var data = this.__data__, - index = assocIndexOf(data, key); - - if (index < 0) { - return false; - } - var lastIndex = data.length - 1; - if (index == lastIndex) { - data.pop(); - } else { - splice.call(data, index, 1); - } - --this.size; - return true; - } - - /** - * Gets the list cache value for `key`. - * - * @private - * @name get - * @memberOf ListCache - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ - function listCacheGet(key) { - var data = this.__data__, - index = assocIndexOf(data, key); - - return index < 0 ? undefined : data[index][1]; - } - - /** - * Checks if a list cache value for `key` exists. - * - * @private - * @name has - * @memberOf ListCache - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ - function listCacheHas(key) { - return assocIndexOf(this.__data__, key) > -1; - } - - /** - * Sets the list cache `key` to `value`. - * - * @private - * @name set - * @memberOf ListCache - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the list cache instance. - */ - function listCacheSet(key, value) { - var data = this.__data__, - index = assocIndexOf(data, key); - - if (index < 0) { - ++this.size; - data.push([key, value]); - } else { - data[index][1] = value; - } - return this; - } - - // Add methods to `ListCache`. - ListCache.prototype.clear = listCacheClear; - ListCache.prototype['delete'] = listCacheDelete; - ListCache.prototype.get = listCacheGet; - ListCache.prototype.has = listCacheHas; - ListCache.prototype.set = listCacheSet; - - /*------------------------------------------------------------------------*/ - - /** - * Creates a map cache object to store key-value pairs. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ - function MapCache(entries) { - var index = -1, - length = entries == null ? 0 : entries.length; - - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); - } - } - - /** - * Removes all key-value entries from the map. - * - * @private - * @name clear - * @memberOf MapCache - */ - function mapCacheClear() { - this.size = 0; - this.__data__ = { - hash: new Hash(), - map: new (Map || ListCache)(), - string: new Hash(), - }; - } - - /** - * Removes `key` and its value from the map. - * - * @private - * @name delete - * @memberOf MapCache - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ - function mapCacheDelete(key) { - var result = getMapData(this, key)['delete'](key); - this.size -= result ? 1 : 0; - return result; - } - - /** - * Gets the map value for `key`. - * - * @private - * @name get - * @memberOf MapCache - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ - function mapCacheGet(key) { - return getMapData(this, key).get(key); - } - - /** - * Checks if a map value for `key` exists. - * - * @private - * @name has - * @memberOf MapCache - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ - function mapCacheHas(key) { - return getMapData(this, key).has(key); - } - - /** - * Sets the map `key` to `value`. - * - * @private - * @name set - * @memberOf MapCache - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the map cache instance. - */ - function mapCacheSet(key, value) { - var data = getMapData(this, key), - size = data.size; - - data.set(key, value); - this.size += data.size == size ? 0 : 1; - return this; - } - - // Add methods to `MapCache`. - MapCache.prototype.clear = mapCacheClear; - MapCache.prototype['delete'] = mapCacheDelete; - MapCache.prototype.get = mapCacheGet; - MapCache.prototype.has = mapCacheHas; - MapCache.prototype.set = mapCacheSet; - - /*------------------------------------------------------------------------*/ - - /** - * - * Creates an array cache object to store unique values. - * - * @private - * @constructor - * @param {Array} [values] The values to cache. - */ - function SetCache(values) { - var index = -1, - length = values == null ? 0 : values.length; - - this.__data__ = new MapCache(); - while (++index < length) { - this.add(values[index]); - } - } - - /** - * Adds `value` to the array cache. - * - * @private - * @name add - * @memberOf SetCache - * @alias push - * @param {*} value The value to cache. - * @returns {Object} Returns the cache instance. - */ - function setCacheAdd(value) { - this.__data__.set(value, HASH_UNDEFINED); - return this; - } - - /** - * Checks if `value` is in the array cache. - * - * @private - * @name has - * @memberOf SetCache - * @param {*} value The value to search for. - * @returns {number} Returns `true` if `value` is found, else `false`. - */ - function setCacheHas(value) { - return this.__data__.has(value); - } - - // Add methods to `SetCache`. - SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; - SetCache.prototype.has = setCacheHas; - - /*------------------------------------------------------------------------*/ - - /** - * Creates a stack cache object to store key-value pairs. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ - function Stack(entries) { - var data = (this.__data__ = new ListCache(entries)); - this.size = data.size; - } - - /** - * Removes all key-value entries from the stack. - * - * @private - * @name clear - * @memberOf Stack - */ - function stackClear() { - this.__data__ = new ListCache(); - this.size = 0; - } - - /** - * Removes `key` and its value from the stack. - * - * @private - * @name delete - * @memberOf Stack - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ - function stackDelete(key) { - var data = this.__data__, - result = data['delete'](key); - - this.size = data.size; - return result; - } - - /** - * Gets the stack value for `key`. - * - * @private - * @name get - * @memberOf Stack - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ - function stackGet(key) { - return this.__data__.get(key); - } - - /** - * Checks if a stack value for `key` exists. - * - * @private - * @name has - * @memberOf Stack - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ - function stackHas(key) { - return this.__data__.has(key); - } - - /** - * Sets the stack `key` to `value`. - * - * @private - * @name set - * @memberOf Stack - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the stack cache instance. - */ - function stackSet(key, value) { - var data = this.__data__; - if (data instanceof ListCache) { - var pairs = data.__data__; - if (!Map || pairs.length < LARGE_ARRAY_SIZE - 1) { - pairs.push([key, value]); - this.size = ++data.size; - return this; - } - data = this.__data__ = new MapCache(pairs); - } - data.set(key, value); - this.size = data.size; - return this; - } - - // Add methods to `Stack`. - Stack.prototype.clear = stackClear; - Stack.prototype['delete'] = stackDelete; - Stack.prototype.get = stackGet; - Stack.prototype.has = stackHas; - Stack.prototype.set = stackSet; - - /*------------------------------------------------------------------------*/ - - /** - * Creates an array of the enumerable property names of the array-like `value`. - * - * @private - * @param {*} value The value to query. - * @param {boolean} inherited Specify returning inherited property names. - * @returns {Array} Returns the array of property names. - */ - function arrayLikeKeys(value, inherited) { - var isArr = isArray(value), - isArg = !isArr && isArguments(value), - isBuff = !isArr && !isArg && isBuffer(value), - isType = !isArr && !isArg && !isBuff && isTypedArray(value), - skipIndexes = isArr || isArg || isBuff || isType, - result = skipIndexes ? baseTimes(value.length, String) : [], - length = result.length; - - for (var key in value) { - if ( - (inherited || hasOwnProperty.call(value, key)) && - !( - skipIndexes && - // Safari 9 has enumerable `arguments.length` in strict mode. - (key == 'length' || - // Node.js 0.10 has enumerable non-index properties on buffers. - (isBuff && (key == 'offset' || key == 'parent')) || - // PhantomJS 2 has enumerable non-index properties on typed arrays. - (isType && - (key == 'buffer' || - key == 'byteLength' || - key == 'byteOffset')) || - // Skip index properties. - isIndex(key, length)) - ) - ) { - result.push(key); - } - } - return result; - } - - /** - * A specialized version of `_.sample` for arrays. - * - * @private - * @param {Array} array The array to sample. - * @returns {*} Returns the random element. - */ - function arraySample(array) { - var length = array.length; - return length ? array[baseRandom(0, length - 1)] : undefined; - } - - /** - * A specialized version of `_.sampleSize` for arrays. - * - * @private - * @param {Array} array The array to sample. - * @param {number} n The number of elements to sample. - * @returns {Array} Returns the random elements. - */ - function arraySampleSize(array, n) { - return shuffleSelf( - copyArray(array), - baseClamp(n, 0, array.length) - ); - } - - /** - * A specialized version of `_.shuffle` for arrays. - * - * @private - * @param {Array} array The array to shuffle. - * @returns {Array} Returns the new shuffled array. - */ - function arrayShuffle(array) { - return shuffleSelf(copyArray(array)); - } - - /** - * This function is like `assignValue` except that it doesn't assign - * `undefined` values. - * - * @private - * @param {Object} object The object to modify. - * @param {string} key The key of the property to assign. - * @param {*} value The value to assign. - */ - function assignMergeValue(object, key, value) { - if ( - (value !== undefined && !eq(object[key], value)) || - (value === undefined && !(key in object)) - ) { - baseAssignValue(object, key, value); - } - } - - /** - * Assigns `value` to `key` of `object` if the existing value is not equivalent - * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * for equality comparisons. - * - * @private - * @param {Object} object The object to modify. - * @param {string} key The key of the property to assign. - * @param {*} value The value to assign. - */ - function assignValue(object, key, value) { - var objValue = object[key]; - if ( - !(hasOwnProperty.call(object, key) && eq(objValue, value)) || - (value === undefined && !(key in object)) - ) { - baseAssignValue(object, key, value); - } - } - - /** - * Gets the index at which the `key` is found in `array` of key-value pairs. - * - * @private - * @param {Array} array The array to inspect. - * @param {*} key The key to search for. - * @returns {number} Returns the index of the matched value, else `-1`. - */ - function assocIndexOf(array, key) { - var length = array.length; - while (length--) { - if (eq(array[length][0], key)) { - return length; - } - } - return -1; - } - - /** - * Aggregates elements of `collection` on `accumulator` with keys transformed - * by `iteratee` and values set by `setter`. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} setter The function to set `accumulator` values. - * @param {Function} iteratee The iteratee to transform keys. - * @param {Object} accumulator The initial aggregated object. - * @returns {Function} Returns `accumulator`. - */ - function baseAggregator(collection, setter, iteratee, accumulator) { - baseEach(collection, function (value, key, collection) { - setter(accumulator, value, iteratee(value), collection); - }); - return accumulator; - } - - /** - * The base implementation of `_.assign` without support for multiple sources - * or `customizer` functions. - * - * @private - * @param {Object} object The destination object. - * @param {Object} source The source object. - * @returns {Object} Returns `object`. - */ - function baseAssign(object, source) { - return object && copyObject(source, keys(source), object); - } - - /** - * The base implementation of `_.assignIn` without support for multiple sources - * or `customizer` functions. - * - * @private - * @param {Object} object The destination object. - * @param {Object} source The source object. - * @returns {Object} Returns `object`. - */ - function baseAssignIn(object, source) { - return object && copyObject(source, keysIn(source), object); - } - - /** - * The base implementation of `assignValue` and `assignMergeValue` without - * value checks. - * - * @private - * @param {Object} object The object to modify. - * @param {string} key The key of the property to assign. - * @param {*} value The value to assign. - */ - function baseAssignValue(object, key, value) { - if (key == '__proto__' && defineProperty) { - defineProperty(object, key, { - configurable: true, - enumerable: true, - value: value, - writable: true, - }); - } else { - object[key] = value; - } - } - - /** - * The base implementation of `_.at` without support for individual paths. - * - * @private - * @param {Object} object The object to iterate over. - * @param {string[]} paths The property paths to pick. - * @returns {Array} Returns the picked elements. - */ - function baseAt(object, paths) { - var index = -1, - length = paths.length, - result = Array(length), - skip = object == null; - - while (++index < length) { - result[index] = skip ? undefined : get(object, paths[index]); - } - return result; - } - - /** - * The base implementation of `_.clamp` which doesn't coerce arguments. - * - * @private - * @param {number} number The number to clamp. - * @param {number} [lower] The lower bound. - * @param {number} upper The upper bound. - * @returns {number} Returns the clamped number. - */ - function baseClamp(number, lower, upper) { - if (number === number) { - if (upper !== undefined) { - number = number <= upper ? number : upper; - } - if (lower !== undefined) { - number = number >= lower ? number : lower; - } - } - return number; - } - - /** - * The base implementation of `_.clone` and `_.cloneDeep` which tracks - * traversed objects. - * - * @private - * @param {*} value The value to clone. - * @param {boolean} bitmask The bitmask flags. - * 1 - Deep clone - * 2 - Flatten inherited properties - * 4 - Clone symbols - * @param {Function} [customizer] The function to customize cloning. - * @param {string} [key] The key of `value`. - * @param {Object} [object] The parent object of `value`. - * @param {Object} [stack] Tracks traversed objects and their clone counterparts. - * @returns {*} Returns the cloned value. - */ - function baseClone(value, bitmask, customizer, key, object, stack) { - var result, - isDeep = bitmask & CLONE_DEEP_FLAG, - isFlat = bitmask & CLONE_FLAT_FLAG, - isFull = bitmask & CLONE_SYMBOLS_FLAG; - - if (customizer) { - result = object - ? customizer(value, key, object, stack) - : customizer(value); - } - if (result !== undefined) { - return result; - } - if (!isObject(value)) { - return value; - } - var isArr = isArray(value); - if (isArr) { - result = initCloneArray(value); - if (!isDeep) { - return copyArray(value, result); - } - } else { - var tag = getTag(value), - isFunc = tag == funcTag || tag == genTag; - - if (isBuffer(value)) { - return cloneBuffer(value, isDeep); - } - if (tag == objectTag || tag == argsTag || (isFunc && !object)) { - result = isFlat || isFunc ? {} : initCloneObject(value); - if (!isDeep) { - return isFlat - ? copySymbolsIn(value, baseAssignIn(result, value)) - : copySymbols(value, baseAssign(result, value)); - } - } else { - if (!cloneableTags[tag]) { - return object ? value : {}; - } - result = initCloneByTag(value, tag, isDeep); - } - } - // Check for circular references and return its corresponding clone. - stack || (stack = new Stack()); - var stacked = stack.get(value); - if (stacked) { - return stacked; - } - stack.set(value, result); - - if (isSet(value)) { - value.forEach(function (subValue) { - result.add( - baseClone( - subValue, - bitmask, - customizer, - subValue, - value, - stack - ) - ); - }); - - return result; - } - - if (isMap(value)) { - value.forEach(function (subValue, key) { - result.set( - key, - baseClone(subValue, bitmask, customizer, key, value, stack) - ); - }); - - return result; - } - - var keysFunc = isFull - ? isFlat - ? getAllKeysIn - : getAllKeys - : isFlat - ? keysIn - : keys; - - var props = isArr ? undefined : keysFunc(value); - arrayEach(props || value, function (subValue, key) { - if (props) { - key = subValue; - subValue = value[key]; - } - // Recursively populate clone (susceptible to call stack limits). - assignValue( - result, - key, - baseClone(subValue, bitmask, customizer, key, value, stack) - ); - }); - return result; - } - - /** - * The base implementation of `_.conforms` which doesn't clone `source`. - * - * @private - * @param {Object} source The object of property predicates to conform to. - * @returns {Function} Returns the new spec function. - */ - function baseConforms(source) { - var props = keys(source); - return function (object) { - return baseConformsTo(object, source, props); - }; - } - - /** - * The base implementation of `_.conformsTo` which accepts `props` to check. - * - * @private - * @param {Object} object The object to inspect. - * @param {Object} source The object of property predicates to conform to. - * @returns {boolean} Returns `true` if `object` conforms, else `false`. - */ - function baseConformsTo(object, source, props) { - var length = props.length; - if (object == null) { - return !length; - } - object = Object(object); - while (length--) { - var key = props[length], - predicate = source[key], - value = object[key]; - - if ( - (value === undefined && !(key in object)) || - !predicate(value) - ) { - return false; - } - } - return true; - } - - /** - * The base implementation of `_.delay` and `_.defer` which accepts `args` - * to provide to `func`. - * - * @private - * @param {Function} func The function to delay. - * @param {number} wait The number of milliseconds to delay invocation. - * @param {Array} args The arguments to provide to `func`. - * @returns {number|Object} Returns the timer id or timeout object. - */ - function baseDelay(func, wait, args) { - if (typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - return setTimeout(function () { - func.apply(undefined, args); - }, wait); - } - - /** - * The base implementation of methods like `_.difference` without support - * for excluding multiple arrays or iteratee shorthands. - * - * @private - * @param {Array} array The array to inspect. - * @param {Array} values The values to exclude. - * @param {Function} [iteratee] The iteratee invoked per element. - * @param {Function} [comparator] The comparator invoked per element. - * @returns {Array} Returns the new array of filtered values. - */ - function baseDifference(array, values, iteratee, comparator) { - var index = -1, - includes = arrayIncludes, - isCommon = true, - length = array.length, - result = [], - valuesLength = values.length; - - if (!length) { - return result; - } - if (iteratee) { - values = arrayMap(values, baseUnary(iteratee)); - } - if (comparator) { - includes = arrayIncludesWith; - isCommon = false; - } else if (values.length >= LARGE_ARRAY_SIZE) { - includes = cacheHas; - isCommon = false; - values = new SetCache(values); - } - outer: while (++index < length) { - var value = array[index], - computed = iteratee == null ? value : iteratee(value); - - value = comparator || value !== 0 ? value : 0; - if (isCommon && computed === computed) { - var valuesIndex = valuesLength; - while (valuesIndex--) { - if (values[valuesIndex] === computed) { - continue outer; - } - } - result.push(value); - } else if (!includes(values, computed, comparator)) { - result.push(value); - } - } - return result; - } - - /** - * The base implementation of `_.forEach` without support for iteratee shorthands. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array|Object} Returns `collection`. - */ - var baseEach = createBaseEach(baseForOwn); - - /** - * The base implementation of `_.forEachRight` without support for iteratee shorthands. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array|Object} Returns `collection`. - */ - var baseEachRight = createBaseEach(baseForOwnRight, true); - - /** - * The base implementation of `_.every` without support for iteratee shorthands. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} predicate The function invoked per iteration. - * @returns {boolean} Returns `true` if all elements pass the predicate check, - * else `false` - */ - function baseEvery(collection, predicate) { - var result = true; - baseEach(collection, function (value, index, collection) { - result = !!predicate(value, index, collection); - return result; - }); - return result; - } - - /** - * The base implementation of methods like `_.max` and `_.min` which accepts a - * `comparator` to determine the extremum value. - * - * @private - * @param {Array} array The array to iterate over. - * @param {Function} iteratee The iteratee invoked per iteration. - * @param {Function} comparator The comparator used to compare values. - * @returns {*} Returns the extremum value. - */ - function baseExtremum(array, iteratee, comparator) { - var index = -1, - length = array.length; - - while (++index < length) { - var value = array[index], - current = iteratee(value); - - if ( - current != null && - (computed === undefined - ? current === current && !isSymbol(current) - : comparator(current, computed)) - ) { - var computed = current, - result = value; - } - } - return result; - } - - /** - * The base implementation of `_.fill` without an iteratee call guard. - * - * @private - * @param {Array} array The array to fill. - * @param {*} value The value to fill `array` with. - * @param {number} [start=0] The start position. - * @param {number} [end=array.length] The end position. - * @returns {Array} Returns `array`. - */ - function baseFill(array, value, start, end) { - var length = array.length; - - start = toInteger(start); - if (start < 0) { - start = -start > length ? 0 : length + start; - } - end = end === undefined || end > length ? length : toInteger(end); - if (end < 0) { - end += length; - } - end = start > end ? 0 : toLength(end); - while (start < end) { - array[start++] = value; - } - return array; - } - - /** - * The base implementation of `_.filter` without support for iteratee shorthands. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} predicate The function invoked per iteration. - * @returns {Array} Returns the new filtered array. - */ - function baseFilter(collection, predicate) { - var result = []; - baseEach(collection, function (value, index, collection) { - if (predicate(value, index, collection)) { - result.push(value); - } - }); - return result; - } - - /** - * The base implementation of `_.flatten` with support for restricting flattening. - * - * @private - * @param {Array} array The array to flatten. - * @param {number} depth The maximum recursion depth. - * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. - * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. - * @param {Array} [result=[]] The initial result value. - * @returns {Array} Returns the new flattened array. - */ - function baseFlatten(array, depth, predicate, isStrict, result) { - var index = -1, - length = array.length; - - predicate || (predicate = isFlattenable); - result || (result = []); - - while (++index < length) { - var value = array[index]; - if (depth > 0 && predicate(value)) { - if (depth > 1) { - // Recursively flatten arrays (susceptible to call stack limits). - baseFlatten(value, depth - 1, predicate, isStrict, result); - } else { - arrayPush(result, value); - } - } else if (!isStrict) { - result[result.length] = value; - } - } - return result; - } - - /** - * The base implementation of `baseForOwn` which iterates over `object` - * properties returned by `keysFunc` and invokes `iteratee` for each property. - * Iteratee functions may exit iteration early by explicitly returning `false`. - * - * @private - * @param {Object} object The object to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @param {Function} keysFunc The function to get the keys of `object`. - * @returns {Object} Returns `object`. - */ - var baseFor = createBaseFor(); - - /** - * This function is like `baseFor` except that it iterates over properties - * in the opposite order. - * - * @private - * @param {Object} object The object to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @param {Function} keysFunc The function to get the keys of `object`. - * @returns {Object} Returns `object`. - */ - var baseForRight = createBaseFor(true); - - /** - * The base implementation of `_.forOwn` without support for iteratee shorthands. - * - * @private - * @param {Object} object The object to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Object} Returns `object`. - */ - function baseForOwn(object, iteratee) { - return object && baseFor(object, iteratee, keys); - } - - /** - * The base implementation of `_.forOwnRight` without support for iteratee shorthands. - * - * @private - * @param {Object} object The object to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Object} Returns `object`. - */ - function baseForOwnRight(object, iteratee) { - return object && baseForRight(object, iteratee, keys); - } - - /** - * The base implementation of `_.functions` which creates an array of - * `object` function property names filtered from `props`. - * - * @private - * @param {Object} object The object to inspect. - * @param {Array} props The property names to filter. - * @returns {Array} Returns the function names. - */ - function baseFunctions(object, props) { - return arrayFilter(props, function (key) { - return isFunction(object[key]); - }); - } - - /** - * The base implementation of `_.get` without support for default values. - * - * @private - * @param {Object} object The object to query. - * @param {Array|string} path The path of the property to get. - * @returns {*} Returns the resolved value. - */ - function baseGet(object, path) { - path = castPath(path, object); - - var index = 0, - length = path.length; - - while (object != null && index < length) { - object = object[toKey(path[index++])]; - } - return index && index == length ? object : undefined; - } - - /** - * The base implementation of `getAllKeys` and `getAllKeysIn` which uses - * `keysFunc` and `symbolsFunc` to get the enumerable property names and - * symbols of `object`. - * - * @private - * @param {Object} object The object to query. - * @param {Function} keysFunc The function to get the keys of `object`. - * @param {Function} symbolsFunc The function to get the symbols of `object`. - * @returns {Array} Returns the array of property names and symbols. - */ - function baseGetAllKeys(object, keysFunc, symbolsFunc) { - var result = keysFunc(object); - return isArray(object) - ? result - : arrayPush(result, symbolsFunc(object)); - } - - /** - * The base implementation of `getTag` without fallbacks for buggy environments. - * - * @private - * @param {*} value The value to query. - * @returns {string} Returns the `toStringTag`. - */ - function baseGetTag(value) { - if (value == null) { - return value === undefined ? undefinedTag : nullTag; - } - return symToStringTag && symToStringTag in Object(value) - ? getRawTag(value) - : objectToString(value); - } - - /** - * The base implementation of `_.gt` which doesn't coerce arguments. - * - * @private - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {boolean} Returns `true` if `value` is greater than `other`, - * else `false`. - */ - function baseGt(value, other) { - return value > other; - } - - /** - * The base implementation of `_.has` without support for deep paths. - * - * @private - * @param {Object} [object] The object to query. - * @param {Array|string} key The key to check. - * @returns {boolean} Returns `true` if `key` exists, else `false`. - */ - function baseHas(object, key) { - return object != null && hasOwnProperty.call(object, key); - } - - /** - * The base implementation of `_.hasIn` without support for deep paths. - * - * @private - * @param {Object} [object] The object to query. - * @param {Array|string} key The key to check. - * @returns {boolean} Returns `true` if `key` exists, else `false`. - */ - function baseHasIn(object, key) { - return object != null && key in Object(object); - } - - /** - * The base implementation of `_.inRange` which doesn't coerce arguments. - * - * @private - * @param {number} number The number to check. - * @param {number} start The start of the range. - * @param {number} end The end of the range. - * @returns {boolean} Returns `true` if `number` is in the range, else `false`. - */ - function baseInRange(number, start, end) { - return ( - number >= nativeMin(start, end) && - number < nativeMax(start, end) - ); - } - - /** - * The base implementation of methods like `_.intersection`, without support - * for iteratee shorthands, that accepts an array of arrays to inspect. - * - * @private - * @param {Array} arrays The arrays to inspect. - * @param {Function} [iteratee] The iteratee invoked per element. - * @param {Function} [comparator] The comparator invoked per element. - * @returns {Array} Returns the new array of shared values. - */ - function baseIntersection(arrays, iteratee, comparator) { - var includes = comparator ? arrayIncludesWith : arrayIncludes, - length = arrays[0].length, - othLength = arrays.length, - othIndex = othLength, - caches = Array(othLength), - maxLength = Infinity, - result = []; - - while (othIndex--) { - var array = arrays[othIndex]; - if (othIndex && iteratee) { - array = arrayMap(array, baseUnary(iteratee)); - } - maxLength = nativeMin(array.length, maxLength); - caches[othIndex] = - !comparator && - (iteratee || (length >= 120 && array.length >= 120)) - ? new SetCache(othIndex && array) - : undefined; - } - array = arrays[0]; - - var index = -1, - seen = caches[0]; - - outer: while (++index < length && result.length < maxLength) { - var value = array[index], - computed = iteratee ? iteratee(value) : value; - - value = comparator || value !== 0 ? value : 0; - if ( - !(seen - ? cacheHas(seen, computed) - : includes(result, computed, comparator)) - ) { - othIndex = othLength; - while (--othIndex) { - var cache = caches[othIndex]; - if ( - !(cache - ? cacheHas(cache, computed) - : includes(arrays[othIndex], computed, comparator)) - ) { - continue outer; - } - } - if (seen) { - seen.push(computed); - } - result.push(value); - } - } - return result; - } - - /** - * The base implementation of `_.invert` and `_.invertBy` which inverts - * `object` with values transformed by `iteratee` and set by `setter`. - * - * @private - * @param {Object} object The object to iterate over. - * @param {Function} setter The function to set `accumulator` values. - * @param {Function} iteratee The iteratee to transform values. - * @param {Object} accumulator The initial inverted object. - * @returns {Function} Returns `accumulator`. - */ - function baseInverter(object, setter, iteratee, accumulator) { - baseForOwn(object, function (value, key, object) { - setter(accumulator, iteratee(value), key, object); - }); - return accumulator; - } - - /** - * The base implementation of `_.invoke` without support for individual - * method arguments. - * - * @private - * @param {Object} object The object to query. - * @param {Array|string} path The path of the method to invoke. - * @param {Array} args The arguments to invoke the method with. - * @returns {*} Returns the result of the invoked method. - */ - function baseInvoke(object, path, args) { - path = castPath(path, object); - object = parent(object, path); - var func = object == null ? object : object[toKey(last(path))]; - return func == null ? undefined : apply(func, object, args); - } - - /** - * The base implementation of `_.isArguments`. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an `arguments` object, - */ - function baseIsArguments(value) { - return isObjectLike(value) && baseGetTag(value) == argsTag; - } - - /** - * The base implementation of `_.isArrayBuffer` without Node.js optimizations. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`. - */ - function baseIsArrayBuffer(value) { - return isObjectLike(value) && baseGetTag(value) == arrayBufferTag; - } - - /** - * The base implementation of `_.isDate` without Node.js optimizations. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a date object, else `false`. - */ - function baseIsDate(value) { - return isObjectLike(value) && baseGetTag(value) == dateTag; - } - - /** - * The base implementation of `_.isEqual` which supports partial comparisons - * and tracks traversed objects. - * - * @private - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @param {boolean} bitmask The bitmask flags. - * 1 - Unordered comparison - * 2 - Partial comparison - * @param {Function} [customizer] The function to customize comparisons. - * @param {Object} [stack] Tracks traversed `value` and `other` objects. - * @returns {boolean} Returns `true` if the values are equivalent, else `false`. - */ - function baseIsEqual(value, other, bitmask, customizer, stack) { - if (value === other) { - return true; - } - if ( - value == null || - other == null || - (!isObjectLike(value) && !isObjectLike(other)) - ) { - return value !== value && other !== other; - } - return baseIsEqualDeep( - value, - other, - bitmask, - customizer, - baseIsEqual, - stack - ); - } - - /** - * A specialized version of `baseIsEqual` for arrays and objects which performs - * deep comparisons and tracks traversed objects enabling objects with circular - * references to be compared. - * - * @private - * @param {Object} object The object to compare. - * @param {Object} other The other object to compare. - * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. - * @param {Function} customizer The function to customize comparisons. - * @param {Function} equalFunc The function to determine equivalents of values. - * @param {Object} [stack] Tracks traversed `object` and `other` objects. - * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. - */ - function baseIsEqualDeep( - object, - other, - bitmask, - customizer, - equalFunc, - stack - ) { - var objIsArr = isArray(object), - othIsArr = isArray(other), - objTag = objIsArr ? arrayTag : getTag(object), - othTag = othIsArr ? arrayTag : getTag(other); - - objTag = objTag == argsTag ? objectTag : objTag; - othTag = othTag == argsTag ? objectTag : othTag; - - var objIsObj = objTag == objectTag, - othIsObj = othTag == objectTag, - isSameTag = objTag == othTag; - - if (isSameTag && isBuffer(object)) { - if (!isBuffer(other)) { - return false; - } - objIsArr = true; - objIsObj = false; - } - if (isSameTag && !objIsObj) { - stack || (stack = new Stack()); - return objIsArr || isTypedArray(object) - ? equalArrays( - object, - other, - bitmask, - customizer, - equalFunc, - stack - ) - : equalByTag( - object, - other, - objTag, - bitmask, - customizer, - equalFunc, - stack - ); - } - if (!(bitmask & COMPARE_PARTIAL_FLAG)) { - var objIsWrapped = - objIsObj && hasOwnProperty.call(object, '__wrapped__'), - othIsWrapped = - othIsObj && hasOwnProperty.call(other, '__wrapped__'); - - if (objIsWrapped || othIsWrapped) { - var objUnwrapped = objIsWrapped ? object.value() : object, - othUnwrapped = othIsWrapped ? other.value() : other; - - stack || (stack = new Stack()); - return equalFunc( - objUnwrapped, - othUnwrapped, - bitmask, - customizer, - stack - ); - } - } - if (!isSameTag) { - return false; - } - stack || (stack = new Stack()); - return equalObjects( - object, - other, - bitmask, - customizer, - equalFunc, - stack - ); - } - - /** - * The base implementation of `_.isMap` without Node.js optimizations. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a map, else `false`. - */ - function baseIsMap(value) { - return isObjectLike(value) && getTag(value) == mapTag; - } - - /** - * The base implementation of `_.isMatch` without support for iteratee shorthands. - * - * @private - * @param {Object} object The object to inspect. - * @param {Object} source The object of property values to match. - * @param {Array} matchData The property names, values, and compare flags to match. - * @param {Function} [customizer] The function to customize comparisons. - * @returns {boolean} Returns `true` if `object` is a match, else `false`. - */ - function baseIsMatch(object, source, matchData, customizer) { - var index = matchData.length, - length = index, - noCustomizer = !customizer; - - if (object == null) { - return !length; - } - object = Object(object); - while (index--) { - var data = matchData[index]; - if ( - noCustomizer && data[2] - ? data[1] !== object[data[0]] - : !(data[0] in object) - ) { - return false; - } - } - while (++index < length) { - data = matchData[index]; - var key = data[0], - objValue = object[key], - srcValue = data[1]; - - if (noCustomizer && data[2]) { - if (objValue === undefined && !(key in object)) { - return false; - } - } else { - var stack = new Stack(); - if (customizer) { - var result = customizer( - objValue, - srcValue, - key, - object, - source, - stack - ); - } - if ( - !(result === undefined - ? baseIsEqual( - srcValue, - objValue, - COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, - customizer, - stack - ) - : result) - ) { - return false; - } - } - } - return true; - } - - /** - * The base implementation of `_.isNative` without bad shim checks. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a native function, - * else `false`. - */ - function baseIsNative(value) { - if (!isObject(value) || isMasked(value)) { - return false; - } - var pattern = isFunction(value) ? reIsNative : reIsHostCtor; - return pattern.test(toSource(value)); - } - - /** - * The base implementation of `_.isRegExp` without Node.js optimizations. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. - */ - function baseIsRegExp(value) { - return isObjectLike(value) && baseGetTag(value) == regexpTag; - } - - /** - * The base implementation of `_.isSet` without Node.js optimizations. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a set, else `false`. - */ - function baseIsSet(value) { - return isObjectLike(value) && getTag(value) == setTag; - } - - /** - * The base implementation of `_.isTypedArray` without Node.js optimizations. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. - */ - function baseIsTypedArray(value) { - return ( - isObjectLike(value) && - isLength(value.length) && - !!typedArrayTags[baseGetTag(value)] - ); - } - - /** - * The base implementation of `_.iteratee`. - * - * @private - * @param {*} [value=_.identity] The value to convert to an iteratee. - * @returns {Function} Returns the iteratee. - */ - function baseIteratee(value) { - // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9. - // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details. - if (typeof value == 'function') { - return value; - } - if (value == null) { - return identity; - } - if (typeof value == 'object') { - return isArray(value) - ? baseMatchesProperty(value[0], value[1]) - : baseMatches(value); - } - return property(value); - } - - /** - * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - */ - function baseKeys(object) { - if (!isPrototype(object)) { - return nativeKeys(object); - } - var result = []; - for (var key in Object(object)) { - if (hasOwnProperty.call(object, key) && key != 'constructor') { - result.push(key); - } - } - return result; - } - - /** - * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - */ - function baseKeysIn(object) { - if (!isObject(object)) { - return nativeKeysIn(object); - } - var isProto = isPrototype(object), - result = []; - - for (var key in object) { - if ( - !( - key == 'constructor' && - (isProto || !hasOwnProperty.call(object, key)) - ) - ) { - result.push(key); - } - } - return result; - } - - /** - * The base implementation of `_.lt` which doesn't coerce arguments. - * - * @private - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {boolean} Returns `true` if `value` is less than `other`, - * else `false`. - */ - function baseLt(value, other) { - return value < other; - } - - /** - * The base implementation of `_.map` without support for iteratee shorthands. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {Array} Returns the new mapped array. - */ - function baseMap(collection, iteratee) { - var index = -1, - result = isArrayLike(collection) - ? Array(collection.length) - : []; - - baseEach(collection, function (value, key, collection) { - result[++index] = iteratee(value, key, collection); - }); - return result; - } - - /** - * The base implementation of `_.matches` which doesn't clone `source`. - * - * @private - * @param {Object} source The object of property values to match. - * @returns {Function} Returns the new spec function. - */ - function baseMatches(source) { - var matchData = getMatchData(source); - if (matchData.length == 1 && matchData[0][2]) { - return matchesStrictComparable( - matchData[0][0], - matchData[0][1] - ); - } - return function (object) { - return ( - object === source || baseIsMatch(object, source, matchData) - ); - }; - } - - /** - * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`. - * - * @private - * @param {string} path The path of the property to get. - * @param {*} srcValue The value to match. - * @returns {Function} Returns the new spec function. - */ - function baseMatchesProperty(path, srcValue) { - if (isKey(path) && isStrictComparable(srcValue)) { - return matchesStrictComparable(toKey(path), srcValue); - } - return function (object) { - var objValue = get(object, path); - return objValue === undefined && objValue === srcValue - ? hasIn(object, path) - : baseIsEqual( - srcValue, - objValue, - COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG - ); - }; - } - - /** - * The base implementation of `_.merge` without support for multiple sources. - * - * @private - * @param {Object} object The destination object. - * @param {Object} source The source object. - * @param {number} srcIndex The index of `source`. - * @param {Function} [customizer] The function to customize merged values. - * @param {Object} [stack] Tracks traversed source values and their merged - * counterparts. - */ - function baseMerge(object, source, srcIndex, customizer, stack) { - if (object === source) { - return; - } - baseFor( - source, - function (srcValue, key) { - if (isObject(srcValue)) { - stack || (stack = new Stack()); - baseMergeDeep( - object, - source, - key, - srcIndex, - baseMerge, - customizer, - stack - ); - } else { - var newValue = customizer - ? customizer( - safeGet(object, key), - srcValue, - key + '', - object, - source, - stack - ) - : undefined; - - if (newValue === undefined) { - newValue = srcValue; - } - assignMergeValue(object, key, newValue); - } - }, - keysIn - ); - } - - /** - * A specialized version of `baseMerge` for arrays and objects which performs - * deep merges and tracks traversed objects enabling objects with circular - * references to be merged. - * - * @private - * @param {Object} object The destination object. - * @param {Object} source The source object. - * @param {string} key The key of the value to merge. - * @param {number} srcIndex The index of `source`. - * @param {Function} mergeFunc The function to merge values. - * @param {Function} [customizer] The function to customize assigned values. - * @param {Object} [stack] Tracks traversed source values and their merged - * counterparts. - */ - function baseMergeDeep( - object, - source, - key, - srcIndex, - mergeFunc, - customizer, - stack - ) { - var objValue = safeGet(object, key), - srcValue = safeGet(source, key), - stacked = stack.get(srcValue); - - if (stacked) { - assignMergeValue(object, key, stacked); - return; - } - var newValue = customizer - ? customizer( - objValue, - srcValue, - key + '', - object, - source, - stack - ) - : undefined; - - var isCommon = newValue === undefined; - - if (isCommon) { - var isArr = isArray(srcValue), - isBuff = !isArr && isBuffer(srcValue), - isTyped = !isArr && !isBuff && isTypedArray(srcValue); - - newValue = srcValue; - if (isArr || isBuff || isTyped) { - if (isArray(objValue)) { - newValue = objValue; - } else if (isArrayLikeObject(objValue)) { - newValue = copyArray(objValue); - } else if (isBuff) { - isCommon = false; - newValue = cloneBuffer(srcValue, true); - } else if (isTyped) { - isCommon = false; - newValue = cloneTypedArray(srcValue, true); - } else { - newValue = []; - } - } else if (isPlainObject(srcValue) || isArguments(srcValue)) { - newValue = objValue; - if (isArguments(objValue)) { - newValue = toPlainObject(objValue); - } else if ( - !isObject(objValue) || - (srcIndex && isFunction(objValue)) - ) { - newValue = initCloneObject(srcValue); - } - } else { - isCommon = false; - } - } - if (isCommon) { - // Recursively merge objects and arrays (susceptible to call stack limits). - stack.set(srcValue, newValue); - mergeFunc(newValue, srcValue, srcIndex, customizer, stack); - stack['delete'](srcValue); - } - assignMergeValue(object, key, newValue); - } - - /** - * The base implementation of `_.nth` which doesn't coerce arguments. - * - * @private - * @param {Array} array The array to query. - * @param {number} n The index of the element to return. - * @returns {*} Returns the nth element of `array`. - */ - function baseNth(array, n) { - var length = array.length; - if (!length) { - return; - } - n += n < 0 ? length : 0; - return isIndex(n, length) ? array[n] : undefined; - } - - /** - * The base implementation of `_.orderBy` without param guards. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by. - * @param {string[]} orders The sort orders of `iteratees`. - * @returns {Array} Returns the new sorted array. - */ - function baseOrderBy(collection, iteratees, orders) { - var index = -1; - iteratees = arrayMap( - iteratees.length ? iteratees : [identity], - baseUnary(getIteratee()) - ); - - var result = baseMap( - collection, - function (value, key, collection) { - var criteria = arrayMap(iteratees, function (iteratee) { - return iteratee(value); - }); - return { criteria: criteria, index: ++index, value: value }; - } - ); - - return baseSortBy(result, function (object, other) { - return compareMultiple(object, other, orders); - }); - } - - /** - * The base implementation of `_.pick` without support for individual - * property identifiers. - * - * @private - * @param {Object} object The source object. - * @param {string[]} paths The property paths to pick. - * @returns {Object} Returns the new object. - */ - function basePick(object, paths) { - return basePickBy(object, paths, function (value, path) { - return hasIn(object, path); - }); - } - - /** - * The base implementation of `_.pickBy` without support for iteratee shorthands. - * - * @private - * @param {Object} object The source object. - * @param {string[]} paths The property paths to pick. - * @param {Function} predicate The function invoked per property. - * @returns {Object} Returns the new object. - */ - function basePickBy(object, paths, predicate) { - var index = -1, - length = paths.length, - result = {}; - - while (++index < length) { - var path = paths[index], - value = baseGet(object, path); - - if (predicate(value, path)) { - baseSet(result, castPath(path, object), value); - } - } - return result; - } - - /** - * A specialized version of `baseProperty` which supports deep paths. - * - * @private - * @param {Array|string} path The path of the property to get. - * @returns {Function} Returns the new accessor function. - */ - function basePropertyDeep(path) { - return function (object) { - return baseGet(object, path); - }; - } - - /** - * The base implementation of `_.pullAllBy` without support for iteratee - * shorthands. - * - * @private - * @param {Array} array The array to modify. - * @param {Array} values The values to remove. - * @param {Function} [iteratee] The iteratee invoked per element. - * @param {Function} [comparator] The comparator invoked per element. - * @returns {Array} Returns `array`. - */ - function basePullAll(array, values, iteratee, comparator) { - var indexOf = comparator ? baseIndexOfWith : baseIndexOf, - index = -1, - length = values.length, - seen = array; - - if (array === values) { - values = copyArray(values); - } - if (iteratee) { - seen = arrayMap(array, baseUnary(iteratee)); - } - while (++index < length) { - var fromIndex = 0, - value = values[index], - computed = iteratee ? iteratee(value) : value; - - while ( - (fromIndex = indexOf(seen, computed, fromIndex, comparator)) > - -1 - ) { - if (seen !== array) { - splice.call(seen, fromIndex, 1); - } - splice.call(array, fromIndex, 1); - } - } - return array; - } - - /** - * The base implementation of `_.pullAt` without support for individual - * indexes or capturing the removed elements. - * - * @private - * @param {Array} array The array to modify. - * @param {number[]} indexes The indexes of elements to remove. - * @returns {Array} Returns `array`. - */ - function basePullAt(array, indexes) { - var length = array ? indexes.length : 0, - lastIndex = length - 1; - - while (length--) { - var index = indexes[length]; - if (length == lastIndex || index !== previous) { - var previous = index; - if (isIndex(index)) { - splice.call(array, index, 1); - } else { - baseUnset(array, index); - } - } - } - return array; - } - - /** - * The base implementation of `_.random` without support for returning - * floating-point numbers. - * - * @private - * @param {number} lower The lower bound. - * @param {number} upper The upper bound. - * @returns {number} Returns the random number. - */ - function baseRandom(lower, upper) { - return lower + nativeFloor(nativeRandom() * (upper - lower + 1)); - } - - /** - * The base implementation of `_.range` and `_.rangeRight` which doesn't - * coerce arguments. - * - * @private - * @param {number} start The start of the range. - * @param {number} end The end of the range. - * @param {number} step The value to increment or decrement by. - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {Array} Returns the range of numbers. - */ - function baseRange(start, end, step, fromRight) { - var index = -1, - length = nativeMax(nativeCeil((end - start) / (step || 1)), 0), - result = Array(length); - - while (length--) { - result[fromRight ? length : ++index] = start; - start += step; - } - return result; - } - - /** - * The base implementation of `_.repeat` which doesn't coerce arguments. - * - * @private - * @param {string} string The string to repeat. - * @param {number} n The number of times to repeat the string. - * @returns {string} Returns the repeated string. - */ - function baseRepeat(string, n) { - var result = ''; - if (!string || n < 1 || n > MAX_SAFE_INTEGER) { - return result; - } - // Leverage the exponentiation by squaring algorithm for a faster repeat. - // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details. - do { - if (n % 2) { - result += string; - } - n = nativeFloor(n / 2); - if (n) { - string += string; - } - } while (n); - - return result; - } - - /** - * The base implementation of `_.rest` which doesn't validate or coerce arguments. - * - * @private - * @param {Function} func The function to apply a rest parameter to. - * @param {number} [start=func.length-1] The start position of the rest parameter. - * @returns {Function} Returns the new function. - */ - function baseRest(func, start) { - return setToString(overRest(func, start, identity), func + ''); - } - - /** - * The base implementation of `_.sample`. - * - * @private - * @param {Array|Object} collection The collection to sample. - * @returns {*} Returns the random element. - */ - function baseSample(collection) { - return arraySample(values(collection)); - } - - /** - * The base implementation of `_.sampleSize` without param guards. - * - * @private - * @param {Array|Object} collection The collection to sample. - * @param {number} n The number of elements to sample. - * @returns {Array} Returns the random elements. - */ - function baseSampleSize(collection, n) { - var array = values(collection); - return shuffleSelf(array, baseClamp(n, 0, array.length)); - } - - /** - * The base implementation of `_.set`. - * - * @private - * @param {Object} object The object to modify. - * @param {Array|string} path The path of the property to set. - * @param {*} value The value to set. - * @param {Function} [customizer] The function to customize path creation. - * @returns {Object} Returns `object`. - */ - function baseSet(object, path, value, customizer) { - if (!isObject(object)) { - return object; - } - path = castPath(path, object); - - var index = -1, - length = path.length, - lastIndex = length - 1, - nested = object; - - while (nested != null && ++index < length) { - var key = toKey(path[index]), - newValue = value; - - if (index != lastIndex) { - var objValue = nested[key]; - newValue = customizer - ? customizer(objValue, key, nested) - : undefined; - if (newValue === undefined) { - newValue = isObject(objValue) - ? objValue - : isIndex(path[index + 1]) - ? [] - : {}; - } - } - assignValue(nested, key, newValue); - nested = nested[key]; - } - return object; - } - - /** - * The base implementation of `setData` without support for hot loop shorting. - * - * @private - * @param {Function} func The function to associate metadata with. - * @param {*} data The metadata. - * @returns {Function} Returns `func`. - */ - var baseSetData = !metaMap - ? identity - : function (func, data) { - metaMap.set(func, data); - return func; - }; - - /** - * The base implementation of `setToString` without support for hot loop shorting. - * - * @private - * @param {Function} func The function to modify. - * @param {Function} string The `toString` result. - * @returns {Function} Returns `func`. - */ - var baseSetToString = !defineProperty - ? identity - : function (func, string) { - return defineProperty(func, 'toString', { - configurable: true, - enumerable: false, - value: constant(string), - writable: true, - }); - }; - - /** - * The base implementation of `_.shuffle`. - * - * @private - * @param {Array|Object} collection The collection to shuffle. - * @returns {Array} Returns the new shuffled array. - */ - function baseShuffle(collection) { - return shuffleSelf(values(collection)); - } - - /** - * The base implementation of `_.slice` without an iteratee call guard. - * - * @private - * @param {Array} array The array to slice. - * @param {number} [start=0] The start position. - * @param {number} [end=array.length] The end position. - * @returns {Array} Returns the slice of `array`. - */ - function baseSlice(array, start, end) { - var index = -1, - length = array.length; - - if (start < 0) { - start = -start > length ? 0 : length + start; - } - end = end > length ? length : end; - if (end < 0) { - end += length; - } - length = start > end ? 0 : (end - start) >>> 0; - start >>>= 0; - - var result = Array(length); - while (++index < length) { - result[index] = array[index + start]; - } - return result; - } - - /** - * The base implementation of `_.some` without support for iteratee shorthands. - * - * @private - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} predicate The function invoked per iteration. - * @returns {boolean} Returns `true` if any element passes the predicate check, - * else `false`. - */ - function baseSome(collection, predicate) { - var result; - - baseEach(collection, function (value, index, collection) { - result = predicate(value, index, collection); - return !result; - }); - return !!result; - } - - /** - * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which - * performs a binary search of `array` to determine the index at which `value` - * should be inserted into `array` in order to maintain its sort order. - * - * @private - * @param {Array} array The sorted array to inspect. - * @param {*} value The value to evaluate. - * @param {boolean} [retHighest] Specify returning the highest qualified index. - * @returns {number} Returns the index at which `value` should be inserted - * into `array`. - */ - function baseSortedIndex(array, value, retHighest) { - var low = 0, - high = array == null ? low : array.length; - - if ( - typeof value == 'number' && - value === value && - high <= HALF_MAX_ARRAY_LENGTH - ) { - while (low < high) { - var mid = (low + high) >>> 1, - computed = array[mid]; - - if ( - computed !== null && - !isSymbol(computed) && - (retHighest ? computed <= value : computed < value) - ) { - low = mid + 1; - } else { - high = mid; - } - } - return high; - } - return baseSortedIndexBy(array, value, identity, retHighest); - } - - /** - * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy` - * which invokes `iteratee` for `value` and each element of `array` to compute - * their sort ranking. The iteratee is invoked with one argument; (value). - * - * @private - * @param {Array} array The sorted array to inspect. - * @param {*} value The value to evaluate. - * @param {Function} iteratee The iteratee invoked per element. - * @param {boolean} [retHighest] Specify returning the highest qualified index. - * @returns {number} Returns the index at which `value` should be inserted - * into `array`. - */ - function baseSortedIndexBy(array, value, iteratee, retHighest) { - value = iteratee(value); - - var low = 0, - high = array == null ? 0 : array.length, - valIsNaN = value !== value, - valIsNull = value === null, - valIsSymbol = isSymbol(value), - valIsUndefined = value === undefined; - - while (low < high) { - var mid = nativeFloor((low + high) / 2), - computed = iteratee(array[mid]), - othIsDefined = computed !== undefined, - othIsNull = computed === null, - othIsReflexive = computed === computed, - othIsSymbol = isSymbol(computed); - - if (valIsNaN) { - var setLow = retHighest || othIsReflexive; - } else if (valIsUndefined) { - setLow = othIsReflexive && (retHighest || othIsDefined); - } else if (valIsNull) { - setLow = - othIsReflexive && - othIsDefined && - (retHighest || !othIsNull); - } else if (valIsSymbol) { - setLow = - othIsReflexive && - othIsDefined && - !othIsNull && - (retHighest || !othIsSymbol); - } else if (othIsNull || othIsSymbol) { - setLow = false; - } else { - setLow = retHighest ? computed <= value : computed < value; - } - if (setLow) { - low = mid + 1; - } else { - high = mid; - } - } - return nativeMin(high, MAX_ARRAY_INDEX); - } - - /** - * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without - * support for iteratee shorthands. - * - * @private - * @param {Array} array The array to inspect. - * @param {Function} [iteratee] The iteratee invoked per element. - * @returns {Array} Returns the new duplicate free array. - */ - function baseSortedUniq(array, iteratee) { - var index = -1, - length = array.length, - resIndex = 0, - result = []; - - while (++index < length) { - var value = array[index], - computed = iteratee ? iteratee(value) : value; - - if (!index || !eq(computed, seen)) { - var seen = computed; - result[resIndex++] = value === 0 ? 0 : value; - } - } - return result; - } - - /** - * The base implementation of `_.toNumber` which doesn't ensure correct - * conversions of binary, hexadecimal, or octal string values. - * - * @private - * @param {*} value The value to process. - * @returns {number} Returns the number. - */ - function baseToNumber(value) { - if (typeof value == 'number') { - return value; - } - if (isSymbol(value)) { - return NAN; - } - return +value; - } - - /** - * The base implementation of `_.toString` which doesn't convert nullish - * values to empty strings. - * - * @private - * @param {*} value The value to process. - * @returns {string} Returns the string. - */ - function baseToString(value) { - // Exit early for strings to avoid a performance hit in some environments. - if (typeof value == 'string') { - return value; - } - if (isArray(value)) { - // Recursively convert values (susceptible to call stack limits). - return arrayMap(value, baseToString) + ''; - } - if (isSymbol(value)) { - return symbolToString ? symbolToString.call(value) : ''; - } - var result = value + ''; - return result == '0' && 1 / value == -INFINITY ? '-0' : result; - } - - /** - * The base implementation of `_.uniqBy` without support for iteratee shorthands. - * - * @private - * @param {Array} array The array to inspect. - * @param {Function} [iteratee] The iteratee invoked per element. - * @param {Function} [comparator] The comparator invoked per element. - * @returns {Array} Returns the new duplicate free array. - */ - function baseUniq(array, iteratee, comparator) { - var index = -1, - includes = arrayIncludes, - length = array.length, - isCommon = true, - result = [], - seen = result; - - if (comparator) { - isCommon = false; - includes = arrayIncludesWith; - } else if (length >= LARGE_ARRAY_SIZE) { - var set = iteratee ? null : createSet(array); - if (set) { - return setToArray(set); - } - isCommon = false; - includes = cacheHas; - seen = new SetCache(); - } else { - seen = iteratee ? [] : result; - } - outer: while (++index < length) { - var value = array[index], - computed = iteratee ? iteratee(value) : value; - - value = comparator || value !== 0 ? value : 0; - if (isCommon && computed === computed) { - var seenIndex = seen.length; - while (seenIndex--) { - if (seen[seenIndex] === computed) { - continue outer; - } - } - if (iteratee) { - seen.push(computed); - } - result.push(value); - } else if (!includes(seen, computed, comparator)) { - if (seen !== result) { - seen.push(computed); - } - result.push(value); - } - } - return result; - } - - /** - * The base implementation of `_.unset`. - * - * @private - * @param {Object} object The object to modify. - * @param {Array|string} path The property path to unset. - * @returns {boolean} Returns `true` if the property is deleted, else `false`. - */ - function baseUnset(object, path) { - path = castPath(path, object); - object = parent(object, path); - return object == null || delete object[toKey(last(path))]; - } - - /** - * The base implementation of `_.update`. - * - * @private - * @param {Object} object The object to modify. - * @param {Array|string} path The path of the property to update. - * @param {Function} updater The function to produce the updated value. - * @param {Function} [customizer] The function to customize path creation. - * @returns {Object} Returns `object`. - */ - function baseUpdate(object, path, updater, customizer) { - return baseSet( - object, - path, - updater(baseGet(object, path)), - customizer - ); - } - - /** - * The base implementation of methods like `_.dropWhile` and `_.takeWhile` - * without support for iteratee shorthands. - * - * @private - * @param {Array} array The array to query. - * @param {Function} predicate The function invoked per iteration. - * @param {boolean} [isDrop] Specify dropping elements instead of taking them. - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {Array} Returns the slice of `array`. - */ - function baseWhile(array, predicate, isDrop, fromRight) { - var length = array.length, - index = fromRight ? length : -1; - - while ( - (fromRight ? index-- : ++index < length) && - predicate(array[index], index, array) - ) {} - - return isDrop - ? baseSlice( - array, - fromRight ? 0 : index, - fromRight ? index + 1 : length - ) - : baseSlice( - array, - fromRight ? index + 1 : 0, - fromRight ? length : index - ); - } - - /** - * The base implementation of `wrapperValue` which returns the result of - * performing a sequence of actions on the unwrapped `value`, where each - * successive action is supplied the return value of the previous. - * - * @private - * @param {*} value The unwrapped value. - * @param {Array} actions Actions to perform to resolve the unwrapped value. - * @returns {*} Returns the resolved value. - */ - function baseWrapperValue(value, actions) { - var result = value; - if (result instanceof LazyWrapper) { - result = result.value(); - } - return arrayReduce( - actions, - function (result, action) { - return action.func.apply( - action.thisArg, - arrayPush([result], action.args) - ); - }, - result - ); - } - - /** - * The base implementation of methods like `_.xor`, without support for - * iteratee shorthands, that accepts an array of arrays to inspect. - * - * @private - * @param {Array} arrays The arrays to inspect. - * @param {Function} [iteratee] The iteratee invoked per element. - * @param {Function} [comparator] The comparator invoked per element. - * @returns {Array} Returns the new array of values. - */ - function baseXor(arrays, iteratee, comparator) { - var length = arrays.length; - if (length < 2) { - return length ? baseUniq(arrays[0]) : []; - } - var index = -1, - result = Array(length); - - while (++index < length) { - var array = arrays[index], - othIndex = -1; - - while (++othIndex < length) { - if (othIndex != index) { - result[index] = baseDifference( - result[index] || array, - arrays[othIndex], - iteratee, - comparator - ); - } - } - } - return baseUniq(baseFlatten(result, 1), iteratee, comparator); - } - - /** - * This base implementation of `_.zipObject` which assigns values using `assignFunc`. - * - * @private - * @param {Array} props The property identifiers. - * @param {Array} values The property values. - * @param {Function} assignFunc The function to assign values. - * @returns {Object} Returns the new object. - */ - function baseZipObject(props, values, assignFunc) { - var index = -1, - length = props.length, - valsLength = values.length, - result = {}; - - while (++index < length) { - var value = index < valsLength ? values[index] : undefined; - assignFunc(result, props[index], value); - } - return result; - } - - /** - * Casts `value` to an empty array if it's not an array like object. - * - * @private - * @param {*} value The value to inspect. - * @returns {Array|Object} Returns the cast array-like object. - */ - function castArrayLikeObject(value) { - return isArrayLikeObject(value) ? value : []; - } - - /** - * Casts `value` to `identity` if it's not a function. - * - * @private - * @param {*} value The value to inspect. - * @returns {Function} Returns cast function. - */ - function castFunction(value) { - return typeof value == 'function' ? value : identity; - } - - /** - * Casts `value` to a path array if it's not one. - * - * @private - * @param {*} value The value to inspect. - * @param {Object} [object] The object to query keys on. - * @returns {Array} Returns the cast property path array. - */ - function castPath(value, object) { - if (isArray(value)) { - return value; - } - return isKey(value, object) - ? [value] - : stringToPath(toString(value)); - } - - /** - * A `baseRest` alias which can be replaced with `identity` by module - * replacement plugins. - * - * @private - * @type {Function} - * @param {Function} func The function to apply a rest parameter to. - * @returns {Function} Returns the new function. - */ - var castRest = baseRest; - - /** - * Casts `array` to a slice if it's needed. - * - * @private - * @param {Array} array The array to inspect. - * @param {number} start The start position. - * @param {number} [end=array.length] The end position. - * @returns {Array} Returns the cast slice. - */ - function castSlice(array, start, end) { - var length = array.length; - end = end === undefined ? length : end; - return !start && end >= length - ? array - : baseSlice(array, start, end); - } - - /** - * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout). - * - * @private - * @param {number|Object} id The timer id or timeout object of the timer to clear. - */ - var clearTimeout = - ctxClearTimeout || - function (id) { - return root.clearTimeout(id); - }; - - /** - * Creates a clone of `buffer`. - * - * @private - * @param {Buffer} buffer The buffer to clone. - * @param {boolean} [isDeep] Specify a deep clone. - * @returns {Buffer} Returns the cloned buffer. - */ - function cloneBuffer(buffer, isDeep) { - if (isDeep) { - return buffer.slice(); - } - var length = buffer.length, - result = allocUnsafe - ? allocUnsafe(length) - : new buffer.constructor(length); - - buffer.copy(result); - return result; - } - - /** - * Creates a clone of `arrayBuffer`. - * - * @private - * @param {ArrayBuffer} arrayBuffer The array buffer to clone. - * @returns {ArrayBuffer} Returns the cloned array buffer. - */ - function cloneArrayBuffer(arrayBuffer) { - var result = new arrayBuffer.constructor(arrayBuffer.byteLength); - new Uint8Array(result).set(new Uint8Array(arrayBuffer)); - return result; - } - - /** - * Creates a clone of `dataView`. - * - * @private - * @param {Object} dataView The data view to clone. - * @param {boolean} [isDeep] Specify a deep clone. - * @returns {Object} Returns the cloned data view. - */ - function cloneDataView(dataView, isDeep) { - var buffer = isDeep - ? cloneArrayBuffer(dataView.buffer) - : dataView.buffer; - return new dataView.constructor( - buffer, - dataView.byteOffset, - dataView.byteLength - ); - } - - /** - * Creates a clone of `regexp`. - * - * @private - * @param {Object} regexp The regexp to clone. - * @returns {Object} Returns the cloned regexp. - */ - function cloneRegExp(regexp) { - var result = new regexp.constructor( - regexp.source, - reFlags.exec(regexp) - ); - result.lastIndex = regexp.lastIndex; - return result; - } - - /** - * Creates a clone of the `symbol` object. - * - * @private - * @param {Object} symbol The symbol object to clone. - * @returns {Object} Returns the cloned symbol object. - */ - function cloneSymbol(symbol) { - return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {}; - } - - /** - * Creates a clone of `typedArray`. - * - * @private - * @param {Object} typedArray The typed array to clone. - * @param {boolean} [isDeep] Specify a deep clone. - * @returns {Object} Returns the cloned typed array. - */ - function cloneTypedArray(typedArray, isDeep) { - var buffer = isDeep - ? cloneArrayBuffer(typedArray.buffer) - : typedArray.buffer; - return new typedArray.constructor( - buffer, - typedArray.byteOffset, - typedArray.length - ); - } - - /** - * Compares values to sort them in ascending order. - * - * @private - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {number} Returns the sort order indicator for `value`. - */ - function compareAscending(value, other) { - if (value !== other) { - var valIsDefined = value !== undefined, - valIsNull = value === null, - valIsReflexive = value === value, - valIsSymbol = isSymbol(value); - - var othIsDefined = other !== undefined, - othIsNull = other === null, - othIsReflexive = other === other, - othIsSymbol = isSymbol(other); - - if ( - (!othIsNull && - !othIsSymbol && - !valIsSymbol && - value > other) || - (valIsSymbol && - othIsDefined && - othIsReflexive && - !othIsNull && - !othIsSymbol) || - (valIsNull && othIsDefined && othIsReflexive) || - (!valIsDefined && othIsReflexive) || - !valIsReflexive - ) { - return 1; - } - if ( - (!valIsNull && - !valIsSymbol && - !othIsSymbol && - value < other) || - (othIsSymbol && - valIsDefined && - valIsReflexive && - !valIsNull && - !valIsSymbol) || - (othIsNull && valIsDefined && valIsReflexive) || - (!othIsDefined && valIsReflexive) || - !othIsReflexive - ) { - return -1; - } - } - return 0; - } - - /** - * Used by `_.orderBy` to compare multiple properties of a value to another - * and stable sort them. - * - * If `orders` is unspecified, all values are sorted in ascending order. Otherwise, - * specify an order of "desc" for descending or "asc" for ascending sort order - * of corresponding values. - * - * @private - * @param {Object} object The object to compare. - * @param {Object} other The other object to compare. - * @param {boolean[]|string[]} orders The order to sort by for each property. - * @returns {number} Returns the sort order indicator for `object`. - */ - function compareMultiple(object, other, orders) { - var index = -1, - objCriteria = object.criteria, - othCriteria = other.criteria, - length = objCriteria.length, - ordersLength = orders.length; - - while (++index < length) { - var result = compareAscending( - objCriteria[index], - othCriteria[index] - ); - if (result) { - if (index >= ordersLength) { - return result; - } - var order = orders[index]; - return result * (order == 'desc' ? -1 : 1); - } - } - // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications - // that causes it, under certain circumstances, to provide the same value for - // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247 - // for more details. - // - // This also ensures a stable sort in V8 and other engines. - // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details. - return object.index - other.index; - } - - /** - * Creates an array that is the composition of partially applied arguments, - * placeholders, and provided arguments into a single array of arguments. - * - * @private - * @param {Array} args The provided arguments. - * @param {Array} partials The arguments to prepend to those provided. - * @param {Array} holders The `partials` placeholder indexes. - * @params {boolean} [isCurried] Specify composing for a curried function. - * @returns {Array} Returns the new array of composed arguments. - */ - function composeArgs(args, partials, holders, isCurried) { - var argsIndex = -1, - argsLength = args.length, - holdersLength = holders.length, - leftIndex = -1, - leftLength = partials.length, - rangeLength = nativeMax(argsLength - holdersLength, 0), - result = Array(leftLength + rangeLength), - isUncurried = !isCurried; - - while (++leftIndex < leftLength) { - result[leftIndex] = partials[leftIndex]; - } - while (++argsIndex < holdersLength) { - if (isUncurried || argsIndex < argsLength) { - result[holders[argsIndex]] = args[argsIndex]; - } - } - while (rangeLength--) { - result[leftIndex++] = args[argsIndex++]; - } - return result; - } - - /** - * This function is like `composeArgs` except that the arguments composition - * is tailored for `_.partialRight`. - * - * @private - * @param {Array} args The provided arguments. - * @param {Array} partials The arguments to append to those provided. - * @param {Array} holders The `partials` placeholder indexes. - * @params {boolean} [isCurried] Specify composing for a curried function. - * @returns {Array} Returns the new array of composed arguments. - */ - function composeArgsRight(args, partials, holders, isCurried) { - var argsIndex = -1, - argsLength = args.length, - holdersIndex = -1, - holdersLength = holders.length, - rightIndex = -1, - rightLength = partials.length, - rangeLength = nativeMax(argsLength - holdersLength, 0), - result = Array(rangeLength + rightLength), - isUncurried = !isCurried; - - while (++argsIndex < rangeLength) { - result[argsIndex] = args[argsIndex]; - } - var offset = argsIndex; - while (++rightIndex < rightLength) { - result[offset + rightIndex] = partials[rightIndex]; - } - while (++holdersIndex < holdersLength) { - if (isUncurried || argsIndex < argsLength) { - result[offset + holders[holdersIndex]] = args[argsIndex++]; - } - } - return result; - } - - /** - * Copies the values of `source` to `array`. - * - * @private - * @param {Array} source The array to copy values from. - * @param {Array} [array=[]] The array to copy values to. - * @returns {Array} Returns `array`. - */ - function copyArray(source, array) { - var index = -1, - length = source.length; - - array || (array = Array(length)); - while (++index < length) { - array[index] = source[index]; - } - return array; - } - - /** - * Copies properties of `source` to `object`. - * - * @private - * @param {Object} source The object to copy properties from. - * @param {Array} props The property identifiers to copy. - * @param {Object} [object={}] The object to copy properties to. - * @param {Function} [customizer] The function to customize copied values. - * @returns {Object} Returns `object`. - */ - function copyObject(source, props, object, customizer) { - var isNew = !object; - object || (object = {}); - - var index = -1, - length = props.length; - - while (++index < length) { - var key = props[index]; - - var newValue = customizer - ? customizer(object[key], source[key], key, object, source) - : undefined; - - if (newValue === undefined) { - newValue = source[key]; - } - if (isNew) { - baseAssignValue(object, key, newValue); - } else { - assignValue(object, key, newValue); - } - } - return object; - } - - /** - * Copies own symbols of `source` to `object`. - * - * @private - * @param {Object} source The object to copy symbols from. - * @param {Object} [object={}] The object to copy symbols to. - * @returns {Object} Returns `object`. - */ - function copySymbols(source, object) { - return copyObject(source, getSymbols(source), object); - } - - /** - * Copies own and inherited symbols of `source` to `object`. - * - * @private - * @param {Object} source The object to copy symbols from. - * @param {Object} [object={}] The object to copy symbols to. - * @returns {Object} Returns `object`. - */ - function copySymbolsIn(source, object) { - return copyObject(source, getSymbolsIn(source), object); - } - - /** - * Creates a function like `_.groupBy`. - * - * @private - * @param {Function} setter The function to set accumulator values. - * @param {Function} [initializer] The accumulator object initializer. - * @returns {Function} Returns the new aggregator function. - */ - function createAggregator(setter, initializer) { - return function (collection, iteratee) { - var func = isArray(collection) - ? arrayAggregator - : baseAggregator, - accumulator = initializer ? initializer() : {}; - - return func( - collection, - setter, - getIteratee(iteratee, 2), - accumulator - ); - }; - } - - /** - * Creates a function like `_.assign`. - * - * @private - * @param {Function} assigner The function to assign values. - * @returns {Function} Returns the new assigner function. - */ - function createAssigner(assigner) { - return baseRest(function (object, sources) { - var index = -1, - length = sources.length, - customizer = length > 1 ? sources[length - 1] : undefined, - guard = length > 2 ? sources[2] : undefined; - - customizer = - assigner.length > 3 && typeof customizer == 'function' - ? (length--, customizer) - : undefined; - - if (guard && isIterateeCall(sources[0], sources[1], guard)) { - customizer = length < 3 ? undefined : customizer; - length = 1; - } - object = Object(object); - while (++index < length) { - var source = sources[index]; - if (source) { - assigner(object, source, index, customizer); - } - } - return object; - }); - } - - /** - * Creates a `baseEach` or `baseEachRight` function. - * - * @private - * @param {Function} eachFunc The function to iterate over a collection. - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {Function} Returns the new base function. - */ - function createBaseEach(eachFunc, fromRight) { - return function (collection, iteratee) { - if (collection == null) { - return collection; - } - if (!isArrayLike(collection)) { - return eachFunc(collection, iteratee); - } - var length = collection.length, - index = fromRight ? length : -1, - iterable = Object(collection); - - while (fromRight ? index-- : ++index < length) { - if (iteratee(iterable[index], index, iterable) === false) { - break; - } - } - return collection; - }; - } - - /** - * Creates a base function for methods like `_.forIn` and `_.forOwn`. - * - * @private - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {Function} Returns the new base function. - */ - function createBaseFor(fromRight) { - return function (object, iteratee, keysFunc) { - var index = -1, - iterable = Object(object), - props = keysFunc(object), - length = props.length; - - while (length--) { - var key = props[fromRight ? length : ++index]; - if (iteratee(iterable[key], key, iterable) === false) { - break; - } - } - return object; - }; - } - - /** - * Creates a function that wraps `func` to invoke it with the optional `this` - * binding of `thisArg`. - * - * @private - * @param {Function} func The function to wrap. - * @param {number} bitmask The bitmask flags. See `createWrap` for more details. - * @param {*} [thisArg] The `this` binding of `func`. - * @returns {Function} Returns the new wrapped function. - */ - function createBind(func, bitmask, thisArg) { - var isBind = bitmask & WRAP_BIND_FLAG, - Ctor = createCtor(func); - - function wrapper() { - var fn = - this && this !== root && this instanceof wrapper - ? Ctor - : func; - return fn.apply(isBind ? thisArg : this, arguments); - } - return wrapper; - } - - /** - * Creates a function like `_.lowerFirst`. - * - * @private - * @param {string} methodName The name of the `String` case method to use. - * @returns {Function} Returns the new case function. - */ - function createCaseFirst(methodName) { - return function (string) { - string = toString(string); - - var strSymbols = hasUnicode(string) - ? stringToArray(string) - : undefined; - - var chr = strSymbols ? strSymbols[0] : string.charAt(0); - - var trailing = strSymbols - ? castSlice(strSymbols, 1).join('') - : string.slice(1); - - return chr[methodName]() + trailing; - }; - } - - /** - * Creates a function like `_.camelCase`. - * - * @private - * @param {Function} callback The function to combine each word. - * @returns {Function} Returns the new compounder function. - */ - function createCompounder(callback) { - return function (string) { - return arrayReduce( - words(deburr(string).replace(reApos, '')), - callback, - '' - ); - }; - } - - /** - * Creates a function that produces an instance of `Ctor` regardless of - * whether it was invoked as part of a `new` expression or by `call` or `apply`. - * - * @private - * @param {Function} Ctor The constructor to wrap. - * @returns {Function} Returns the new wrapped function. - */ - function createCtor(Ctor) { - return function () { - // Use a `switch` statement to work with class constructors. See - // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist - // for more details. - var args = arguments; - switch (args.length) { - case 0: - return new Ctor(); - case 1: - return new Ctor(args[0]); - case 2: - return new Ctor(args[0], args[1]); - case 3: - return new Ctor(args[0], args[1], args[2]); - case 4: - return new Ctor(args[0], args[1], args[2], args[3]); - case 5: - return new Ctor( - args[0], - args[1], - args[2], - args[3], - args[4] - ); - case 6: - return new Ctor( - args[0], - args[1], - args[2], - args[3], - args[4], - args[5] - ); - case 7: - return new Ctor( - args[0], - args[1], - args[2], - args[3], - args[4], - args[5], - args[6] - ); - } - var thisBinding = baseCreate(Ctor.prototype), - result = Ctor.apply(thisBinding, args); - - // Mimic the constructor's `return` behavior. - // See https://es5.github.io/#x13.2.2 for more details. - return isObject(result) ? result : thisBinding; - }; - } - - /** - * Creates a function that wraps `func` to enable currying. - * - * @private - * @param {Function} func The function to wrap. - * @param {number} bitmask The bitmask flags. See `createWrap` for more details. - * @param {number} arity The arity of `func`. - * @returns {Function} Returns the new wrapped function. - */ - function createCurry(func, bitmask, arity) { - var Ctor = createCtor(func); - - function wrapper() { - var length = arguments.length, - args = Array(length), - index = length, - placeholder = getHolder(wrapper); - - while (index--) { - args[index] = arguments[index]; - } - var holders = - length < 3 && - args[0] !== placeholder && - args[length - 1] !== placeholder - ? [] - : replaceHolders(args, placeholder); - - length -= holders.length; - if (length < arity) { - return createRecurry( - func, - bitmask, - createHybrid, - wrapper.placeholder, - undefined, - args, - holders, - undefined, - undefined, - arity - length - ); - } - var fn = - this && this !== root && this instanceof wrapper - ? Ctor - : func; - return apply(fn, this, args); - } - return wrapper; - } - - /** - * Creates a `_.find` or `_.findLast` function. - * - * @private - * @param {Function} findIndexFunc The function to find the collection index. - * @returns {Function} Returns the new find function. - */ - function createFind(findIndexFunc) { - return function (collection, predicate, fromIndex) { - var iterable = Object(collection); - if (!isArrayLike(collection)) { - var iteratee = getIteratee(predicate, 3); - collection = keys(collection); - predicate = function (key) { - return iteratee(iterable[key], key, iterable); - }; - } - var index = findIndexFunc(collection, predicate, fromIndex); - return index > -1 - ? iterable[iteratee ? collection[index] : index] - : undefined; - }; - } - - /** - * Creates a `_.flow` or `_.flowRight` function. - * - * @private - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {Function} Returns the new flow function. - */ - function createFlow(fromRight) { - return flatRest(function (funcs) { - var length = funcs.length, - index = length, - prereq = LodashWrapper.prototype.thru; - - if (fromRight) { - funcs.reverse(); - } - while (index--) { - var func = funcs[index]; - if (typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - if (prereq && !wrapper && getFuncName(func) == 'wrapper') { - var wrapper = new LodashWrapper([], true); - } - } - index = wrapper ? index : length; - while (++index < length) { - func = funcs[index]; - - var funcName = getFuncName(func), - data = funcName == 'wrapper' ? getData(func) : undefined; - - if ( - data && - isLaziable(data[0]) && - data[1] == - (WRAP_ARY_FLAG | - WRAP_CURRY_FLAG | - WRAP_PARTIAL_FLAG | - WRAP_REARG_FLAG) && - !data[4].length && - data[9] == 1 - ) { - wrapper = wrapper[getFuncName(data[0])].apply( - wrapper, - data[3] - ); - } else { - wrapper = - func.length == 1 && isLaziable(func) - ? wrapper[funcName]() - : wrapper.thru(func); - } - } - return function () { - var args = arguments, - value = args[0]; - - if (wrapper && args.length == 1 && isArray(value)) { - return wrapper.plant(value).value(); - } - var index = 0, - result = length ? funcs[index].apply(this, args) : value; - - while (++index < length) { - result = funcs[index].call(this, result); - } - return result; - }; - }); - } - - /** - * Creates a function that wraps `func` to invoke it with optional `this` - * binding of `thisArg`, partial application, and currying. - * - * @private - * @param {Function|string} func The function or method name to wrap. - * @param {number} bitmask The bitmask flags. See `createWrap` for more details. - * @param {*} [thisArg] The `this` binding of `func`. - * @param {Array} [partials] The arguments to prepend to those provided to - * the new function. - * @param {Array} [holders] The `partials` placeholder indexes. - * @param {Array} [partialsRight] The arguments to append to those provided - * to the new function. - * @param {Array} [holdersRight] The `partialsRight` placeholder indexes. - * @param {Array} [argPos] The argument positions of the new function. - * @param {number} [ary] The arity cap of `func`. - * @param {number} [arity] The arity of `func`. - * @returns {Function} Returns the new wrapped function. - */ - function createHybrid( - func, - bitmask, - thisArg, - partials, - holders, - partialsRight, - holdersRight, - argPos, - ary, - arity - ) { - var isAry = bitmask & WRAP_ARY_FLAG, - isBind = bitmask & WRAP_BIND_FLAG, - isBindKey = bitmask & WRAP_BIND_KEY_FLAG, - isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG), - isFlip = bitmask & WRAP_FLIP_FLAG, - Ctor = isBindKey ? undefined : createCtor(func); - - function wrapper() { - var length = arguments.length, - args = Array(length), - index = length; - - while (index--) { - args[index] = arguments[index]; - } - if (isCurried) { - var placeholder = getHolder(wrapper), - holdersCount = countHolders(args, placeholder); - } - if (partials) { - args = composeArgs(args, partials, holders, isCurried); - } - if (partialsRight) { - args = composeArgsRight( - args, - partialsRight, - holdersRight, - isCurried - ); - } - length -= holdersCount; - if (isCurried && length < arity) { - var newHolders = replaceHolders(args, placeholder); - return createRecurry( - func, - bitmask, - createHybrid, - wrapper.placeholder, - thisArg, - args, - newHolders, - argPos, - ary, - arity - length - ); - } - var thisBinding = isBind ? thisArg : this, - fn = isBindKey ? thisBinding[func] : func; - - length = args.length; - if (argPos) { - args = reorder(args, argPos); - } else if (isFlip && length > 1) { - args.reverse(); - } - if (isAry && ary < length) { - args.length = ary; - } - if (this && this !== root && this instanceof wrapper) { - fn = Ctor || createCtor(fn); - } - return fn.apply(thisBinding, args); - } - return wrapper; - } - - /** - * Creates a function like `_.invertBy`. - * - * @private - * @param {Function} setter The function to set accumulator values. - * @param {Function} toIteratee The function to resolve iteratees. - * @returns {Function} Returns the new inverter function. - */ - function createInverter(setter, toIteratee) { - return function (object, iteratee) { - return baseInverter(object, setter, toIteratee(iteratee), {}); - }; - } - - /** - * Creates a function that performs a mathematical operation on two values. - * - * @private - * @param {Function} operator The function to perform the operation. - * @param {number} [defaultValue] The value used for `undefined` arguments. - * @returns {Function} Returns the new mathematical operation function. - */ - function createMathOperation(operator, defaultValue) { - return function (value, other) { - var result; - if (value === undefined && other === undefined) { - return defaultValue; - } - if (value !== undefined) { - result = value; - } - if (other !== undefined) { - if (result === undefined) { - return other; - } - if (typeof value == 'string' || typeof other == 'string') { - value = baseToString(value); - other = baseToString(other); - } else { - value = baseToNumber(value); - other = baseToNumber(other); - } - result = operator(value, other); - } - return result; - }; - } - - /** - * Creates a function like `_.over`. - * - * @private - * @param {Function} arrayFunc The function to iterate over iteratees. - * @returns {Function} Returns the new over function. - */ - function createOver(arrayFunc) { - return flatRest(function (iteratees) { - iteratees = arrayMap(iteratees, baseUnary(getIteratee())); - return baseRest(function (args) { - var thisArg = this; - return arrayFunc(iteratees, function (iteratee) { - return apply(iteratee, thisArg, args); - }); - }); - }); - } - - /** - * Creates the padding for `string` based on `length`. The `chars` string - * is truncated if the number of characters exceeds `length`. - * - * @private - * @param {number} length The padding length. - * @param {string} [chars=' '] The string used as padding. - * @returns {string} Returns the padding for `string`. - */ - function createPadding(length, chars) { - chars = chars === undefined ? ' ' : baseToString(chars); - - var charsLength = chars.length; - if (charsLength < 2) { - return charsLength ? baseRepeat(chars, length) : chars; - } - var result = baseRepeat( - chars, - nativeCeil(length / stringSize(chars)) - ); - return hasUnicode(chars) - ? castSlice(stringToArray(result), 0, length).join('') - : result.slice(0, length); - } - - /** - * Creates a function that wraps `func` to invoke it with the `this` binding - * of `thisArg` and `partials` prepended to the arguments it receives. - * - * @private - * @param {Function} func The function to wrap. - * @param {number} bitmask The bitmask flags. See `createWrap` for more details. - * @param {*} thisArg The `this` binding of `func`. - * @param {Array} partials The arguments to prepend to those provided to - * the new function. - * @returns {Function} Returns the new wrapped function. - */ - function createPartial(func, bitmask, thisArg, partials) { - var isBind = bitmask & WRAP_BIND_FLAG, - Ctor = createCtor(func); - - function wrapper() { - var argsIndex = -1, - argsLength = arguments.length, - leftIndex = -1, - leftLength = partials.length, - args = Array(leftLength + argsLength), - fn = - this && this !== root && this instanceof wrapper - ? Ctor - : func; - - while (++leftIndex < leftLength) { - args[leftIndex] = partials[leftIndex]; - } - while (argsLength--) { - args[leftIndex++] = arguments[++argsIndex]; - } - return apply(fn, isBind ? thisArg : this, args); - } - return wrapper; - } - - /** - * Creates a `_.range` or `_.rangeRight` function. - * - * @private - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {Function} Returns the new range function. - */ - function createRange(fromRight) { - return function (start, end, step) { - if ( - step && - typeof step != 'number' && - isIterateeCall(start, end, step) - ) { - end = step = undefined; - } - // Ensure the sign of `-0` is preserved. - start = toFinite(start); - if (end === undefined) { - end = start; - start = 0; - } else { - end = toFinite(end); - } - step = - step === undefined ? (start < end ? 1 : -1) : toFinite(step); - return baseRange(start, end, step, fromRight); - }; - } - - /** - * Creates a function that performs a relational operation on two values. - * - * @private - * @param {Function} operator The function to perform the operation. - * @returns {Function} Returns the new relational operation function. - */ - function createRelationalOperation(operator) { - return function (value, other) { - if (!(typeof value == 'string' && typeof other == 'string')) { - value = toNumber(value); - other = toNumber(other); - } - return operator(value, other); - }; - } - - /** - * Creates a function that wraps `func` to continue currying. - * - * @private - * @param {Function} func The function to wrap. - * @param {number} bitmask The bitmask flags. See `createWrap` for more details. - * @param {Function} wrapFunc The function to create the `func` wrapper. - * @param {*} placeholder The placeholder value. - * @param {*} [thisArg] The `this` binding of `func`. - * @param {Array} [partials] The arguments to prepend to those provided to - * the new function. - * @param {Array} [holders] The `partials` placeholder indexes. - * @param {Array} [argPos] The argument positions of the new function. - * @param {number} [ary] The arity cap of `func`. - * @param {number} [arity] The arity of `func`. - * @returns {Function} Returns the new wrapped function. - */ - function createRecurry( - func, - bitmask, - wrapFunc, - placeholder, - thisArg, - partials, - holders, - argPos, - ary, - arity - ) { - var isCurry = bitmask & WRAP_CURRY_FLAG, - newHolders = isCurry ? holders : undefined, - newHoldersRight = isCurry ? undefined : holders, - newPartials = isCurry ? partials : undefined, - newPartialsRight = isCurry ? undefined : partials; - - bitmask |= isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG; - bitmask &= ~(isCurry - ? WRAP_PARTIAL_RIGHT_FLAG - : WRAP_PARTIAL_FLAG); - - if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) { - bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG); - } - var newData = [ - func, - bitmask, - thisArg, - newPartials, - newHolders, - newPartialsRight, - newHoldersRight, - argPos, - ary, - arity, - ]; - - var result = wrapFunc.apply(undefined, newData); - if (isLaziable(func)) { - setData(result, newData); - } - result.placeholder = placeholder; - return setWrapToString(result, func, bitmask); - } - - /** - * Creates a function like `_.round`. - * - * @private - * @param {string} methodName The name of the `Math` method to use when rounding. - * @returns {Function} Returns the new round function. - */ - function createRound(methodName) { - var func = Math[methodName]; - return function (number, precision) { - number = toNumber(number); - precision = - precision == null ? 0 : nativeMin(toInteger(precision), 292); - if (precision) { - // Shift with exponential notation to avoid floating-point issues. - // See [MDN](https://mdn.io/round#Examples) for more details. - var pair = (toString(number) + 'e').split('e'), - value = func(pair[0] + 'e' + (+pair[1] + precision)); - - pair = (toString(value) + 'e').split('e'); - return +(pair[0] + 'e' + (+pair[1] - precision)); - } - return func(number); - }; - } - - /** - * Creates a set object of `values`. - * - * @private - * @param {Array} values The values to add to the set. - * @returns {Object} Returns the new set. - */ - var createSet = !( - Set && 1 / setToArray(new Set([, -0]))[1] == INFINITY - ) - ? noop - : function (values) { - return new Set(values); - }; - - /** - * Creates a `_.toPairs` or `_.toPairsIn` function. - * - * @private - * @param {Function} keysFunc The function to get the keys of a given object. - * @returns {Function} Returns the new pairs function. - */ - function createToPairs(keysFunc) { - return function (object) { - var tag = getTag(object); - if (tag == mapTag) { - return mapToArray(object); - } - if (tag == setTag) { - return setToPairs(object); - } - return baseToPairs(object, keysFunc(object)); - }; - } - - /** - * Creates a function that either curries or invokes `func` with optional - * `this` binding and partially applied arguments. - * - * @private - * @param {Function|string} func The function or method name to wrap. - * @param {number} bitmask The bitmask flags. - * 1 - `_.bind` - * 2 - `_.bindKey` - * 4 - `_.curry` or `_.curryRight` of a bound function - * 8 - `_.curry` - * 16 - `_.curryRight` - * 32 - `_.partial` - * 64 - `_.partialRight` - * 128 - `_.rearg` - * 256 - `_.ary` - * 512 - `_.flip` - * @param {*} [thisArg] The `this` binding of `func`. - * @param {Array} [partials] The arguments to be partially applied. - * @param {Array} [holders] The `partials` placeholder indexes. - * @param {Array} [argPos] The argument positions of the new function. - * @param {number} [ary] The arity cap of `func`. - * @param {number} [arity] The arity of `func`. - * @returns {Function} Returns the new wrapped function. - */ - function createWrap( - func, - bitmask, - thisArg, - partials, - holders, - argPos, - ary, - arity - ) { - var isBindKey = bitmask & WRAP_BIND_KEY_FLAG; - if (!isBindKey && typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - var length = partials ? partials.length : 0; - if (!length) { - bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG); - partials = holders = undefined; - } - ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0); - arity = arity === undefined ? arity : toInteger(arity); - length -= holders ? holders.length : 0; - - if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) { - var partialsRight = partials, - holdersRight = holders; - - partials = holders = undefined; - } - var data = isBindKey ? undefined : getData(func); - - var newData = [ - func, - bitmask, - thisArg, - partials, - holders, - partialsRight, - holdersRight, - argPos, - ary, - arity, - ]; - - if (data) { - mergeData(newData, data); - } - func = newData[0]; - bitmask = newData[1]; - thisArg = newData[2]; - partials = newData[3]; - holders = newData[4]; - arity = newData[9] = - newData[9] === undefined - ? isBindKey - ? 0 - : func.length - : nativeMax(newData[9] - length, 0); - - if ( - !arity && - bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG) - ) { - bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG); - } - if (!bitmask || bitmask == WRAP_BIND_FLAG) { - var result = createBind(func, bitmask, thisArg); - } else if ( - bitmask == WRAP_CURRY_FLAG || - bitmask == WRAP_CURRY_RIGHT_FLAG - ) { - result = createCurry(func, bitmask, arity); - } else if ( - (bitmask == WRAP_PARTIAL_FLAG || - bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && - !holders.length - ) { - result = createPartial(func, bitmask, thisArg, partials); - } else { - result = createHybrid.apply(undefined, newData); - } - var setter = data ? baseSetData : setData; - return setWrapToString(setter(result, newData), func, bitmask); - } - - /** - * Used by `_.defaults` to customize its `_.assignIn` use to assign properties - * of source objects to the destination object for all destination properties - * that resolve to `undefined`. - * - * @private - * @param {*} objValue The destination value. - * @param {*} srcValue The source value. - * @param {string} key The key of the property to assign. - * @param {Object} object The parent object of `objValue`. - * @returns {*} Returns the value to assign. - */ - function customDefaultsAssignIn(objValue, srcValue, key, object) { - if ( - objValue === undefined || - (eq(objValue, objectProto[key]) && - !hasOwnProperty.call(object, key)) - ) { - return srcValue; - } - return objValue; - } - - /** - * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source - * objects into destination objects that are passed thru. - * - * @private - * @param {*} objValue The destination value. - * @param {*} srcValue The source value. - * @param {string} key The key of the property to merge. - * @param {Object} object The parent object of `objValue`. - * @param {Object} source The parent object of `srcValue`. - * @param {Object} [stack] Tracks traversed source values and their merged - * counterparts. - * @returns {*} Returns the value to assign. - */ - function customDefaultsMerge( - objValue, - srcValue, - key, - object, - source, - stack - ) { - if (isObject(objValue) && isObject(srcValue)) { - // Recursively merge objects and arrays (susceptible to call stack limits). - stack.set(srcValue, objValue); - baseMerge( - objValue, - srcValue, - undefined, - customDefaultsMerge, - stack - ); - stack['delete'](srcValue); - } - return objValue; - } - - /** - * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain - * objects. - * - * @private - * @param {*} value The value to inspect. - * @param {string} key The key of the property to inspect. - * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`. - */ - function customOmitClone(value) { - return isPlainObject(value) ? undefined : value; - } - - /** - * A specialized version of `baseIsEqualDeep` for arrays with support for - * partial deep comparisons. - * - * @private - * @param {Array} array The array to compare. - * @param {Array} other The other array to compare. - * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. - * @param {Function} customizer The function to customize comparisons. - * @param {Function} equalFunc The function to determine equivalents of values. - * @param {Object} stack Tracks traversed `array` and `other` objects. - * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. - */ - function equalArrays( - array, - other, - bitmask, - customizer, - equalFunc, - stack - ) { - var isPartial = bitmask & COMPARE_PARTIAL_FLAG, - arrLength = array.length, - othLength = other.length; - - if ( - arrLength != othLength && - !(isPartial && othLength > arrLength) - ) { - return false; - } - // Assume cyclic values are equal. - var stacked = stack.get(array); - if (stacked && stack.get(other)) { - return stacked == other; - } - var index = -1, - result = true, - seen = - bitmask & COMPARE_UNORDERED_FLAG ? new SetCache() : undefined; - - stack.set(array, other); - stack.set(other, array); - - // Ignore non-index properties. - while (++index < arrLength) { - var arrValue = array[index], - othValue = other[index]; - - if (customizer) { - var compared = isPartial - ? customizer(othValue, arrValue, index, other, array, stack) - : customizer( - arrValue, - othValue, - index, - array, - other, - stack - ); - } - if (compared !== undefined) { - if (compared) { - continue; - } - result = false; - break; - } - // Recursively compare arrays (susceptible to call stack limits). - if (seen) { - if ( - !arraySome(other, function (othValue, othIndex) { - if ( - !cacheHas(seen, othIndex) && - (arrValue === othValue || - equalFunc( - arrValue, - othValue, - bitmask, - customizer, - stack - )) - ) { - return seen.push(othIndex); - } - }) - ) { - result = false; - break; - } - } else if ( - !( - arrValue === othValue || - equalFunc(arrValue, othValue, bitmask, customizer, stack) - ) - ) { - result = false; - break; - } - } - stack['delete'](array); - stack['delete'](other); - return result; - } - - /** - * A specialized version of `baseIsEqualDeep` for comparing objects of - * the same `toStringTag`. - * - * **Note:** This function only supports comparing values with tags of - * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. - * - * @private - * @param {Object} object The object to compare. - * @param {Object} other The other object to compare. - * @param {string} tag The `toStringTag` of the objects to compare. - * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. - * @param {Function} customizer The function to customize comparisons. - * @param {Function} equalFunc The function to determine equivalents of values. - * @param {Object} stack Tracks traversed `object` and `other` objects. - * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. - */ - function equalByTag( - object, - other, - tag, - bitmask, - customizer, - equalFunc, - stack - ) { - switch (tag) { - case dataViewTag: - if ( - object.byteLength != other.byteLength || - object.byteOffset != other.byteOffset - ) { - return false; - } - object = object.buffer; - other = other.buffer; - - case arrayBufferTag: - if ( - object.byteLength != other.byteLength || - !equalFunc(new Uint8Array(object), new Uint8Array(other)) - ) { - return false; - } - return true; - - case boolTag: - case dateTag: - case numberTag: - // Coerce booleans to `1` or `0` and dates to milliseconds. - // Invalid dates are coerced to `NaN`. - return eq(+object, +other); - - case errorTag: - return ( - object.name == other.name && object.message == other.message - ); - - case regexpTag: - case stringTag: - // Coerce regexes to strings and treat strings, primitives and objects, - // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring - // for more details. - return object == other + ''; - - case mapTag: - var convert = mapToArray; - - case setTag: - var isPartial = bitmask & COMPARE_PARTIAL_FLAG; - convert || (convert = setToArray); - - if (object.size != other.size && !isPartial) { - return false; - } - // Assume cyclic values are equal. - var stacked = stack.get(object); - if (stacked) { - return stacked == other; - } - bitmask |= COMPARE_UNORDERED_FLAG; - - // Recursively compare objects (susceptible to call stack limits). - stack.set(object, other); - var result = equalArrays( - convert(object), - convert(other), - bitmask, - customizer, - equalFunc, - stack - ); - stack['delete'](object); - return result; - - case symbolTag: - if (symbolValueOf) { - return ( - symbolValueOf.call(object) == symbolValueOf.call(other) - ); - } - } - return false; - } - - /** - * A specialized version of `baseIsEqualDeep` for objects with support for - * partial deep comparisons. - * - * @private - * @param {Object} object The object to compare. - * @param {Object} other The other object to compare. - * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. - * @param {Function} customizer The function to customize comparisons. - * @param {Function} equalFunc The function to determine equivalents of values. - * @param {Object} stack Tracks traversed `object` and `other` objects. - * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. - */ - function equalObjects( - object, - other, - bitmask, - customizer, - equalFunc, - stack - ) { - var isPartial = bitmask & COMPARE_PARTIAL_FLAG, - objProps = getAllKeys(object), - objLength = objProps.length, - othProps = getAllKeys(other), - othLength = othProps.length; - - if (objLength != othLength && !isPartial) { - return false; - } - var index = objLength; - while (index--) { - var key = objProps[index]; - if ( - !(isPartial ? key in other : hasOwnProperty.call(other, key)) - ) { - return false; - } - } - // Assume cyclic values are equal. - var stacked = stack.get(object); - if (stacked && stack.get(other)) { - return stacked == other; - } - var result = true; - stack.set(object, other); - stack.set(other, object); - - var skipCtor = isPartial; - while (++index < objLength) { - key = objProps[index]; - var objValue = object[key], - othValue = other[key]; - - if (customizer) { - var compared = isPartial - ? customizer(othValue, objValue, key, other, object, stack) - : customizer(objValue, othValue, key, object, other, stack); - } - // Recursively compare objects (susceptible to call stack limits). - if ( - !(compared === undefined - ? objValue === othValue || - equalFunc(objValue, othValue, bitmask, customizer, stack) - : compared) - ) { - result = false; - break; - } - skipCtor || (skipCtor = key == 'constructor'); - } - if (result && !skipCtor) { - var objCtor = object.constructor, - othCtor = other.constructor; - - // Non `Object` object instances with different constructors are not equal. - if ( - objCtor != othCtor && - 'constructor' in object && - 'constructor' in other && - !( - typeof objCtor == 'function' && - objCtor instanceof objCtor && - typeof othCtor == 'function' && - othCtor instanceof othCtor - ) - ) { - result = false; - } - } - stack['delete'](object); - stack['delete'](other); - return result; - } - - /** - * A specialized version of `baseRest` which flattens the rest array. - * - * @private - * @param {Function} func The function to apply a rest parameter to. - * @returns {Function} Returns the new function. - */ - function flatRest(func) { - return setToString(overRest(func, undefined, flatten), func + ''); - } - - /** - * Creates an array of own enumerable property names and symbols of `object`. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names and symbols. - */ - function getAllKeys(object) { - return baseGetAllKeys(object, keys, getSymbols); - } - - /** - * Creates an array of own and inherited enumerable property names and - * symbols of `object`. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names and symbols. - */ - function getAllKeysIn(object) { - return baseGetAllKeys(object, keysIn, getSymbolsIn); - } - - /** - * Gets metadata for `func`. - * - * @private - * @param {Function} func The function to query. - * @returns {*} Returns the metadata for `func`. - */ - var getData = !metaMap - ? noop - : function (func) { - return metaMap.get(func); - }; - - /** - * Gets the name of `func`. - * - * @private - * @param {Function} func The function to query. - * @returns {string} Returns the function name. - */ - function getFuncName(func) { - var result = func.name + '', - array = realNames[result], - length = hasOwnProperty.call(realNames, result) - ? array.length - : 0; - - while (length--) { - var data = array[length], - otherFunc = data.func; - if (otherFunc == null || otherFunc == func) { - return data.name; - } - } - return result; - } - - /** - * Gets the argument placeholder value for `func`. - * - * @private - * @param {Function} func The function to inspect. - * @returns {*} Returns the placeholder value. - */ - function getHolder(func) { - var object = hasOwnProperty.call(lodash, 'placeholder') - ? lodash - : func; - return object.placeholder; - } - - /** - * Gets the appropriate "iteratee" function. If `_.iteratee` is customized, - * this function returns the custom method, otherwise it returns `baseIteratee`. - * If arguments are provided, the chosen function is invoked with them and - * its result is returned. - * - * @private - * @param {*} [value] The value to convert to an iteratee. - * @param {number} [arity] The arity of the created iteratee. - * @returns {Function} Returns the chosen function or its result. - */ - function getIteratee() { - var result = lodash.iteratee || iteratee; - result = result === iteratee ? baseIteratee : result; - return arguments.length - ? result(arguments[0], arguments[1]) - : result; - } - - /** - * Gets the data for `map`. - * - * @private - * @param {Object} map The map to query. - * @param {string} key The reference key. - * @returns {*} Returns the map data. - */ - function getMapData(map, key) { - var data = map.__data__; - return isKeyable(key) - ? data[typeof key == 'string' ? 'string' : 'hash'] - : data.map; - } - - /** - * Gets the property names, values, and compare flags of `object`. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the match data of `object`. - */ - function getMatchData(object) { - var result = keys(object), - length = result.length; - - while (length--) { - var key = result[length], - value = object[key]; - - result[length] = [key, value, isStrictComparable(value)]; - } - return result; - } - - /** - * Gets the native function at `key` of `object`. - * - * @private - * @param {Object} object The object to query. - * @param {string} key The key of the method to get. - * @returns {*} Returns the function if it's native, else `undefined`. - */ - function getNative(object, key) { - var value = getValue(object, key); - return baseIsNative(value) ? value : undefined; - } - - /** - * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. - * - * @private - * @param {*} value The value to query. - * @returns {string} Returns the raw `toStringTag`. - */ - function getRawTag(value) { - var isOwn = hasOwnProperty.call(value, symToStringTag), - tag = value[symToStringTag]; - - try { - value[symToStringTag] = undefined; - var unmasked = true; - } catch (e) {} - - var result = nativeObjectToString.call(value); - if (unmasked) { - if (isOwn) { - value[symToStringTag] = tag; - } else { - delete value[symToStringTag]; - } - } - return result; - } - - /** - * Creates an array of the own enumerable symbols of `object`. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of symbols. - */ - var getSymbols = !nativeGetSymbols - ? stubArray - : function (object) { - if (object == null) { - return []; - } - object = Object(object); - return arrayFilter( - nativeGetSymbols(object), - function (symbol) { - return propertyIsEnumerable.call(object, symbol); - } - ); - }; - - /** - * Creates an array of the own and inherited enumerable symbols of `object`. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of symbols. - */ - var getSymbolsIn = !nativeGetSymbols - ? stubArray - : function (object) { - var result = []; - while (object) { - arrayPush(result, getSymbols(object)); - object = getPrototype(object); - } - return result; - }; - - /** - * Gets the `toStringTag` of `value`. - * - * @private - * @param {*} value The value to query. - * @returns {string} Returns the `toStringTag`. - */ - var getTag = baseGetTag; - - // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6. - if ( - (DataView && - getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) || - (Map && getTag(new Map()) != mapTag) || - (Promise && getTag(Promise.resolve()) != promiseTag) || - (Set && getTag(new Set()) != setTag) || - (WeakMap && getTag(new WeakMap()) != weakMapTag) - ) { - getTag = function (value) { - var result = baseGetTag(value), - Ctor = result == objectTag ? value.constructor : undefined, - ctorString = Ctor ? toSource(Ctor) : ''; - - if (ctorString) { - switch (ctorString) { - case dataViewCtorString: - return dataViewTag; - case mapCtorString: - return mapTag; - case promiseCtorString: - return promiseTag; - case setCtorString: - return setTag; - case weakMapCtorString: - return weakMapTag; - } - } - return result; - }; - } - - /** - * Gets the view, applying any `transforms` to the `start` and `end` positions. - * - * @private - * @param {number} start The start of the view. - * @param {number} end The end of the view. - * @param {Array} transforms The transformations to apply to the view. - * @returns {Object} Returns an object containing the `start` and `end` - * positions of the view. - */ - function getView(start, end, transforms) { - var index = -1, - length = transforms.length; - - while (++index < length) { - var data = transforms[index], - size = data.size; - - switch (data.type) { - case 'drop': - start += size; - break; - case 'dropRight': - end -= size; - break; - case 'take': - end = nativeMin(end, start + size); - break; - case 'takeRight': - start = nativeMax(start, end - size); - break; - } - } - return { start: start, end: end }; - } - - /** - * Extracts wrapper details from the `source` body comment. - * - * @private - * @param {string} source The source to inspect. - * @returns {Array} Returns the wrapper details. - */ - function getWrapDetails(source) { - var match = source.match(reWrapDetails); - return match ? match[1].split(reSplitDetails) : []; - } - - /** - * Checks if `path` exists on `object`. - * - * @private - * @param {Object} object The object to query. - * @param {Array|string} path The path to check. - * @param {Function} hasFunc The function to check properties. - * @returns {boolean} Returns `true` if `path` exists, else `false`. - */ - function hasPath(object, path, hasFunc) { - path = castPath(path, object); - - var index = -1, - length = path.length, - result = false; - - while (++index < length) { - var key = toKey(path[index]); - if (!(result = object != null && hasFunc(object, key))) { - break; - } - object = object[key]; - } - if (result || ++index != length) { - return result; - } - length = object == null ? 0 : object.length; - return ( - !!length && - isLength(length) && - isIndex(key, length) && - (isArray(object) || isArguments(object)) - ); - } - - /** - * Initializes an array clone. - * - * @private - * @param {Array} array The array to clone. - * @returns {Array} Returns the initialized clone. - */ - function initCloneArray(array) { - var length = array.length, - result = new array.constructor(length); - - // Add properties assigned by `RegExp#exec`. - if ( - length && - typeof array[0] == 'string' && - hasOwnProperty.call(array, 'index') - ) { - result.index = array.index; - result.input = array.input; - } - return result; - } - - /** - * Initializes an object clone. - * - * @private - * @param {Object} object The object to clone. - * @returns {Object} Returns the initialized clone. - */ - function initCloneObject(object) { - return typeof object.constructor == 'function' && - !isPrototype(object) - ? baseCreate(getPrototype(object)) - : {}; - } - - /** - * Initializes an object clone based on its `toStringTag`. - * - * **Note:** This function only supports cloning values with tags of - * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`. - * - * @private - * @param {Object} object The object to clone. - * @param {string} tag The `toStringTag` of the object to clone. - * @param {boolean} [isDeep] Specify a deep clone. - * @returns {Object} Returns the initialized clone. - */ - function initCloneByTag(object, tag, isDeep) { - var Ctor = object.constructor; - switch (tag) { - case arrayBufferTag: - return cloneArrayBuffer(object); - - case boolTag: - case dateTag: - return new Ctor(+object); - - case dataViewTag: - return cloneDataView(object, isDeep); - - case float32Tag: - case float64Tag: - case int8Tag: - case int16Tag: - case int32Tag: - case uint8Tag: - case uint8ClampedTag: - case uint16Tag: - case uint32Tag: - return cloneTypedArray(object, isDeep); - - case mapTag: - return new Ctor(); - - case numberTag: - case stringTag: - return new Ctor(object); - - case regexpTag: - return cloneRegExp(object); - - case setTag: - return new Ctor(); - - case symbolTag: - return cloneSymbol(object); - } - } - - /** - * Inserts wrapper `details` in a comment at the top of the `source` body. - * - * @private - * @param {string} source The source to modify. - * @returns {Array} details The details to insert. - * @returns {string} Returns the modified source. - */ - function insertWrapDetails(source, details) { - var length = details.length; - if (!length) { - return source; - } - var lastIndex = length - 1; - details[lastIndex] = - (length > 1 ? '& ' : '') + details[lastIndex]; - details = details.join(length > 2 ? ', ' : ' '); - return source.replace( - reWrapComment, - '{\n/* [wrapped with ' + details + '] */\n' - ); - } - - /** - * Checks if `value` is a flattenable `arguments` object or array. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is flattenable, else `false`. - */ - function isFlattenable(value) { - return ( - isArray(value) || - isArguments(value) || - !!(spreadableSymbol && value && value[spreadableSymbol]) - ); - } - - /** - * Checks if `value` is a valid array-like index. - * - * @private - * @param {*} value The value to check. - * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. - * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. - */ - function isIndex(value, length) { - var type = typeof value; - length = length == null ? MAX_SAFE_INTEGER : length; - - return ( - !!length && - (type == 'number' || - (type != 'symbol' && reIsUint.test(value))) && - value > -1 && - value % 1 == 0 && - value < length - ); - } - - /** - * Checks if the given arguments are from an iteratee call. - * - * @private - * @param {*} value The potential iteratee value argument. - * @param {*} index The potential iteratee index or key argument. - * @param {*} object The potential iteratee object argument. - * @returns {boolean} Returns `true` if the arguments are from an iteratee call, - * else `false`. - */ - function isIterateeCall(value, index, object) { - if (!isObject(object)) { - return false; - } - var type = typeof index; - if ( - type == 'number' - ? isArrayLike(object) && isIndex(index, object.length) - : type == 'string' && index in object - ) { - return eq(object[index], value); - } - return false; - } - - /** - * Checks if `value` is a property name and not a property path. - * - * @private - * @param {*} value The value to check. - * @param {Object} [object] The object to query keys on. - * @returns {boolean} Returns `true` if `value` is a property name, else `false`. - */ - function isKey(value, object) { - if (isArray(value)) { - return false; - } - var type = typeof value; - if ( - type == 'number' || - type == 'symbol' || - type == 'boolean' || - value == null || - isSymbol(value) - ) { - return true; - } - return ( - reIsPlainProp.test(value) || - !reIsDeepProp.test(value) || - (object != null && value in Object(object)) - ); - } - - /** - * Checks if `value` is suitable for use as unique object key. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is suitable, else `false`. - */ - function isKeyable(value) { - var type = typeof value; - return type == 'string' || - type == 'number' || - type == 'symbol' || - type == 'boolean' - ? value !== '__proto__' - : value === null; - } - - /** - * Checks if `func` has a lazy counterpart. - * - * @private - * @param {Function} func The function to check. - * @returns {boolean} Returns `true` if `func` has a lazy counterpart, - * else `false`. - */ - function isLaziable(func) { - var funcName = getFuncName(func), - other = lodash[funcName]; - - if ( - typeof other != 'function' || - !(funcName in LazyWrapper.prototype) - ) { - return false; - } - if (func === other) { - return true; - } - var data = getData(other); - return !!data && func === data[0]; - } - - /** - * Checks if `func` has its source masked. - * - * @private - * @param {Function} func The function to check. - * @returns {boolean} Returns `true` if `func` is masked, else `false`. - */ - function isMasked(func) { - return !!maskSrcKey && maskSrcKey in func; - } - - /** - * Checks if `func` is capable of being masked. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `func` is maskable, else `false`. - */ - var isMaskable = coreJsData ? isFunction : stubFalse; - - /** - * Checks if `value` is likely a prototype object. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. - */ - function isPrototype(value) { - var Ctor = value && value.constructor, - proto = - (typeof Ctor == 'function' && Ctor.prototype) || objectProto; - - return value === proto; - } - - /** - * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` if suitable for strict - * equality comparisons, else `false`. - */ - function isStrictComparable(value) { - return value === value && !isObject(value); - } - - /** - * A specialized version of `matchesProperty` for source values suitable - * for strict equality comparisons, i.e. `===`. - * - * @private - * @param {string} key The key of the property to get. - * @param {*} srcValue The value to match. - * @returns {Function} Returns the new spec function. - */ - function matchesStrictComparable(key, srcValue) { - return function (object) { - if (object == null) { - return false; - } - return ( - object[key] === srcValue && - (srcValue !== undefined || key in Object(object)) - ); - }; - } - - /** - * A specialized version of `_.memoize` which clears the memoized function's - * cache when it exceeds `MAX_MEMOIZE_SIZE`. - * - * @private - * @param {Function} func The function to have its output memoized. - * @returns {Function} Returns the new memoized function. - */ - function memoizeCapped(func) { - var result = memoize(func, function (key) { - if (cache.size === MAX_MEMOIZE_SIZE) { - cache.clear(); - } - return key; - }); - - var cache = result.cache; - return result; - } - - /** - * Merges the function metadata of `source` into `data`. - * - * Merging metadata reduces the number of wrappers used to invoke a function. - * This is possible because methods like `_.bind`, `_.curry`, and `_.partial` - * may be applied regardless of execution order. Methods like `_.ary` and - * `_.rearg` modify function arguments, making the order in which they are - * executed important, preventing the merging of metadata. However, we make - * an exception for a safe combined case where curried functions have `_.ary` - * and or `_.rearg` applied. - * - * @private - * @param {Array} data The destination metadata. - * @param {Array} source The source metadata. - * @returns {Array} Returns `data`. - */ - function mergeData(data, source) { - var bitmask = data[1], - srcBitmask = source[1], - newBitmask = bitmask | srcBitmask, - isCommon = - newBitmask < - (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG); - - var isCombo = - (srcBitmask == WRAP_ARY_FLAG && bitmask == WRAP_CURRY_FLAG) || - (srcBitmask == WRAP_ARY_FLAG && - bitmask == WRAP_REARG_FLAG && - data[7].length <= source[8]) || - (srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG) && - source[7].length <= source[8] && - bitmask == WRAP_CURRY_FLAG); - - // Exit early if metadata can't be merged. - if (!(isCommon || isCombo)) { - return data; - } - // Use source `thisArg` if available. - if (srcBitmask & WRAP_BIND_FLAG) { - data[2] = source[2]; - // Set when currying a bound function. - newBitmask |= - bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG; - } - // Compose partial arguments. - var value = source[3]; - if (value) { - var partials = data[3]; - data[3] = partials - ? composeArgs(partials, value, source[4]) - : value; - data[4] = partials - ? replaceHolders(data[3], PLACEHOLDER) - : source[4]; - } - // Compose partial right arguments. - value = source[5]; - if (value) { - partials = data[5]; - data[5] = partials - ? composeArgsRight(partials, value, source[6]) - : value; - data[6] = partials - ? replaceHolders(data[5], PLACEHOLDER) - : source[6]; - } - // Use source `argPos` if available. - value = source[7]; - if (value) { - data[7] = value; - } - // Use source `ary` if it's smaller. - if (srcBitmask & WRAP_ARY_FLAG) { - data[8] = - data[8] == null ? source[8] : nativeMin(data[8], source[8]); - } - // Use source `arity` if one is not provided. - if (data[9] == null) { - data[9] = source[9]; - } - // Use source `func` and merge bitmasks. - data[0] = source[0]; - data[1] = newBitmask; - - return data; - } - - /** - * This function is like - * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) - * except that it includes inherited enumerable properties. - * - * @private - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - */ - function nativeKeysIn(object) { - var result = []; - if (object != null) { - for (var key in Object(object)) { - result.push(key); - } - } - return result; - } - - /** - * Converts `value` to a string using `Object.prototype.toString`. - * - * @private - * @param {*} value The value to convert. - * @returns {string} Returns the converted string. - */ - function objectToString(value) { - return nativeObjectToString.call(value); - } - - /** - * A specialized version of `baseRest` which transforms the rest array. - * - * @private - * @param {Function} func The function to apply a rest parameter to. - * @param {number} [start=func.length-1] The start position of the rest parameter. - * @param {Function} transform The rest array transform. - * @returns {Function} Returns the new function. - */ - function overRest(func, start, transform) { - start = nativeMax( - start === undefined ? func.length - 1 : start, - 0 - ); - return function () { - var args = arguments, - index = -1, - length = nativeMax(args.length - start, 0), - array = Array(length); - - while (++index < length) { - array[index] = args[start + index]; - } - index = -1; - var otherArgs = Array(start + 1); - while (++index < start) { - otherArgs[index] = args[index]; - } - otherArgs[start] = transform(array); - return apply(func, this, otherArgs); - }; - } - - /** - * Gets the parent value at `path` of `object`. - * - * @private - * @param {Object} object The object to query. - * @param {Array} path The path to get the parent value of. - * @returns {*} Returns the parent value. - */ - function parent(object, path) { - return path.length < 2 - ? object - : baseGet(object, baseSlice(path, 0, -1)); - } - - /** - * Reorder `array` according to the specified indexes where the element at - * the first index is assigned as the first element, the element at - * the second index is assigned as the second element, and so on. - * - * @private - * @param {Array} array The array to reorder. - * @param {Array} indexes The arranged array indexes. - * @returns {Array} Returns `array`. - */ - function reorder(array, indexes) { - var arrLength = array.length, - length = nativeMin(indexes.length, arrLength), - oldArray = copyArray(array); - - while (length--) { - var index = indexes[length]; - array[length] = isIndex(index, arrLength) - ? oldArray[index] - : undefined; - } - return array; - } - - /** - * Sets metadata for `func`. - * - * **Note:** If this function becomes hot, i.e. is invoked a lot in a short - * period of time, it will trip its breaker and transition to an identity - * function to avoid garbage collection pauses in V8. See - * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070) - * for more details. - * - * @private - * @param {Function} func The function to associate metadata with. - * @param {*} data The metadata. - * @returns {Function} Returns `func`. - */ - var setData = shortOut(baseSetData); - - /** - * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout). - * - * @private - * @param {Function} func The function to delay. - * @param {number} wait The number of milliseconds to delay invocation. - * @returns {number|Object} Returns the timer id or timeout object. - */ - var setTimeout = - ctxSetTimeout || - function (func, wait) { - return root.setTimeout(func, wait); - }; - - /** - * Sets the `toString` method of `func` to return `string`. - * - * @private - * @param {Function} func The function to modify. - * @param {Function} string The `toString` result. - * @returns {Function} Returns `func`. - */ - var setToString = shortOut(baseSetToString); - - /** - * Sets the `toString` method of `wrapper` to mimic the source of `reference` - * with wrapper details in a comment at the top of the source body. - * - * @private - * @param {Function} wrapper The function to modify. - * @param {Function} reference The reference function. - * @param {number} bitmask The bitmask flags. See `createWrap` for more details. - * @returns {Function} Returns `wrapper`. - */ - function setWrapToString(wrapper, reference, bitmask) { - var source = reference + ''; - return setToString( - wrapper, - insertWrapDetails( - source, - updateWrapDetails(getWrapDetails(source), bitmask) - ) - ); - } - - /** - * Creates a function that'll short out and invoke `identity` instead - * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN` - * milliseconds. - * - * @private - * @param {Function} func The function to restrict. - * @returns {Function} Returns the new shortable function. - */ - function shortOut(func) { - var count = 0, - lastCalled = 0; - - return function () { - var stamp = nativeNow(), - remaining = HOT_SPAN - (stamp - lastCalled); - - lastCalled = stamp; - if (remaining > 0) { - if (++count >= HOT_COUNT) { - return arguments[0]; - } - } else { - count = 0; - } - return func.apply(undefined, arguments); - }; - } - - /** - * A specialized version of `_.shuffle` which mutates and sets the size of `array`. - * - * @private - * @param {Array} array The array to shuffle. - * @param {number} [size=array.length] The size of `array`. - * @returns {Array} Returns `array`. - */ - function shuffleSelf(array, size) { - var index = -1, - length = array.length, - lastIndex = length - 1; - - size = size === undefined ? length : size; - while (++index < size) { - var rand = baseRandom(index, lastIndex), - value = array[rand]; - - array[rand] = array[index]; - array[index] = value; - } - array.length = size; - return array; - } - - /** - * Converts `string` to a property path array. - * - * @private - * @param {string} string The string to convert. - * @returns {Array} Returns the property path array. - */ - var stringToPath = memoizeCapped(function (string) { - var result = []; - if (string.charCodeAt(0) === 46 /* . */) { - result.push(''); - } - string.replace( - rePropName, - function (match, number, quote, subString) { - result.push( - quote - ? subString.replace(reEscapeChar, '$1') - : number || match - ); - } - ); - return result; - }); - - /** - * Converts `value` to a string key if it's not a string or symbol. - * - * @private - * @param {*} value The value to inspect. - * @returns {string|symbol} Returns the key. - */ - function toKey(value) { - if (typeof value == 'string' || isSymbol(value)) { - return value; - } - var result = value + ''; - return result == '0' && 1 / value == -INFINITY ? '-0' : result; - } - - /** - * Converts `func` to its source code. - * - * @private - * @param {Function} func The function to convert. - * @returns {string} Returns the source code. - */ - function toSource(func) { - if (func != null) { - try { - return funcToString.call(func); - } catch (e) {} - try { - return func + ''; - } catch (e) {} - } - return ''; - } - - /** - * Updates wrapper `details` based on `bitmask` flags. - * - * @private - * @returns {Array} details The details to modify. - * @param {number} bitmask The bitmask flags. See `createWrap` for more details. - * @returns {Array} Returns `details`. - */ - function updateWrapDetails(details, bitmask) { - arrayEach(wrapFlags, function (pair) { - var value = '_.' + pair[0]; - if (bitmask & pair[1] && !arrayIncludes(details, value)) { - details.push(value); - } - }); - return details.sort(); - } - - /** - * Creates a clone of `wrapper`. - * - * @private - * @param {Object} wrapper The wrapper to clone. - * @returns {Object} Returns the cloned wrapper. - */ - function wrapperClone(wrapper) { - if (wrapper instanceof LazyWrapper) { - return wrapper.clone(); - } - var result = new LodashWrapper( - wrapper.__wrapped__, - wrapper.__chain__ - ); - result.__actions__ = copyArray(wrapper.__actions__); - result.__index__ = wrapper.__index__; - result.__values__ = wrapper.__values__; - return result; - } - - /*------------------------------------------------------------------------*/ - - /** - * Creates an array of elements split into groups the length of `size`. - * If `array` can't be split evenly, the final chunk will be the remaining - * elements. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Array - * @param {Array} array The array to process. - * @param {number} [size=1] The length of each chunk - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {Array} Returns the new array of chunks. - * @example - * - * _.chunk(['a', 'b', 'c', 'd'], 2); - * // => [['a', 'b'], ['c', 'd']] - * - * _.chunk(['a', 'b', 'c', 'd'], 3); - * // => [['a', 'b', 'c'], ['d']] - */ - function chunk(array, size, guard) { - if ( - guard ? isIterateeCall(array, size, guard) : size === undefined - ) { - size = 1; - } else { - size = nativeMax(toInteger(size), 0); - } - var length = array == null ? 0 : array.length; - if (!length || size < 1) { - return []; - } - var index = 0, - resIndex = 0, - result = Array(nativeCeil(length / size)); - - while (index < length) { - result[resIndex++] = baseSlice(array, index, (index += size)); - } - return result; - } - - /** - * Creates an array with all falsey values removed. The values `false`, `null`, - * `0`, `""`, `undefined`, and `NaN` are falsey. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {Array} array The array to compact. - * @returns {Array} Returns the new array of filtered values. - * @example - * - * _.compact([0, 1, false, 2, '', 3]); - * // => [1, 2, 3] - */ - function compact(array) { - var index = -1, - length = array == null ? 0 : array.length, - resIndex = 0, - result = []; - - while (++index < length) { - var value = array[index]; - if (value) { - result[resIndex++] = value; - } - } - return result; - } - - /** - * Creates a new array concatenating `array` with any additional arrays - * and/or values. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The array to concatenate. - * @param {...*} [values] The values to concatenate. - * @returns {Array} Returns the new concatenated array. - * @example - * - * var array = [1]; - * var other = _.concat(array, 2, [3], [[4]]); - * - * console.log(other); - * // => [1, 2, 3, [4]] - * - * console.log(array); - * // => [1] - */ - function concat() { - var length = arguments.length; - if (!length) { - return []; - } - var args = Array(length - 1), - array = arguments[0], - index = length; - - while (index--) { - args[index - 1] = arguments[index]; - } - return arrayPush( - isArray(array) ? copyArray(array) : [array], - baseFlatten(args, 1) - ); - } - - /** - * Creates an array of `array` values not included in the other given arrays - * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * for equality comparisons. The order and references of result values are - * determined by the first array. - * - * **Note:** Unlike `_.pullAll`, this method returns a new array. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {Array} array The array to inspect. - * @param {...Array} [values] The values to exclude. - * @returns {Array} Returns the new array of filtered values. - * @see _.without, _.xor - * @example - * - * _.difference([2, 1], [2, 3]); - * // => [1] - */ - var difference = baseRest(function (array, values) { - return isArrayLikeObject(array) - ? baseDifference( - array, - baseFlatten(values, 1, isArrayLikeObject, true) - ) - : []; - }); - - /** - * This method is like `_.difference` except that it accepts `iteratee` which - * is invoked for each element of `array` and `values` to generate the criterion - * by which they're compared. The order and references of result values are - * determined by the first array. The iteratee is invoked with one argument: - * (value). - * - * **Note:** Unlike `_.pullAllBy`, this method returns a new array. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The array to inspect. - * @param {...Array} [values] The values to exclude. - * @param {Function} [iteratee=_.identity] The iteratee invoked per element. - * @returns {Array} Returns the new array of filtered values. - * @example - * - * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor); - * // => [1.2] - * - * // The `_.property` iteratee shorthand. - * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x'); - * // => [{ 'x': 2 }] - */ - var differenceBy = baseRest(function (array, values) { - var iteratee = last(values); - if (isArrayLikeObject(iteratee)) { - iteratee = undefined; - } - return isArrayLikeObject(array) - ? baseDifference( - array, - baseFlatten(values, 1, isArrayLikeObject, true), - getIteratee(iteratee, 2) - ) - : []; - }); - - /** - * This method is like `_.difference` except that it accepts `comparator` - * which is invoked to compare elements of `array` to `values`. The order and - * references of result values are determined by the first array. The comparator - * is invoked with two arguments: (arrVal, othVal). - * - * **Note:** Unlike `_.pullAllWith`, this method returns a new array. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The array to inspect. - * @param {...Array} [values] The values to exclude. - * @param {Function} [comparator] The comparator invoked per element. - * @returns {Array} Returns the new array of filtered values. - * @example - * - * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; - * - * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual); - * // => [{ 'x': 2, 'y': 1 }] - */ - var differenceWith = baseRest(function (array, values) { - var comparator = last(values); - if (isArrayLikeObject(comparator)) { - comparator = undefined; - } - return isArrayLikeObject(array) - ? baseDifference( - array, - baseFlatten(values, 1, isArrayLikeObject, true), - undefined, - comparator - ) - : []; - }); - - /** - * Creates a slice of `array` with `n` elements dropped from the beginning. - * - * @static - * @memberOf _ - * @since 0.5.0 - * @category Array - * @param {Array} array The array to query. - * @param {number} [n=1] The number of elements to drop. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {Array} Returns the slice of `array`. - * @example - * - * _.drop([1, 2, 3]); - * // => [2, 3] - * - * _.drop([1, 2, 3], 2); - * // => [3] - * - * _.drop([1, 2, 3], 5); - * // => [] - * - * _.drop([1, 2, 3], 0); - * // => [1, 2, 3] - */ - function drop(array, n, guard) { - var length = array == null ? 0 : array.length; - if (!length) { - return []; - } - n = guard || n === undefined ? 1 : toInteger(n); - return baseSlice(array, n < 0 ? 0 : n, length); - } - - /** - * Creates a slice of `array` with `n` elements dropped from the end. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Array - * @param {Array} array The array to query. - * @param {number} [n=1] The number of elements to drop. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {Array} Returns the slice of `array`. - * @example - * - * _.dropRight([1, 2, 3]); - * // => [1, 2] - * - * _.dropRight([1, 2, 3], 2); - * // => [1] - * - * _.dropRight([1, 2, 3], 5); - * // => [] - * - * _.dropRight([1, 2, 3], 0); - * // => [1, 2, 3] - */ - function dropRight(array, n, guard) { - var length = array == null ? 0 : array.length; - if (!length) { - return []; - } - n = guard || n === undefined ? 1 : toInteger(n); - n = length - n; - return baseSlice(array, 0, n < 0 ? 0 : n); - } - - /** - * Creates a slice of `array` excluding elements dropped from the end. - * Elements are dropped until `predicate` returns falsey. The predicate is - * invoked with three arguments: (value, index, array). - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Array - * @param {Array} array The array to query. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @returns {Array} Returns the slice of `array`. - * @example - * - * var users = [ - * { 'user': 'barney', 'active': true }, - * { 'user': 'fred', 'active': false }, - * { 'user': 'pebbles', 'active': false } - * ]; - * - * _.dropRightWhile(users, function(o) { return !o.active; }); - * // => objects for ['barney'] - * - * // The `_.matches` iteratee shorthand. - * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false }); - * // => objects for ['barney', 'fred'] - * - * // The `_.matchesProperty` iteratee shorthand. - * _.dropRightWhile(users, ['active', false]); - * // => objects for ['barney'] - * - * // The `_.property` iteratee shorthand. - * _.dropRightWhile(users, 'active'); - * // => objects for ['barney', 'fred', 'pebbles'] - */ - function dropRightWhile(array, predicate) { - return array && array.length - ? baseWhile(array, getIteratee(predicate, 3), true, true) - : []; - } - - /** - * Creates a slice of `array` excluding elements dropped from the beginning. - * Elements are dropped until `predicate` returns falsey. The predicate is - * invoked with three arguments: (value, index, array). - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Array - * @param {Array} array The array to query. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @returns {Array} Returns the slice of `array`. - * @example - * - * var users = [ - * { 'user': 'barney', 'active': false }, - * { 'user': 'fred', 'active': false }, - * { 'user': 'pebbles', 'active': true } - * ]; - * - * _.dropWhile(users, function(o) { return !o.active; }); - * // => objects for ['pebbles'] - * - * // The `_.matches` iteratee shorthand. - * _.dropWhile(users, { 'user': 'barney', 'active': false }); - * // => objects for ['fred', 'pebbles'] - * - * // The `_.matchesProperty` iteratee shorthand. - * _.dropWhile(users, ['active', false]); - * // => objects for ['pebbles'] - * - * // The `_.property` iteratee shorthand. - * _.dropWhile(users, 'active'); - * // => objects for ['barney', 'fred', 'pebbles'] - */ - function dropWhile(array, predicate) { - return array && array.length - ? baseWhile(array, getIteratee(predicate, 3), true) - : []; - } - - /** - * Fills elements of `array` with `value` from `start` up to, but not - * including, `end`. - * - * **Note:** This method mutates `array`. - * - * @static - * @memberOf _ - * @since 3.2.0 - * @category Array - * @param {Array} array The array to fill. - * @param {*} value The value to fill `array` with. - * @param {number} [start=0] The start position. - * @param {number} [end=array.length] The end position. - * @returns {Array} Returns `array`. - * @example - * - * var array = [1, 2, 3]; - * - * _.fill(array, 'a'); - * console.log(array); - * // => ['a', 'a', 'a'] - * - * _.fill(Array(3), 2); - * // => [2, 2, 2] - * - * _.fill([4, 6, 8, 10], '*', 1, 3); - * // => [4, '*', '*', 10] - */ - function fill(array, value, start, end) { - var length = array == null ? 0 : array.length; - if (!length) { - return []; - } - if ( - start && - typeof start != 'number' && - isIterateeCall(array, value, start) - ) { - start = 0; - end = length; - } - return baseFill(array, value, start, end); - } - - /** - * This method is like `_.find` except that it returns the index of the first - * element `predicate` returns truthy for instead of the element itself. - * - * @static - * @memberOf _ - * @since 1.1.0 - * @category Array - * @param {Array} array The array to inspect. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @param {number} [fromIndex=0] The index to search from. - * @returns {number} Returns the index of the found element, else `-1`. - * @example - * - * var users = [ - * { 'user': 'barney', 'active': false }, - * { 'user': 'fred', 'active': false }, - * { 'user': 'pebbles', 'active': true } - * ]; - * - * _.findIndex(users, function(o) { return o.user == 'barney'; }); - * // => 0 - * - * // The `_.matches` iteratee shorthand. - * _.findIndex(users, { 'user': 'fred', 'active': false }); - * // => 1 - * - * // The `_.matchesProperty` iteratee shorthand. - * _.findIndex(users, ['active', false]); - * // => 0 - * - * // The `_.property` iteratee shorthand. - * _.findIndex(users, 'active'); - * // => 2 - */ - function findIndex(array, predicate, fromIndex) { - var length = array == null ? 0 : array.length; - if (!length) { - return -1; - } - var index = fromIndex == null ? 0 : toInteger(fromIndex); - if (index < 0) { - index = nativeMax(length + index, 0); - } - return baseFindIndex(array, getIteratee(predicate, 3), index); - } - - /** - * This method is like `_.findIndex` except that it iterates over elements - * of `collection` from right to left. - * - * @static - * @memberOf _ - * @since 2.0.0 - * @category Array - * @param {Array} array The array to inspect. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @param {number} [fromIndex=array.length-1] The index to search from. - * @returns {number} Returns the index of the found element, else `-1`. - * @example - * - * var users = [ - * { 'user': 'barney', 'active': true }, - * { 'user': 'fred', 'active': false }, - * { 'user': 'pebbles', 'active': false } - * ]; - * - * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; }); - * // => 2 - * - * // The `_.matches` iteratee shorthand. - * _.findLastIndex(users, { 'user': 'barney', 'active': true }); - * // => 0 - * - * // The `_.matchesProperty` iteratee shorthand. - * _.findLastIndex(users, ['active', false]); - * // => 2 - * - * // The `_.property` iteratee shorthand. - * _.findLastIndex(users, 'active'); - * // => 0 - */ - function findLastIndex(array, predicate, fromIndex) { - var length = array == null ? 0 : array.length; - if (!length) { - return -1; - } - var index = length - 1; - if (fromIndex !== undefined) { - index = toInteger(fromIndex); - index = - fromIndex < 0 - ? nativeMax(length + index, 0) - : nativeMin(index, length - 1); - } - return baseFindIndex( - array, - getIteratee(predicate, 3), - index, - true - ); - } - - /** - * Flattens `array` a single level deep. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {Array} array The array to flatten. - * @returns {Array} Returns the new flattened array. - * @example - * - * _.flatten([1, [2, [3, [4]], 5]]); - * // => [1, 2, [3, [4]], 5] - */ - function flatten(array) { - var length = array == null ? 0 : array.length; - return length ? baseFlatten(array, 1) : []; - } - - /** - * Recursively flattens `array`. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Array - * @param {Array} array The array to flatten. - * @returns {Array} Returns the new flattened array. - * @example - * - * _.flattenDeep([1, [2, [3, [4]], 5]]); - * // => [1, 2, 3, 4, 5] - */ - function flattenDeep(array) { - var length = array == null ? 0 : array.length; - return length ? baseFlatten(array, INFINITY) : []; - } - - /** - * Recursively flatten `array` up to `depth` times. - * - * @static - * @memberOf _ - * @since 4.4.0 - * @category Array - * @param {Array} array The array to flatten. - * @param {number} [depth=1] The maximum recursion depth. - * @returns {Array} Returns the new flattened array. - * @example - * - * var array = [1, [2, [3, [4]], 5]]; - * - * _.flattenDepth(array, 1); - * // => [1, 2, [3, [4]], 5] - * - * _.flattenDepth(array, 2); - * // => [1, 2, 3, [4], 5] - */ - function flattenDepth(array, depth) { - var length = array == null ? 0 : array.length; - if (!length) { - return []; - } - depth = depth === undefined ? 1 : toInteger(depth); - return baseFlatten(array, depth); - } - - /** - * The inverse of `_.toPairs`; this method returns an object composed - * from key-value `pairs`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} pairs The key-value pairs. - * @returns {Object} Returns the new object. - * @example - * - * _.fromPairs([['a', 1], ['b', 2]]); - * // => { 'a': 1, 'b': 2 } - */ - function fromPairs(pairs) { - var index = -1, - length = pairs == null ? 0 : pairs.length, - result = {}; - - while (++index < length) { - var pair = pairs[index]; - result[pair[0]] = pair[1]; - } - return result; - } - - /** - * Gets the first element of `array`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @alias first - * @category Array - * @param {Array} array The array to query. - * @returns {*} Returns the first element of `array`. - * @example - * - * _.head([1, 2, 3]); - * // => 1 - * - * _.head([]); - * // => undefined - */ - function head(array) { - return array && array.length ? array[0] : undefined; - } - - /** - * Gets the index at which the first occurrence of `value` is found in `array` - * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * for equality comparisons. If `fromIndex` is negative, it's used as the - * offset from the end of `array`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {Array} array The array to inspect. - * @param {*} value The value to search for. - * @param {number} [fromIndex=0] The index to search from. - * @returns {number} Returns the index of the matched value, else `-1`. - * @example - * - * _.indexOf([1, 2, 1, 2], 2); - * // => 1 - * - * // Search from the `fromIndex`. - * _.indexOf([1, 2, 1, 2], 2, 2); - * // => 3 - */ - function indexOf(array, value, fromIndex) { - var length = array == null ? 0 : array.length; - if (!length) { - return -1; - } - var index = fromIndex == null ? 0 : toInteger(fromIndex); - if (index < 0) { - index = nativeMax(length + index, 0); - } - return baseIndexOf(array, value, index); - } - - /** - * Gets all but the last element of `array`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {Array} array The array to query. - * @returns {Array} Returns the slice of `array`. - * @example - * - * _.initial([1, 2, 3]); - * // => [1, 2] - */ - function initial(array) { - var length = array == null ? 0 : array.length; - return length ? baseSlice(array, 0, -1) : []; - } - - /** - * Creates an array of unique values that are included in all given arrays - * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * for equality comparisons. The order and references of result values are - * determined by the first array. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {...Array} [arrays] The arrays to inspect. - * @returns {Array} Returns the new array of intersecting values. - * @example - * - * _.intersection([2, 1], [2, 3]); - * // => [2] - */ - var intersection = baseRest(function (arrays) { - var mapped = arrayMap(arrays, castArrayLikeObject); - return mapped.length && mapped[0] === arrays[0] - ? baseIntersection(mapped) - : []; - }); - - /** - * This method is like `_.intersection` except that it accepts `iteratee` - * which is invoked for each element of each `arrays` to generate the criterion - * by which they're compared. The order and references of result values are - * determined by the first array. The iteratee is invoked with one argument: - * (value). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {...Array} [arrays] The arrays to inspect. - * @param {Function} [iteratee=_.identity] The iteratee invoked per element. - * @returns {Array} Returns the new array of intersecting values. - * @example - * - * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor); - * // => [2.1] - * - * // The `_.property` iteratee shorthand. - * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); - * // => [{ 'x': 1 }] - */ - var intersectionBy = baseRest(function (arrays) { - var iteratee = last(arrays), - mapped = arrayMap(arrays, castArrayLikeObject); - - if (iteratee === last(mapped)) { - iteratee = undefined; - } else { - mapped.pop(); - } - return mapped.length && mapped[0] === arrays[0] - ? baseIntersection(mapped, getIteratee(iteratee, 2)) - : []; - }); - - /** - * This method is like `_.intersection` except that it accepts `comparator` - * which is invoked to compare elements of `arrays`. The order and references - * of result values are determined by the first array. The comparator is - * invoked with two arguments: (arrVal, othVal). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {...Array} [arrays] The arrays to inspect. - * @param {Function} [comparator] The comparator invoked per element. - * @returns {Array} Returns the new array of intersecting values. - * @example - * - * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; - * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; - * - * _.intersectionWith(objects, others, _.isEqual); - * // => [{ 'x': 1, 'y': 2 }] - */ - var intersectionWith = baseRest(function (arrays) { - var comparator = last(arrays), - mapped = arrayMap(arrays, castArrayLikeObject); - - comparator = - typeof comparator == 'function' ? comparator : undefined; - if (comparator) { - mapped.pop(); - } - return mapped.length && mapped[0] === arrays[0] - ? baseIntersection(mapped, undefined, comparator) - : []; - }); - - /** - * Converts all elements in `array` into a string separated by `separator`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The array to convert. - * @param {string} [separator=','] The element separator. - * @returns {string} Returns the joined string. - * @example - * - * _.join(['a', 'b', 'c'], '~'); - * // => 'a~b~c' - */ - function join(array, separator) { - return array == null ? '' : nativeJoin.call(array, separator); - } - - /** - * Gets the last element of `array`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {Array} array The array to query. - * @returns {*} Returns the last element of `array`. - * @example - * - * _.last([1, 2, 3]); - * // => 3 - */ - function last(array) { - var length = array == null ? 0 : array.length; - return length ? array[length - 1] : undefined; - } - - /** - * This method is like `_.indexOf` except that it iterates over elements of - * `array` from right to left. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {Array} array The array to inspect. - * @param {*} value The value to search for. - * @param {number} [fromIndex=array.length-1] The index to search from. - * @returns {number} Returns the index of the matched value, else `-1`. - * @example - * - * _.lastIndexOf([1, 2, 1, 2], 2); - * // => 3 - * - * // Search from the `fromIndex`. - * _.lastIndexOf([1, 2, 1, 2], 2, 2); - * // => 1 - */ - function lastIndexOf(array, value, fromIndex) { - var length = array == null ? 0 : array.length; - if (!length) { - return -1; - } - var index = length; - if (fromIndex !== undefined) { - index = toInteger(fromIndex); - index = - index < 0 - ? nativeMax(length + index, 0) - : nativeMin(index, length - 1); - } - return value === value - ? strictLastIndexOf(array, value, index) - : baseFindIndex(array, baseIsNaN, index, true); - } - - /** - * Gets the element at index `n` of `array`. If `n` is negative, the nth - * element from the end is returned. - * - * @static - * @memberOf _ - * @since 4.11.0 - * @category Array - * @param {Array} array The array to query. - * @param {number} [n=0] The index of the element to return. - * @returns {*} Returns the nth element of `array`. - * @example - * - * var array = ['a', 'b', 'c', 'd']; - * - * _.nth(array, 1); - * // => 'b' - * - * _.nth(array, -2); - * // => 'c'; - */ - function nth(array, n) { - return array && array.length - ? baseNth(array, toInteger(n)) - : undefined; - } - - /** - * Removes all given values from `array` using - * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * for equality comparisons. - * - * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove` - * to remove elements from an array by predicate. - * - * @static - * @memberOf _ - * @since 2.0.0 - * @category Array - * @param {Array} array The array to modify. - * @param {...*} [values] The values to remove. - * @returns {Array} Returns `array`. - * @example - * - * var array = ['a', 'b', 'c', 'a', 'b', 'c']; - * - * _.pull(array, 'a', 'c'); - * console.log(array); - * // => ['b', 'b'] - */ - var pull = baseRest(pullAll); - - /** - * This method is like `_.pull` except that it accepts an array of values to remove. - * - * **Note:** Unlike `_.difference`, this method mutates `array`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The array to modify. - * @param {Array} values The values to remove. - * @returns {Array} Returns `array`. - * @example - * - * var array = ['a', 'b', 'c', 'a', 'b', 'c']; - * - * _.pullAll(array, ['a', 'c']); - * console.log(array); - * // => ['b', 'b'] - */ - function pullAll(array, values) { - return array && array.length && values && values.length - ? basePullAll(array, values) - : array; - } - - /** - * This method is like `_.pullAll` except that it accepts `iteratee` which is - * invoked for each element of `array` and `values` to generate the criterion - * by which they're compared. The iteratee is invoked with one argument: (value). - * - * **Note:** Unlike `_.differenceBy`, this method mutates `array`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The array to modify. - * @param {Array} values The values to remove. - * @param {Function} [iteratee=_.identity] The iteratee invoked per element. - * @returns {Array} Returns `array`. - * @example - * - * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }]; - * - * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x'); - * console.log(array); - * // => [{ 'x': 2 }] - */ - function pullAllBy(array, values, iteratee) { - return array && array.length && values && values.length - ? basePullAll(array, values, getIteratee(iteratee, 2)) - : array; - } - - /** - * This method is like `_.pullAll` except that it accepts `comparator` which - * is invoked to compare elements of `array` to `values`. The comparator is - * invoked with two arguments: (arrVal, othVal). - * - * **Note:** Unlike `_.differenceWith`, this method mutates `array`. - * - * @static - * @memberOf _ - * @since 4.6.0 - * @category Array - * @param {Array} array The array to modify. - * @param {Array} values The values to remove. - * @param {Function} [comparator] The comparator invoked per element. - * @returns {Array} Returns `array`. - * @example - * - * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }]; - * - * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual); - * console.log(array); - * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }] - */ - function pullAllWith(array, values, comparator) { - return array && array.length && values && values.length - ? basePullAll(array, values, undefined, comparator) - : array; - } - - /** - * Removes elements from `array` corresponding to `indexes` and returns an - * array of removed elements. - * - * **Note:** Unlike `_.at`, this method mutates `array`. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Array - * @param {Array} array The array to modify. - * @param {...(number|number[])} [indexes] The indexes of elements to remove. - * @returns {Array} Returns the new array of removed elements. - * @example - * - * var array = ['a', 'b', 'c', 'd']; - * var pulled = _.pullAt(array, [1, 3]); - * - * console.log(array); - * // => ['a', 'c'] - * - * console.log(pulled); - * // => ['b', 'd'] - */ - var pullAt = flatRest(function (array, indexes) { - var length = array == null ? 0 : array.length, - result = baseAt(array, indexes); - - basePullAt( - array, - arrayMap(indexes, function (index) { - return isIndex(index, length) ? +index : index; - }).sort(compareAscending) - ); - - return result; - }); - - /** - * Removes all elements from `array` that `predicate` returns truthy for - * and returns an array of the removed elements. The predicate is invoked - * with three arguments: (value, index, array). - * - * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull` - * to pull elements from an array by value. - * - * @static - * @memberOf _ - * @since 2.0.0 - * @category Array - * @param {Array} array The array to modify. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @returns {Array} Returns the new array of removed elements. - * @example - * - * var array = [1, 2, 3, 4]; - * var evens = _.remove(array, function(n) { - * return n % 2 == 0; - * }); - * - * console.log(array); - * // => [1, 3] - * - * console.log(evens); - * // => [2, 4] - */ - function remove(array, predicate) { - var result = []; - if (!(array && array.length)) { - return result; - } - var index = -1, - indexes = [], - length = array.length; - - predicate = getIteratee(predicate, 3); - while (++index < length) { - var value = array[index]; - if (predicate(value, index, array)) { - result.push(value); - indexes.push(index); - } - } - basePullAt(array, indexes); - return result; - } - - /** - * Reverses `array` so that the first element becomes the last, the second - * element becomes the second to last, and so on. - * - * **Note:** This method mutates `array` and is based on - * [`Array#reverse`](https://mdn.io/Array/reverse). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The array to modify. - * @returns {Array} Returns `array`. - * @example - * - * var array = [1, 2, 3]; - * - * _.reverse(array); - * // => [3, 2, 1] - * - * console.log(array); - * // => [3, 2, 1] - */ - function reverse(array) { - return array == null ? array : nativeReverse.call(array); - } - - /** - * Creates a slice of `array` from `start` up to, but not including, `end`. - * - * **Note:** This method is used instead of - * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are - * returned. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Array - * @param {Array} array The array to slice. - * @param {number} [start=0] The start position. - * @param {number} [end=array.length] The end position. - * @returns {Array} Returns the slice of `array`. - */ - function slice(array, start, end) { - var length = array == null ? 0 : array.length; - if (!length) { - return []; - } - if ( - end && - typeof end != 'number' && - isIterateeCall(array, start, end) - ) { - start = 0; - end = length; - } else { - start = start == null ? 0 : toInteger(start); - end = end === undefined ? length : toInteger(end); - } - return baseSlice(array, start, end); - } - - /** - * Uses a binary search to determine the lowest index at which `value` - * should be inserted into `array` in order to maintain its sort order. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {Array} array The sorted array to inspect. - * @param {*} value The value to evaluate. - * @returns {number} Returns the index at which `value` should be inserted - * into `array`. - * @example - * - * _.sortedIndex([30, 50], 40); - * // => 1 - */ - function sortedIndex(array, value) { - return baseSortedIndex(array, value); - } - - /** - * This method is like `_.sortedIndex` except that it accepts `iteratee` - * which is invoked for `value` and each element of `array` to compute their - * sort ranking. The iteratee is invoked with one argument: (value). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The sorted array to inspect. - * @param {*} value The value to evaluate. - * @param {Function} [iteratee=_.identity] The iteratee invoked per element. - * @returns {number} Returns the index at which `value` should be inserted - * into `array`. - * @example - * - * var objects = [{ 'x': 4 }, { 'x': 5 }]; - * - * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; }); - * // => 0 - * - * // The `_.property` iteratee shorthand. - * _.sortedIndexBy(objects, { 'x': 4 }, 'x'); - * // => 0 - */ - function sortedIndexBy(array, value, iteratee) { - return baseSortedIndexBy(array, value, getIteratee(iteratee, 2)); - } - - /** - * This method is like `_.indexOf` except that it performs a binary - * search on a sorted `array`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The array to inspect. - * @param {*} value The value to search for. - * @returns {number} Returns the index of the matched value, else `-1`. - * @example - * - * _.sortedIndexOf([4, 5, 5, 5, 6], 5); - * // => 1 - */ - function sortedIndexOf(array, value) { - var length = array == null ? 0 : array.length; - if (length) { - var index = baseSortedIndex(array, value); - if (index < length && eq(array[index], value)) { - return index; - } - } - return -1; - } - - /** - * This method is like `_.sortedIndex` except that it returns the highest - * index at which `value` should be inserted into `array` in order to - * maintain its sort order. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Array - * @param {Array} array The sorted array to inspect. - * @param {*} value The value to evaluate. - * @returns {number} Returns the index at which `value` should be inserted - * into `array`. - * @example - * - * _.sortedLastIndex([4, 5, 5, 5, 6], 5); - * // => 4 - */ - function sortedLastIndex(array, value) { - return baseSortedIndex(array, value, true); - } - - /** - * This method is like `_.sortedLastIndex` except that it accepts `iteratee` - * which is invoked for `value` and each element of `array` to compute their - * sort ranking. The iteratee is invoked with one argument: (value). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The sorted array to inspect. - * @param {*} value The value to evaluate. - * @param {Function} [iteratee=_.identity] The iteratee invoked per element. - * @returns {number} Returns the index at which `value` should be inserted - * into `array`. - * @example - * - * var objects = [{ 'x': 4 }, { 'x': 5 }]; - * - * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; }); - * // => 1 - * - * // The `_.property` iteratee shorthand. - * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x'); - * // => 1 - */ - function sortedLastIndexBy(array, value, iteratee) { - return baseSortedIndexBy( - array, - value, - getIteratee(iteratee, 2), - true - ); - } - - /** - * This method is like `_.lastIndexOf` except that it performs a binary - * search on a sorted `array`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The array to inspect. - * @param {*} value The value to search for. - * @returns {number} Returns the index of the matched value, else `-1`. - * @example - * - * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5); - * // => 3 - */ - function sortedLastIndexOf(array, value) { - var length = array == null ? 0 : array.length; - if (length) { - var index = baseSortedIndex(array, value, true) - 1; - if (eq(array[index], value)) { - return index; - } - } - return -1; - } - - /** - * This method is like `_.uniq` except that it's designed and optimized - * for sorted arrays. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The array to inspect. - * @returns {Array} Returns the new duplicate free array. - * @example - * - * _.sortedUniq([1, 1, 2]); - * // => [1, 2] - */ - function sortedUniq(array) { - return array && array.length ? baseSortedUniq(array) : []; - } - - /** - * This method is like `_.uniqBy` except that it's designed and optimized - * for sorted arrays. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The array to inspect. - * @param {Function} [iteratee] The iteratee invoked per element. - * @returns {Array} Returns the new duplicate free array. - * @example - * - * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor); - * // => [1.1, 2.3] - */ - function sortedUniqBy(array, iteratee) { - return array && array.length - ? baseSortedUniq(array, getIteratee(iteratee, 2)) - : []; - } - - /** - * Gets all but the first element of `array`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The array to query. - * @returns {Array} Returns the slice of `array`. - * @example - * - * _.tail([1, 2, 3]); - * // => [2, 3] - */ - function tail(array) { - var length = array == null ? 0 : array.length; - return length ? baseSlice(array, 1, length) : []; - } - - /** - * Creates a slice of `array` with `n` elements taken from the beginning. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {Array} array The array to query. - * @param {number} [n=1] The number of elements to take. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {Array} Returns the slice of `array`. - * @example - * - * _.take([1, 2, 3]); - * // => [1] - * - * _.take([1, 2, 3], 2); - * // => [1, 2] - * - * _.take([1, 2, 3], 5); - * // => [1, 2, 3] - * - * _.take([1, 2, 3], 0); - * // => [] - */ - function take(array, n, guard) { - if (!(array && array.length)) { - return []; - } - n = guard || n === undefined ? 1 : toInteger(n); - return baseSlice(array, 0, n < 0 ? 0 : n); - } - - /** - * Creates a slice of `array` with `n` elements taken from the end. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Array - * @param {Array} array The array to query. - * @param {number} [n=1] The number of elements to take. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {Array} Returns the slice of `array`. - * @example - * - * _.takeRight([1, 2, 3]); - * // => [3] - * - * _.takeRight([1, 2, 3], 2); - * // => [2, 3] - * - * _.takeRight([1, 2, 3], 5); - * // => [1, 2, 3] - * - * _.takeRight([1, 2, 3], 0); - * // => [] - */ - function takeRight(array, n, guard) { - var length = array == null ? 0 : array.length; - if (!length) { - return []; - } - n = guard || n === undefined ? 1 : toInteger(n); - n = length - n; - return baseSlice(array, n < 0 ? 0 : n, length); - } - - /** - * Creates a slice of `array` with elements taken from the end. Elements are - * taken until `predicate` returns falsey. The predicate is invoked with - * three arguments: (value, index, array). - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Array - * @param {Array} array The array to query. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @returns {Array} Returns the slice of `array`. - * @example - * - * var users = [ - * { 'user': 'barney', 'active': true }, - * { 'user': 'fred', 'active': false }, - * { 'user': 'pebbles', 'active': false } - * ]; - * - * _.takeRightWhile(users, function(o) { return !o.active; }); - * // => objects for ['fred', 'pebbles'] - * - * // The `_.matches` iteratee shorthand. - * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false }); - * // => objects for ['pebbles'] - * - * // The `_.matchesProperty` iteratee shorthand. - * _.takeRightWhile(users, ['active', false]); - * // => objects for ['fred', 'pebbles'] - * - * // The `_.property` iteratee shorthand. - * _.takeRightWhile(users, 'active'); - * // => [] - */ - function takeRightWhile(array, predicate) { - return array && array.length - ? baseWhile(array, getIteratee(predicate, 3), false, true) - : []; - } - - /** - * Creates a slice of `array` with elements taken from the beginning. Elements - * are taken until `predicate` returns falsey. The predicate is invoked with - * three arguments: (value, index, array). - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Array - * @param {Array} array The array to query. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @returns {Array} Returns the slice of `array`. - * @example - * - * var users = [ - * { 'user': 'barney', 'active': false }, - * { 'user': 'fred', 'active': false }, - * { 'user': 'pebbles', 'active': true } - * ]; - * - * _.takeWhile(users, function(o) { return !o.active; }); - * // => objects for ['barney', 'fred'] - * - * // The `_.matches` iteratee shorthand. - * _.takeWhile(users, { 'user': 'barney', 'active': false }); - * // => objects for ['barney'] - * - * // The `_.matchesProperty` iteratee shorthand. - * _.takeWhile(users, ['active', false]); - * // => objects for ['barney', 'fred'] - * - * // The `_.property` iteratee shorthand. - * _.takeWhile(users, 'active'); - * // => [] - */ - function takeWhile(array, predicate) { - return array && array.length - ? baseWhile(array, getIteratee(predicate, 3)) - : []; - } - - /** - * Creates an array of unique values, in order, from all given arrays using - * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * for equality comparisons. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {...Array} [arrays] The arrays to inspect. - * @returns {Array} Returns the new array of combined values. - * @example - * - * _.union([2], [1, 2]); - * // => [2, 1] - */ - var union = baseRest(function (arrays) { - return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true)); - }); - - /** - * This method is like `_.union` except that it accepts `iteratee` which is - * invoked for each element of each `arrays` to generate the criterion by - * which uniqueness is computed. Result values are chosen from the first - * array in which the value occurs. The iteratee is invoked with one argument: - * (value). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {...Array} [arrays] The arrays to inspect. - * @param {Function} [iteratee=_.identity] The iteratee invoked per element. - * @returns {Array} Returns the new array of combined values. - * @example - * - * _.unionBy([2.1], [1.2, 2.3], Math.floor); - * // => [2.1, 1.2] - * - * // The `_.property` iteratee shorthand. - * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); - * // => [{ 'x': 1 }, { 'x': 2 }] - */ - var unionBy = baseRest(function (arrays) { - var iteratee = last(arrays); - if (isArrayLikeObject(iteratee)) { - iteratee = undefined; - } - return baseUniq( - baseFlatten(arrays, 1, isArrayLikeObject, true), - getIteratee(iteratee, 2) - ); - }); - - /** - * This method is like `_.union` except that it accepts `comparator` which - * is invoked to compare elements of `arrays`. Result values are chosen from - * the first array in which the value occurs. The comparator is invoked - * with two arguments: (arrVal, othVal). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {...Array} [arrays] The arrays to inspect. - * @param {Function} [comparator] The comparator invoked per element. - * @returns {Array} Returns the new array of combined values. - * @example - * - * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; - * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; - * - * _.unionWith(objects, others, _.isEqual); - * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }] - */ - var unionWith = baseRest(function (arrays) { - var comparator = last(arrays); - comparator = - typeof comparator == 'function' ? comparator : undefined; - return baseUniq( - baseFlatten(arrays, 1, isArrayLikeObject, true), - undefined, - comparator - ); - }); - - /** - * Creates a duplicate-free version of an array, using - * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * for equality comparisons, in which only the first occurrence of each element - * is kept. The order of result values is determined by the order they occur - * in the array. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {Array} array The array to inspect. - * @returns {Array} Returns the new duplicate free array. - * @example - * - * _.uniq([2, 1, 2]); - * // => [2, 1] - */ - function uniq(array) { - return array && array.length ? baseUniq(array) : []; - } - - /** - * This method is like `_.uniq` except that it accepts `iteratee` which is - * invoked for each element in `array` to generate the criterion by which - * uniqueness is computed. The order of result values is determined by the - * order they occur in the array. The iteratee is invoked with one argument: - * (value). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The array to inspect. - * @param {Function} [iteratee=_.identity] The iteratee invoked per element. - * @returns {Array} Returns the new duplicate free array. - * @example - * - * _.uniqBy([2.1, 1.2, 2.3], Math.floor); - * // => [2.1, 1.2] - * - * // The `_.property` iteratee shorthand. - * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x'); - * // => [{ 'x': 1 }, { 'x': 2 }] - */ - function uniqBy(array, iteratee) { - return array && array.length - ? baseUniq(array, getIteratee(iteratee, 2)) - : []; - } - - /** - * This method is like `_.uniq` except that it accepts `comparator` which - * is invoked to compare elements of `array`. The order of result values is - * determined by the order they occur in the array.The comparator is invoked - * with two arguments: (arrVal, othVal). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {Array} array The array to inspect. - * @param {Function} [comparator] The comparator invoked per element. - * @returns {Array} Returns the new duplicate free array. - * @example - * - * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }]; - * - * _.uniqWith(objects, _.isEqual); - * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }] - */ - function uniqWith(array, comparator) { - comparator = - typeof comparator == 'function' ? comparator : undefined; - return array && array.length - ? baseUniq(array, undefined, comparator) - : []; - } - - /** - * This method is like `_.zip` except that it accepts an array of grouped - * elements and creates an array regrouping the elements to their pre-zip - * configuration. - * - * @static - * @memberOf _ - * @since 1.2.0 - * @category Array - * @param {Array} array The array of grouped elements to process. - * @returns {Array} Returns the new array of regrouped elements. - * @example - * - * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]); - * // => [['a', 1, true], ['b', 2, false]] - * - * _.unzip(zipped); - * // => [['a', 'b'], [1, 2], [true, false]] - */ - function unzip(array) { - if (!(array && array.length)) { - return []; - } - var length = 0; - array = arrayFilter(array, function (group) { - if (isArrayLikeObject(group)) { - length = nativeMax(group.length, length); - return true; - } - }); - return baseTimes(length, function (index) { - return arrayMap(array, baseProperty(index)); - }); - } - - /** - * This method is like `_.unzip` except that it accepts `iteratee` to specify - * how regrouped values should be combined. The iteratee is invoked with the - * elements of each group: (...group). - * - * @static - * @memberOf _ - * @since 3.8.0 - * @category Array - * @param {Array} array The array of grouped elements to process. - * @param {Function} [iteratee=_.identity] The function to combine - * regrouped values. - * @returns {Array} Returns the new array of regrouped elements. - * @example - * - * var zipped = _.zip([1, 2], [10, 20], [100, 200]); - * // => [[1, 10, 100], [2, 20, 200]] - * - * _.unzipWith(zipped, _.add); - * // => [3, 30, 300] - */ - function unzipWith(array, iteratee) { - if (!(array && array.length)) { - return []; - } - var result = unzip(array); - if (iteratee == null) { - return result; - } - return arrayMap(result, function (group) { - return apply(iteratee, undefined, group); - }); - } - - /** - * Creates an array excluding all given values using - * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * for equality comparisons. - * - * **Note:** Unlike `_.pull`, this method returns a new array. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {Array} array The array to inspect. - * @param {...*} [values] The values to exclude. - * @returns {Array} Returns the new array of filtered values. - * @see _.difference, _.xor - * @example - * - * _.without([2, 1, 2, 3], 1, 2); - * // => [3] - */ - var without = baseRest(function (array, values) { - return isArrayLikeObject(array) - ? baseDifference(array, values) - : []; - }); - - /** - * Creates an array of unique values that is the - * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference) - * of the given arrays. The order of result values is determined by the order - * they occur in the arrays. - * - * @static - * @memberOf _ - * @since 2.4.0 - * @category Array - * @param {...Array} [arrays] The arrays to inspect. - * @returns {Array} Returns the new array of filtered values. - * @see _.difference, _.without - * @example - * - * _.xor([2, 1], [2, 3]); - * // => [1, 3] - */ - var xor = baseRest(function (arrays) { - return baseXor(arrayFilter(arrays, isArrayLikeObject)); - }); - - /** - * This method is like `_.xor` except that it accepts `iteratee` which is - * invoked for each element of each `arrays` to generate the criterion by - * which by which they're compared. The order of result values is determined - * by the order they occur in the arrays. The iteratee is invoked with one - * argument: (value). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {...Array} [arrays] The arrays to inspect. - * @param {Function} [iteratee=_.identity] The iteratee invoked per element. - * @returns {Array} Returns the new array of filtered values. - * @example - * - * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor); - * // => [1.2, 3.4] - * - * // The `_.property` iteratee shorthand. - * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); - * // => [{ 'x': 2 }] - */ - var xorBy = baseRest(function (arrays) { - var iteratee = last(arrays); - if (isArrayLikeObject(iteratee)) { - iteratee = undefined; - } - return baseXor( - arrayFilter(arrays, isArrayLikeObject), - getIteratee(iteratee, 2) - ); - }); - - /** - * This method is like `_.xor` except that it accepts `comparator` which is - * invoked to compare elements of `arrays`. The order of result values is - * determined by the order they occur in the arrays. The comparator is invoked - * with two arguments: (arrVal, othVal). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Array - * @param {...Array} [arrays] The arrays to inspect. - * @param {Function} [comparator] The comparator invoked per element. - * @returns {Array} Returns the new array of filtered values. - * @example - * - * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; - * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; - * - * _.xorWith(objects, others, _.isEqual); - * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }] - */ - var xorWith = baseRest(function (arrays) { - var comparator = last(arrays); - comparator = - typeof comparator == 'function' ? comparator : undefined; - return baseXor( - arrayFilter(arrays, isArrayLikeObject), - undefined, - comparator - ); - }); - - /** - * Creates an array of grouped elements, the first of which contains the - * first elements of the given arrays, the second of which contains the - * second elements of the given arrays, and so on. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {...Array} [arrays] The arrays to process. - * @returns {Array} Returns the new array of grouped elements. - * @example - * - * _.zip(['a', 'b'], [1, 2], [true, false]); - * // => [['a', 1, true], ['b', 2, false]] - */ - var zip = baseRest(unzip); - - /** - * This method is like `_.fromPairs` except that it accepts two arrays, - * one of property identifiers and one of corresponding values. - * - * @static - * @memberOf _ - * @since 0.4.0 - * @category Array - * @param {Array} [props=[]] The property identifiers. - * @param {Array} [values=[]] The property values. - * @returns {Object} Returns the new object. - * @example - * - * _.zipObject(['a', 'b'], [1, 2]); - * // => { 'a': 1, 'b': 2 } - */ - function zipObject(props, values) { - return baseZipObject(props || [], values || [], assignValue); - } - - /** - * This method is like `_.zipObject` except that it supports property paths. - * - * @static - * @memberOf _ - * @since 4.1.0 - * @category Array - * @param {Array} [props=[]] The property identifiers. - * @param {Array} [values=[]] The property values. - * @returns {Object} Returns the new object. - * @example - * - * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]); - * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } } - */ - function zipObjectDeep(props, values) { - return baseZipObject(props || [], values || [], baseSet); - } - - /** - * This method is like `_.zip` except that it accepts `iteratee` to specify - * how grouped values should be combined. The iteratee is invoked with the - * elements of each group: (...group). - * - * @static - * @memberOf _ - * @since 3.8.0 - * @category Array - * @param {...Array} [arrays] The arrays to process. - * @param {Function} [iteratee=_.identity] The function to combine - * grouped values. - * @returns {Array} Returns the new array of grouped elements. - * @example - * - * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) { - * return a + b + c; - * }); - * // => [111, 222] - */ - var zipWith = baseRest(function (arrays) { - var length = arrays.length, - iteratee = length > 1 ? arrays[length - 1] : undefined; - - iteratee = - typeof iteratee == 'function' - ? (arrays.pop(), iteratee) - : undefined; - return unzipWith(arrays, iteratee); - }); - - /*------------------------------------------------------------------------*/ - - /** - * Creates a `lodash` wrapper instance that wraps `value` with explicit method - * chain sequences enabled. The result of such sequences must be unwrapped - * with `_#value`. - * - * @static - * @memberOf _ - * @since 1.3.0 - * @category Seq - * @param {*} value The value to wrap. - * @returns {Object} Returns the new `lodash` wrapper instance. - * @example - * - * var users = [ - * { 'user': 'barney', 'age': 36 }, - * { 'user': 'fred', 'age': 40 }, - * { 'user': 'pebbles', 'age': 1 } - * ]; - * - * var youngest = _ - * .chain(users) - * .sortBy('age') - * .map(function(o) { - * return o.user + ' is ' + o.age; - * }) - * .head() - * .value(); - * // => 'pebbles is 1' - */ - function chain(value) { - var result = lodash(value); - result.__chain__ = true; - return result; - } - - /** - * This method invokes `interceptor` and returns `value`. The interceptor - * is invoked with one argument; (value). The purpose of this method is to - * "tap into" a method chain sequence in order to modify intermediate results. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Seq - * @param {*} value The value to provide to `interceptor`. - * @param {Function} interceptor The function to invoke. - * @returns {*} Returns `value`. - * @example - * - * _([1, 2, 3]) - * .tap(function(array) { - * // Mutate input array. - * array.pop(); - * }) - * .reverse() - * .value(); - * // => [2, 1] - */ - function tap(value, interceptor) { - interceptor(value); - return value; - } - - /** - * This method is like `_.tap` except that it returns the result of `interceptor`. - * The purpose of this method is to "pass thru" values replacing intermediate - * results in a method chain sequence. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Seq - * @param {*} value The value to provide to `interceptor`. - * @param {Function} interceptor The function to invoke. - * @returns {*} Returns the result of `interceptor`. - * @example - * - * _(' abc ') - * .chain() - * .trim() - * .thru(function(value) { - * return [value]; - * }) - * .value(); - * // => ['abc'] - */ - function thru(value, interceptor) { - return interceptor(value); - } - - /** - * This method is the wrapper version of `_.at`. - * - * @name at - * @memberOf _ - * @since 1.0.0 - * @category Seq - * @param {...(string|string[])} [paths] The property paths to pick. - * @returns {Object} Returns the new `lodash` wrapper instance. - * @example - * - * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] }; - * - * _(object).at(['a[0].b.c', 'a[1]']).value(); - * // => [3, 4] - */ - var wrapperAt = flatRest(function (paths) { - var length = paths.length, - start = length ? paths[0] : 0, - value = this.__wrapped__, - interceptor = function (object) { - return baseAt(object, paths); - }; - - if ( - length > 1 || - this.__actions__.length || - !(value instanceof LazyWrapper) || - !isIndex(start) - ) { - return this.thru(interceptor); - } - value = value.slice(start, +start + (length ? 1 : 0)); - value.__actions__.push({ - func: thru, - args: [interceptor], - thisArg: undefined, - }); - return new LodashWrapper(value, this.__chain__).thru(function ( - array - ) { - if (length && !array.length) { - array.push(undefined); - } - return array; - }); - }); - - /** - * Creates a `lodash` wrapper instance with explicit method chain sequences enabled. - * - * @name chain - * @memberOf _ - * @since 0.1.0 - * @category Seq - * @returns {Object} Returns the new `lodash` wrapper instance. - * @example - * - * var users = [ - * { 'user': 'barney', 'age': 36 }, - * { 'user': 'fred', 'age': 40 } - * ]; - * - * // A sequence without explicit chaining. - * _(users).head(); - * // => { 'user': 'barney', 'age': 36 } - * - * // A sequence with explicit chaining. - * _(users) - * .chain() - * .head() - * .pick('user') - * .value(); - * // => { 'user': 'barney' } - */ - function wrapperChain() { - return chain(this); - } - - /** - * Executes the chain sequence and returns the wrapped result. - * - * @name commit - * @memberOf _ - * @since 3.2.0 - * @category Seq - * @returns {Object} Returns the new `lodash` wrapper instance. - * @example - * - * var array = [1, 2]; - * var wrapped = _(array).push(3); - * - * console.log(array); - * // => [1, 2] - * - * wrapped = wrapped.commit(); - * console.log(array); - * // => [1, 2, 3] - * - * wrapped.last(); - * // => 3 - * - * console.log(array); - * // => [1, 2, 3] - */ - function wrapperCommit() { - return new LodashWrapper(this.value(), this.__chain__); - } - - /** - * Gets the next value on a wrapped object following the - * [iterator protocol](https://mdn.io/iteration_protocols#iterator). - * - * @name next - * @memberOf _ - * @since 4.0.0 - * @category Seq - * @returns {Object} Returns the next iterator value. - * @example - * - * var wrapped = _([1, 2]); - * - * wrapped.next(); - * // => { 'done': false, 'value': 1 } - * - * wrapped.next(); - * // => { 'done': false, 'value': 2 } - * - * wrapped.next(); - * // => { 'done': true, 'value': undefined } - */ - function wrapperNext() { - if (this.__values__ === undefined) { - this.__values__ = toArray(this.value()); - } - var done = this.__index__ >= this.__values__.length, - value = done ? undefined : this.__values__[this.__index__++]; - - return { done: done, value: value }; - } - - /** - * Enables the wrapper to be iterable. - * - * @name Symbol.iterator - * @memberOf _ - * @since 4.0.0 - * @category Seq - * @returns {Object} Returns the wrapper object. - * @example - * - * var wrapped = _([1, 2]); - * - * wrapped[Symbol.iterator]() === wrapped; - * // => true - * - * Array.from(wrapped); - * // => [1, 2] - */ - function wrapperToIterator() { - return this; - } - - /** - * Creates a clone of the chain sequence planting `value` as the wrapped value. - * - * @name plant - * @memberOf _ - * @since 3.2.0 - * @category Seq - * @param {*} value The value to plant. - * @returns {Object} Returns the new `lodash` wrapper instance. - * @example - * - * function square(n) { - * return n * n; - * } - * - * var wrapped = _([1, 2]).map(square); - * var other = wrapped.plant([3, 4]); - * - * other.value(); - * // => [9, 16] - * - * wrapped.value(); - * // => [1, 4] - */ - function wrapperPlant(value) { - var result, - parent = this; - - while (parent instanceof baseLodash) { - var clone = wrapperClone(parent); - clone.__index__ = 0; - clone.__values__ = undefined; - if (result) { - previous.__wrapped__ = clone; - } else { - result = clone; - } - var previous = clone; - parent = parent.__wrapped__; - } - previous.__wrapped__ = value; - return result; - } - - /** - * This method is the wrapper version of `_.reverse`. - * - * **Note:** This method mutates the wrapped array. - * - * @name reverse - * @memberOf _ - * @since 0.1.0 - * @category Seq - * @returns {Object} Returns the new `lodash` wrapper instance. - * @example - * - * var array = [1, 2, 3]; - * - * _(array).reverse().value() - * // => [3, 2, 1] - * - * console.log(array); - * // => [3, 2, 1] - */ - function wrapperReverse() { - var value = this.__wrapped__; - if (value instanceof LazyWrapper) { - var wrapped = value; - if (this.__actions__.length) { - wrapped = new LazyWrapper(this); - } - wrapped = wrapped.reverse(); - wrapped.__actions__.push({ - func: thru, - args: [reverse], - thisArg: undefined, - }); - return new LodashWrapper(wrapped, this.__chain__); - } - return this.thru(reverse); - } - - /** - * Executes the chain sequence to resolve the unwrapped value. - * - * @name value - * @memberOf _ - * @since 0.1.0 - * @alias toJSON, valueOf - * @category Seq - * @returns {*} Returns the resolved unwrapped value. - * @example - * - * _([1, 2, 3]).value(); - * // => [1, 2, 3] - */ - function wrapperValue() { - return baseWrapperValue(this.__wrapped__, this.__actions__); - } - - /*------------------------------------------------------------------------*/ - - /** - * Creates an object composed of keys generated from the results of running - * each element of `collection` thru `iteratee`. The corresponding value of - * each key is the number of times the key was returned by `iteratee`. The - * iteratee is invoked with one argument: (value). - * - * @static - * @memberOf _ - * @since 0.5.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The iteratee to transform keys. - * @returns {Object} Returns the composed aggregate object. - * @example - * - * _.countBy([6.1, 4.2, 6.3], Math.floor); - * // => { '4': 1, '6': 2 } - * - * // The `_.property` iteratee shorthand. - * _.countBy(['one', 'two', 'three'], 'length'); - * // => { '3': 2, '5': 1 } - */ - var countBy = createAggregator(function (result, value, key) { - if (hasOwnProperty.call(result, key)) { - ++result[key]; - } else { - baseAssignValue(result, key, 1); - } - }); - - /** - * Checks if `predicate` returns truthy for **all** elements of `collection`. - * Iteration is stopped once `predicate` returns falsey. The predicate is - * invoked with three arguments: (value, index|key, collection). - * - * **Note:** This method returns `true` for - * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because - * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of - * elements of empty collections. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {boolean} Returns `true` if all elements pass the predicate check, - * else `false`. - * @example - * - * _.every([true, 1, null, 'yes'], Boolean); - * // => false - * - * var users = [ - * { 'user': 'barney', 'age': 36, 'active': false }, - * { 'user': 'fred', 'age': 40, 'active': false } - * ]; - * - * // The `_.matches` iteratee shorthand. - * _.every(users, { 'user': 'barney', 'active': false }); - * // => false - * - * // The `_.matchesProperty` iteratee shorthand. - * _.every(users, ['active', false]); - * // => true - * - * // The `_.property` iteratee shorthand. - * _.every(users, 'active'); - * // => false - */ - function every(collection, predicate, guard) { - var func = isArray(collection) ? arrayEvery : baseEvery; - if (guard && isIterateeCall(collection, predicate, guard)) { - predicate = undefined; - } - return func(collection, getIteratee(predicate, 3)); - } - - /** - * Iterates over elements of `collection`, returning an array of all elements - * `predicate` returns truthy for. The predicate is invoked with three - * arguments: (value, index|key, collection). - * - * **Note:** Unlike `_.remove`, this method returns a new array. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @returns {Array} Returns the new filtered array. - * @see _.reject - * @example - * - * var users = [ - * { 'user': 'barney', 'age': 36, 'active': true }, - * { 'user': 'fred', 'age': 40, 'active': false } - * ]; - * - * _.filter(users, function(o) { return !o.active; }); - * // => objects for ['fred'] - * - * // The `_.matches` iteratee shorthand. - * _.filter(users, { 'age': 36, 'active': true }); - * // => objects for ['barney'] - * - * // The `_.matchesProperty` iteratee shorthand. - * _.filter(users, ['active', false]); - * // => objects for ['fred'] - * - * // The `_.property` iteratee shorthand. - * _.filter(users, 'active'); - * // => objects for ['barney'] - */ - function filter(collection, predicate) { - var func = isArray(collection) ? arrayFilter : baseFilter; - return func(collection, getIteratee(predicate, 3)); - } - - /** - * Iterates over elements of `collection`, returning the first element - * `predicate` returns truthy for. The predicate is invoked with three - * arguments: (value, index|key, collection). - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to inspect. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @param {number} [fromIndex=0] The index to search from. - * @returns {*} Returns the matched element, else `undefined`. - * @example - * - * var users = [ - * { 'user': 'barney', 'age': 36, 'active': true }, - * { 'user': 'fred', 'age': 40, 'active': false }, - * { 'user': 'pebbles', 'age': 1, 'active': true } - * ]; - * - * _.find(users, function(o) { return o.age < 40; }); - * // => object for 'barney' - * - * // The `_.matches` iteratee shorthand. - * _.find(users, { 'age': 1, 'active': true }); - * // => object for 'pebbles' - * - * // The `_.matchesProperty` iteratee shorthand. - * _.find(users, ['active', false]); - * // => object for 'fred' - * - * // The `_.property` iteratee shorthand. - * _.find(users, 'active'); - * // => object for 'barney' - */ - var find = createFind(findIndex); - - /** - * This method is like `_.find` except that it iterates over elements of - * `collection` from right to left. - * - * @static - * @memberOf _ - * @since 2.0.0 - * @category Collection - * @param {Array|Object} collection The collection to inspect. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @param {number} [fromIndex=collection.length-1] The index to search from. - * @returns {*} Returns the matched element, else `undefined`. - * @example - * - * _.findLast([1, 2, 3, 4], function(n) { - * return n % 2 == 1; - * }); - * // => 3 - */ - var findLast = createFind(findLastIndex); - - /** - * Creates a flattened array of values by running each element in `collection` - * thru `iteratee` and flattening the mapped results. The iteratee is invoked - * with three arguments: (value, index|key, collection). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Array} Returns the new flattened array. - * @example - * - * function duplicate(n) { - * return [n, n]; - * } - * - * _.flatMap([1, 2], duplicate); - * // => [1, 1, 2, 2] - */ - function flatMap(collection, iteratee) { - return baseFlatten(map(collection, iteratee), 1); - } - - /** - * This method is like `_.flatMap` except that it recursively flattens the - * mapped results. - * - * @static - * @memberOf _ - * @since 4.7.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Array} Returns the new flattened array. - * @example - * - * function duplicate(n) { - * return [[[n, n]]]; - * } - * - * _.flatMapDeep([1, 2], duplicate); - * // => [1, 1, 2, 2] - */ - function flatMapDeep(collection, iteratee) { - return baseFlatten(map(collection, iteratee), INFINITY); - } - - /** - * This method is like `_.flatMap` except that it recursively flattens the - * mapped results up to `depth` times. - * - * @static - * @memberOf _ - * @since 4.7.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @param {number} [depth=1] The maximum recursion depth. - * @returns {Array} Returns the new flattened array. - * @example - * - * function duplicate(n) { - * return [[[n, n]]]; - * } - * - * _.flatMapDepth([1, 2], duplicate, 2); - * // => [[1, 1], [2, 2]] - */ - function flatMapDepth(collection, iteratee, depth) { - depth = depth === undefined ? 1 : toInteger(depth); - return baseFlatten(map(collection, iteratee), depth); - } - - /** - * Iterates over elements of `collection` and invokes `iteratee` for each element. - * The iteratee is invoked with three arguments: (value, index|key, collection). - * Iteratee functions may exit iteration early by explicitly returning `false`. - * - * **Note:** As with other "Collections" methods, objects with a "length" - * property are iterated like arrays. To avoid this behavior use `_.forIn` - * or `_.forOwn` for object iteration. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @alias each - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Array|Object} Returns `collection`. - * @see _.forEachRight - * @example - * - * _.forEach([1, 2], function(value) { - * console.log(value); - * }); - * // => Logs `1` then `2`. - * - * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) { - * console.log(key); - * }); - * // => Logs 'a' then 'b' (iteration order is not guaranteed). - */ - function forEach(collection, iteratee) { - var func = isArray(collection) ? arrayEach : baseEach; - return func(collection, getIteratee(iteratee, 3)); - } - - /** - * This method is like `_.forEach` except that it iterates over elements of - * `collection` from right to left. - * - * @static - * @memberOf _ - * @since 2.0.0 - * @alias eachRight - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Array|Object} Returns `collection`. - * @see _.forEach - * @example - * - * _.forEachRight([1, 2], function(value) { - * console.log(value); - * }); - * // => Logs `2` then `1`. - */ - function forEachRight(collection, iteratee) { - var func = isArray(collection) ? arrayEachRight : baseEachRight; - return func(collection, getIteratee(iteratee, 3)); - } - - /** - * Creates an object composed of keys generated from the results of running - * each element of `collection` thru `iteratee`. The order of grouped values - * is determined by the order they occur in `collection`. The corresponding - * value of each key is an array of elements responsible for generating the - * key. The iteratee is invoked with one argument: (value). - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The iteratee to transform keys. - * @returns {Object} Returns the composed aggregate object. - * @example - * - * _.groupBy([6.1, 4.2, 6.3], Math.floor); - * // => { '4': [4.2], '6': [6.1, 6.3] } - * - * // The `_.property` iteratee shorthand. - * _.groupBy(['one', 'two', 'three'], 'length'); - * // => { '3': ['one', 'two'], '5': ['three'] } - */ - var groupBy = createAggregator(function (result, value, key) { - if (hasOwnProperty.call(result, key)) { - result[key].push(value); - } else { - baseAssignValue(result, key, [value]); - } - }); - - /** - * Checks if `value` is in `collection`. If `collection` is a string, it's - * checked for a substring of `value`, otherwise - * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * is used for equality comparisons. If `fromIndex` is negative, it's used as - * the offset from the end of `collection`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object|string} collection The collection to inspect. - * @param {*} value The value to search for. - * @param {number} [fromIndex=0] The index to search from. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`. - * @returns {boolean} Returns `true` if `value` is found, else `false`. - * @example - * - * _.includes([1, 2, 3], 1); - * // => true - * - * _.includes([1, 2, 3], 1, 2); - * // => false - * - * _.includes({ 'a': 1, 'b': 2 }, 1); - * // => true - * - * _.includes('abcd', 'bc'); - * // => true - */ - function includes(collection, value, fromIndex, guard) { - collection = isArrayLike(collection) - ? collection - : values(collection); - fromIndex = fromIndex && !guard ? toInteger(fromIndex) : 0; - - var length = collection.length; - if (fromIndex < 0) { - fromIndex = nativeMax(length + fromIndex, 0); - } - return isString(collection) - ? fromIndex <= length && - collection.indexOf(value, fromIndex) > -1 - : !!length && baseIndexOf(collection, value, fromIndex) > -1; - } - - /** - * Invokes the method at `path` of each element in `collection`, returning - * an array of the results of each invoked method. Any additional arguments - * are provided to each invoked method. If `path` is a function, it's invoked - * for, and `this` bound to, each element in `collection`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Array|Function|string} path The path of the method to invoke or - * the function invoked per iteration. - * @param {...*} [args] The arguments to invoke each method with. - * @returns {Array} Returns the array of results. - * @example - * - * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort'); - * // => [[1, 5, 7], [1, 2, 3]] - * - * _.invokeMap([123, 456], String.prototype.split, ''); - * // => [['1', '2', '3'], ['4', '5', '6']] - */ - var invokeMap = baseRest(function (collection, path, args) { - var index = -1, - isFunc = typeof path == 'function', - result = isArrayLike(collection) - ? Array(collection.length) - : []; - - baseEach(collection, function (value) { - result[++index] = isFunc - ? apply(path, value, args) - : baseInvoke(value, path, args); - }); - return result; - }); - - /** - * Creates an object composed of keys generated from the results of running - * each element of `collection` thru `iteratee`. The corresponding value of - * each key is the last element responsible for generating the key. The - * iteratee is invoked with one argument: (value). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The iteratee to transform keys. - * @returns {Object} Returns the composed aggregate object. - * @example - * - * var array = [ - * { 'dir': 'left', 'code': 97 }, - * { 'dir': 'right', 'code': 100 } - * ]; - * - * _.keyBy(array, function(o) { - * return String.fromCharCode(o.code); - * }); - * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } } - * - * _.keyBy(array, 'dir'); - * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } } - */ - var keyBy = createAggregator(function (result, value, key) { - baseAssignValue(result, key, value); - }); - - /** - * Creates an array of values by running each element in `collection` thru - * `iteratee`. The iteratee is invoked with three arguments: - * (value, index|key, collection). - * - * Many lodash methods are guarded to work as iteratees for methods like - * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. - * - * The guarded methods are: - * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`, - * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`, - * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`, - * `template`, `trim`, `trimEnd`, `trimStart`, and `words` - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Array} Returns the new mapped array. - * @example - * - * function square(n) { - * return n * n; - * } - * - * _.map([4, 8], square); - * // => [16, 64] - * - * _.map({ 'a': 4, 'b': 8 }, square); - * // => [16, 64] (iteration order is not guaranteed) - * - * var users = [ - * { 'user': 'barney' }, - * { 'user': 'fred' } - * ]; - * - * // The `_.property` iteratee shorthand. - * _.map(users, 'user'); - * // => ['barney', 'fred'] - */ - function map(collection, iteratee) { - var func = isArray(collection) ? arrayMap : baseMap; - return func(collection, getIteratee(iteratee, 3)); - } - - /** - * This method is like `_.sortBy` except that it allows specifying the sort - * orders of the iteratees to sort by. If `orders` is unspecified, all values - * are sorted in ascending order. Otherwise, specify an order of "desc" for - * descending or "asc" for ascending sort order of corresponding values. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]] - * The iteratees to sort by. - * @param {string[]} [orders] The sort orders of `iteratees`. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`. - * @returns {Array} Returns the new sorted array. - * @example - * - * var users = [ - * { 'user': 'fred', 'age': 48 }, - * { 'user': 'barney', 'age': 34 }, - * { 'user': 'fred', 'age': 40 }, - * { 'user': 'barney', 'age': 36 } - * ]; - * - * // Sort by `user` in ascending order and by `age` in descending order. - * _.orderBy(users, ['user', 'age'], ['asc', 'desc']); - * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]] - */ - function orderBy(collection, iteratees, orders, guard) { - if (collection == null) { - return []; - } - if (!isArray(iteratees)) { - iteratees = iteratees == null ? [] : [iteratees]; - } - orders = guard ? undefined : orders; - if (!isArray(orders)) { - orders = orders == null ? [] : [orders]; - } - return baseOrderBy(collection, iteratees, orders); - } - - /** - * Creates an array of elements split into two groups, the first of which - * contains elements `predicate` returns truthy for, the second of which - * contains elements `predicate` returns falsey for. The predicate is - * invoked with one argument: (value). - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @returns {Array} Returns the array of grouped elements. - * @example - * - * var users = [ - * { 'user': 'barney', 'age': 36, 'active': false }, - * { 'user': 'fred', 'age': 40, 'active': true }, - * { 'user': 'pebbles', 'age': 1, 'active': false } - * ]; - * - * _.partition(users, function(o) { return o.active; }); - * // => objects for [['fred'], ['barney', 'pebbles']] - * - * // The `_.matches` iteratee shorthand. - * _.partition(users, { 'age': 1, 'active': false }); - * // => objects for [['pebbles'], ['barney', 'fred']] - * - * // The `_.matchesProperty` iteratee shorthand. - * _.partition(users, ['active', false]); - * // => objects for [['barney', 'pebbles'], ['fred']] - * - * // The `_.property` iteratee shorthand. - * _.partition(users, 'active'); - * // => objects for [['fred'], ['barney', 'pebbles']] - */ - var partition = createAggregator( - function (result, value, key) { - result[key ? 0 : 1].push(value); - }, - function () { - return [[], []]; - } - ); - - /** - * Reduces `collection` to a value which is the accumulated result of running - * each element in `collection` thru `iteratee`, where each successive - * invocation is supplied the return value of the previous. If `accumulator` - * is not given, the first element of `collection` is used as the initial - * value. The iteratee is invoked with four arguments: - * (accumulator, value, index|key, collection). - * - * Many lodash methods are guarded to work as iteratees for methods like - * `_.reduce`, `_.reduceRight`, and `_.transform`. - * - * The guarded methods are: - * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`, - * and `sortBy` - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @param {*} [accumulator] The initial value. - * @returns {*} Returns the accumulated value. - * @see _.reduceRight - * @example - * - * _.reduce([1, 2], function(sum, n) { - * return sum + n; - * }, 0); - * // => 3 - * - * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { - * (result[value] || (result[value] = [])).push(key); - * return result; - * }, {}); - * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed) - */ - function reduce(collection, iteratee, accumulator) { - var func = isArray(collection) ? arrayReduce : baseReduce, - initAccum = arguments.length < 3; - - return func( - collection, - getIteratee(iteratee, 4), - accumulator, - initAccum, - baseEach - ); - } - - /** - * This method is like `_.reduce` except that it iterates over elements of - * `collection` from right to left. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @param {*} [accumulator] The initial value. - * @returns {*} Returns the accumulated value. - * @see _.reduce - * @example - * - * var array = [[0, 1], [2, 3], [4, 5]]; - * - * _.reduceRight(array, function(flattened, other) { - * return flattened.concat(other); - * }, []); - * // => [4, 5, 2, 3, 0, 1] - */ - function reduceRight(collection, iteratee, accumulator) { - var func = isArray(collection) ? arrayReduceRight : baseReduce, - initAccum = arguments.length < 3; - - return func( - collection, - getIteratee(iteratee, 4), - accumulator, - initAccum, - baseEachRight - ); - } - - /** - * The opposite of `_.filter`; this method returns the elements of `collection` - * that `predicate` does **not** return truthy for. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @returns {Array} Returns the new filtered array. - * @see _.filter - * @example - * - * var users = [ - * { 'user': 'barney', 'age': 36, 'active': false }, - * { 'user': 'fred', 'age': 40, 'active': true } - * ]; - * - * _.reject(users, function(o) { return !o.active; }); - * // => objects for ['fred'] - * - * // The `_.matches` iteratee shorthand. - * _.reject(users, { 'age': 40, 'active': true }); - * // => objects for ['barney'] - * - * // The `_.matchesProperty` iteratee shorthand. - * _.reject(users, ['active', false]); - * // => objects for ['fred'] - * - * // The `_.property` iteratee shorthand. - * _.reject(users, 'active'); - * // => objects for ['barney'] - */ - function reject(collection, predicate) { - var func = isArray(collection) ? arrayFilter : baseFilter; - return func(collection, negate(getIteratee(predicate, 3))); - } - - /** - * Gets a random element from `collection`. - * - * @static - * @memberOf _ - * @since 2.0.0 - * @category Collection - * @param {Array|Object} collection The collection to sample. - * @returns {*} Returns the random element. - * @example - * - * _.sample([1, 2, 3, 4]); - * // => 2 - */ - function sample(collection) { - var func = isArray(collection) ? arraySample : baseSample; - return func(collection); - } - - /** - * Gets `n` random elements at unique keys from `collection` up to the - * size of `collection`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Collection - * @param {Array|Object} collection The collection to sample. - * @param {number} [n=1] The number of elements to sample. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {Array} Returns the random elements. - * @example - * - * _.sampleSize([1, 2, 3], 2); - * // => [3, 1] - * - * _.sampleSize([1, 2, 3], 4); - * // => [2, 3, 1] - */ - function sampleSize(collection, n, guard) { - if ( - guard ? isIterateeCall(collection, n, guard) : n === undefined - ) { - n = 1; - } else { - n = toInteger(n); - } - var func = isArray(collection) ? arraySampleSize : baseSampleSize; - return func(collection, n); - } - - /** - * Creates an array of shuffled values, using a version of the - * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle). - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to shuffle. - * @returns {Array} Returns the new shuffled array. - * @example - * - * _.shuffle([1, 2, 3, 4]); - * // => [4, 1, 3, 2] - */ - function shuffle(collection) { - var func = isArray(collection) ? arrayShuffle : baseShuffle; - return func(collection); - } - - /** - * Gets the size of `collection` by returning its length for array-like - * values or the number of own enumerable string keyed properties for objects. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object|string} collection The collection to inspect. - * @returns {number} Returns the collection size. - * @example - * - * _.size([1, 2, 3]); - * // => 3 - * - * _.size({ 'a': 1, 'b': 2 }); - * // => 2 - * - * _.size('pebbles'); - * // => 7 - */ - function size(collection) { - if (collection == null) { - return 0; - } - if (isArrayLike(collection)) { - return isString(collection) - ? stringSize(collection) - : collection.length; - } - var tag = getTag(collection); - if (tag == mapTag || tag == setTag) { - return collection.size; - } - return baseKeys(collection).length; - } - - /** - * Checks if `predicate` returns truthy for **any** element of `collection`. - * Iteration is stopped once `predicate` returns truthy. The predicate is - * invoked with three arguments: (value, index|key, collection). - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {boolean} Returns `true` if any element passes the predicate check, - * else `false`. - * @example - * - * _.some([null, 0, 'yes', false], Boolean); - * // => true - * - * var users = [ - * { 'user': 'barney', 'active': true }, - * { 'user': 'fred', 'active': false } - * ]; - * - * // The `_.matches` iteratee shorthand. - * _.some(users, { 'user': 'barney', 'active': false }); - * // => false - * - * // The `_.matchesProperty` iteratee shorthand. - * _.some(users, ['active', false]); - * // => true - * - * // The `_.property` iteratee shorthand. - * _.some(users, 'active'); - * // => true - */ - function some(collection, predicate, guard) { - var func = isArray(collection) ? arraySome : baseSome; - if (guard && isIterateeCall(collection, predicate, guard)) { - predicate = undefined; - } - return func(collection, getIteratee(predicate, 3)); - } - - /** - * Creates an array of elements, sorted in ascending order by the results of - * running each element in a collection thru each iteratee. This method - * performs a stable sort, that is, it preserves the original sort order of - * equal elements. The iteratees are invoked with one argument: (value). - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {...(Function|Function[])} [iteratees=[_.identity]] - * The iteratees to sort by. - * @returns {Array} Returns the new sorted array. - * @example - * - * var users = [ - * { 'user': 'fred', 'age': 48 }, - * { 'user': 'barney', 'age': 36 }, - * { 'user': 'fred', 'age': 40 }, - * { 'user': 'barney', 'age': 34 } - * ]; - * - * _.sortBy(users, [function(o) { return o.user; }]); - * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]] - * - * _.sortBy(users, ['user', 'age']); - * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]] - */ - var sortBy = baseRest(function (collection, iteratees) { - if (collection == null) { - return []; - } - var length = iteratees.length; - if ( - length > 1 && - isIterateeCall(collection, iteratees[0], iteratees[1]) - ) { - iteratees = []; - } else if ( - length > 2 && - isIterateeCall(iteratees[0], iteratees[1], iteratees[2]) - ) { - iteratees = [iteratees[0]]; - } - return baseOrderBy(collection, baseFlatten(iteratees, 1), []); - }); - - /*------------------------------------------------------------------------*/ - - /** - * Gets the timestamp of the number of milliseconds that have elapsed since - * the Unix epoch (1 January 1970 00:00:00 UTC). - * - * @static - * @memberOf _ - * @since 2.4.0 - * @category Date - * @returns {number} Returns the timestamp. - * @example - * - * _.defer(function(stamp) { - * console.log(_.now() - stamp); - * }, _.now()); - * // => Logs the number of milliseconds it took for the deferred invocation. - */ - var now = - ctxNow || - function () { - return root.Date.now(); - }; - - /*------------------------------------------------------------------------*/ - - /** - * The opposite of `_.before`; this method creates a function that invokes - * `func` once it's called `n` or more times. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {number} n The number of calls before `func` is invoked. - * @param {Function} func The function to restrict. - * @returns {Function} Returns the new restricted function. - * @example - * - * var saves = ['profile', 'settings']; - * - * var done = _.after(saves.length, function() { - * console.log('done saving!'); - * }); - * - * _.forEach(saves, function(type) { - * asyncSave({ 'type': type, 'complete': done }); - * }); - * // => Logs 'done saving!' after the two async saves have completed. - */ - function after(n, func) { - if (typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - n = toInteger(n); - return function () { - if (--n < 1) { - return func.apply(this, arguments); - } - }; - } - - /** - * Creates a function that invokes `func`, with up to `n` arguments, - * ignoring any additional arguments. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Function - * @param {Function} func The function to cap arguments for. - * @param {number} [n=func.length] The arity cap. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {Function} Returns the new capped function. - * @example - * - * _.map(['6', '8', '10'], _.ary(parseInt, 1)); - * // => [6, 8, 10] - */ - function ary(func, n, guard) { - n = guard ? undefined : n; - n = func && n == null ? func.length : n; - return createWrap( - func, - WRAP_ARY_FLAG, - undefined, - undefined, - undefined, - undefined, - n - ); - } - - /** - * Creates a function that invokes `func`, with the `this` binding and arguments - * of the created function, while it's called less than `n` times. Subsequent - * calls to the created function return the result of the last `func` invocation. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Function - * @param {number} n The number of calls at which `func` is no longer invoked. - * @param {Function} func The function to restrict. - * @returns {Function} Returns the new restricted function. - * @example - * - * jQuery(element).on('click', _.before(5, addContactToList)); - * // => Allows adding up to 4 contacts to the list. - */ - function before(n, func) { - var result; - if (typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - n = toInteger(n); - return function () { - if (--n > 0) { - result = func.apply(this, arguments); - } - if (n <= 1) { - func = undefined; - } - return result; - }; - } - - /** - * Creates a function that invokes `func` with the `this` binding of `thisArg` - * and `partials` prepended to the arguments it receives. - * - * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds, - * may be used as a placeholder for partially applied arguments. - * - * **Note:** Unlike native `Function#bind`, this method doesn't set the "length" - * property of bound functions. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to bind. - * @param {*} thisArg The `this` binding of `func`. - * @param {...*} [partials] The arguments to be partially applied. - * @returns {Function} Returns the new bound function. - * @example - * - * function greet(greeting, punctuation) { - * return greeting + ' ' + this.user + punctuation; - * } - * - * var object = { 'user': 'fred' }; - * - * var bound = _.bind(greet, object, 'hi'); - * bound('!'); - * // => 'hi fred!' - * - * // Bound with placeholders. - * var bound = _.bind(greet, object, _, '!'); - * bound('hi'); - * // => 'hi fred!' - */ - var bind = baseRest(function (func, thisArg, partials) { - var bitmask = WRAP_BIND_FLAG; - if (partials.length) { - var holders = replaceHolders(partials, getHolder(bind)); - bitmask |= WRAP_PARTIAL_FLAG; - } - return createWrap(func, bitmask, thisArg, partials, holders); - }); - - /** - * Creates a function that invokes the method at `object[key]` with `partials` - * prepended to the arguments it receives. - * - * This method differs from `_.bind` by allowing bound functions to reference - * methods that may be redefined or don't yet exist. See - * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern) - * for more details. - * - * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic - * builds, may be used as a placeholder for partially applied arguments. - * - * @static - * @memberOf _ - * @since 0.10.0 - * @category Function - * @param {Object} object The object to invoke the method on. - * @param {string} key The key of the method. - * @param {...*} [partials] The arguments to be partially applied. - * @returns {Function} Returns the new bound function. - * @example - * - * var object = { - * 'user': 'fred', - * 'greet': function(greeting, punctuation) { - * return greeting + ' ' + this.user + punctuation; - * } - * }; - * - * var bound = _.bindKey(object, 'greet', 'hi'); - * bound('!'); - * // => 'hi fred!' - * - * object.greet = function(greeting, punctuation) { - * return greeting + 'ya ' + this.user + punctuation; - * }; - * - * bound('!'); - * // => 'hiya fred!' - * - * // Bound with placeholders. - * var bound = _.bindKey(object, 'greet', _, '!'); - * bound('hi'); - * // => 'hiya fred!' - */ - var bindKey = baseRest(function (object, key, partials) { - var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG; - if (partials.length) { - var holders = replaceHolders(partials, getHolder(bindKey)); - bitmask |= WRAP_PARTIAL_FLAG; - } - return createWrap(key, bitmask, object, partials, holders); - }); - - /** - * Creates a function that accepts arguments of `func` and either invokes - * `func` returning its result, if at least `arity` number of arguments have - * been provided, or returns a function that accepts the remaining `func` - * arguments, and so on. The arity of `func` may be specified if `func.length` - * is not sufficient. - * - * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds, - * may be used as a placeholder for provided arguments. - * - * **Note:** This method doesn't set the "length" property of curried functions. - * - * @static - * @memberOf _ - * @since 2.0.0 - * @category Function - * @param {Function} func The function to curry. - * @param {number} [arity=func.length] The arity of `func`. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {Function} Returns the new curried function. - * @example - * - * var abc = function(a, b, c) { - * return [a, b, c]; - * }; - * - * var curried = _.curry(abc); - * - * curried(1)(2)(3); - * // => [1, 2, 3] - * - * curried(1, 2)(3); - * // => [1, 2, 3] - * - * curried(1, 2, 3); - * // => [1, 2, 3] - * - * // Curried with placeholders. - * curried(1)(_, 3)(2); - * // => [1, 2, 3] - */ - function curry(func, arity, guard) { - arity = guard ? undefined : arity; - var result = createWrap( - func, - WRAP_CURRY_FLAG, - undefined, - undefined, - undefined, - undefined, - undefined, - arity - ); - result.placeholder = curry.placeholder; - return result; - } - - /** - * This method is like `_.curry` except that arguments are applied to `func` - * in the manner of `_.partialRight` instead of `_.partial`. - * - * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic - * builds, may be used as a placeholder for provided arguments. - * - * **Note:** This method doesn't set the "length" property of curried functions. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Function - * @param {Function} func The function to curry. - * @param {number} [arity=func.length] The arity of `func`. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {Function} Returns the new curried function. - * @example - * - * var abc = function(a, b, c) { - * return [a, b, c]; - * }; - * - * var curried = _.curryRight(abc); - * - * curried(3)(2)(1); - * // => [1, 2, 3] - * - * curried(2, 3)(1); - * // => [1, 2, 3] - * - * curried(1, 2, 3); - * // => [1, 2, 3] - * - * // Curried with placeholders. - * curried(3)(1, _)(2); - * // => [1, 2, 3] - */ - function curryRight(func, arity, guard) { - arity = guard ? undefined : arity; - var result = createWrap( - func, - WRAP_CURRY_RIGHT_FLAG, - undefined, - undefined, - undefined, - undefined, - undefined, - arity - ); - result.placeholder = curryRight.placeholder; - return result; - } - - /** - * Creates a debounced function that delays invoking `func` until after `wait` - * milliseconds have elapsed since the last time the debounced function was - * invoked. The debounced function comes with a `cancel` method to cancel - * delayed `func` invocations and a `flush` method to immediately invoke them. - * Provide `options` to indicate whether `func` should be invoked on the - * leading and/or trailing edge of the `wait` timeout. The `func` is invoked - * with the last arguments provided to the debounced function. Subsequent - * calls to the debounced function return the result of the last `func` - * invocation. - * - * **Note:** If `leading` and `trailing` options are `true`, `func` is - * invoked on the trailing edge of the timeout only if the debounced function - * is invoked more than once during the `wait` timeout. - * - * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred - * until to the next tick, similar to `setTimeout` with a timeout of `0`. - * - * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) - * for details over the differences between `_.debounce` and `_.throttle`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to debounce. - * @param {number} [wait=0] The number of milliseconds to delay. - * @param {Object} [options={}] The options object. - * @param {boolean} [options.leading=false] - * Specify invoking on the leading edge of the timeout. - * @param {number} [options.maxWait] - * The maximum time `func` is allowed to be delayed before it's invoked. - * @param {boolean} [options.trailing=true] - * Specify invoking on the trailing edge of the timeout. - * @returns {Function} Returns the new debounced function. - * @example - * - * // Avoid costly calculations while the window size is in flux. - * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); - * - * // Invoke `sendMail` when clicked, debouncing subsequent calls. - * jQuery(element).on('click', _.debounce(sendMail, 300, { - * 'leading': true, - * 'trailing': false - * })); - * - * // Ensure `batchLog` is invoked once after 1 second of debounced calls. - * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 }); - * var source = new EventSource('/stream'); - * jQuery(source).on('message', debounced); - * - * // Cancel the trailing debounced invocation. - * jQuery(window).on('popstate', debounced.cancel); - */ - function debounce(func, wait, options) { - var lastArgs, - lastThis, - maxWait, - result, - timerId, - lastCallTime, - lastInvokeTime = 0, - leading = false, - maxing = false, - trailing = true; - - if (typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - wait = toNumber(wait) || 0; - if (isObject(options)) { - leading = !!options.leading; - maxing = 'maxWait' in options; - maxWait = maxing - ? nativeMax(toNumber(options.maxWait) || 0, wait) - : maxWait; - trailing = - 'trailing' in options ? !!options.trailing : trailing; - } - - function invokeFunc(time) { - var args = lastArgs, - thisArg = lastThis; - - lastArgs = lastThis = undefined; - lastInvokeTime = time; - result = func.apply(thisArg, args); - return result; - } - - function leadingEdge(time) { - // Reset any `maxWait` timer. - lastInvokeTime = time; - // Start the timer for the trailing edge. - timerId = setTimeout(timerExpired, wait); - // Invoke the leading edge. - return leading ? invokeFunc(time) : result; - } - - function remainingWait(time) { - var timeSinceLastCall = time - lastCallTime, - timeSinceLastInvoke = time - lastInvokeTime, - timeWaiting = wait - timeSinceLastCall; - - return maxing - ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) - : timeWaiting; - } - - function shouldInvoke(time) { - var timeSinceLastCall = time - lastCallTime, - timeSinceLastInvoke = time - lastInvokeTime; - - // Either this is the first call, activity has stopped and we're at the - // trailing edge, the system time has gone backwards and we're treating - // it as the trailing edge, or we've hit the `maxWait` limit. - return ( - lastCallTime === undefined || - timeSinceLastCall >= wait || - timeSinceLastCall < 0 || - (maxing && timeSinceLastInvoke >= maxWait) - ); - } - - function timerExpired() { - var time = now(); - if (shouldInvoke(time)) { - return trailingEdge(time); - } - // Restart the timer. - timerId = setTimeout(timerExpired, remainingWait(time)); - } - - function trailingEdge(time) { - timerId = undefined; - - // Only invoke if we have `lastArgs` which means `func` has been - // debounced at least once. - if (trailing && lastArgs) { - return invokeFunc(time); - } - lastArgs = lastThis = undefined; - return result; - } - - function cancel() { - if (timerId !== undefined) { - clearTimeout(timerId); - } - lastInvokeTime = 0; - lastArgs = lastCallTime = lastThis = timerId = undefined; - } - - function flush() { - return timerId === undefined ? result : trailingEdge(now()); - } - - function debounced() { - var time = now(), - isInvoking = shouldInvoke(time); - - lastArgs = arguments; - lastThis = this; - lastCallTime = time; - - if (isInvoking) { - if (timerId === undefined) { - return leadingEdge(lastCallTime); - } - if (maxing) { - // Handle invocations in a tight loop. - timerId = setTimeout(timerExpired, wait); - return invokeFunc(lastCallTime); - } - } - if (timerId === undefined) { - timerId = setTimeout(timerExpired, wait); - } - return result; - } - debounced.cancel = cancel; - debounced.flush = flush; - return debounced; - } - - /** - * Defers invoking the `func` until the current call stack has cleared. Any - * additional arguments are provided to `func` when it's invoked. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to defer. - * @param {...*} [args] The arguments to invoke `func` with. - * @returns {number} Returns the timer id. - * @example - * - * _.defer(function(text) { - * console.log(text); - * }, 'deferred'); - * // => Logs 'deferred' after one millisecond. - */ - var defer = baseRest(function (func, args) { - return baseDelay(func, 1, args); - }); - - /** - * Invokes `func` after `wait` milliseconds. Any additional arguments are - * provided to `func` when it's invoked. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to delay. - * @param {number} wait The number of milliseconds to delay invocation. - * @param {...*} [args] The arguments to invoke `func` with. - * @returns {number} Returns the timer id. - * @example - * - * _.delay(function(text) { - * console.log(text); - * }, 1000, 'later'); - * // => Logs 'later' after one second. - */ - var delay = baseRest(function (func, wait, args) { - return baseDelay(func, toNumber(wait) || 0, args); - }); - - /** - * Creates a function that invokes `func` with arguments reversed. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Function - * @param {Function} func The function to flip arguments for. - * @returns {Function} Returns the new flipped function. - * @example - * - * var flipped = _.flip(function() { - * return _.toArray(arguments); - * }); - * - * flipped('a', 'b', 'c', 'd'); - * // => ['d', 'c', 'b', 'a'] - */ - function flip(func) { - return createWrap(func, WRAP_FLIP_FLAG); - } - - /** - * Creates a function that memoizes the result of `func`. If `resolver` is - * provided, it determines the cache key for storing the result based on the - * arguments provided to the memoized function. By default, the first argument - * provided to the memoized function is used as the map cache key. The `func` - * is invoked with the `this` binding of the memoized function. - * - * **Note:** The cache is exposed as the `cache` property on the memoized - * function. Its creation may be customized by replacing the `_.memoize.Cache` - * constructor with one whose instances implement the - * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) - * method interface of `clear`, `delete`, `get`, `has`, and `set`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to have its output memoized. - * @param {Function} [resolver] The function to resolve the cache key. - * @returns {Function} Returns the new memoized function. - * @example - * - * var object = { 'a': 1, 'b': 2 }; - * var other = { 'c': 3, 'd': 4 }; - * - * var values = _.memoize(_.values); - * values(object); - * // => [1, 2] - * - * values(other); - * // => [3, 4] - * - * object.a = 2; - * values(object); - * // => [1, 2] - * - * // Modify the result cache. - * values.cache.set(object, ['a', 'b']); - * values(object); - * // => ['a', 'b'] - * - * // Replace `_.memoize.Cache`. - * _.memoize.Cache = WeakMap; - */ - function memoize(func, resolver) { - if ( - typeof func != 'function' || - (resolver != null && typeof resolver != 'function') - ) { - throw new TypeError(FUNC_ERROR_TEXT); - } - var memoized = function () { - var args = arguments, - key = resolver ? resolver.apply(this, args) : args[0], - cache = memoized.cache; - - if (cache.has(key)) { - return cache.get(key); - } - var result = func.apply(this, args); - memoized.cache = cache.set(key, result) || cache; - return result; - }; - memoized.cache = new (memoize.Cache || MapCache)(); - return memoized; - } - - // Expose `MapCache`. - memoize.Cache = MapCache; - - /** - * Creates a function that negates the result of the predicate `func`. The - * `func` predicate is invoked with the `this` binding and arguments of the - * created function. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Function - * @param {Function} predicate The predicate to negate. - * @returns {Function} Returns the new negated function. - * @example - * - * function isEven(n) { - * return n % 2 == 0; - * } - * - * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven)); - * // => [1, 3, 5] - */ - function negate(predicate) { - if (typeof predicate != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - return function () { - var args = arguments; - switch (args.length) { - case 0: - return !predicate.call(this); - case 1: - return !predicate.call(this, args[0]); - case 2: - return !predicate.call(this, args[0], args[1]); - case 3: - return !predicate.call(this, args[0], args[1], args[2]); - } - return !predicate.apply(this, args); - }; - } - - /** - * Creates a function that is restricted to invoking `func` once. Repeat calls - * to the function return the value of the first invocation. The `func` is - * invoked with the `this` binding and arguments of the created function. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to restrict. - * @returns {Function} Returns the new restricted function. - * @example - * - * var initialize = _.once(createApplication); - * initialize(); - * initialize(); - * // => `createApplication` is invoked once - */ - function once(func) { - return before(2, func); - } - - /** - * Creates a function that invokes `func` with its arguments transformed. - * - * @static - * @since 4.0.0 - * @memberOf _ - * @category Function - * @param {Function} func The function to wrap. - * @param {...(Function|Function[])} [transforms=[_.identity]] - * The argument transforms. - * @returns {Function} Returns the new function. - * @example - * - * function doubled(n) { - * return n * 2; - * } - * - * function square(n) { - * return n * n; - * } - * - * var func = _.overArgs(function(x, y) { - * return [x, y]; - * }, [square, doubled]); - * - * func(9, 3); - * // => [81, 6] - * - * func(10, 5); - * // => [100, 10] - */ - var overArgs = castRest(function (func, transforms) { - transforms = - transforms.length == 1 && isArray(transforms[0]) - ? arrayMap(transforms[0], baseUnary(getIteratee())) - : arrayMap( - baseFlatten(transforms, 1), - baseUnary(getIteratee()) - ); - - var funcsLength = transforms.length; - return baseRest(function (args) { - var index = -1, - length = nativeMin(args.length, funcsLength); - - while (++index < length) { - args[index] = transforms[index].call(this, args[index]); - } - return apply(func, this, args); - }); - }); - - /** - * Creates a function that invokes `func` with `partials` prepended to the - * arguments it receives. This method is like `_.bind` except it does **not** - * alter the `this` binding. - * - * The `_.partial.placeholder` value, which defaults to `_` in monolithic - * builds, may be used as a placeholder for partially applied arguments. - * - * **Note:** This method doesn't set the "length" property of partially - * applied functions. - * - * @static - * @memberOf _ - * @since 0.2.0 - * @category Function - * @param {Function} func The function to partially apply arguments to. - * @param {...*} [partials] The arguments to be partially applied. - * @returns {Function} Returns the new partially applied function. - * @example - * - * function greet(greeting, name) { - * return greeting + ' ' + name; - * } - * - * var sayHelloTo = _.partial(greet, 'hello'); - * sayHelloTo('fred'); - * // => 'hello fred' - * - * // Partially applied with placeholders. - * var greetFred = _.partial(greet, _, 'fred'); - * greetFred('hi'); - * // => 'hi fred' - */ - var partial = baseRest(function (func, partials) { - var holders = replaceHolders(partials, getHolder(partial)); - return createWrap( - func, - WRAP_PARTIAL_FLAG, - undefined, - partials, - holders - ); - }); - - /** - * This method is like `_.partial` except that partially applied arguments - * are appended to the arguments it receives. - * - * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic - * builds, may be used as a placeholder for partially applied arguments. - * - * **Note:** This method doesn't set the "length" property of partially - * applied functions. - * - * @static - * @memberOf _ - * @since 1.0.0 - * @category Function - * @param {Function} func The function to partially apply arguments to. - * @param {...*} [partials] The arguments to be partially applied. - * @returns {Function} Returns the new partially applied function. - * @example - * - * function greet(greeting, name) { - * return greeting + ' ' + name; - * } - * - * var greetFred = _.partialRight(greet, 'fred'); - * greetFred('hi'); - * // => 'hi fred' - * - * // Partially applied with placeholders. - * var sayHelloTo = _.partialRight(greet, 'hello', _); - * sayHelloTo('fred'); - * // => 'hello fred' - */ - var partialRight = baseRest(function (func, partials) { - var holders = replaceHolders(partials, getHolder(partialRight)); - return createWrap( - func, - WRAP_PARTIAL_RIGHT_FLAG, - undefined, - partials, - holders - ); - }); - - /** - * Creates a function that invokes `func` with arguments arranged according - * to the specified `indexes` where the argument value at the first index is - * provided as the first argument, the argument value at the second index is - * provided as the second argument, and so on. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Function - * @param {Function} func The function to rearrange arguments for. - * @param {...(number|number[])} indexes The arranged argument indexes. - * @returns {Function} Returns the new function. - * @example - * - * var rearged = _.rearg(function(a, b, c) { - * return [a, b, c]; - * }, [2, 0, 1]); - * - * rearged('b', 'c', 'a') - * // => ['a', 'b', 'c'] - */ - var rearg = flatRest(function (func, indexes) { - return createWrap( - func, - WRAP_REARG_FLAG, - undefined, - undefined, - undefined, - indexes - ); - }); - - /** - * Creates a function that invokes `func` with the `this` binding of the - * created function and arguments from `start` and beyond provided as - * an array. - * - * **Note:** This method is based on the - * [rest parameter](https://mdn.io/rest_parameters). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Function - * @param {Function} func The function to apply a rest parameter to. - * @param {number} [start=func.length-1] The start position of the rest parameter. - * @returns {Function} Returns the new function. - * @example - * - * var say = _.rest(function(what, names) { - * return what + ' ' + _.initial(names).join(', ') + - * (_.size(names) > 1 ? ', & ' : '') + _.last(names); - * }); - * - * say('hello', 'fred', 'barney', 'pebbles'); - * // => 'hello fred, barney, & pebbles' - */ - function rest(func, start) { - if (typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - start = start === undefined ? start : toInteger(start); - return baseRest(func, start); - } - - /** - * Creates a function that invokes `func` with the `this` binding of the - * create function and an array of arguments much like - * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply). - * - * **Note:** This method is based on the - * [spread operator](https://mdn.io/spread_operator). - * - * @static - * @memberOf _ - * @since 3.2.0 - * @category Function - * @param {Function} func The function to spread arguments over. - * @param {number} [start=0] The start position of the spread. - * @returns {Function} Returns the new function. - * @example - * - * var say = _.spread(function(who, what) { - * return who + ' says ' + what; - * }); - * - * say(['fred', 'hello']); - * // => 'fred says hello' - * - * var numbers = Promise.all([ - * Promise.resolve(40), - * Promise.resolve(36) - * ]); - * - * numbers.then(_.spread(function(x, y) { - * return x + y; - * })); - * // => a Promise of 76 - */ - function spread(func, start) { - if (typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - start = start == null ? 0 : nativeMax(toInteger(start), 0); - return baseRest(function (args) { - var array = args[start], - otherArgs = castSlice(args, 0, start); - - if (array) { - arrayPush(otherArgs, array); - } - return apply(func, this, otherArgs); - }); - } - - /** - * Creates a throttled function that only invokes `func` at most once per - * every `wait` milliseconds. The throttled function comes with a `cancel` - * method to cancel delayed `func` invocations and a `flush` method to - * immediately invoke them. Provide `options` to indicate whether `func` - * should be invoked on the leading and/or trailing edge of the `wait` - * timeout. The `func` is invoked with the last arguments provided to the - * throttled function. Subsequent calls to the throttled function return the - * result of the last `func` invocation. - * - * **Note:** If `leading` and `trailing` options are `true`, `func` is - * invoked on the trailing edge of the timeout only if the throttled function - * is invoked more than once during the `wait` timeout. - * - * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred - * until to the next tick, similar to `setTimeout` with a timeout of `0`. - * - * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) - * for details over the differences between `_.throttle` and `_.debounce`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to throttle. - * @param {number} [wait=0] The number of milliseconds to throttle invocations to. - * @param {Object} [options={}] The options object. - * @param {boolean} [options.leading=true] - * Specify invoking on the leading edge of the timeout. - * @param {boolean} [options.trailing=true] - * Specify invoking on the trailing edge of the timeout. - * @returns {Function} Returns the new throttled function. - * @example - * - * // Avoid excessively updating the position while scrolling. - * jQuery(window).on('scroll', _.throttle(updatePosition, 100)); - * - * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes. - * var throttled = _.throttle(renewToken, 300000, { 'trailing': false }); - * jQuery(element).on('click', throttled); - * - * // Cancel the trailing throttled invocation. - * jQuery(window).on('popstate', throttled.cancel); - */ - function throttle(func, wait, options) { - var leading = true, - trailing = true; - - if (typeof func != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - if (isObject(options)) { - leading = 'leading' in options ? !!options.leading : leading; - trailing = - 'trailing' in options ? !!options.trailing : trailing; - } - return debounce(func, wait, { - leading: leading, - maxWait: wait, - trailing: trailing, - }); - } - - /** - * Creates a function that accepts up to one argument, ignoring any - * additional arguments. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Function - * @param {Function} func The function to cap arguments for. - * @returns {Function} Returns the new capped function. - * @example - * - * _.map(['6', '8', '10'], _.unary(parseInt)); - * // => [6, 8, 10] - */ - function unary(func) { - return ary(func, 1); - } - - /** - * Creates a function that provides `value` to `wrapper` as its first - * argument. Any additional arguments provided to the function are appended - * to those provided to the `wrapper`. The wrapper is invoked with the `this` - * binding of the created function. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {*} value The value to wrap. - * @param {Function} [wrapper=identity] The wrapper function. - * @returns {Function} Returns the new function. - * @example - * - * var p = _.wrap(_.escape, function(func, text) { - * return '

' + func(text) + '

'; - * }); - * - * p('fred, barney, & pebbles'); - * // => '

fred, barney, & pebbles

' - */ - function wrap(value, wrapper) { - return partial(castFunction(wrapper), value); - } - - /*------------------------------------------------------------------------*/ - - /** - * Casts `value` as an array if it's not one. - * - * @static - * @memberOf _ - * @since 4.4.0 - * @category Lang - * @param {*} value The value to inspect. - * @returns {Array} Returns the cast array. - * @example - * - * _.castArray(1); - * // => [1] - * - * _.castArray({ 'a': 1 }); - * // => [{ 'a': 1 }] - * - * _.castArray('abc'); - * // => ['abc'] - * - * _.castArray(null); - * // => [null] - * - * _.castArray(undefined); - * // => [undefined] - * - * _.castArray(); - * // => [] - * - * var array = [1, 2, 3]; - * console.log(_.castArray(array) === array); - * // => true - */ - function castArray() { - if (!arguments.length) { - return []; - } - var value = arguments[0]; - return isArray(value) ? value : [value]; - } - - /** - * Creates a shallow clone of `value`. - * - * **Note:** This method is loosely based on the - * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm) - * and supports cloning arrays, array buffers, booleans, date objects, maps, - * numbers, `Object` objects, regexes, sets, strings, symbols, and typed - * arrays. The own enumerable properties of `arguments` objects are cloned - * as plain objects. An empty object is returned for uncloneable values such - * as error objects, functions, DOM nodes, and WeakMaps. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to clone. - * @returns {*} Returns the cloned value. - * @see _.cloneDeep - * @example - * - * var objects = [{ 'a': 1 }, { 'b': 2 }]; - * - * var shallow = _.clone(objects); - * console.log(shallow[0] === objects[0]); - * // => true - */ - function clone(value) { - return baseClone(value, CLONE_SYMBOLS_FLAG); - } - - /** - * This method is like `_.clone` except that it accepts `customizer` which - * is invoked to produce the cloned value. If `customizer` returns `undefined`, - * cloning is handled by the method instead. The `customizer` is invoked with - * up to four arguments; (value [, index|key, object, stack]). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to clone. - * @param {Function} [customizer] The function to customize cloning. - * @returns {*} Returns the cloned value. - * @see _.cloneDeepWith - * @example - * - * function customizer(value) { - * if (_.isElement(value)) { - * return value.cloneNode(false); - * } - * } - * - * var el = _.cloneWith(document.body, customizer); - * - * console.log(el === document.body); - * // => false - * console.log(el.nodeName); - * // => 'BODY' - * console.log(el.childNodes.length); - * // => 0 - */ - function cloneWith(value, customizer) { - customizer = - typeof customizer == 'function' ? customizer : undefined; - return baseClone(value, CLONE_SYMBOLS_FLAG, customizer); - } - - /** - * This method is like `_.clone` except that it recursively clones `value`. - * - * @static - * @memberOf _ - * @since 1.0.0 - * @category Lang - * @param {*} value The value to recursively clone. - * @returns {*} Returns the deep cloned value. - * @see _.clone - * @example - * - * var objects = [{ 'a': 1 }, { 'b': 2 }]; - * - * var deep = _.cloneDeep(objects); - * console.log(deep[0] === objects[0]); - * // => false - */ - function cloneDeep(value) { - return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG); - } - - /** - * This method is like `_.cloneWith` except that it recursively clones `value`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to recursively clone. - * @param {Function} [customizer] The function to customize cloning. - * @returns {*} Returns the deep cloned value. - * @see _.cloneWith - * @example - * - * function customizer(value) { - * if (_.isElement(value)) { - * return value.cloneNode(true); - * } - * } - * - * var el = _.cloneDeepWith(document.body, customizer); - * - * console.log(el === document.body); - * // => false - * console.log(el.nodeName); - * // => 'BODY' - * console.log(el.childNodes.length); - * // => 20 - */ - function cloneDeepWith(value, customizer) { - customizer = - typeof customizer == 'function' ? customizer : undefined; - return baseClone( - value, - CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, - customizer - ); - } - - /** - * Checks if `object` conforms to `source` by invoking the predicate - * properties of `source` with the corresponding property values of `object`. - * - * **Note:** This method is equivalent to `_.conforms` when `source` is - * partially applied. - * - * @static - * @memberOf _ - * @since 4.14.0 - * @category Lang - * @param {Object} object The object to inspect. - * @param {Object} source The object of property predicates to conform to. - * @returns {boolean} Returns `true` if `object` conforms, else `false`. - * @example - * - * var object = { 'a': 1, 'b': 2 }; - * - * _.conformsTo(object, { 'b': function(n) { return n > 1; } }); - * // => true - * - * _.conformsTo(object, { 'b': function(n) { return n > 2; } }); - * // => false - */ - function conformsTo(object, source) { - return ( - source == null || baseConformsTo(object, source, keys(source)) - ); - } - - /** - * Performs a - * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * comparison between two values to determine if they are equivalent. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {boolean} Returns `true` if the values are equivalent, else `false`. - * @example - * - * var object = { 'a': 1 }; - * var other = { 'a': 1 }; - * - * _.eq(object, object); - * // => true - * - * _.eq(object, other); - * // => false - * - * _.eq('a', 'a'); - * // => true - * - * _.eq('a', Object('a')); - * // => false - * - * _.eq(NaN, NaN); - * // => true - */ - function eq(value, other) { - return value === other || (value !== value && other !== other); - } - - /** - * Checks if `value` is greater than `other`. - * - * @static - * @memberOf _ - * @since 3.9.0 - * @category Lang - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {boolean} Returns `true` if `value` is greater than `other`, - * else `false`. - * @see _.lt - * @example - * - * _.gt(3, 1); - * // => true - * - * _.gt(3, 3); - * // => false - * - * _.gt(1, 3); - * // => false - */ - var gt = createRelationalOperation(baseGt); - - /** - * Checks if `value` is greater than or equal to `other`. - * - * @static - * @memberOf _ - * @since 3.9.0 - * @category Lang - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {boolean} Returns `true` if `value` is greater than or equal to - * `other`, else `false`. - * @see _.lte - * @example - * - * _.gte(3, 1); - * // => true - * - * _.gte(3, 3); - * // => true - * - * _.gte(1, 3); - * // => false - */ - var gte = createRelationalOperation(function (value, other) { - return value >= other; - }); - - /** - * Checks if `value` is likely an `arguments` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an `arguments` object, - * else `false`. - * @example - * - * _.isArguments(function() { return arguments; }()); - * // => true - * - * _.isArguments([1, 2, 3]); - * // => false - */ - var isArguments = baseIsArguments( - (function () { - return arguments; - })() - ) - ? baseIsArguments - : function (value) { - return ( - isObjectLike(value) && - hasOwnProperty.call(value, 'callee') && - !propertyIsEnumerable.call(value, 'callee') - ); - }; - - /** - * Checks if `value` is classified as an `Array` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an array, else `false`. - * @example - * - * _.isArray([1, 2, 3]); - * // => true - * - * _.isArray(document.body.children); - * // => false - * - * _.isArray('abc'); - * // => false - * - * _.isArray(_.noop); - * // => false - */ - var isArray = Array.isArray; - - /** - * Checks if `value` is classified as an `ArrayBuffer` object. - * - * @static - * @memberOf _ - * @since 4.3.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`. - * @example - * - * _.isArrayBuffer(new ArrayBuffer(2)); - * // => true - * - * _.isArrayBuffer(new Array(2)); - * // => false - */ - var isArrayBuffer = nodeIsArrayBuffer - ? baseUnary(nodeIsArrayBuffer) - : baseIsArrayBuffer; - - /** - * Checks if `value` is array-like. A value is considered array-like if it's - * not a function and has a `value.length` that's an integer greater than or - * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is array-like, else `false`. - * @example - * - * _.isArrayLike([1, 2, 3]); - * // => true - * - * _.isArrayLike(document.body.children); - * // => true - * - * _.isArrayLike('abc'); - * // => true - * - * _.isArrayLike(_.noop); - * // => false - */ - function isArrayLike(value) { - return ( - value != null && isLength(value.length) && !isFunction(value) - ); - } - - /** - * This method is like `_.isArrayLike` except that it also checks if `value` - * is an object. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an array-like object, - * else `false`. - * @example - * - * _.isArrayLikeObject([1, 2, 3]); - * // => true - * - * _.isArrayLikeObject(document.body.children); - * // => true - * - * _.isArrayLikeObject('abc'); - * // => false - * - * _.isArrayLikeObject(_.noop); - * // => false - */ - function isArrayLikeObject(value) { - return isObjectLike(value) && isArrayLike(value); - } - - /** - * Checks if `value` is classified as a boolean primitive or object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a boolean, else `false`. - * @example - * - * _.isBoolean(false); - * // => true - * - * _.isBoolean(null); - * // => false - */ - function isBoolean(value) { - return ( - value === true || - value === false || - (isObjectLike(value) && baseGetTag(value) == boolTag) - ); - } - - /** - * Checks if `value` is a buffer. - * - * @static - * @memberOf _ - * @since 4.3.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. - * @example - * - * _.isBuffer(new Buffer(2)); - * // => true - * - * _.isBuffer(new Uint8Array(2)); - * // => false - */ - var isBuffer = nativeIsBuffer || stubFalse; - - /** - * Checks if `value` is classified as a `Date` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a date object, else `false`. - * @example - * - * _.isDate(new Date); - * // => true - * - * _.isDate('Mon April 23 2012'); - * // => false - */ - var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate; - - /** - * Checks if `value` is likely a DOM element. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`. - * @example - * - * _.isElement(document.body); - * // => true - * - * _.isElement(''); - * // => false - */ - function isElement(value) { - return ( - isObjectLike(value) && - value.nodeType === 1 && - !isPlainObject(value) - ); - } - - /** - * Checks if `value` is an empty object, collection, map, or set. - * - * Objects are considered empty if they have no own enumerable string keyed - * properties. - * - * Array-like values such as `arguments` objects, arrays, buffers, strings, or - * jQuery-like collections are considered empty if they have a `length` of `0`. - * Similarly, maps and sets are considered empty if they have a `size` of `0`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is empty, else `false`. - * @example - * - * _.isEmpty(null); - * // => true - * - * _.isEmpty(true); - * // => true - * - * _.isEmpty(1); - * // => true - * - * _.isEmpty([1, 2, 3]); - * // => false - * - * _.isEmpty({ 'a': 1 }); - * // => false - */ - function isEmpty(value) { - if (value == null) { - return true; - } - if ( - isArrayLike(value) && - (isArray(value) || - typeof value == 'string' || - typeof value.splice == 'function' || - isBuffer(value) || - isTypedArray(value) || - isArguments(value)) - ) { - return !value.length; - } - var tag = getTag(value); - if (tag == mapTag || tag == setTag) { - return !value.size; - } - if (isPrototype(value)) { - return !baseKeys(value).length; - } - for (var key in value) { - if (hasOwnProperty.call(value, key)) { - return false; - } - } - return true; - } - - /** - * Performs a deep comparison between two values to determine if they are - * equivalent. - * - * **Note:** This method supports comparing arrays, array buffers, booleans, - * date objects, error objects, maps, numbers, `Object` objects, regexes, - * sets, strings, symbols, and typed arrays. `Object` objects are compared - * by their own, not inherited, enumerable properties. Functions and DOM - * nodes are compared by strict equality, i.e. `===`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {boolean} Returns `true` if the values are equivalent, else `false`. - * @example - * - * var object = { 'a': 1 }; - * var other = { 'a': 1 }; - * - * _.isEqual(object, other); - * // => true - * - * object === other; - * // => false - */ - function isEqual(value, other) { - return baseIsEqual(value, other); - } - - /** - * This method is like `_.isEqual` except that it accepts `customizer` which - * is invoked to compare values. If `customizer` returns `undefined`, comparisons - * are handled by the method instead. The `customizer` is invoked with up to - * six arguments: (objValue, othValue [, index|key, object, other, stack]). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @param {Function} [customizer] The function to customize comparisons. - * @returns {boolean} Returns `true` if the values are equivalent, else `false`. - * @example - * - * function isGreeting(value) { - * return /^h(?:i|ello)$/.test(value); - * } - * - * function customizer(objValue, othValue) { - * if (isGreeting(objValue) && isGreeting(othValue)) { - * return true; - * } - * } - * - * var array = ['hello', 'goodbye']; - * var other = ['hi', 'goodbye']; - * - * _.isEqualWith(array, other, customizer); - * // => true - */ - function isEqualWith(value, other, customizer) { - customizer = - typeof customizer == 'function' ? customizer : undefined; - var result = customizer ? customizer(value, other) : undefined; - return result === undefined - ? baseIsEqual(value, other, undefined, customizer) - : !!result; - } - - /** - * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`, - * `SyntaxError`, `TypeError`, or `URIError` object. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an error object, else `false`. - * @example - * - * _.isError(new Error); - * // => true - * - * _.isError(Error); - * // => false - */ - function isError(value) { - if (!isObjectLike(value)) { - return false; - } - var tag = baseGetTag(value); - return ( - tag == errorTag || - tag == domExcTag || - (typeof value.message == 'string' && - typeof value.name == 'string' && - !isPlainObject(value)) - ); - } - - /** - * Checks if `value` is a finite primitive number. - * - * **Note:** This method is based on - * [`Number.isFinite`](https://mdn.io/Number/isFinite). - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a finite number, else `false`. - * @example - * - * _.isFinite(3); - * // => true - * - * _.isFinite(Number.MIN_VALUE); - * // => true - * - * _.isFinite(Infinity); - * // => false - * - * _.isFinite('3'); - * // => false - */ - function isFinite(value) { - return typeof value == 'number' && nativeIsFinite(value); - } - - /** - * Checks if `value` is classified as a `Function` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a function, else `false`. - * @example - * - * _.isFunction(_); - * // => true - * - * _.isFunction(/abc/); - * // => false - */ - function isFunction(value) { - if (!isObject(value)) { - return false; - } - // The use of `Object#toString` avoids issues with the `typeof` operator - // in Safari 9 which returns 'object' for typed arrays and other constructors. - var tag = baseGetTag(value); - return ( - tag == funcTag || - tag == genTag || - tag == asyncTag || - tag == proxyTag - ); - } - - /** - * Checks if `value` is an integer. - * - * **Note:** This method is based on - * [`Number.isInteger`](https://mdn.io/Number/isInteger). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an integer, else `false`. - * @example - * - * _.isInteger(3); - * // => true - * - * _.isInteger(Number.MIN_VALUE); - * // => false - * - * _.isInteger(Infinity); - * // => false - * - * _.isInteger('3'); - * // => false - */ - function isInteger(value) { - return typeof value == 'number' && value == toInteger(value); - } - - /** - * Checks if `value` is a valid array-like length. - * - * **Note:** This method is loosely based on - * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. - * @example - * - * _.isLength(3); - * // => true - * - * _.isLength(Number.MIN_VALUE); - * // => false - * - * _.isLength(Infinity); - * // => false - * - * _.isLength('3'); - * // => false - */ - function isLength(value) { - return ( - typeof value == 'number' && - value > -1 && - value % 1 == 0 && - value <= MAX_SAFE_INTEGER - ); - } - - /** - * Checks if `value` is the - * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) - * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an object, else `false`. - * @example - * - * _.isObject({}); - * // => true - * - * _.isObject([1, 2, 3]); - * // => true - * - * _.isObject(_.noop); - * // => true - * - * _.isObject(null); - * // => false - */ - function isObject(value) { - var type = typeof value; - return value != null && (type == 'object' || type == 'function'); - } - - /** - * Checks if `value` is object-like. A value is object-like if it's not `null` - * and has a `typeof` result of "object". - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is object-like, else `false`. - * @example - * - * _.isObjectLike({}); - * // => true - * - * _.isObjectLike([1, 2, 3]); - * // => true - * - * _.isObjectLike(_.noop); - * // => false - * - * _.isObjectLike(null); - * // => false - */ - function isObjectLike(value) { - return value != null && typeof value == 'object'; - } - - /** - * Checks if `value` is classified as a `Map` object. - * - * @static - * @memberOf _ - * @since 4.3.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a map, else `false`. - * @example - * - * _.isMap(new Map); - * // => true - * - * _.isMap(new WeakMap); - * // => false - */ - var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap; - - /** - * Performs a partial deep comparison between `object` and `source` to - * determine if `object` contains equivalent property values. - * - * **Note:** This method is equivalent to `_.matches` when `source` is - * partially applied. - * - * Partial comparisons will match empty array and empty object `source` - * values against any array or object value, respectively. See `_.isEqual` - * for a list of supported value comparisons. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Lang - * @param {Object} object The object to inspect. - * @param {Object} source The object of property values to match. - * @returns {boolean} Returns `true` if `object` is a match, else `false`. - * @example - * - * var object = { 'a': 1, 'b': 2 }; - * - * _.isMatch(object, { 'b': 2 }); - * // => true - * - * _.isMatch(object, { 'b': 1 }); - * // => false - */ - function isMatch(object, source) { - return ( - object === source || - baseIsMatch(object, source, getMatchData(source)) - ); - } - - /** - * This method is like `_.isMatch` except that it accepts `customizer` which - * is invoked to compare values. If `customizer` returns `undefined`, comparisons - * are handled by the method instead. The `customizer` is invoked with five - * arguments: (objValue, srcValue, index|key, object, source). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {Object} object The object to inspect. - * @param {Object} source The object of property values to match. - * @param {Function} [customizer] The function to customize comparisons. - * @returns {boolean} Returns `true` if `object` is a match, else `false`. - * @example - * - * function isGreeting(value) { - * return /^h(?:i|ello)$/.test(value); - * } - * - * function customizer(objValue, srcValue) { - * if (isGreeting(objValue) && isGreeting(srcValue)) { - * return true; - * } - * } - * - * var object = { 'greeting': 'hello' }; - * var source = { 'greeting': 'hi' }; - * - * _.isMatchWith(object, source, customizer); - * // => true - */ - function isMatchWith(object, source, customizer) { - customizer = - typeof customizer == 'function' ? customizer : undefined; - return baseIsMatch( - object, - source, - getMatchData(source), - customizer - ); - } - - /** - * Checks if `value` is `NaN`. - * - * **Note:** This method is based on - * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as - * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for - * `undefined` and other non-number values. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. - * @example - * - * _.isNaN(NaN); - * // => true - * - * _.isNaN(new Number(NaN)); - * // => true - * - * isNaN(undefined); - * // => true - * - * _.isNaN(undefined); - * // => false - */ - function isNaN(value) { - // An `NaN` primitive is the only value that is not equal to itself. - // Perform the `toStringTag` check first to avoid errors with some - // ActiveX objects in IE. - return isNumber(value) && value != +value; - } - - /** - * Checks if `value` is a pristine native function. - * - * **Note:** This method can't reliably detect native functions in the presence - * of the core-js package because core-js circumvents this kind of detection. - * Despite multiple requests, the core-js maintainer has made it clear: any - * attempt to fix the detection will be obstructed. As a result, we're left - * with little choice but to throw an error. Unfortunately, this also affects - * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill), - * which rely on core-js. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a native function, - * else `false`. - * @example - * - * _.isNative(Array.prototype.push); - * // => true - * - * _.isNative(_); - * // => false - */ - function isNative(value) { - if (isMaskable(value)) { - throw new Error(CORE_ERROR_TEXT); - } - return baseIsNative(value); - } - - /** - * Checks if `value` is `null`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is `null`, else `false`. - * @example - * - * _.isNull(null); - * // => true - * - * _.isNull(void 0); - * // => false - */ - function isNull(value) { - return value === null; - } - - /** - * Checks if `value` is `null` or `undefined`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is nullish, else `false`. - * @example - * - * _.isNil(null); - * // => true - * - * _.isNil(void 0); - * // => true - * - * _.isNil(NaN); - * // => false - */ - function isNil(value) { - return value == null; - } - - /** - * Checks if `value` is classified as a `Number` primitive or object. - * - * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are - * classified as numbers, use the `_.isFinite` method. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a number, else `false`. - * @example - * - * _.isNumber(3); - * // => true - * - * _.isNumber(Number.MIN_VALUE); - * // => true - * - * _.isNumber(Infinity); - * // => true - * - * _.isNumber('3'); - * // => false - */ - function isNumber(value) { - return ( - typeof value == 'number' || - (isObjectLike(value) && baseGetTag(value) == numberTag) - ); - } - - /** - * Checks if `value` is a plain object, that is, an object created by the - * `Object` constructor or one with a `[[Prototype]]` of `null`. - * - * @static - * @memberOf _ - * @since 0.8.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. - * @example - * - * function Foo() { - * this.a = 1; - * } - * - * _.isPlainObject(new Foo); - * // => false - * - * _.isPlainObject([1, 2, 3]); - * // => false - * - * _.isPlainObject({ 'x': 0, 'y': 0 }); - * // => true - * - * _.isPlainObject(Object.create(null)); - * // => true - */ - function isPlainObject(value) { - if (!isObjectLike(value) || baseGetTag(value) != objectTag) { - return false; - } - var proto = getPrototype(value); - if (proto === null) { - return true; - } - var Ctor = - hasOwnProperty.call(proto, 'constructor') && proto.constructor; - return ( - typeof Ctor == 'function' && - Ctor instanceof Ctor && - funcToString.call(Ctor) == objectCtorString - ); - } - - /** - * Checks if `value` is classified as a `RegExp` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. - * @example - * - * _.isRegExp(/abc/); - * // => true - * - * _.isRegExp('/abc/'); - * // => false - */ - var isRegExp = nodeIsRegExp - ? baseUnary(nodeIsRegExp) - : baseIsRegExp; - - /** - * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754 - * double precision number which isn't the result of a rounded unsafe integer. - * - * **Note:** This method is based on - * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`. - * @example - * - * _.isSafeInteger(3); - * // => true - * - * _.isSafeInteger(Number.MIN_VALUE); - * // => false - * - * _.isSafeInteger(Infinity); - * // => false - * - * _.isSafeInteger('3'); - * // => false - */ - function isSafeInteger(value) { - return ( - isInteger(value) && - value >= -MAX_SAFE_INTEGER && - value <= MAX_SAFE_INTEGER - ); - } - - /** - * Checks if `value` is classified as a `Set` object. - * - * @static - * @memberOf _ - * @since 4.3.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a set, else `false`. - * @example - * - * _.isSet(new Set); - * // => true - * - * _.isSet(new WeakSet); - * // => false - */ - var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet; - - /** - * Checks if `value` is classified as a `String` primitive or object. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a string, else `false`. - * @example - * - * _.isString('abc'); - * // => true - * - * _.isString(1); - * // => false - */ - function isString(value) { - return ( - typeof value == 'string' || - (!isArray(value) && - isObjectLike(value) && - baseGetTag(value) == stringTag) - ); - } - - /** - * Checks if `value` is classified as a `Symbol` primitive or object. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. - * @example - * - * _.isSymbol(Symbol.iterator); - * // => true - * - * _.isSymbol('abc'); - * // => false - */ - function isSymbol(value) { - return ( - typeof value == 'symbol' || - (isObjectLike(value) && baseGetTag(value) == symbolTag) - ); - } - - /** - * Checks if `value` is classified as a typed array. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. - * @example - * - * _.isTypedArray(new Uint8Array); - * // => true - * - * _.isTypedArray([]); - * // => false - */ - var isTypedArray = nodeIsTypedArray - ? baseUnary(nodeIsTypedArray) - : baseIsTypedArray; - - /** - * Checks if `value` is `undefined`. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`. - * @example - * - * _.isUndefined(void 0); - * // => true - * - * _.isUndefined(null); - * // => false - */ - function isUndefined(value) { - return value === undefined; - } - - /** - * Checks if `value` is classified as a `WeakMap` object. - * - * @static - * @memberOf _ - * @since 4.3.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a weak map, else `false`. - * @example - * - * _.isWeakMap(new WeakMap); - * // => true - * - * _.isWeakMap(new Map); - * // => false - */ - function isWeakMap(value) { - return isObjectLike(value) && getTag(value) == weakMapTag; - } - - /** - * Checks if `value` is classified as a `WeakSet` object. - * - * @static - * @memberOf _ - * @since 4.3.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a weak set, else `false`. - * @example - * - * _.isWeakSet(new WeakSet); - * // => true - * - * _.isWeakSet(new Set); - * // => false - */ - function isWeakSet(value) { - return isObjectLike(value) && baseGetTag(value) == weakSetTag; - } - - /** - * Checks if `value` is less than `other`. - * - * @static - * @memberOf _ - * @since 3.9.0 - * @category Lang - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {boolean} Returns `true` if `value` is less than `other`, - * else `false`. - * @see _.gt - * @example - * - * _.lt(1, 3); - * // => true - * - * _.lt(3, 3); - * // => false - * - * _.lt(3, 1); - * // => false - */ - var lt = createRelationalOperation(baseLt); - - /** - * Checks if `value` is less than or equal to `other`. - * - * @static - * @memberOf _ - * @since 3.9.0 - * @category Lang - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {boolean} Returns `true` if `value` is less than or equal to - * `other`, else `false`. - * @see _.gte - * @example - * - * _.lte(1, 3); - * // => true - * - * _.lte(3, 3); - * // => true - * - * _.lte(3, 1); - * // => false - */ - var lte = createRelationalOperation(function (value, other) { - return value <= other; - }); - - /** - * Converts `value` to an array. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Lang - * @param {*} value The value to convert. - * @returns {Array} Returns the converted array. - * @example - * - * _.toArray({ 'a': 1, 'b': 2 }); - * // => [1, 2] - * - * _.toArray('abc'); - * // => ['a', 'b', 'c'] - * - * _.toArray(1); - * // => [] - * - * _.toArray(null); - * // => [] - */ - function toArray(value) { - if (!value) { - return []; - } - if (isArrayLike(value)) { - return isString(value) - ? stringToArray(value) - : copyArray(value); - } - if (symIterator && value[symIterator]) { - return iteratorToArray(value[symIterator]()); - } - var tag = getTag(value), - func = - tag == mapTag - ? mapToArray - : tag == setTag - ? setToArray - : values; - - return func(value); - } - - /** - * Converts `value` to a finite number. - * - * @static - * @memberOf _ - * @since 4.12.0 - * @category Lang - * @param {*} value The value to convert. - * @returns {number} Returns the converted number. - * @example - * - * _.toFinite(3.2); - * // => 3.2 - * - * _.toFinite(Number.MIN_VALUE); - * // => 5e-324 - * - * _.toFinite(Infinity); - * // => 1.7976931348623157e+308 - * - * _.toFinite('3.2'); - * // => 3.2 - */ - function toFinite(value) { - if (!value) { - return value === 0 ? value : 0; - } - value = toNumber(value); - if (value === INFINITY || value === -INFINITY) { - var sign = value < 0 ? -1 : 1; - return sign * MAX_INTEGER; - } - return value === value ? value : 0; - } - - /** - * Converts `value` to an integer. - * - * **Note:** This method is loosely based on - * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to convert. - * @returns {number} Returns the converted integer. - * @example - * - * _.toInteger(3.2); - * // => 3 - * - * _.toInteger(Number.MIN_VALUE); - * // => 0 - * - * _.toInteger(Infinity); - * // => 1.7976931348623157e+308 - * - * _.toInteger('3.2'); - * // => 3 - */ - function toInteger(value) { - var result = toFinite(value), - remainder = result % 1; - - return result === result - ? remainder - ? result - remainder - : result - : 0; - } - - /** - * Converts `value` to an integer suitable for use as the length of an - * array-like object. - * - * **Note:** This method is based on - * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to convert. - * @returns {number} Returns the converted integer. - * @example - * - * _.toLength(3.2); - * // => 3 - * - * _.toLength(Number.MIN_VALUE); - * // => 0 - * - * _.toLength(Infinity); - * // => 4294967295 - * - * _.toLength('3.2'); - * // => 3 - */ - function toLength(value) { - return value - ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) - : 0; - } - - /** - * Converts `value` to a number. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to process. - * @returns {number} Returns the number. - * @example - * - * _.toNumber(3.2); - * // => 3.2 - * - * _.toNumber(Number.MIN_VALUE); - * // => 5e-324 - * - * _.toNumber(Infinity); - * // => Infinity - * - * _.toNumber('3.2'); - * // => 3.2 - */ - function toNumber(value) { - if (typeof value == 'number') { - return value; - } - if (isSymbol(value)) { - return NAN; - } - if (isObject(value)) { - var other = - typeof value.valueOf == 'function' ? value.valueOf() : value; - value = isObject(other) ? other + '' : other; - } - if (typeof value != 'string') { - return value === 0 ? value : +value; - } - value = value.replace(reTrim, ''); - var isBinary = reIsBinary.test(value); - return isBinary || reIsOctal.test(value) - ? freeParseInt(value.slice(2), isBinary ? 2 : 8) - : reIsBadHex.test(value) - ? NAN - : +value; - } - - /** - * Converts `value` to a plain object flattening inherited enumerable string - * keyed properties of `value` to own properties of the plain object. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Lang - * @param {*} value The value to convert. - * @returns {Object} Returns the converted plain object. - * @example - * - * function Foo() { - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.assign({ 'a': 1 }, new Foo); - * // => { 'a': 1, 'b': 2 } - * - * _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); - * // => { 'a': 1, 'b': 2, 'c': 3 } - */ - function toPlainObject(value) { - return copyObject(value, keysIn(value)); - } - - /** - * Converts `value` to a safe integer. A safe integer can be compared and - * represented correctly. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to convert. - * @returns {number} Returns the converted integer. - * @example - * - * _.toSafeInteger(3.2); - * // => 3 - * - * _.toSafeInteger(Number.MIN_VALUE); - * // => 0 - * - * _.toSafeInteger(Infinity); - * // => 9007199254740991 - * - * _.toSafeInteger('3.2'); - * // => 3 - */ - function toSafeInteger(value) { - return value - ? baseClamp( - toInteger(value), - -MAX_SAFE_INTEGER, - MAX_SAFE_INTEGER - ) - : value === 0 - ? value - : 0; - } - - /** - * Converts `value` to a string. An empty string is returned for `null` - * and `undefined` values. The sign of `-0` is preserved. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to convert. - * @returns {string} Returns the converted string. - * @example - * - * _.toString(null); - * // => '' - * - * _.toString(-0); - * // => '-0' - * - * _.toString([1, 2, 3]); - * // => '1,2,3' - */ - function toString(value) { - return value == null ? '' : baseToString(value); - } - - /*------------------------------------------------------------------------*/ - - /** - * Assigns own enumerable string keyed properties of source objects to the - * destination object. Source objects are applied from left to right. - * Subsequent sources overwrite property assignments of previous sources. - * - * **Note:** This method mutates `object` and is loosely based on - * [`Object.assign`](https://mdn.io/Object/assign). - * - * @static - * @memberOf _ - * @since 0.10.0 - * @category Object - * @param {Object} object The destination object. - * @param {...Object} [sources] The source objects. - * @returns {Object} Returns `object`. - * @see _.assignIn - * @example - * - * function Foo() { - * this.a = 1; - * } - * - * function Bar() { - * this.c = 3; - * } - * - * Foo.prototype.b = 2; - * Bar.prototype.d = 4; - * - * _.assign({ 'a': 0 }, new Foo, new Bar); - * // => { 'a': 1, 'c': 3 } - */ - var assign = createAssigner(function (object, source) { - if (isPrototype(source) || isArrayLike(source)) { - copyObject(source, keys(source), object); - return; - } - for (var key in source) { - if (hasOwnProperty.call(source, key)) { - assignValue(object, key, source[key]); - } - } - }); - - /** - * This method is like `_.assign` except that it iterates over own and - * inherited source properties. - * - * **Note:** This method mutates `object`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @alias extend - * @category Object - * @param {Object} object The destination object. - * @param {...Object} [sources] The source objects. - * @returns {Object} Returns `object`. - * @see _.assign - * @example - * - * function Foo() { - * this.a = 1; - * } - * - * function Bar() { - * this.c = 3; - * } - * - * Foo.prototype.b = 2; - * Bar.prototype.d = 4; - * - * _.assignIn({ 'a': 0 }, new Foo, new Bar); - * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 } - */ - var assignIn = createAssigner(function (object, source) { - copyObject(source, keysIn(source), object); - }); - - /** - * This method is like `_.assignIn` except that it accepts `customizer` - * which is invoked to produce the assigned values. If `customizer` returns - * `undefined`, assignment is handled by the method instead. The `customizer` - * is invoked with five arguments: (objValue, srcValue, key, object, source). - * - * **Note:** This method mutates `object`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @alias extendWith - * @category Object - * @param {Object} object The destination object. - * @param {...Object} sources The source objects. - * @param {Function} [customizer] The function to customize assigned values. - * @returns {Object} Returns `object`. - * @see _.assignWith - * @example - * - * function customizer(objValue, srcValue) { - * return _.isUndefined(objValue) ? srcValue : objValue; - * } - * - * var defaults = _.partialRight(_.assignInWith, customizer); - * - * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); - * // => { 'a': 1, 'b': 2 } - */ - var assignInWith = createAssigner(function ( - object, - source, - srcIndex, - customizer - ) { - copyObject(source, keysIn(source), object, customizer); - }); - - /** - * This method is like `_.assign` except that it accepts `customizer` - * which is invoked to produce the assigned values. If `customizer` returns - * `undefined`, assignment is handled by the method instead. The `customizer` - * is invoked with five arguments: (objValue, srcValue, key, object, source). - * - * **Note:** This method mutates `object`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Object - * @param {Object} object The destination object. - * @param {...Object} sources The source objects. - * @param {Function} [customizer] The function to customize assigned values. - * @returns {Object} Returns `object`. - * @see _.assignInWith - * @example - * - * function customizer(objValue, srcValue) { - * return _.isUndefined(objValue) ? srcValue : objValue; - * } - * - * var defaults = _.partialRight(_.assignWith, customizer); - * - * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); - * // => { 'a': 1, 'b': 2 } - */ - var assignWith = createAssigner(function ( - object, - source, - srcIndex, - customizer - ) { - copyObject(source, keys(source), object, customizer); - }); - - /** - * Creates an array of values corresponding to `paths` of `object`. - * - * @static - * @memberOf _ - * @since 1.0.0 - * @category Object - * @param {Object} object The object to iterate over. - * @param {...(string|string[])} [paths] The property paths to pick. - * @returns {Array} Returns the picked values. - * @example - * - * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] }; - * - * _.at(object, ['a[0].b.c', 'a[1]']); - * // => [3, 4] - */ - var at = flatRest(baseAt); - - /** - * Creates an object that inherits from the `prototype` object. If a - * `properties` object is given, its own enumerable string keyed properties - * are assigned to the created object. - * - * @static - * @memberOf _ - * @since 2.3.0 - * @category Object - * @param {Object} prototype The object to inherit from. - * @param {Object} [properties] The properties to assign to the object. - * @returns {Object} Returns the new object. - * @example - * - * function Shape() { - * this.x = 0; - * this.y = 0; - * } - * - * function Circle() { - * Shape.call(this); - * } - * - * Circle.prototype = _.create(Shape.prototype, { - * 'constructor': Circle - * }); - * - * var circle = new Circle; - * circle instanceof Circle; - * // => true - * - * circle instanceof Shape; - * // => true - */ - function create(prototype, properties) { - var result = baseCreate(prototype); - return properties == null - ? result - : baseAssign(result, properties); - } - - /** - * Assigns own and inherited enumerable string keyed properties of source - * objects to the destination object for all destination properties that - * resolve to `undefined`. Source objects are applied from left to right. - * Once a property is set, additional values of the same property are ignored. - * - * **Note:** This method mutates `object`. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Object - * @param {Object} object The destination object. - * @param {...Object} [sources] The source objects. - * @returns {Object} Returns `object`. - * @see _.defaultsDeep - * @example - * - * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); - * // => { 'a': 1, 'b': 2 } - */ - var defaults = baseRest(function (object, sources) { - object = Object(object); - - var index = -1; - var length = sources.length; - var guard = length > 2 ? sources[2] : undefined; - - if (guard && isIterateeCall(sources[0], sources[1], guard)) { - length = 1; - } - - while (++index < length) { - var source = sources[index]; - var props = keysIn(source); - var propsIndex = -1; - var propsLength = props.length; - - while (++propsIndex < propsLength) { - var key = props[propsIndex]; - var value = object[key]; - - if ( - value === undefined || - (eq(value, objectProto[key]) && - !hasOwnProperty.call(object, key)) - ) { - object[key] = source[key]; - } - } - } - - return object; - }); - - /** - * This method is like `_.defaults` except that it recursively assigns - * default properties. - * - * **Note:** This method mutates `object`. - * - * @static - * @memberOf _ - * @since 3.10.0 - * @category Object - * @param {Object} object The destination object. - * @param {...Object} [sources] The source objects. - * @returns {Object} Returns `object`. - * @see _.defaults - * @example - * - * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } }); - * // => { 'a': { 'b': 2, 'c': 3 } } - */ - var defaultsDeep = baseRest(function (args) { - args.push(undefined, customDefaultsMerge); - return apply(mergeWith, undefined, args); - }); - - /** - * This method is like `_.find` except that it returns the key of the first - * element `predicate` returns truthy for instead of the element itself. - * - * @static - * @memberOf _ - * @since 1.1.0 - * @category Object - * @param {Object} object The object to inspect. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @returns {string|undefined} Returns the key of the matched element, - * else `undefined`. - * @example - * - * var users = { - * 'barney': { 'age': 36, 'active': true }, - * 'fred': { 'age': 40, 'active': false }, - * 'pebbles': { 'age': 1, 'active': true } - * }; - * - * _.findKey(users, function(o) { return o.age < 40; }); - * // => 'barney' (iteration order is not guaranteed) - * - * // The `_.matches` iteratee shorthand. - * _.findKey(users, { 'age': 1, 'active': true }); - * // => 'pebbles' - * - * // The `_.matchesProperty` iteratee shorthand. - * _.findKey(users, ['active', false]); - * // => 'fred' - * - * // The `_.property` iteratee shorthand. - * _.findKey(users, 'active'); - * // => 'barney' - */ - function findKey(object, predicate) { - return baseFindKey(object, getIteratee(predicate, 3), baseForOwn); - } - - /** - * This method is like `_.findKey` except that it iterates over elements of - * a collection in the opposite order. - * - * @static - * @memberOf _ - * @since 2.0.0 - * @category Object - * @param {Object} object The object to inspect. - * @param {Function} [predicate=_.identity] The function invoked per iteration. - * @returns {string|undefined} Returns the key of the matched element, - * else `undefined`. - * @example - * - * var users = { - * 'barney': { 'age': 36, 'active': true }, - * 'fred': { 'age': 40, 'active': false }, - * 'pebbles': { 'age': 1, 'active': true } - * }; - * - * _.findLastKey(users, function(o) { return o.age < 40; }); - * // => returns 'pebbles' assuming `_.findKey` returns 'barney' - * - * // The `_.matches` iteratee shorthand. - * _.findLastKey(users, { 'age': 36, 'active': true }); - * // => 'barney' - * - * // The `_.matchesProperty` iteratee shorthand. - * _.findLastKey(users, ['active', false]); - * // => 'fred' - * - * // The `_.property` iteratee shorthand. - * _.findLastKey(users, 'active'); - * // => 'pebbles' - */ - function findLastKey(object, predicate) { - return baseFindKey( - object, - getIteratee(predicate, 3), - baseForOwnRight - ); - } - - /** - * Iterates over own and inherited enumerable string keyed properties of an - * object and invokes `iteratee` for each property. The iteratee is invoked - * with three arguments: (value, key, object). Iteratee functions may exit - * iteration early by explicitly returning `false`. - * - * @static - * @memberOf _ - * @since 0.3.0 - * @category Object - * @param {Object} object The object to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Object} Returns `object`. - * @see _.forInRight - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.forIn(new Foo, function(value, key) { - * console.log(key); - * }); - * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed). - */ - function forIn(object, iteratee) { - return object == null - ? object - : baseFor(object, getIteratee(iteratee, 3), keysIn); - } - - /** - * This method is like `_.forIn` except that it iterates over properties of - * `object` in the opposite order. - * - * @static - * @memberOf _ - * @since 2.0.0 - * @category Object - * @param {Object} object The object to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Object} Returns `object`. - * @see _.forIn - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.forInRight(new Foo, function(value, key) { - * console.log(key); - * }); - * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'. - */ - function forInRight(object, iteratee) { - return object == null - ? object - : baseForRight(object, getIteratee(iteratee, 3), keysIn); - } - - /** - * Iterates over own enumerable string keyed properties of an object and - * invokes `iteratee` for each property. The iteratee is invoked with three - * arguments: (value, key, object). Iteratee functions may exit iteration - * early by explicitly returning `false`. - * - * @static - * @memberOf _ - * @since 0.3.0 - * @category Object - * @param {Object} object The object to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Object} Returns `object`. - * @see _.forOwnRight - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.forOwn(new Foo, function(value, key) { - * console.log(key); - * }); - * // => Logs 'a' then 'b' (iteration order is not guaranteed). - */ - function forOwn(object, iteratee) { - return object && baseForOwn(object, getIteratee(iteratee, 3)); - } - - /** - * This method is like `_.forOwn` except that it iterates over properties of - * `object` in the opposite order. - * - * @static - * @memberOf _ - * @since 2.0.0 - * @category Object - * @param {Object} object The object to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Object} Returns `object`. - * @see _.forOwn - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.forOwnRight(new Foo, function(value, key) { - * console.log(key); - * }); - * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'. - */ - function forOwnRight(object, iteratee) { - return ( - object && baseForOwnRight(object, getIteratee(iteratee, 3)) - ); - } - - /** - * Creates an array of function property names from own enumerable properties - * of `object`. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Object - * @param {Object} object The object to inspect. - * @returns {Array} Returns the function names. - * @see _.functionsIn - * @example - * - * function Foo() { - * this.a = _.constant('a'); - * this.b = _.constant('b'); - * } - * - * Foo.prototype.c = _.constant('c'); - * - * _.functions(new Foo); - * // => ['a', 'b'] - */ - function functions(object) { - return object == null ? [] : baseFunctions(object, keys(object)); - } - - /** - * Creates an array of function property names from own and inherited - * enumerable properties of `object`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Object - * @param {Object} object The object to inspect. - * @returns {Array} Returns the function names. - * @see _.functions - * @example - * - * function Foo() { - * this.a = _.constant('a'); - * this.b = _.constant('b'); - * } - * - * Foo.prototype.c = _.constant('c'); - * - * _.functionsIn(new Foo); - * // => ['a', 'b', 'c'] - */ - function functionsIn(object) { - return object == null - ? [] - : baseFunctions(object, keysIn(object)); - } - - /** - * Gets the value at `path` of `object`. If the resolved value is - * `undefined`, the `defaultValue` is returned in its place. - * - * @static - * @memberOf _ - * @since 3.7.0 - * @category Object - * @param {Object} object The object to query. - * @param {Array|string} path The path of the property to get. - * @param {*} [defaultValue] The value returned for `undefined` resolved values. - * @returns {*} Returns the resolved value. - * @example - * - * var object = { 'a': [{ 'b': { 'c': 3 } }] }; - * - * _.get(object, 'a[0].b.c'); - * // => 3 - * - * _.get(object, ['a', '0', 'b', 'c']); - * // => 3 - * - * _.get(object, 'a.b.c', 'default'); - * // => 'default' - */ - function get(object, path, defaultValue) { - var result = object == null ? undefined : baseGet(object, path); - return result === undefined ? defaultValue : result; - } - - /** - * Checks if `path` is a direct property of `object`. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Object - * @param {Object} object The object to query. - * @param {Array|string} path The path to check. - * @returns {boolean} Returns `true` if `path` exists, else `false`. - * @example - * - * var object = { 'a': { 'b': 2 } }; - * var other = _.create({ 'a': _.create({ 'b': 2 }) }); - * - * _.has(object, 'a'); - * // => true - * - * _.has(object, 'a.b'); - * // => true - * - * _.has(object, ['a', 'b']); - * // => true - * - * _.has(other, 'a'); - * // => false - */ - function has(object, path) { - return object != null && hasPath(object, path, baseHas); - } - - /** - * Checks if `path` is a direct or inherited property of `object`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Object - * @param {Object} object The object to query. - * @param {Array|string} path The path to check. - * @returns {boolean} Returns `true` if `path` exists, else `false`. - * @example - * - * var object = _.create({ 'a': _.create({ 'b': 2 }) }); - * - * _.hasIn(object, 'a'); - * // => true - * - * _.hasIn(object, 'a.b'); - * // => true - * - * _.hasIn(object, ['a', 'b']); - * // => true - * - * _.hasIn(object, 'b'); - * // => false - */ - function hasIn(object, path) { - return object != null && hasPath(object, path, baseHasIn); - } - - /** - * Creates an object composed of the inverted keys and values of `object`. - * If `object` contains duplicate values, subsequent values overwrite - * property assignments of previous values. - * - * @static - * @memberOf _ - * @since 0.7.0 - * @category Object - * @param {Object} object The object to invert. - * @returns {Object} Returns the new inverted object. - * @example - * - * var object = { 'a': 1, 'b': 2, 'c': 1 }; - * - * _.invert(object); - * // => { '1': 'c', '2': 'b' } - */ - var invert = createInverter(function (result, value, key) { - if (value != null && typeof value.toString != 'function') { - value = nativeObjectToString.call(value); - } - - result[value] = key; - }, constant(identity)); - - /** - * This method is like `_.invert` except that the inverted object is generated - * from the results of running each element of `object` thru `iteratee`. The - * corresponding inverted value of each inverted key is an array of keys - * responsible for generating the inverted value. The iteratee is invoked - * with one argument: (value). - * - * @static - * @memberOf _ - * @since 4.1.0 - * @category Object - * @param {Object} object The object to invert. - * @param {Function} [iteratee=_.identity] The iteratee invoked per element. - * @returns {Object} Returns the new inverted object. - * @example - * - * var object = { 'a': 1, 'b': 2, 'c': 1 }; - * - * _.invertBy(object); - * // => { '1': ['a', 'c'], '2': ['b'] } - * - * _.invertBy(object, function(value) { - * return 'group' + value; - * }); - * // => { 'group1': ['a', 'c'], 'group2': ['b'] } - */ - var invertBy = createInverter(function (result, value, key) { - if (value != null && typeof value.toString != 'function') { - value = nativeObjectToString.call(value); - } - - if (hasOwnProperty.call(result, value)) { - result[value].push(key); - } else { - result[value] = [key]; - } - }, getIteratee); - - /** - * Invokes the method at `path` of `object`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Object - * @param {Object} object The object to query. - * @param {Array|string} path The path of the method to invoke. - * @param {...*} [args] The arguments to invoke the method with. - * @returns {*} Returns the result of the invoked method. - * @example - * - * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] }; - * - * _.invoke(object, 'a[0].b.c.slice', 1, 3); - * // => [2, 3] - */ - var invoke = baseRest(baseInvoke); - - /** - * Creates an array of the own enumerable property names of `object`. - * - * **Note:** Non-object values are coerced to objects. See the - * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) - * for more details. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Object - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.keys(new Foo); - * // => ['a', 'b'] (iteration order is not guaranteed) - * - * _.keys('hi'); - * // => ['0', '1'] - */ - function keys(object) { - return isArrayLike(object) - ? arrayLikeKeys(object) - : baseKeys(object); - } - - /** - * Creates an array of the own and inherited enumerable property names of `object`. - * - * **Note:** Non-object values are coerced to objects. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Object - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property names. - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.keysIn(new Foo); - * // => ['a', 'b', 'c'] (iteration order is not guaranteed) - */ - function keysIn(object) { - return isArrayLike(object) - ? arrayLikeKeys(object, true) - : baseKeysIn(object); - } - - /** - * The opposite of `_.mapValues`; this method creates an object with the - * same values as `object` and keys generated by running each own enumerable - * string keyed property of `object` thru `iteratee`. The iteratee is invoked - * with three arguments: (value, key, object). - * - * @static - * @memberOf _ - * @since 3.8.0 - * @category Object - * @param {Object} object The object to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Object} Returns the new mapped object. - * @see _.mapValues - * @example - * - * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) { - * return key + value; - * }); - * // => { 'a1': 1, 'b2': 2 } - */ - function mapKeys(object, iteratee) { - var result = {}; - iteratee = getIteratee(iteratee, 3); - - baseForOwn(object, function (value, key, object) { - baseAssignValue(result, iteratee(value, key, object), value); - }); - return result; - } - - /** - * Creates an object with the same keys as `object` and values generated - * by running each own enumerable string keyed property of `object` thru - * `iteratee`. The iteratee is invoked with three arguments: - * (value, key, object). - * - * @static - * @memberOf _ - * @since 2.4.0 - * @category Object - * @param {Object} object The object to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Object} Returns the new mapped object. - * @see _.mapKeys - * @example - * - * var users = { - * 'fred': { 'user': 'fred', 'age': 40 }, - * 'pebbles': { 'user': 'pebbles', 'age': 1 } - * }; - * - * _.mapValues(users, function(o) { return o.age; }); - * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) - * - * // The `_.property` iteratee shorthand. - * _.mapValues(users, 'age'); - * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) - */ - function mapValues(object, iteratee) { - var result = {}; - iteratee = getIteratee(iteratee, 3); - - baseForOwn(object, function (value, key, object) { - baseAssignValue(result, key, iteratee(value, key, object)); - }); - return result; - } - - /** - * This method is like `_.assign` except that it recursively merges own and - * inherited enumerable string keyed properties of source objects into the - * destination object. Source properties that resolve to `undefined` are - * skipped if a destination value exists. Array and plain object properties - * are merged recursively. Other objects and value types are overridden by - * assignment. Source objects are applied from left to right. Subsequent - * sources overwrite property assignments of previous sources. - * - * **Note:** This method mutates `object`. - * - * @static - * @memberOf _ - * @since 0.5.0 - * @category Object - * @param {Object} object The destination object. - * @param {...Object} [sources] The source objects. - * @returns {Object} Returns `object`. - * @example - * - * var object = { - * 'a': [{ 'b': 2 }, { 'd': 4 }] - * }; - * - * var other = { - * 'a': [{ 'c': 3 }, { 'e': 5 }] - * }; - * - * _.merge(object, other); - * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] } - */ - var merge = createAssigner(function (object, source, srcIndex) { - baseMerge(object, source, srcIndex); - }); - - /** - * This method is like `_.merge` except that it accepts `customizer` which - * is invoked to produce the merged values of the destination and source - * properties. If `customizer` returns `undefined`, merging is handled by the - * method instead. The `customizer` is invoked with six arguments: - * (objValue, srcValue, key, object, source, stack). - * - * **Note:** This method mutates `object`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Object - * @param {Object} object The destination object. - * @param {...Object} sources The source objects. - * @param {Function} customizer The function to customize assigned values. - * @returns {Object} Returns `object`. - * @example - * - * function customizer(objValue, srcValue) { - * if (_.isArray(objValue)) { - * return objValue.concat(srcValue); - * } - * } - * - * var object = { 'a': [1], 'b': [2] }; - * var other = { 'a': [3], 'b': [4] }; - * - * _.mergeWith(object, other, customizer); - * // => { 'a': [1, 3], 'b': [2, 4] } - */ - var mergeWith = createAssigner(function ( - object, - source, - srcIndex, - customizer - ) { - baseMerge(object, source, srcIndex, customizer); - }); - - /** - * The opposite of `_.pick`; this method creates an object composed of the - * own and inherited enumerable property paths of `object` that are not omitted. - * - * **Note:** This method is considerably slower than `_.pick`. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Object - * @param {Object} object The source object. - * @param {...(string|string[])} [paths] The property paths to omit. - * @returns {Object} Returns the new object. - * @example - * - * var object = { 'a': 1, 'b': '2', 'c': 3 }; - * - * _.omit(object, ['a', 'c']); - * // => { 'b': '2' } - */ - var omit = flatRest(function (object, paths) { - var result = {}; - if (object == null) { - return result; - } - var isDeep = false; - paths = arrayMap(paths, function (path) { - path = castPath(path, object); - isDeep || (isDeep = path.length > 1); - return path; - }); - copyObject(object, getAllKeysIn(object), result); - if (isDeep) { - result = baseClone( - result, - CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, - customOmitClone - ); - } - var length = paths.length; - while (length--) { - baseUnset(result, paths[length]); - } - return result; - }); - - /** - * The opposite of `_.pickBy`; this method creates an object composed of - * the own and inherited enumerable string keyed properties of `object` that - * `predicate` doesn't return truthy for. The predicate is invoked with two - * arguments: (value, key). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Object - * @param {Object} object The source object. - * @param {Function} [predicate=_.identity] The function invoked per property. - * @returns {Object} Returns the new object. - * @example - * - * var object = { 'a': 1, 'b': '2', 'c': 3 }; - * - * _.omitBy(object, _.isNumber); - * // => { 'b': '2' } - */ - function omitBy(object, predicate) { - return pickBy(object, negate(getIteratee(predicate))); - } - - /** - * Creates an object composed of the picked `object` properties. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Object - * @param {Object} object The source object. - * @param {...(string|string[])} [paths] The property paths to pick. - * @returns {Object} Returns the new object. - * @example - * - * var object = { 'a': 1, 'b': '2', 'c': 3 }; - * - * _.pick(object, ['a', 'c']); - * // => { 'a': 1, 'c': 3 } - */ - var pick = flatRest(function (object, paths) { - return object == null ? {} : basePick(object, paths); - }); - - /** - * Creates an object composed of the `object` properties `predicate` returns - * truthy for. The predicate is invoked with two arguments: (value, key). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Object - * @param {Object} object The source object. - * @param {Function} [predicate=_.identity] The function invoked per property. - * @returns {Object} Returns the new object. - * @example - * - * var object = { 'a': 1, 'b': '2', 'c': 3 }; - * - * _.pickBy(object, _.isNumber); - * // => { 'a': 1, 'c': 3 } - */ - function pickBy(object, predicate) { - if (object == null) { - return {}; - } - var props = arrayMap(getAllKeysIn(object), function (prop) { - return [prop]; - }); - predicate = getIteratee(predicate); - return basePickBy(object, props, function (value, path) { - return predicate(value, path[0]); - }); - } - - /** - * This method is like `_.get` except that if the resolved value is a - * function it's invoked with the `this` binding of its parent object and - * its result is returned. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Object - * @param {Object} object The object to query. - * @param {Array|string} path The path of the property to resolve. - * @param {*} [defaultValue] The value returned for `undefined` resolved values. - * @returns {*} Returns the resolved value. - * @example - * - * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] }; - * - * _.result(object, 'a[0].b.c1'); - * // => 3 - * - * _.result(object, 'a[0].b.c2'); - * // => 4 - * - * _.result(object, 'a[0].b.c3', 'default'); - * // => 'default' - * - * _.result(object, 'a[0].b.c3', _.constant('default')); - * // => 'default' - */ - function result(object, path, defaultValue) { - path = castPath(path, object); - - var index = -1, - length = path.length; - - // Ensure the loop is entered when path is empty. - if (!length) { - length = 1; - object = undefined; - } - while (++index < length) { - var value = - object == null ? undefined : object[toKey(path[index])]; - if (value === undefined) { - index = length; - value = defaultValue; - } - object = isFunction(value) ? value.call(object) : value; - } - return object; - } - - /** - * Sets the value at `path` of `object`. If a portion of `path` doesn't exist, - * it's created. Arrays are created for missing index properties while objects - * are created for all other missing properties. Use `_.setWith` to customize - * `path` creation. - * - * **Note:** This method mutates `object`. - * - * @static - * @memberOf _ - * @since 3.7.0 - * @category Object - * @param {Object} object The object to modify. - * @param {Array|string} path The path of the property to set. - * @param {*} value The value to set. - * @returns {Object} Returns `object`. - * @example - * - * var object = { 'a': [{ 'b': { 'c': 3 } }] }; - * - * _.set(object, 'a[0].b.c', 4); - * console.log(object.a[0].b.c); - * // => 4 - * - * _.set(object, ['x', '0', 'y', 'z'], 5); - * console.log(object.x[0].y.z); - * // => 5 - */ - function set(object, path, value) { - return object == null ? object : baseSet(object, path, value); - } - - /** - * This method is like `_.set` except that it accepts `customizer` which is - * invoked to produce the objects of `path`. If `customizer` returns `undefined` - * path creation is handled by the method instead. The `customizer` is invoked - * with three arguments: (nsValue, key, nsObject). - * - * **Note:** This method mutates `object`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Object - * @param {Object} object The object to modify. - * @param {Array|string} path The path of the property to set. - * @param {*} value The value to set. - * @param {Function} [customizer] The function to customize assigned values. - * @returns {Object} Returns `object`. - * @example - * - * var object = {}; - * - * _.setWith(object, '[0][1]', 'a', Object); - * // => { '0': { '1': 'a' } } - */ - function setWith(object, path, value, customizer) { - customizer = - typeof customizer == 'function' ? customizer : undefined; - return object == null - ? object - : baseSet(object, path, value, customizer); - } - - /** - * Creates an array of own enumerable string keyed-value pairs for `object` - * which can be consumed by `_.fromPairs`. If `object` is a map or set, its - * entries are returned. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @alias entries - * @category Object - * @param {Object} object The object to query. - * @returns {Array} Returns the key-value pairs. - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.toPairs(new Foo); - * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed) - */ - var toPairs = createToPairs(keys); - - /** - * Creates an array of own and inherited enumerable string keyed-value pairs - * for `object` which can be consumed by `_.fromPairs`. If `object` is a map - * or set, its entries are returned. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @alias entriesIn - * @category Object - * @param {Object} object The object to query. - * @returns {Array} Returns the key-value pairs. - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.toPairsIn(new Foo); - * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed) - */ - var toPairsIn = createToPairs(keysIn); - - /** - * An alternative to `_.reduce`; this method transforms `object` to a new - * `accumulator` object which is the result of running each of its own - * enumerable string keyed properties thru `iteratee`, with each invocation - * potentially mutating the `accumulator` object. If `accumulator` is not - * provided, a new object with the same `[[Prototype]]` will be used. The - * iteratee is invoked with four arguments: (accumulator, value, key, object). - * Iteratee functions may exit iteration early by explicitly returning `false`. - * - * @static - * @memberOf _ - * @since 1.3.0 - * @category Object - * @param {Object} object The object to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @param {*} [accumulator] The custom accumulator value. - * @returns {*} Returns the accumulated value. - * @example - * - * _.transform([2, 3, 4], function(result, n) { - * result.push(n *= n); - * return n % 2 == 0; - * }, []); - * // => [4, 9] - * - * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { - * (result[value] || (result[value] = [])).push(key); - * }, {}); - * // => { '1': ['a', 'c'], '2': ['b'] } - */ - function transform(object, iteratee, accumulator) { - var isArr = isArray(object), - isArrLike = isArr || isBuffer(object) || isTypedArray(object); - - iteratee = getIteratee(iteratee, 4); - if (accumulator == null) { - var Ctor = object && object.constructor; - if (isArrLike) { - accumulator = isArr ? new Ctor() : []; - } else if (isObject(object)) { - accumulator = isFunction(Ctor) - ? baseCreate(getPrototype(object)) - : {}; - } else { - accumulator = {}; - } - } - (isArrLike ? arrayEach : baseForOwn)( - object, - function (value, index, object) { - return iteratee(accumulator, value, index, object); - } - ); - return accumulator; - } - - /** - * Removes the property at `path` of `object`. - * - * **Note:** This method mutates `object`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Object - * @param {Object} object The object to modify. - * @param {Array|string} path The path of the property to unset. - * @returns {boolean} Returns `true` if the property is deleted, else `false`. - * @example - * - * var object = { 'a': [{ 'b': { 'c': 7 } }] }; - * _.unset(object, 'a[0].b.c'); - * // => true - * - * console.log(object); - * // => { 'a': [{ 'b': {} }] }; - * - * _.unset(object, ['a', '0', 'b', 'c']); - * // => true - * - * console.log(object); - * // => { 'a': [{ 'b': {} }] }; - */ - function unset(object, path) { - return object == null ? true : baseUnset(object, path); - } - - /** - * This method is like `_.set` except that accepts `updater` to produce the - * value to set. Use `_.updateWith` to customize `path` creation. The `updater` - * is invoked with one argument: (value). - * - * **Note:** This method mutates `object`. - * - * @static - * @memberOf _ - * @since 4.6.0 - * @category Object - * @param {Object} object The object to modify. - * @param {Array|string} path The path of the property to set. - * @param {Function} updater The function to produce the updated value. - * @returns {Object} Returns `object`. - * @example - * - * var object = { 'a': [{ 'b': { 'c': 3 } }] }; - * - * _.update(object, 'a[0].b.c', function(n) { return n * n; }); - * console.log(object.a[0].b.c); - * // => 9 - * - * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; }); - * console.log(object.x[0].y.z); - * // => 0 - */ - function update(object, path, updater) { - return object == null - ? object - : baseUpdate(object, path, castFunction(updater)); - } - - /** - * This method is like `_.update` except that it accepts `customizer` which is - * invoked to produce the objects of `path`. If `customizer` returns `undefined` - * path creation is handled by the method instead. The `customizer` is invoked - * with three arguments: (nsValue, key, nsObject). - * - * **Note:** This method mutates `object`. - * - * @static - * @memberOf _ - * @since 4.6.0 - * @category Object - * @param {Object} object The object to modify. - * @param {Array|string} path The path of the property to set. - * @param {Function} updater The function to produce the updated value. - * @param {Function} [customizer] The function to customize assigned values. - * @returns {Object} Returns `object`. - * @example - * - * var object = {}; - * - * _.updateWith(object, '[0][1]', _.constant('a'), Object); - * // => { '0': { '1': 'a' } } - */ - function updateWith(object, path, updater, customizer) { - customizer = - typeof customizer == 'function' ? customizer : undefined; - return object == null - ? object - : baseUpdate(object, path, castFunction(updater), customizer); - } - - /** - * Creates an array of the own enumerable string keyed property values of `object`. - * - * **Note:** Non-object values are coerced to objects. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Object - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property values. - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.values(new Foo); - * // => [1, 2] (iteration order is not guaranteed) - * - * _.values('hi'); - * // => ['h', 'i'] - */ - function values(object) { - return object == null ? [] : baseValues(object, keys(object)); - } - - /** - * Creates an array of the own and inherited enumerable string keyed property - * values of `object`. - * - * **Note:** Non-object values are coerced to objects. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Object - * @param {Object} object The object to query. - * @returns {Array} Returns the array of property values. - * @example - * - * function Foo() { - * this.a = 1; - * this.b = 2; - * } - * - * Foo.prototype.c = 3; - * - * _.valuesIn(new Foo); - * // => [1, 2, 3] (iteration order is not guaranteed) - */ - function valuesIn(object) { - return object == null ? [] : baseValues(object, keysIn(object)); - } - - /*------------------------------------------------------------------------*/ - - /** - * Clamps `number` within the inclusive `lower` and `upper` bounds. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Number - * @param {number} number The number to clamp. - * @param {number} [lower] The lower bound. - * @param {number} upper The upper bound. - * @returns {number} Returns the clamped number. - * @example - * - * _.clamp(-10, -5, 5); - * // => -5 - * - * _.clamp(10, -5, 5); - * // => 5 - */ - function clamp(number, lower, upper) { - if (upper === undefined) { - upper = lower; - lower = undefined; - } - if (upper !== undefined) { - upper = toNumber(upper); - upper = upper === upper ? upper : 0; - } - if (lower !== undefined) { - lower = toNumber(lower); - lower = lower === lower ? lower : 0; - } - return baseClamp(toNumber(number), lower, upper); - } - - /** - * Checks if `n` is between `start` and up to, but not including, `end`. If - * `end` is not specified, it's set to `start` with `start` then set to `0`. - * If `start` is greater than `end` the params are swapped to support - * negative ranges. - * - * @static - * @memberOf _ - * @since 3.3.0 - * @category Number - * @param {number} number The number to check. - * @param {number} [start=0] The start of the range. - * @param {number} end The end of the range. - * @returns {boolean} Returns `true` if `number` is in the range, else `false`. - * @see _.range, _.rangeRight - * @example - * - * _.inRange(3, 2, 4); - * // => true - * - * _.inRange(4, 8); - * // => true - * - * _.inRange(4, 2); - * // => false - * - * _.inRange(2, 2); - * // => false - * - * _.inRange(1.2, 2); - * // => true - * - * _.inRange(5.2, 4); - * // => false - * - * _.inRange(-3, -2, -6); - * // => true - */ - function inRange(number, start, end) { - start = toFinite(start); - if (end === undefined) { - end = start; - start = 0; - } else { - end = toFinite(end); - } - number = toNumber(number); - return baseInRange(number, start, end); - } - - /** - * Produces a random number between the inclusive `lower` and `upper` bounds. - * If only one argument is provided a number between `0` and the given number - * is returned. If `floating` is `true`, or either `lower` or `upper` are - * floats, a floating-point number is returned instead of an integer. - * - * **Note:** JavaScript follows the IEEE-754 standard for resolving - * floating-point values which can produce unexpected results. - * - * @static - * @memberOf _ - * @since 0.7.0 - * @category Number - * @param {number} [lower=0] The lower bound. - * @param {number} [upper=1] The upper bound. - * @param {boolean} [floating] Specify returning a floating-point number. - * @returns {number} Returns the random number. - * @example - * - * _.random(0, 5); - * // => an integer between 0 and 5 - * - * _.random(5); - * // => also an integer between 0 and 5 - * - * _.random(5, true); - * // => a floating-point number between 0 and 5 - * - * _.random(1.2, 5.2); - * // => a floating-point number between 1.2 and 5.2 - */ - function random(lower, upper, floating) { - if ( - floating && - typeof floating != 'boolean' && - isIterateeCall(lower, upper, floating) - ) { - upper = floating = undefined; - } - if (floating === undefined) { - if (typeof upper == 'boolean') { - floating = upper; - upper = undefined; - } else if (typeof lower == 'boolean') { - floating = lower; - lower = undefined; - } - } - if (lower === undefined && upper === undefined) { - lower = 0; - upper = 1; - } else { - lower = toFinite(lower); - if (upper === undefined) { - upper = lower; - lower = 0; - } else { - upper = toFinite(upper); - } - } - if (lower > upper) { - var temp = lower; - lower = upper; - upper = temp; - } - if (floating || lower % 1 || upper % 1) { - var rand = nativeRandom(); - return nativeMin( - lower + - rand * - (upper - - lower + - freeParseFloat('1e-' + ((rand + '').length - 1))), - upper - ); - } - return baseRandom(lower, upper); - } - - /*------------------------------------------------------------------------*/ - - /** - * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase). - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category String - * @param {string} [string=''] The string to convert. - * @returns {string} Returns the camel cased string. - * @example - * - * _.camelCase('Foo Bar'); - * // => 'fooBar' - * - * _.camelCase('--foo-bar--'); - * // => 'fooBar' - * - * _.camelCase('__FOO_BAR__'); - * // => 'fooBar' - */ - var camelCase = createCompounder(function (result, word, index) { - word = word.toLowerCase(); - return result + (index ? capitalize(word) : word); - }); - - /** - * Converts the first character of `string` to upper case and the remaining - * to lower case. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category String - * @param {string} [string=''] The string to capitalize. - * @returns {string} Returns the capitalized string. - * @example - * - * _.capitalize('FRED'); - * // => 'Fred' - */ - function capitalize(string) { - return upperFirst(toString(string).toLowerCase()); - } - - /** - * Deburrs `string` by converting - * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table) - * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A) - * letters to basic Latin letters and removing - * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category String - * @param {string} [string=''] The string to deburr. - * @returns {string} Returns the deburred string. - * @example - * - * _.deburr('déjà vu'); - * // => 'deja vu' - */ - function deburr(string) { - string = toString(string); - return ( - string && - string.replace(reLatin, deburrLetter).replace(reComboMark, '') - ); - } - - /** - * Checks if `string` ends with the given target string. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category String - * @param {string} [string=''] The string to inspect. - * @param {string} [target] The string to search for. - * @param {number} [position=string.length] The position to search up to. - * @returns {boolean} Returns `true` if `string` ends with `target`, - * else `false`. - * @example - * - * _.endsWith('abc', 'c'); - * // => true - * - * _.endsWith('abc', 'b'); - * // => false - * - * _.endsWith('abc', 'b', 2); - * // => true - */ - function endsWith(string, target, position) { - string = toString(string); - target = baseToString(target); - - var length = string.length; - position = - position === undefined - ? length - : baseClamp(toInteger(position), 0, length); - - var end = position; - position -= target.length; - return position >= 0 && string.slice(position, end) == target; - } - - /** - * Converts the characters "&", "<", ">", '"', and "'" in `string` to their - * corresponding HTML entities. - * - * **Note:** No other characters are escaped. To escape additional - * characters use a third-party library like [_he_](https://mths.be/he). - * - * Though the ">" character is escaped for symmetry, characters like - * ">" and "/" don't need escaping in HTML and have no special meaning - * unless they're part of a tag or unquoted attribute value. See - * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands) - * (under "semi-related fun fact") for more details. - * - * When working with HTML you should always - * [quote attribute values](http://wonko.com/post/html-escaping) to reduce - * XSS vectors. - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category String - * @param {string} [string=''] The string to escape. - * @returns {string} Returns the escaped string. - * @example - * - * _.escape('fred, barney, & pebbles'); - * // => 'fred, barney, & pebbles' - */ - function escape(string) { - string = toString(string); - return string && reHasUnescapedHtml.test(string) - ? string.replace(reUnescapedHtml, escapeHtmlChar) - : string; - } - - /** - * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+", - * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category String - * @param {string} [string=''] The string to escape. - * @returns {string} Returns the escaped string. - * @example - * - * _.escapeRegExp('[lodash](https://lodash.com/)'); - * // => '\[lodash\]\(https://lodash\.com/\)' - */ - function escapeRegExp(string) { - string = toString(string); - return string && reHasRegExpChar.test(string) - ? string.replace(reRegExpChar, '\\$&') - : string; - } - - /** - * Converts `string` to - * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles). - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category String - * @param {string} [string=''] The string to convert. - * @returns {string} Returns the kebab cased string. - * @example - * - * _.kebabCase('Foo Bar'); - * // => 'foo-bar' - * - * _.kebabCase('fooBar'); - * // => 'foo-bar' - * - * _.kebabCase('__FOO_BAR__'); - * // => 'foo-bar' - */ - var kebabCase = createCompounder(function (result, word, index) { - return result + (index ? '-' : '') + word.toLowerCase(); - }); - - /** - * Converts `string`, as space separated words, to lower case. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category String - * @param {string} [string=''] The string to convert. - * @returns {string} Returns the lower cased string. - * @example - * - * _.lowerCase('--Foo-Bar--'); - * // => 'foo bar' - * - * _.lowerCase('fooBar'); - * // => 'foo bar' - * - * _.lowerCase('__FOO_BAR__'); - * // => 'foo bar' - */ - var lowerCase = createCompounder(function (result, word, index) { - return result + (index ? ' ' : '') + word.toLowerCase(); - }); - - /** - * Converts the first character of `string` to lower case. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category String - * @param {string} [string=''] The string to convert. - * @returns {string} Returns the converted string. - * @example - * - * _.lowerFirst('Fred'); - * // => 'fred' - * - * _.lowerFirst('FRED'); - * // => 'fRED' - */ - var lowerFirst = createCaseFirst('toLowerCase'); - - /** - * Pads `string` on the left and right sides if it's shorter than `length`. - * Padding characters are truncated if they can't be evenly divided by `length`. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category String - * @param {string} [string=''] The string to pad. - * @param {number} [length=0] The padding length. - * @param {string} [chars=' '] The string used as padding. - * @returns {string} Returns the padded string. - * @example - * - * _.pad('abc', 8); - * // => ' abc ' - * - * _.pad('abc', 8, '_-'); - * // => '_-abc_-_' - * - * _.pad('abc', 3); - * // => 'abc' - */ - function pad(string, length, chars) { - string = toString(string); - length = toInteger(length); - - var strLength = length ? stringSize(string) : 0; - if (!length || strLength >= length) { - return string; - } - var mid = (length - strLength) / 2; - return ( - createPadding(nativeFloor(mid), chars) + - string + - createPadding(nativeCeil(mid), chars) - ); - } - - /** - * Pads `string` on the right side if it's shorter than `length`. Padding - * characters are truncated if they exceed `length`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category String - * @param {string} [string=''] The string to pad. - * @param {number} [length=0] The padding length. - * @param {string} [chars=' '] The string used as padding. - * @returns {string} Returns the padded string. - * @example - * - * _.padEnd('abc', 6); - * // => 'abc ' - * - * _.padEnd('abc', 6, '_-'); - * // => 'abc_-_' - * - * _.padEnd('abc', 3); - * // => 'abc' - */ - function padEnd(string, length, chars) { - string = toString(string); - length = toInteger(length); - - var strLength = length ? stringSize(string) : 0; - return length && strLength < length - ? string + createPadding(length - strLength, chars) - : string; - } - - /** - * Pads `string` on the left side if it's shorter than `length`. Padding - * characters are truncated if they exceed `length`. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category String - * @param {string} [string=''] The string to pad. - * @param {number} [length=0] The padding length. - * @param {string} [chars=' '] The string used as padding. - * @returns {string} Returns the padded string. - * @example - * - * _.padStart('abc', 6); - * // => ' abc' - * - * _.padStart('abc', 6, '_-'); - * // => '_-_abc' - * - * _.padStart('abc', 3); - * // => 'abc' - */ - function padStart(string, length, chars) { - string = toString(string); - length = toInteger(length); - - var strLength = length ? stringSize(string) : 0; - return length && strLength < length - ? createPadding(length - strLength, chars) + string - : string; - } - - /** - * Converts `string` to an integer of the specified radix. If `radix` is - * `undefined` or `0`, a `radix` of `10` is used unless `value` is a - * hexadecimal, in which case a `radix` of `16` is used. - * - * **Note:** This method aligns with the - * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`. - * - * @static - * @memberOf _ - * @since 1.1.0 - * @category String - * @param {string} string The string to convert. - * @param {number} [radix=10] The radix to interpret `value` by. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {number} Returns the converted integer. - * @example - * - * _.parseInt('08'); - * // => 8 - * - * _.map(['6', '08', '10'], _.parseInt); - * // => [6, 8, 10] - */ - function parseInt(string, radix, guard) { - if (guard || radix == null) { - radix = 0; - } else if (radix) { - radix = +radix; - } - return nativeParseInt( - toString(string).replace(reTrimStart, ''), - radix || 0 - ); - } - - /** - * Repeats the given string `n` times. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category String - * @param {string} [string=''] The string to repeat. - * @param {number} [n=1] The number of times to repeat the string. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {string} Returns the repeated string. - * @example - * - * _.repeat('*', 3); - * // => '***' - * - * _.repeat('abc', 2); - * // => 'abcabc' - * - * _.repeat('abc', 0); - * // => '' - */ - function repeat(string, n, guard) { - if (guard ? isIterateeCall(string, n, guard) : n === undefined) { - n = 1; - } else { - n = toInteger(n); - } - return baseRepeat(toString(string), n); - } - - /** - * Replaces matches for `pattern` in `string` with `replacement`. - * - * **Note:** This method is based on - * [`String#replace`](https://mdn.io/String/replace). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category String - * @param {string} [string=''] The string to modify. - * @param {RegExp|string} pattern The pattern to replace. - * @param {Function|string} replacement The match replacement. - * @returns {string} Returns the modified string. - * @example - * - * _.replace('Hi Fred', 'Fred', 'Barney'); - * // => 'Hi Barney' - */ - function replace() { - var args = arguments, - string = toString(args[0]); - - return args.length < 3 - ? string - : string.replace(args[1], args[2]); - } - - /** - * Converts `string` to - * [snake case](https://en.wikipedia.org/wiki/Snake_case). - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category String - * @param {string} [string=''] The string to convert. - * @returns {string} Returns the snake cased string. - * @example - * - * _.snakeCase('Foo Bar'); - * // => 'foo_bar' - * - * _.snakeCase('fooBar'); - * // => 'foo_bar' - * - * _.snakeCase('--FOO-BAR--'); - * // => 'foo_bar' - */ - var snakeCase = createCompounder(function (result, word, index) { - return result + (index ? '_' : '') + word.toLowerCase(); - }); - - /** - * Splits `string` by `separator`. - * - * **Note:** This method is based on - * [`String#split`](https://mdn.io/String/split). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category String - * @param {string} [string=''] The string to split. - * @param {RegExp|string} separator The separator pattern to split by. - * @param {number} [limit] The length to truncate results to. - * @returns {Array} Returns the string segments. - * @example - * - * _.split('a-b-c', '-', 2); - * // => ['a', 'b'] - */ - function split(string, separator, limit) { - if ( - limit && - typeof limit != 'number' && - isIterateeCall(string, separator, limit) - ) { - separator = limit = undefined; - } - limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0; - if (!limit) { - return []; - } - string = toString(string); - if ( - string && - (typeof separator == 'string' || - (separator != null && !isRegExp(separator))) - ) { - separator = baseToString(separator); - if (!separator && hasUnicode(string)) { - return castSlice(stringToArray(string), 0, limit); - } - } - return string.split(separator, limit); - } - - /** - * Converts `string` to - * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage). - * - * @static - * @memberOf _ - * @since 3.1.0 - * @category String - * @param {string} [string=''] The string to convert. - * @returns {string} Returns the start cased string. - * @example - * - * _.startCase('--foo-bar--'); - * // => 'Foo Bar' - * - * _.startCase('fooBar'); - * // => 'Foo Bar' - * - * _.startCase('__FOO_BAR__'); - * // => 'FOO BAR' - */ - var startCase = createCompounder(function (result, word, index) { - return result + (index ? ' ' : '') + upperFirst(word); - }); - - /** - * Checks if `string` starts with the given target string. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category String - * @param {string} [string=''] The string to inspect. - * @param {string} [target] The string to search for. - * @param {number} [position=0] The position to search from. - * @returns {boolean} Returns `true` if `string` starts with `target`, - * else `false`. - * @example - * - * _.startsWith('abc', 'a'); - * // => true - * - * _.startsWith('abc', 'b'); - * // => false - * - * _.startsWith('abc', 'b', 1); - * // => true - */ - function startsWith(string, target, position) { - string = toString(string); - position = - position == null - ? 0 - : baseClamp(toInteger(position), 0, string.length); - - target = baseToString(target); - return string.slice(position, position + target.length) == target; - } - - /** - * Creates a compiled template function that can interpolate data properties - * in "interpolate" delimiters, HTML-escape interpolated data properties in - * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data - * properties may be accessed as free variables in the template. If a setting - * object is given, it takes precedence over `_.templateSettings` values. - * - * **Note:** In the development build `_.template` utilizes - * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl) - * for easier debugging. - * - * For more information on precompiling templates see - * [lodash's custom builds documentation](https://lodash.com/custom-builds). - * - * For more information on Chrome extension sandboxes see - * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval). - * - * @static - * @since 0.1.0 - * @memberOf _ - * @category String - * @param {string} [string=''] The template string. - * @param {Object} [options={}] The options object. - * @param {RegExp} [options.escape=_.templateSettings.escape] - * The HTML "escape" delimiter. - * @param {RegExp} [options.evaluate=_.templateSettings.evaluate] - * The "evaluate" delimiter. - * @param {Object} [options.imports=_.templateSettings.imports] - * An object to import into the template as free variables. - * @param {RegExp} [options.interpolate=_.templateSettings.interpolate] - * The "interpolate" delimiter. - * @param {string} [options.sourceURL='lodash.templateSources[n]'] - * The sourceURL of the compiled template. - * @param {string} [options.variable='obj'] - * The data object variable name. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {Function} Returns the compiled template function. - * @example - * - * // Use the "interpolate" delimiter to create a compiled template. - * var compiled = _.template('hello <%= user %>!'); - * compiled({ 'user': 'fred' }); - * // => 'hello fred!' - * - * // Use the HTML "escape" delimiter to escape data property values. - * var compiled = _.template('<%- value %>'); - * compiled({ 'value': ' - - - -
- - - diff --git a/invokeai/frontend/web/dist/locales/ar.json b/invokeai/frontend/web/dist/locales/ar.json deleted file mode 100644 index 7354b21ea0..0000000000 --- a/invokeai/frontend/web/dist/locales/ar.json +++ /dev/null @@ -1,504 +0,0 @@ -{ - "common": { - "hotkeysLabel": "مفاتيح الأختصار", - "languagePickerLabel": "منتقي اللغة", - "reportBugLabel": "بلغ عن خطأ", - "settingsLabel": "إعدادات", - "img2img": "صورة إلى صورة", - "unifiedCanvas": "لوحة موحدة", - "nodes": "عقد", - "langArabic": "العربية", - "nodesDesc": "نظام مبني على العقد لإنتاج الصور قيد التطوير حاليًا. تبقى على اتصال مع تحديثات حول هذه الميزة المذهلة.", - "postProcessing": "معالجة بعد الإصدار", - "postProcessDesc1": "Invoke AI توفر مجموعة واسعة من ميزات المعالجة بعد الإصدار. تحسين الصور واستعادة الوجوه متاحين بالفعل في واجهة الويب. يمكنك الوصول إليهم من الخيارات المتقدمة في قائمة الخيارات في علامة التبويب Text To Image و Image To Image. يمكن أيضًا معالجة الصور مباشرةً باستخدام أزرار الإجراء على الصورة فوق عرض الصورة الحالي أو في العارض.", - "postProcessDesc2": "سيتم إصدار واجهة رسومية مخصصة قريبًا لتسهيل عمليات المعالجة بعد الإصدار المتقدمة.", - "postProcessDesc3": "واجهة سطر الأوامر Invoke AI توفر ميزات أخرى عديدة بما في ذلك Embiggen.", - "training": "تدريب", - "trainingDesc1": "تدفق خاص مخصص لتدريب تضميناتك الخاصة ونقاط التحقق باستخدام العكس النصي و دريم بوث من واجهة الويب.", - "trainingDesc2": " استحضر الذكاء الصناعي يدعم بالفعل تدريب تضمينات مخصصة باستخدام العكس النصي باستخدام السكريبت الرئيسي.", - "upload": "رفع", - "close": "إغلاق", - "load": "تحميل", - "back": "الى الخلف", - "statusConnected": "متصل", - "statusDisconnected": "غير متصل", - "statusError": "خطأ", - "statusPreparing": "جاري التحضير", - "statusProcessingCanceled": "تم إلغاء المعالجة", - "statusProcessingComplete": "اكتمال المعالجة", - "statusGenerating": "جاري التوليد", - "statusGeneratingTextToImage": "جاري توليد النص إلى الصورة", - "statusGeneratingImageToImage": "جاري توليد الصورة إلى الصورة", - "statusGeneratingInpainting": "جاري توليد Inpainting", - "statusGeneratingOutpainting": "جاري توليد Outpainting", - "statusGenerationComplete": "اكتمال التوليد", - "statusIterationComplete": "اكتمال التكرار", - "statusSavingImage": "جاري حفظ الصورة", - "statusRestoringFaces": "جاري استعادة الوجوه", - "statusRestoringFacesGFPGAN": "تحسيت الوجوه (جي إف بي جان)", - "statusRestoringFacesCodeFormer": "تحسين الوجوه (كود فورمر)", - "statusUpscaling": "تحسين الحجم", - "statusUpscalingESRGAN": "تحسين الحجم (إي إس آر جان)", - "statusLoadingModel": "تحميل النموذج", - "statusModelChanged": "تغير النموذج" - }, - "gallery": { - "generations": "الأجيال", - "showGenerations": "عرض الأجيال", - "uploads": "التحميلات", - "showUploads": "عرض التحميلات", - "galleryImageSize": "حجم الصورة", - "galleryImageResetSize": "إعادة ضبط الحجم", - "gallerySettings": "إعدادات المعرض", - "maintainAspectRatio": "الحفاظ على نسبة الأبعاد", - "autoSwitchNewImages": "التبديل التلقائي إلى الصور الجديدة", - "singleColumnLayout": "تخطيط عمود واحد", - "allImagesLoaded": "تم تحميل جميع الصور", - "loadMore": "تحميل المزيد", - "noImagesInGallery": "لا توجد صور في المعرض" - }, - "hotkeys": { - "keyboardShortcuts": "مفاتيح الأزرار المختصرة", - "appHotkeys": "مفاتيح التطبيق", - "generalHotkeys": "مفاتيح عامة", - "galleryHotkeys": "مفاتيح المعرض", - "unifiedCanvasHotkeys": "مفاتيح اللوحةالموحدة ", - "invoke": { - "title": "أدعو", - "desc": "إنشاء صورة" - }, - "cancel": { - "title": "إلغاء", - "desc": "إلغاء إنشاء الصورة" - }, - "focusPrompt": { - "title": "تركيز الإشعار", - "desc": "تركيز منطقة الإدخال الإشعار" - }, - "toggleOptions": { - "title": "تبديل الخيارات", - "desc": "فتح وإغلاق لوحة الخيارات" - }, - "pinOptions": { - "title": "خيارات التثبيت", - "desc": "ثبت لوحة الخيارات" - }, - "toggleViewer": { - "title": "تبديل العارض", - "desc": "فتح وإغلاق مشاهد الصور" - }, - "toggleGallery": { - "title": "تبديل المعرض", - "desc": "فتح وإغلاق درابزين المعرض" - }, - "maximizeWorkSpace": { - "title": "تكبير مساحة العمل", - "desc": "إغلاق اللوحات وتكبير مساحة العمل" - }, - "changeTabs": { - "title": "تغيير الألسنة", - "desc": "التبديل إلى مساحة عمل أخرى" - }, - "consoleToggle": { - "title": "تبديل الطرفية", - "desc": "فتح وإغلاق الطرفية" - }, - "setPrompt": { - "title": "ضبط التشعب", - "desc": "استخدم تشعب الصورة الحالية" - }, - "setSeed": { - "title": "ضبط البذور", - "desc": "استخدم بذور الصورة الحالية" - }, - "setParameters": { - "title": "ضبط المعلمات", - "desc": "استخدم جميع المعلمات الخاصة بالصورة الحالية" - }, - "restoreFaces": { - "title": "استعادة الوجوه", - "desc": "استعادة الصورة الحالية" - }, - "upscale": { - "title": "تحسين الحجم", - "desc": "تحسين حجم الصورة الحالية" - }, - "showInfo": { - "title": "عرض المعلومات", - "desc": "عرض معلومات البيانات الخاصة بالصورة الحالية" - }, - "sendToImageToImage": { - "title": "أرسل إلى صورة إلى صورة", - "desc": "أرسل الصورة الحالية إلى صورة إلى صورة" - }, - "deleteImage": { - "title": "حذف الصورة", - "desc": "حذف الصورة الحالية" - }, - "closePanels": { - "title": "أغلق اللوحات", - "desc": "يغلق اللوحات المفتوحة" - }, - "previousImage": { - "title": "الصورة السابقة", - "desc": "عرض الصورة السابقة في الصالة" - }, - "nextImage": { - "title": "الصورة التالية", - "desc": "عرض الصورة التالية في الصالة" - }, - "toggleGalleryPin": { - "title": "تبديل تثبيت الصالة", - "desc": "يثبت ويفتح تثبيت الصالة على الواجهة الرسومية" - }, - "increaseGalleryThumbSize": { - "title": "زيادة حجم صورة الصالة", - "desc": "يزيد حجم الصور المصغرة في الصالة" - }, - "decreaseGalleryThumbSize": { - "title": "انقاص حجم صورة الصالة", - "desc": "ينقص حجم الصور المصغرة في الصالة" - }, - "selectBrush": { - "title": "تحديد الفرشاة", - "desc": "يحدد الفرشاة على اللوحة" - }, - "selectEraser": { - "title": "تحديد الممحاة", - "desc": "يحدد الممحاة على اللوحة" - }, - "decreaseBrushSize": { - "title": "تصغير حجم الفرشاة", - "desc": "يصغر حجم الفرشاة/الممحاة على اللوحة" - }, - "increaseBrushSize": { - "title": "زيادة حجم الفرشاة", - "desc": "يزيد حجم فرشة اللوحة / الممحاة" - }, - "decreaseBrushOpacity": { - "title": "تخفيض شفافية الفرشاة", - "desc": "يخفض شفافية فرشة اللوحة" - }, - "increaseBrushOpacity": { - "title": "زيادة شفافية الفرشاة", - "desc": "يزيد شفافية فرشة اللوحة" - }, - "moveTool": { - "title": "أداة التحريك", - "desc": "يتيح التحرك في اللوحة" - }, - "fillBoundingBox": { - "title": "ملء الصندوق المحدد", - "desc": "يملأ الصندوق المحدد بلون الفرشاة" - }, - "eraseBoundingBox": { - "title": "محو الصندوق المحدد", - "desc": "يمحو منطقة الصندوق المحدد" - }, - "colorPicker": { - "title": "اختيار منتقي اللون", - "desc": "يختار منتقي اللون الخاص باللوحة" - }, - "toggleSnap": { - "title": "تبديل التأكيد", - "desc": "يبديل تأكيد الشبكة" - }, - "quickToggleMove": { - "title": "تبديل سريع للتحريك", - "desc": "يبديل مؤقتا وضع التحريك" - }, - "toggleLayer": { - "title": "تبديل الطبقة", - "desc": "يبديل إختيار الطبقة القناع / الأساسية" - }, - "clearMask": { - "title": "مسح القناع", - "desc": "مسح القناع بأكمله" - }, - "hideMask": { - "title": "إخفاء الكمامة", - "desc": "إخفاء وإظهار الكمامة" - }, - "showHideBoundingBox": { - "title": "إظهار / إخفاء علبة التحديد", - "desc": "تبديل ظهور علبة التحديد" - }, - "mergeVisible": { - "title": "دمج الطبقات الظاهرة", - "desc": "دمج جميع الطبقات الظاهرة في اللوحة" - }, - "saveToGallery": { - "title": "حفظ إلى صالة الأزياء", - "desc": "حفظ اللوحة الحالية إلى صالة الأزياء" - }, - "copyToClipboard": { - "title": "نسخ إلى الحافظة", - "desc": "نسخ اللوحة الحالية إلى الحافظة" - }, - "downloadImage": { - "title": "تنزيل الصورة", - "desc": "تنزيل اللوحة الحالية" - }, - "undoStroke": { - "title": "تراجع عن الخط", - "desc": "تراجع عن خط الفرشاة" - }, - "redoStroke": { - "title": "إعادة الخط", - "desc": "إعادة خط الفرشاة" - }, - "resetView": { - "title": "إعادة تعيين العرض", - "desc": "إعادة تعيين عرض اللوحة" - }, - "previousStagingImage": { - "title": "الصورة السابقة في المرحلة التجريبية", - "desc": "الصورة السابقة في منطقة المرحلة التجريبية" - }, - "nextStagingImage": { - "title": "الصورة التالية في المرحلة التجريبية", - "desc": "الصورة التالية في منطقة المرحلة التجريبية" - }, - "acceptStagingImage": { - "title": "قبول الصورة في المرحلة التجريبية", - "desc": "قبول الصورة الحالية في منطقة المرحلة التجريبية" - } - }, - "modelManager": { - "modelManager": "مدير النموذج", - "model": "نموذج", - "allModels": "جميع النماذج", - "checkpointModels": "نقاط التحقق", - "diffusersModels": "المصادر المتعددة", - "safetensorModels": "التنسورات الآمنة", - "modelAdded": "تمت إضافة النموذج", - "modelUpdated": "تم تحديث النموذج", - "modelEntryDeleted": "تم حذف مدخل النموذج", - "cannotUseSpaces": "لا يمكن استخدام المساحات", - "addNew": "إضافة جديد", - "addNewModel": "إضافة نموذج جديد", - "addCheckpointModel": "إضافة نقطة تحقق / نموذج التنسور الآمن", - "addDiffuserModel": "إضافة مصادر متعددة", - "addManually": "إضافة يدويًا", - "manual": "يدوي", - "name": "الاسم", - "nameValidationMsg": "أدخل اسما لنموذجك", - "description": "الوصف", - "descriptionValidationMsg": "أضف وصفا لنموذجك", - "config": "تكوين", - "configValidationMsg": "مسار الملف الإعدادي لنموذجك.", - "modelLocation": "موقع النموذج", - "modelLocationValidationMsg": "موقع النموذج على الجهاز الخاص بك.", - "repo_id": "معرف المستودع", - "repoIDValidationMsg": "المستودع الإلكتروني لنموذجك", - "vaeLocation": "موقع فاي إي", - "vaeLocationValidationMsg": "موقع فاي إي على الجهاز الخاص بك.", - "vaeRepoID": "معرف مستودع فاي إي", - "vaeRepoIDValidationMsg": "المستودع الإلكتروني فاي إي", - "width": "عرض", - "widthValidationMsg": "عرض افتراضي لنموذجك.", - "height": "ارتفاع", - "heightValidationMsg": "ارتفاع افتراضي لنموذجك.", - "addModel": "أضف نموذج", - "updateModel": "تحديث النموذج", - "availableModels": "النماذج المتاحة", - "search": "بحث", - "load": "تحميل", - "active": "نشط", - "notLoaded": "غير محمل", - "cached": "مخبأ", - "checkpointFolder": "مجلد التدقيق", - "clearCheckpointFolder": "مسح مجلد التدقيق", - "findModels": "إيجاد النماذج", - "scanAgain": "فحص مرة أخرى", - "modelsFound": "النماذج الموجودة", - "selectFolder": "حدد المجلد", - "selected": "تم التحديد", - "selectAll": "حدد الكل", - "deselectAll": "إلغاء تحديد الكل", - "showExisting": "إظهار الموجود", - "addSelected": "أضف المحدد", - "modelExists": "النموذج موجود", - "selectAndAdd": "حدد وأضف النماذج المدرجة أدناه", - "noModelsFound": "لم يتم العثور على نماذج", - "delete": "حذف", - "deleteModel": "حذف النموذج", - "deleteConfig": "حذف التكوين", - "deleteMsg1": "هل أنت متأكد من رغبتك في حذف إدخال النموذج هذا من استحضر الذكاء الصناعي", - "deleteMsg2": "هذا لن يحذف ملف نقطة التحكم للنموذج من القرص الخاص بك. يمكنك إعادة إضافتهم إذا كنت ترغب في ذلك.", - "formMessageDiffusersModelLocation": "موقع النموذج للمصعد", - "formMessageDiffusersModelLocationDesc": "يرجى إدخال واحد على الأقل.", - "formMessageDiffusersVAELocation": "موقع فاي إي", - "formMessageDiffusersVAELocationDesc": "إذا لم يتم توفيره، سيبحث استحضر الذكاء الصناعي عن ملف فاي إي داخل موقع النموذج المعطى أعلاه." - }, - "parameters": { - "images": "الصور", - "steps": "الخطوات", - "cfgScale": "مقياس الإعداد الذاتي للجملة", - "width": "عرض", - "height": "ارتفاع", - "seed": "بذرة", - "randomizeSeed": "تبديل بذرة", - "shuffle": "تشغيل", - "noiseThreshold": "عتبة الضوضاء", - "perlinNoise": "ضجيج برلين", - "variations": "تباينات", - "variationAmount": "كمية التباين", - "seedWeights": "أوزان البذور", - "faceRestoration": "استعادة الوجه", - "restoreFaces": "استعادة الوجوه", - "type": "نوع", - "strength": "قوة", - "upscaling": "تصغير", - "upscale": "تصغير", - "upscaleImage": "تصغير الصورة", - "scale": "مقياس", - "otherOptions": "خيارات أخرى", - "seamlessTiling": "تجهيز بلاستيكي بدون تشققات", - "hiresOptim": "تحسين الدقة العالية", - "imageFit": "ملائمة الصورة الأولية لحجم الخرج", - "codeformerFidelity": "الوثوقية", - "scaleBeforeProcessing": "تحجيم قبل المعالجة", - "scaledWidth": "العرض المحجوب", - "scaledHeight": "الارتفاع المحجوب", - "infillMethod": "طريقة التعبئة", - "tileSize": "حجم البلاطة", - "boundingBoxHeader": "صندوق التحديد", - "seamCorrectionHeader": "تصحيح التشقق", - "infillScalingHeader": "التعبئة والتحجيم", - "img2imgStrength": "قوة صورة إلى صورة", - "toggleLoopback": "تبديل الإعادة", - "sendTo": "أرسل إلى", - "sendToImg2Img": "أرسل إلى صورة إلى صورة", - "sendToUnifiedCanvas": "أرسل إلى الخطوط الموحدة", - "copyImage": "نسخ الصورة", - "copyImageToLink": "نسخ الصورة إلى الرابط", - "downloadImage": "تحميل الصورة", - "openInViewer": "فتح في العارض", - "closeViewer": "إغلاق العارض", - "usePrompt": "استخدم المحث", - "useSeed": "استخدام البذور", - "useAll": "استخدام الكل", - "useInitImg": "استخدام الصورة الأولية", - "info": "معلومات", - "initialImage": "الصورة الأولية", - "showOptionsPanel": "إظهار لوحة الخيارات" - }, - "settings": { - "models": "موديلات", - "displayInProgress": "عرض الصور المؤرشفة", - "saveSteps": "حفظ الصور كل n خطوات", - "confirmOnDelete": "تأكيد عند الحذف", - "displayHelpIcons": "عرض أيقونات المساعدة", - "enableImageDebugging": "تمكين التصحيح عند التصوير", - "resetWebUI": "إعادة تعيين واجهة الويب", - "resetWebUIDesc1": "إعادة تعيين واجهة الويب يعيد فقط ذاكرة التخزين المؤقت للمتصفح لصورك وإعداداتك المذكورة. لا يحذف أي صور من القرص.", - "resetWebUIDesc2": "إذا لم تظهر الصور في الصالة أو إذا كان شيء آخر غير ناجح، يرجى المحاولة إعادة تعيين قبل تقديم مشكلة على جيت هب.", - "resetComplete": "تم إعادة تعيين واجهة الويب. تحديث الصفحة لإعادة التحميل." - }, - "toast": { - "tempFoldersEmptied": "تم تفريغ مجلد المؤقت", - "uploadFailed": "فشل التحميل", - "uploadFailedUnableToLoadDesc": "تعذر تحميل الملف", - "downloadImageStarted": "بدأ تنزيل الصورة", - "imageCopied": "تم نسخ الصورة", - "imageLinkCopied": "تم نسخ رابط الصورة", - "imageNotLoaded": "لم يتم تحميل أي صورة", - "imageNotLoadedDesc": "لم يتم العثور على صورة لإرسالها إلى وحدة الصورة", - "imageSavedToGallery": "تم حفظ الصورة في المعرض", - "canvasMerged": "تم دمج الخط", - "sentToImageToImage": "تم إرسال إلى صورة إلى صورة", - "sentToUnifiedCanvas": "تم إرسال إلى لوحة موحدة", - "parametersSet": "تم تعيين المعلمات", - "parametersNotSet": "لم يتم تعيين المعلمات", - "parametersNotSetDesc": "لم يتم العثور على معلمات بيانية لهذه الصورة.", - "parametersFailed": "حدث مشكلة في تحميل المعلمات", - "parametersFailedDesc": "تعذر تحميل صورة البدء.", - "seedSet": "تم تعيين البذرة", - "seedNotSet": "لم يتم تعيين البذرة", - "seedNotSetDesc": "تعذر العثور على البذرة لهذه الصورة.", - "promptSet": "تم تعيين الإشعار", - "promptNotSet": "Prompt Not Set", - "promptNotSetDesc": "تعذر العثور على الإشعار لهذه الصورة.", - "upscalingFailed": "فشل التحسين", - "faceRestoreFailed": "فشل استعادة الوجه", - "metadataLoadFailed": "فشل تحميل البيانات الوصفية", - "initialImageSet": "تم تعيين الصورة الأولية", - "initialImageNotSet": "لم يتم تعيين الصورة الأولية", - "initialImageNotSetDesc": "تعذر تحميل الصورة الأولية" - }, - "tooltip": { - "feature": { - "prompt": "هذا هو حقل التحذير. يشمل التحذير عناصر الإنتاج والمصطلحات الأسلوبية. يمكنك إضافة الأوزان (أهمية الرمز) في التحذير أيضًا، ولكن أوامر CLI والمعلمات لن تعمل.", - "gallery": "تعرض Gallery منتجات من مجلد الإخراج عندما يتم إنشاؤها. تخزن الإعدادات داخل الملفات ويتم الوصول إليها عن طريق قائمة السياق.", - "other": "ستمكن هذه الخيارات من وضع عمليات معالجة بديلة لـاستحضر الذكاء الصناعي. سيؤدي 'الزخرفة بلا جدران' إلى إنشاء أنماط تكرارية في الإخراج. 'دقة عالية' هي الإنتاج خلال خطوتين عبر صورة إلى صورة: استخدم هذا الإعداد عندما ترغب في توليد صورة أكبر وأكثر تجانبًا دون العيوب. ستستغرق الأشياء وقتًا أطول من نص إلى صورة المعتاد.", - "seed": "يؤثر قيمة البذور على الضوضاء الأولي الذي يتم تكوين الصورة منه. يمكنك استخدام البذور الخاصة بالصور السابقة. 'عتبة الضوضاء' يتم استخدامها لتخفيف العناصر الخللية في قيم CFG العالية (جرب مدى 0-10), و Perlin لإضافة ضوضاء Perlin أثناء الإنتاج: كلا منهما يعملان على إضافة التنوع إلى النتائج الخاصة بك.", - "variations": "جرب التغيير مع قيمة بين 0.1 و 1.0 لتغيير النتائج لبذور معينة. التغييرات المثيرة للاهتمام للبذور تكون بين 0.1 و 0.3.", - "upscale": "استخدم إي إس آر جان لتكبير الصورة على الفور بعد الإنتاج.", - "faceCorrection": "تصحيح الوجه باستخدام جي إف بي جان أو كود فورمر: يكتشف الخوارزمية الوجوه في الصورة وتصحح أي عيوب. قيمة عالية ستغير الصورة أكثر، مما يؤدي إلى وجوه أكثر جمالا. كود فورمر بدقة أعلى يحتفظ بالصورة الأصلية على حساب تصحيح وجه أكثر قوة.", - "imageToImage": "تحميل صورة إلى صورة أي صورة كأولية، والتي يتم استخدامها لإنشاء صورة جديدة مع التشعيب. كلما كانت القيمة أعلى، كلما تغيرت نتيجة الصورة. من الممكن أن تكون القيم بين 0.0 و 1.0، وتوصي النطاق الموصى به هو .25-.75", - "boundingBox": "مربع الحدود هو نفس الإعدادات العرض والارتفاع لنص إلى صورة أو صورة إلى صورة. فقط المنطقة في المربع سيتم معالجتها.", - "seamCorrection": "يتحكم بالتعامل مع الخطوط المرئية التي تحدث بين الصور المولدة في سطح اللوحة.", - "infillAndScaling": "إدارة أساليب التعبئة (المستخدمة على المناطق المخفية أو الممحوة في سطح اللوحة) والزيادة في الحجم (مفيدة لحجوزات الإطارات الصغيرة)." - } - }, - "unifiedCanvas": { - "layer": "طبقة", - "base": "قاعدة", - "mask": "قناع", - "maskingOptions": "خيارات القناع", - "enableMask": "مكن القناع", - "preserveMaskedArea": "الحفاظ على المنطقة المقنعة", - "clearMask": "مسح القناع", - "brush": "فرشاة", - "eraser": "ممحاة", - "fillBoundingBox": "ملئ إطار الحدود", - "eraseBoundingBox": "مسح إطار الحدود", - "colorPicker": "اختيار اللون", - "brushOptions": "خيارات الفرشاة", - "brushSize": "الحجم", - "move": "تحريك", - "resetView": "إعادة تعيين العرض", - "mergeVisible": "دمج الظاهر", - "saveToGallery": "حفظ إلى المعرض", - "copyToClipboard": "نسخ إلى الحافظة", - "downloadAsImage": "تنزيل على شكل صورة", - "undo": "تراجع", - "redo": "إعادة", - "clearCanvas": "مسح سبيكة الكاملة", - "canvasSettings": "إعدادات سبيكة الكاملة", - "showIntermediates": "إظهار الوسطاء", - "showGrid": "إظهار الشبكة", - "snapToGrid": "الالتفاف إلى الشبكة", - "darkenOutsideSelection": "تعمية خارج التحديد", - "autoSaveToGallery": "حفظ تلقائي إلى المعرض", - "saveBoxRegionOnly": "حفظ منطقة الصندوق فقط", - "limitStrokesToBox": "تحديد عدد الخطوط إلى الصندوق", - "showCanvasDebugInfo": "إظهار معلومات تصحيح سبيكة الكاملة", - "clearCanvasHistory": "مسح تاريخ سبيكة الكاملة", - "clearHistory": "مسح التاريخ", - "clearCanvasHistoryMessage": "مسح تاريخ اللوحة تترك اللوحة الحالية عائمة، ولكن تمسح بشكل غير قابل للتراجع تاريخ التراجع والإعادة.", - "clearCanvasHistoryConfirm": "هل أنت متأكد من رغبتك في مسح تاريخ اللوحة؟", - "emptyTempImageFolder": "إفراغ مجلد الصور المؤقتة", - "emptyFolder": "إفراغ المجلد", - "emptyTempImagesFolderMessage": "إفراغ مجلد الصور المؤقتة يؤدي أيضًا إلى إعادة تعيين اللوحة الموحدة بشكل كامل. وهذا يشمل كل تاريخ التراجع / الإعادة والصور في منطقة التخزين وطبقة الأساس لللوحة.", - "emptyTempImagesFolderConfirm": "هل أنت متأكد من رغبتك في إفراغ مجلد الصور المؤقتة؟", - "activeLayer": "الطبقة النشطة", - "canvasScale": "مقياس اللوحة", - "boundingBox": "صندوق الحدود", - "scaledBoundingBox": "صندوق الحدود المكبر", - "boundingBoxPosition": "موضع صندوق الحدود", - "canvasDimensions": "أبعاد اللوحة", - "canvasPosition": "موضع اللوحة", - "cursorPosition": "موضع المؤشر", - "previous": "السابق", - "next": "التالي", - "accept": "قبول", - "showHide": "إظهار/إخفاء", - "discardAll": "تجاهل الكل", - "betaClear": "مسح", - "betaDarkenOutside": "ظل الخارج", - "betaLimitToBox": "تحديد إلى الصندوق", - "betaPreserveMasked": "المحافظة على المخفية" - } -} diff --git a/invokeai/frontend/web/dist/locales/de.json b/invokeai/frontend/web/dist/locales/de.json deleted file mode 100644 index ee5b4f10d3..0000000000 --- a/invokeai/frontend/web/dist/locales/de.json +++ /dev/null @@ -1,973 +0,0 @@ -{ - "common": { - "languagePickerLabel": "Sprachauswahl", - "reportBugLabel": "Fehler melden", - "settingsLabel": "Einstellungen", - "img2img": "Bild zu Bild", - "nodes": "Knoten Editor", - "langGerman": "Deutsch", - "nodesDesc": "Ein knotenbasiertes System, für die Erzeugung von Bildern, ist derzeit in der Entwicklung. Bleiben Sie gespannt auf Updates zu dieser fantastischen Funktion.", - "postProcessing": "Nachbearbeitung", - "postProcessDesc1": "InvokeAI bietet eine breite Palette von Nachbearbeitungsfunktionen. Bildhochskalierung und Gesichtsrekonstruktion sind bereits in der WebUI verfügbar. Sie können sie über das Menü Erweiterte Optionen der Reiter Text in Bild und Bild in Bild aufrufen. Sie können Bilder auch direkt bearbeiten, indem Sie die Schaltflächen für Bildaktionen oberhalb der aktuellen Bildanzeige oder im Viewer verwenden.", - "postProcessDesc2": "Eine spezielle Benutzeroberfläche wird in Kürze veröffentlicht, um erweiterte Nachbearbeitungs-Workflows zu erleichtern.", - "postProcessDesc3": "Die InvokeAI Kommandozeilen-Schnittstelle bietet verschiedene andere Funktionen, darunter Embiggen.", - "training": "trainieren", - "trainingDesc1": "Ein spezieller Arbeitsablauf zum Trainieren Ihrer eigenen Embeddings und Checkpoints mit Textual Inversion und Dreambooth über die Weboberfläche.", - "trainingDesc2": "InvokeAI unterstützt bereits das Training von benutzerdefinierten Embeddings mit Textual Inversion unter Verwendung des Hauptskripts.", - "upload": "Hochladen", - "close": "Schließen", - "load": "Laden", - "statusConnected": "Verbunden", - "statusDisconnected": "Getrennt", - "statusError": "Fehler", - "statusPreparing": "Vorbereiten", - "statusProcessingCanceled": "Verarbeitung abgebrochen", - "statusProcessingComplete": "Verarbeitung komplett", - "statusGenerating": "Generieren", - "statusGeneratingTextToImage": "Erzeugen von Text zu Bild", - "statusGeneratingImageToImage": "Erzeugen von Bild zu Bild", - "statusGeneratingInpainting": "Erzeuge Inpainting", - "statusGeneratingOutpainting": "Erzeuge Outpainting", - "statusGenerationComplete": "Generierung abgeschlossen", - "statusIterationComplete": "Iteration abgeschlossen", - "statusSavingImage": "Speichere Bild", - "statusRestoringFaces": "Gesichter restaurieren", - "statusRestoringFacesGFPGAN": "Gesichter restaurieren (GFPGAN)", - "statusRestoringFacesCodeFormer": "Gesichter restaurieren (CodeFormer)", - "statusUpscaling": "Hochskalierung", - "statusUpscalingESRGAN": "Hochskalierung (ESRGAN)", - "statusLoadingModel": "Laden des Modells", - "statusModelChanged": "Modell Geändert", - "cancel": "Abbrechen", - "accept": "Annehmen", - "back": "Zurück", - "langEnglish": "Englisch", - "langDutch": "Niederländisch", - "langFrench": "Französisch", - "langItalian": "Italienisch", - "langPortuguese": "Portugiesisch", - "langRussian": "Russisch", - "langUkranian": "Ukrainisch", - "hotkeysLabel": "Tastenkombinationen", - "githubLabel": "Github", - "discordLabel": "Discord", - "txt2img": "Text zu Bild", - "postprocessing": "Nachbearbeitung", - "langPolish": "Polnisch", - "langJapanese": "Japanisch", - "langArabic": "Arabisch", - "langKorean": "Koreanisch", - "langHebrew": "Hebräisch", - "langSpanish": "Spanisch", - "t2iAdapter": "T2I Adapter", - "communityLabel": "Gemeinschaft", - "dontAskMeAgain": "Frag mich nicht nochmal", - "loadingInvokeAI": "Lade Invoke AI", - "statusMergedModels": "Modelle zusammengeführt", - "areYouSure": "Bist du dir sicher?", - "statusConvertingModel": "Model konvertieren", - "on": "An", - "nodeEditor": "Knoten Editor", - "statusMergingModels": "Modelle zusammenführen", - "langSimplifiedChinese": "Vereinfachtes Chinesisch", - "ipAdapter": "IP Adapter", - "controlAdapter": "Control Adapter", - "auto": "Automatisch", - "controlNet": "ControlNet", - "imageFailedToLoad": "Kann Bild nicht laden", - "statusModelConverted": "Model konvertiert", - "modelManager": "Model Manager", - "lightMode": "Heller Modus", - "generate": "Erstellen", - "learnMore": "Mehr lernen", - "darkMode": "Dunkler Modus", - "loading": "Lade", - "random": "Zufall", - "batch": "Stapel-Manager", - "advanced": "Erweitert", - "langBrPortuguese": "Portugiesisch (Brasilien)", - "unifiedCanvas": "Einheitliche Leinwand", - "openInNewTab": "In einem neuem Tab öffnen", - "statusProcessing": "wird bearbeitet", - "linear": "Linear", - "imagePrompt": "Bild Prompt" - }, - "gallery": { - "generations": "Erzeugungen", - "showGenerations": "Zeige Erzeugnisse", - "uploads": "Uploads", - "showUploads": "Zeige Uploads", - "galleryImageSize": "Bildgröße", - "galleryImageResetSize": "Größe zurücksetzen", - "gallerySettings": "Galerie-Einstellungen", - "maintainAspectRatio": "Seitenverhältnis beibehalten", - "autoSwitchNewImages": "Automatisch zu neuen Bildern wechseln", - "singleColumnLayout": "Einspaltiges Layout", - "allImagesLoaded": "Alle Bilder geladen", - "loadMore": "Mehr laden", - "noImagesInGallery": "Keine Bilder in der Galerie", - "loading": "Lade", - "preparingDownload": "bereite Download vor", - "preparingDownloadFailed": "Problem beim Download vorbereiten", - "deleteImage": "Lösche Bild", - "images": "Bilder", - "copy": "Kopieren", - "download": "Runterladen", - "setCurrentImage": "Setze aktuelle Bild", - "featuresWillReset": "Wenn Sie dieses Bild löschen, werden diese Funktionen sofort zurückgesetzt.", - "deleteImageBin": "Gelöschte Bilder werden an den Papierkorb Ihres Betriebssystems gesendet.", - "unableToLoad": "Galerie kann nicht geladen werden", - "downloadSelection": "Auswahl herunterladen", - "currentlyInUse": "Dieses Bild wird derzeit in den folgenden Funktionen verwendet:", - "deleteImagePermanent": "Gelöschte Bilder können nicht wiederhergestellt werden.", - "autoAssignBoardOnClick": "Board per Klick automatisch zuweisen" - }, - "hotkeys": { - "keyboardShortcuts": "Tastenkürzel", - "appHotkeys": "App-Tastenkombinationen", - "generalHotkeys": "Allgemeine Tastenkürzel", - "galleryHotkeys": "Galerie Tastenkürzel", - "unifiedCanvasHotkeys": "Unified Canvas Tastenkürzel", - "invoke": { - "desc": "Ein Bild erzeugen", - "title": "Invoke" - }, - "cancel": { - "title": "Abbrechen", - "desc": "Bilderzeugung abbrechen" - }, - "focusPrompt": { - "title": "Fokussiere Prompt", - "desc": "Fokussieren des Eingabefeldes für den Prompt" - }, - "toggleOptions": { - "title": "Optionen umschalten", - "desc": "Öffnen und Schließen des Optionsfeldes" - }, - "pinOptions": { - "title": "Optionen anheften", - "desc": "Anheften des Optionsfeldes" - }, - "toggleViewer": { - "title": "Bildbetrachter umschalten", - "desc": "Bildbetrachter öffnen und schließen" - }, - "toggleGallery": { - "title": "Galerie umschalten", - "desc": "Öffnen und Schließen des Galerie-Schubfachs" - }, - "maximizeWorkSpace": { - "title": "Arbeitsbereich maximieren", - "desc": "Schließen Sie die Panels und maximieren Sie den Arbeitsbereich" - }, - "changeTabs": { - "title": "Tabs wechseln", - "desc": "Zu einem anderen Arbeitsbereich wechseln" - }, - "consoleToggle": { - "title": "Konsole Umschalten", - "desc": "Konsole öffnen und schließen" - }, - "setPrompt": { - "title": "Prompt setzen", - "desc": "Verwende den Prompt des aktuellen Bildes" - }, - "setSeed": { - "title": "Seed setzen", - "desc": "Verwende den Seed des aktuellen Bildes" - }, - "setParameters": { - "title": "Parameter setzen", - "desc": "Alle Parameter des aktuellen Bildes verwenden" - }, - "restoreFaces": { - "title": "Gesicht restaurieren", - "desc": "Das aktuelle Bild restaurieren" - }, - "upscale": { - "title": "Hochskalieren", - "desc": "Das aktuelle Bild hochskalieren" - }, - "showInfo": { - "title": "Info anzeigen", - "desc": "Metadaten des aktuellen Bildes anzeigen" - }, - "sendToImageToImage": { - "title": "An Bild zu Bild senden", - "desc": "Aktuelles Bild an Bild zu Bild senden" - }, - "deleteImage": { - "title": "Bild löschen", - "desc": "Aktuelles Bild löschen" - }, - "closePanels": { - "title": "Panels schließen", - "desc": "Schließt offene Panels" - }, - "previousImage": { - "title": "Vorheriges Bild", - "desc": "Vorheriges Bild in der Galerie anzeigen" - }, - "nextImage": { - "title": "Nächstes Bild", - "desc": "Nächstes Bild in Galerie anzeigen" - }, - "toggleGalleryPin": { - "title": "Galerie anheften umschalten", - "desc": "Heftet die Galerie an die Benutzeroberfläche bzw. löst die sie" - }, - "increaseGalleryThumbSize": { - "title": "Größe der Galeriebilder erhöhen", - "desc": "Vergrößert die Galerie-Miniaturansichten" - }, - "decreaseGalleryThumbSize": { - "title": "Größe der Galeriebilder verringern", - "desc": "Verringert die Größe der Galerie-Miniaturansichten" - }, - "selectBrush": { - "title": "Pinsel auswählen", - "desc": "Wählt den Leinwandpinsel aus" - }, - "selectEraser": { - "title": "Radiergummi auswählen", - "desc": "Wählt den Radiergummi für die Leinwand aus" - }, - "decreaseBrushSize": { - "title": "Pinselgröße verkleinern", - "desc": "Verringert die Größe des Pinsels/Radiergummis" - }, - "increaseBrushSize": { - "title": "Pinselgröße erhöhen", - "desc": "Erhöht die Größe des Pinsels/Radiergummis" - }, - "decreaseBrushOpacity": { - "title": "Deckkraft des Pinsels vermindern", - "desc": "Verringert die Deckkraft des Pinsels" - }, - "increaseBrushOpacity": { - "title": "Deckkraft des Pinsels erhöhen", - "desc": "Erhöht die Deckkraft des Pinsels" - }, - "moveTool": { - "title": "Verschieben Werkzeug", - "desc": "Ermöglicht die Navigation auf der Leinwand" - }, - "fillBoundingBox": { - "title": "Begrenzungsrahmen füllen", - "desc": "Füllt den Begrenzungsrahmen mit Pinselfarbe" - }, - "eraseBoundingBox": { - "title": "Begrenzungsrahmen löschen", - "desc": "Löscht den Bereich des Begrenzungsrahmens" - }, - "colorPicker": { - "title": "Farbpipette", - "desc": "Farben aus dem Bild aufnehmen" - }, - "toggleSnap": { - "title": "Einrasten umschalten", - "desc": "Schaltet Einrasten am Raster ein und aus" - }, - "quickToggleMove": { - "title": "Schnell Verschiebemodus", - "desc": "Schaltet vorübergehend den Verschiebemodus um" - }, - "toggleLayer": { - "title": "Ebene umschalten", - "desc": "Schaltet die Auswahl von Maske/Basisebene um" - }, - "clearMask": { - "title": "Lösche Maske", - "desc": "Die gesamte Maske löschen" - }, - "hideMask": { - "title": "Maske ausblenden", - "desc": "Maske aus- und einblenden" - }, - "showHideBoundingBox": { - "title": "Begrenzungsrahmen ein-/ausblenden", - "desc": "Sichtbarkeit des Begrenzungsrahmens ein- und ausschalten" - }, - "mergeVisible": { - "title": "Sichtbares Zusammenführen", - "desc": "Alle sichtbaren Ebenen der Leinwand zusammenführen" - }, - "saveToGallery": { - "title": "In Galerie speichern", - "desc": "Aktuelle Leinwand in Galerie speichern" - }, - "copyToClipboard": { - "title": "In die Zwischenablage kopieren", - "desc": "Aktuelle Leinwand in die Zwischenablage kopieren" - }, - "downloadImage": { - "title": "Bild herunterladen", - "desc": "Aktuelle Leinwand herunterladen" - }, - "undoStroke": { - "title": "Pinselstrich rückgängig machen", - "desc": "Einen Pinselstrich rückgängig machen" - }, - "redoStroke": { - "title": "Pinselstrich wiederherstellen", - "desc": "Einen Pinselstrich wiederherstellen" - }, - "resetView": { - "title": "Ansicht zurücksetzen", - "desc": "Leinwandansicht zurücksetzen" - }, - "previousStagingImage": { - "title": "Vorheriges Staging-Bild", - "desc": "Bild des vorherigen Staging-Bereichs" - }, - "nextStagingImage": { - "title": "Nächstes Staging-Bild", - "desc": "Bild des nächsten Staging-Bereichs" - }, - "acceptStagingImage": { - "title": "Staging-Bild akzeptieren", - "desc": "Akzeptieren Sie das aktuelle Bild des Staging-Bereichs" - }, - "nodesHotkeys": "Knoten Tastenkürzel", - "addNodes": { - "title": "Knotenpunkt hinzufügen", - "desc": "Öffnet das Menü zum Hinzufügen von Knoten" - } - }, - "modelManager": { - "modelAdded": "Model hinzugefügt", - "modelUpdated": "Model aktualisiert", - "modelEntryDeleted": "Modelleintrag gelöscht", - "cannotUseSpaces": "Leerzeichen können nicht verwendet werden", - "addNew": "Neue hinzufügen", - "addNewModel": "Neues Model hinzufügen", - "addManually": "Manuell hinzufügen", - "nameValidationMsg": "Geben Sie einen Namen für Ihr Model ein", - "description": "Beschreibung", - "descriptionValidationMsg": "Fügen Sie eine Beschreibung für Ihr Model hinzu", - "config": "Konfiguration", - "configValidationMsg": "Pfad zur Konfigurationsdatei Ihres Models.", - "modelLocation": "Ort des Models", - "modelLocationValidationMsg": "Pfad zum Speicherort Ihres Models", - "vaeLocation": "VAE Ort", - "vaeLocationValidationMsg": "Pfad zum Speicherort Ihres VAE.", - "width": "Breite", - "widthValidationMsg": "Standardbreite Ihres Models.", - "height": "Höhe", - "heightValidationMsg": "Standardbhöhe Ihres Models.", - "addModel": "Model hinzufügen", - "updateModel": "Model aktualisieren", - "availableModels": "Verfügbare Models", - "search": "Suche", - "load": "Laden", - "active": "Aktiv", - "notLoaded": "nicht geladen", - "cached": "zwischengespeichert", - "checkpointFolder": "Checkpoint-Ordner", - "clearCheckpointFolder": "Checkpoint-Ordner löschen", - "findModels": "Models finden", - "scanAgain": "Erneut scannen", - "modelsFound": "Models gefunden", - "selectFolder": "Ordner auswählen", - "selected": "Ausgewählt", - "selectAll": "Alles auswählen", - "deselectAll": "Alle abwählen", - "showExisting": "Vorhandene anzeigen", - "addSelected": "Auswahl hinzufügen", - "modelExists": "Model existiert", - "selectAndAdd": "Unten aufgeführte Models auswählen und hinzufügen", - "noModelsFound": "Keine Models gefunden", - "delete": "Löschen", - "deleteModel": "Model löschen", - "deleteConfig": "Konfiguration löschen", - "deleteMsg1": "Möchten Sie diesen Model-Eintrag wirklich aus InvokeAI löschen?", - "deleteMsg2": "Dadurch WIRD das Modell von der Festplatte gelöscht WENN es im InvokeAI Root Ordner liegt. Wenn es in einem anderem Ordner liegt wird das Modell NICHT von der Festplatte gelöscht.", - "customConfig": "Benutzerdefinierte Konfiguration", - "invokeRoot": "InvokeAI Ordner", - "formMessageDiffusersVAELocationDesc": "Falls nicht angegeben, sucht InvokeAI nach der VAE-Datei innerhalb des oben angegebenen Modell Speicherortes.", - "checkpointModels": "Kontrollpunkte", - "convert": "Umwandeln", - "addCheckpointModel": "Kontrollpunkt / SafeTensors Modell hinzufügen", - "allModels": "Alle Modelle", - "alpha": "Alpha", - "addDifference": "Unterschied hinzufügen", - "convertToDiffusersHelpText2": "Bei diesem Vorgang wird Ihr Eintrag im Modell-Manager durch die Diffusor-Version desselben Modells ersetzt.", - "convertToDiffusersHelpText5": "Bitte stellen Sie sicher, dass Sie über genügend Speicherplatz verfügen. Die Modelle sind in der Regel zwischen 2 GB und 7 GB groß.", - "convertToDiffusersHelpText3": "Ihre Kontrollpunktdatei auf der Festplatte wird NICHT gelöscht oder in irgendeiner Weise verändert. Sie können Ihren Kontrollpunkt dem Modell-Manager wieder hinzufügen, wenn Sie dies wünschen.", - "convertToDiffusersHelpText4": "Dies ist ein einmaliger Vorgang. Er kann je nach den Spezifikationen Ihres Computers etwa 30-60 Sekunden dauern.", - "convertToDiffusersHelpText6": "Möchten Sie dieses Modell konvertieren?", - "custom": "Benutzerdefiniert", - "modelConverted": "Modell umgewandelt", - "inverseSigmoid": "Inverses Sigmoid", - "invokeAIFolder": "Invoke AI Ordner", - "formMessageDiffusersModelLocationDesc": "Bitte geben Sie mindestens einen an.", - "customSaveLocation": "Benutzerdefinierter Speicherort", - "formMessageDiffusersVAELocation": "VAE Speicherort", - "mergedModelCustomSaveLocation": "Benutzerdefinierter Pfad", - "modelMergeHeaderHelp2": "Nur Diffusers sind für die Zusammenführung verfügbar. Wenn Sie ein Kontrollpunktmodell zusammenführen möchten, konvertieren Sie es bitte zuerst in Diffusers.", - "manual": "Manuell", - "modelManager": "Modell Manager", - "modelMergeAlphaHelp": "Alpha steuert die Überblendungsstärke für die Modelle. Niedrigere Alphawerte führen zu einem geringeren Einfluss des zweiten Modells.", - "modelMergeHeaderHelp1": "Sie können bis zu drei verschiedene Modelle miteinander kombinieren, um eine Mischung zu erstellen, die Ihren Bedürfnissen entspricht.", - "ignoreMismatch": "Unstimmigkeiten zwischen ausgewählten Modellen ignorieren", - "model": "Modell", - "convertToDiffusersSaveLocation": "Speicherort", - "pathToCustomConfig": "Pfad zur benutzerdefinierten Konfiguration", - "v1": "v1", - "modelMergeInterpAddDifferenceHelp": "In diesem Modus wird zunächst Modell 3 von Modell 2 subtrahiert. Die resultierende Version wird mit Modell 1 mit dem oben eingestellten Alphasatz gemischt.", - "modelTwo": "Modell 2", - "modelOne": "Modell 1", - "v2_base": "v2 (512px)", - "scanForModels": "Nach Modellen suchen", - "name": "Name", - "safetensorModels": "SafeTensors", - "pickModelType": "Modell Typ auswählen", - "sameFolder": "Gleicher Ordner", - "modelThree": "Modell 3", - "v2_768": "v2 (768px)", - "none": "Nix", - "repoIDValidationMsg": "Online Repo Ihres Modells", - "vaeRepoIDValidationMsg": "Online Repo Ihrer VAE", - "importModels": "Importiere Modelle", - "merge": "Zusammenführen", - "addDiffuserModel": "Diffusers hinzufügen", - "advanced": "Erweitert", - "closeAdvanced": "Schließe Erweitert", - "convertingModelBegin": "Konvertiere Modell. Bitte warten.", - "customConfigFileLocation": "Benutzerdefinierte Konfiguration Datei Speicherort", - "baseModel": "Basis Modell", - "convertToDiffusers": "Konvertiere zu Diffusers", - "diffusersModels": "Diffusers", - "noCustomLocationProvided": "Kein benutzerdefinierter Standort angegeben", - "onnxModels": "Onnx", - "vaeRepoID": "VAE-Repo-ID", - "weightedSum": "Gewichtete Summe", - "syncModelsDesc": "Wenn Ihre Modelle nicht mit dem Backend synchronisiert sind, können Sie sie mit dieser Option aktualisieren. Dies ist im Allgemeinen praktisch, wenn Sie Ihre models.yaml-Datei manuell aktualisieren oder Modelle zum InvokeAI-Stammordner hinzufügen, nachdem die Anwendung gestartet wurde.", - "vae": "VAE", - "noModels": "Keine Modelle gefunden", - "statusConverting": "Konvertieren", - "sigmoid": "Sigmoid", - "predictionType": "Vorhersagetyp (für Stable Diffusion 2.x-Modelle und gelegentliche Stable Diffusion 1.x-Modelle)", - "selectModel": "Wählen Sie Modell aus", - "repo_id": "Repo-ID", - "modelSyncFailed": "Modellsynchronisierung fehlgeschlagen", - "quickAdd": "Schnell hinzufügen", - "simpleModelDesc": "Geben Sie einen Pfad zu einem lokalen Diffusers-Modell, einem lokalen Checkpoint-/Safetensors-Modell, einer HuggingFace-Repo-ID oder einer Checkpoint-/Diffusers-Modell-URL an.", - "modelDeleted": "Modell gelöscht", - "inpainting": "v1 Ausmalen", - "modelUpdateFailed": "Modellaktualisierung fehlgeschlagen", - "useCustomConfig": "Benutzerdefinierte Konfiguration verwenden", - "settings": "Einstellungen", - "modelConversionFailed": "Modellkonvertierung fehlgeschlagen", - "syncModels": "Modelle synchronisieren", - "mergedModelSaveLocation": "Speicherort", - "modelType": "Modelltyp", - "modelsMerged": "Modelle zusammengeführt", - "modelsMergeFailed": "Modellzusammenführung fehlgeschlagen", - "convertToDiffusersHelpText1": "Dieses Modell wird in das 🧨 Diffusers-Format konvertiert.", - "modelsSynced": "Modelle synchronisiert", - "vaePrecision": "VAE-Präzision", - "mergeModels": "Modelle zusammenführen", - "interpolationType": "Interpolationstyp", - "oliveModels": "Olives", - "variant": "Variante", - "loraModels": "LoRAs", - "modelDeleteFailed": "Modell konnte nicht gelöscht werden", - "mergedModelName": "Zusammengeführter Modellname" - }, - "parameters": { - "images": "Bilder", - "steps": "Schritte", - "cfgScale": "CFG-Skala", - "width": "Breite", - "height": "Höhe", - "randomizeSeed": "Zufälliger Seed", - "shuffle": "Mischen", - "noiseThreshold": "Rausch-Schwellenwert", - "perlinNoise": "Perlin-Rauschen", - "variations": "Variationen", - "variationAmount": "Höhe der Abweichung", - "seedWeights": "Seed-Gewichte", - "faceRestoration": "Gesichtsrestaurierung", - "restoreFaces": "Gesichter wiederherstellen", - "type": "Art", - "strength": "Stärke", - "upscaling": "Hochskalierung", - "upscale": "Hochskalieren (Shift + U)", - "upscaleImage": "Bild hochskalieren", - "scale": "Maßstab", - "otherOptions": "Andere Optionen", - "seamlessTiling": "Nahtlose Kacheln", - "hiresOptim": "High-Res-Optimierung", - "imageFit": "Ausgangsbild an Ausgabegröße anpassen", - "codeformerFidelity": "Glaubwürdigkeit", - "scaleBeforeProcessing": "Skalieren vor der Verarbeitung", - "scaledWidth": "Skaliert W", - "scaledHeight": "Skaliert H", - "infillMethod": "Infill-Methode", - "tileSize": "Kachelgröße", - "boundingBoxHeader": "Begrenzungsrahmen", - "seamCorrectionHeader": "Nahtkorrektur", - "infillScalingHeader": "Infill und Skalierung", - "img2imgStrength": "Bild-zu-Bild-Stärke", - "toggleLoopback": "Loopback umschalten", - "sendTo": "Senden an", - "sendToImg2Img": "Senden an Bild zu Bild", - "sendToUnifiedCanvas": "Senden an Unified Canvas", - "copyImageToLink": "Bild-Link kopieren", - "downloadImage": "Bild herunterladen", - "openInViewer": "Im Viewer öffnen", - "closeViewer": "Viewer schließen", - "usePrompt": "Prompt verwenden", - "useSeed": "Seed verwenden", - "useAll": "Alle verwenden", - "useInitImg": "Ausgangsbild verwenden", - "initialImage": "Ursprüngliches Bild", - "showOptionsPanel": "Optionsleiste zeigen", - "cancel": { - "setType": "Abbruchart festlegen", - "immediate": "Sofort abbrechen", - "schedule": "Abbrechen nach der aktuellen Iteration", - "isScheduled": "Abbrechen" - }, - "copyImage": "Bild kopieren", - "denoisingStrength": "Stärke der Entrauschung", - "symmetry": "Symmetrie", - "imageToImage": "Bild zu Bild", - "info": "Information", - "general": "Allgemein", - "hiresStrength": "High Res Stärke", - "hidePreview": "Verstecke Vorschau", - "showPreview": "Zeige Vorschau" - }, - "settings": { - "displayInProgress": "Bilder in Bearbeitung anzeigen", - "saveSteps": "Speichern der Bilder alle n Schritte", - "confirmOnDelete": "Bestätigen beim Löschen", - "displayHelpIcons": "Hilfesymbole anzeigen", - "enableImageDebugging": "Bild-Debugging aktivieren", - "resetWebUI": "Web-Oberfläche zurücksetzen", - "resetWebUIDesc1": "Das Zurücksetzen der Web-Oberfläche setzt nur den lokalen Cache des Browsers mit Ihren Bildern und gespeicherten Einstellungen zurück. Es werden keine Bilder von der Festplatte gelöscht.", - "resetWebUIDesc2": "Wenn die Bilder nicht in der Galerie angezeigt werden oder etwas anderes nicht funktioniert, versuchen Sie bitte, die Einstellungen zurückzusetzen, bevor Sie einen Fehler auf GitHub melden.", - "resetComplete": "Die Web-Oberfläche wurde zurückgesetzt.", - "models": "Modelle", - "useSlidersForAll": "Schieberegler für alle Optionen verwenden" - }, - "toast": { - "tempFoldersEmptied": "Temp-Ordner geleert", - "uploadFailed": "Hochladen fehlgeschlagen", - "uploadFailedUnableToLoadDesc": "Datei kann nicht geladen werden", - "downloadImageStarted": "Bild wird heruntergeladen", - "imageCopied": "Bild kopiert", - "imageLinkCopied": "Bildlink kopiert", - "imageNotLoaded": "Kein Bild geladen", - "imageNotLoadedDesc": "Konnte kein Bild finden", - "imageSavedToGallery": "Bild in die Galerie gespeichert", - "canvasMerged": "Leinwand zusammengeführt", - "sentToImageToImage": "Gesendet an Bild zu Bild", - "sentToUnifiedCanvas": "Gesendet an Unified Canvas", - "parametersSet": "Parameter festlegen", - "parametersNotSet": "Parameter nicht festgelegt", - "parametersNotSetDesc": "Keine Metadaten für dieses Bild gefunden.", - "parametersFailed": "Problem beim Laden der Parameter", - "parametersFailedDesc": "Ausgangsbild kann nicht geladen werden.", - "seedSet": "Seed festlegen", - "seedNotSet": "Saatgut nicht festgelegt", - "seedNotSetDesc": "Für dieses Bild wurde kein Seed gefunden.", - "promptSet": "Prompt festgelegt", - "promptNotSet": "Prompt nicht festgelegt", - "promptNotSetDesc": "Für dieses Bild wurde kein Prompt gefunden.", - "upscalingFailed": "Hochskalierung fehlgeschlagen", - "faceRestoreFailed": "Gesichtswiederherstellung fehlgeschlagen", - "metadataLoadFailed": "Metadaten konnten nicht geladen werden", - "initialImageSet": "Ausgangsbild festgelegt", - "initialImageNotSet": "Ausgangsbild nicht festgelegt", - "initialImageNotSetDesc": "Ausgangsbild konnte nicht geladen werden" - }, - "tooltip": { - "feature": { - "prompt": "Dies ist das Prompt-Feld. Ein Prompt enthält Generierungsobjekte und stilistische Begriffe. Sie können auch Gewichtungen (Token-Bedeutung) dem Prompt hinzufügen, aber CLI-Befehle und Parameter funktionieren nicht.", - "gallery": "Die Galerie zeigt erzeugte Bilder aus dem Ausgabeordner an, sobald sie erstellt wurden. Die Einstellungen werden in den Dateien gespeichert und können über das Kontextmenü aufgerufen werden.", - "other": "Mit diesen Optionen werden alternative Verarbeitungsmodi für InvokeAI aktiviert. 'Nahtlose Kachelung' erzeugt sich wiederholende Muster in der Ausgabe. 'Hohe Auflösungen' werden in zwei Schritten mit img2img erzeugt: Verwenden Sie diese Einstellung, wenn Sie ein größeres und kohärenteres Bild ohne Artefakte wünschen. Es dauert länger als das normale txt2img.", - "seed": "Der Seed-Wert beeinflusst das Ausgangsrauschen, aus dem das Bild erstellt wird. Sie können die bereits vorhandenen Seeds von früheren Bildern verwenden. 'Der Rauschschwellenwert' wird verwendet, um Artefakte bei hohen CFG-Werten abzuschwächen (versuchen Sie es im Bereich 0-10), und Perlin, um während der Erzeugung Perlin-Rauschen hinzuzufügen: Beide dienen dazu, Ihre Ergebnisse zu variieren.", - "variations": "Versuchen Sie eine Variation mit einem Wert zwischen 0,1 und 1,0, um das Ergebnis für ein bestimmtes Seed zu ändern. Interessante Variationen des Seeds liegen zwischen 0,1 und 0,3.", - "upscale": "Verwenden Sie ESRGAN, um das Bild unmittelbar nach der Erzeugung zu vergrößern.", - "faceCorrection": "Gesichtskorrektur mit GFPGAN oder Codeformer: Der Algorithmus erkennt Gesichter im Bild und korrigiert alle Fehler. Ein hoher Wert verändert das Bild stärker, was zu attraktiveren Gesichtern führt. Codeformer mit einer höheren Genauigkeit bewahrt das Originalbild auf Kosten einer stärkeren Gesichtskorrektur.", - "imageToImage": "Bild zu Bild lädt ein beliebiges Bild als Ausgangsbild, aus dem dann zusammen mit dem Prompt ein neues Bild erzeugt wird. Je höher der Wert ist, desto stärker wird das Ergebnisbild verändert. Werte von 0,0 bis 1,0 sind möglich, der empfohlene Bereich ist .25-.75", - "boundingBox": "Der Begrenzungsrahmen ist derselbe wie die Einstellungen für Breite und Höhe bei Text zu Bild oder Bild zu Bild. Es wird nur der Bereich innerhalb des Rahmens verarbeitet.", - "seamCorrection": "Steuert die Behandlung von sichtbaren Übergängen, die zwischen den erzeugten Bildern auf der Leinwand auftreten.", - "infillAndScaling": "Verwalten Sie Infill-Methoden (für maskierte oder gelöschte Bereiche der Leinwand) und Skalierung (nützlich für kleine Begrenzungsrahmengrößen)." - } - }, - "unifiedCanvas": { - "layer": "Ebene", - "base": "Basis", - "mask": "Maske", - "maskingOptions": "Maskierungsoptionen", - "enableMask": "Maske aktivieren", - "preserveMaskedArea": "Maskierten Bereich bewahren", - "clearMask": "Maske löschen", - "brush": "Pinsel", - "eraser": "Radierer", - "fillBoundingBox": "Begrenzungsrahmen füllen", - "eraseBoundingBox": "Begrenzungsrahmen löschen", - "colorPicker": "Farbpipette", - "brushOptions": "Pinseloptionen", - "brushSize": "Größe", - "move": "Bewegen", - "resetView": "Ansicht zurücksetzen", - "mergeVisible": "Sichtbare Zusammenführen", - "saveToGallery": "In Galerie speichern", - "copyToClipboard": "In Zwischenablage kopieren", - "downloadAsImage": "Als Bild herunterladen", - "undo": "Rückgängig", - "redo": "Wiederherstellen", - "clearCanvas": "Leinwand löschen", - "canvasSettings": "Leinwand-Einstellungen", - "showIntermediates": "Zwischenprodukte anzeigen", - "showGrid": "Gitternetz anzeigen", - "snapToGrid": "Am Gitternetz einrasten", - "darkenOutsideSelection": "Außerhalb der Auswahl verdunkeln", - "autoSaveToGallery": "Automatisch in Galerie speichern", - "saveBoxRegionOnly": "Nur Auswahlbox speichern", - "limitStrokesToBox": "Striche auf Box beschränken", - "showCanvasDebugInfo": "Zusätzliche Informationen zur Leinwand anzeigen", - "clearCanvasHistory": "Leinwand-Verlauf löschen", - "clearHistory": "Verlauf löschen", - "clearCanvasHistoryMessage": "Wenn Sie den Verlauf der Leinwand löschen, bleibt die aktuelle Leinwand intakt, aber der Verlauf der Rückgängig- und Wiederherstellung wird unwiderruflich gelöscht.", - "clearCanvasHistoryConfirm": "Sind Sie sicher, dass Sie den Verlauf der Leinwand löschen möchten?", - "emptyTempImageFolder": "Temp-Image Ordner leeren", - "emptyFolder": "Leerer Ordner", - "emptyTempImagesFolderMessage": "Wenn Sie den Ordner für temporäre Bilder leeren, wird auch der Unified Canvas vollständig zurückgesetzt. Dies umfasst den gesamten Verlauf der Rückgängig-/Wiederherstellungsvorgänge, die Bilder im Bereitstellungsbereich und die Leinwand-Basisebene.", - "emptyTempImagesFolderConfirm": "Sind Sie sicher, dass Sie den temporären Ordner leeren wollen?", - "activeLayer": "Aktive Ebene", - "canvasScale": "Leinwand Maßstab", - "boundingBox": "Begrenzungsrahmen", - "scaledBoundingBox": "Skalierter Begrenzungsrahmen", - "boundingBoxPosition": "Begrenzungsrahmen Position", - "canvasDimensions": "Maße der Leinwand", - "canvasPosition": "Leinwandposition", - "cursorPosition": "Position des Cursors", - "previous": "Vorherige", - "next": "Nächste", - "accept": "Akzeptieren", - "showHide": "Einblenden/Ausblenden", - "discardAll": "Alles verwerfen", - "betaClear": "Löschen", - "betaDarkenOutside": "Außen abdunkeln", - "betaLimitToBox": "Begrenzung auf das Feld", - "betaPreserveMasked": "Maskiertes bewahren", - "antialiasing": "Kantenglättung", - "showResultsOn": "Zeige Ergebnisse (An)", - "showResultsOff": "Zeige Ergebnisse (Aus)" - }, - "accessibility": { - "modelSelect": "Model Auswahl", - "uploadImage": "Bild hochladen", - "previousImage": "Voriges Bild", - "useThisParameter": "Benutze diesen Parameter", - "copyMetadataJson": "Kopiere Metadaten JSON", - "zoomIn": "Vergrößern", - "rotateClockwise": "Im Uhrzeigersinn drehen", - "flipHorizontally": "Horizontal drehen", - "flipVertically": "Vertikal drehen", - "modifyConfig": "Optionen einstellen", - "toggleAutoscroll": "Auroscroll ein/ausschalten", - "toggleLogViewer": "Log Betrachter ein/ausschalten", - "showOptionsPanel": "Zeige Optionen", - "reset": "Zurücksetzten", - "nextImage": "Nächstes Bild", - "zoomOut": "Verkleinern", - "rotateCounterClockwise": "Gegen den Uhrzeigersinn verdrehen", - "showGalleryPanel": "Galeriefenster anzeigen", - "exitViewer": "Betrachten beenden", - "menu": "Menü", - "loadMore": "Mehr laden", - "invokeProgressBar": "Invoke Fortschrittsanzeige" - }, - "boards": { - "autoAddBoard": "Automatisches Hinzufügen zum Ordner", - "topMessage": "Dieser Ordner enthält Bilder die in den folgenden Funktionen verwendet werden:", - "move": "Bewegen", - "menuItemAutoAdd": "Automatisches Hinzufügen zu diesem Ordner", - "myBoard": "Meine Ordner", - "searchBoard": "Ordner durchsuchen...", - "noMatching": "Keine passenden Ordner", - "selectBoard": "Ordner aussuchen", - "cancel": "Abbrechen", - "addBoard": "Ordner hinzufügen", - "uncategorized": "Nicht kategorisiert", - "downloadBoard": "Ordner runterladen", - "changeBoard": "Ordner wechseln", - "loading": "Laden...", - "clearSearch": "Suche leeren", - "bottomMessage": "Durch das Löschen dieses Ordners und seiner Bilder werden alle Funktionen zurückgesetzt, die sie derzeit verwenden." - }, - "controlnet": { - "showAdvanced": "Zeige Erweitert", - "contentShuffleDescription": "Mischt den Inhalt von einem Bild", - "addT2IAdapter": "$t(common.t2iAdapter) hinzufügen", - "importImageFromCanvas": "Importieren Bild von Zeichenfläche", - "lineartDescription": "Konvertiere Bild zu Lineart", - "importMaskFromCanvas": "Importiere Maske von Zeichenfläche", - "hed": "HED", - "hideAdvanced": "Verstecke Erweitert", - "contentShuffle": "Inhalt mischen", - "controlNetEnabledT2IDisabled": "$t(common.controlNet) ist aktiv, $t(common.t2iAdapter) ist deaktiviert", - "ipAdapterModel": "Adapter Modell", - "beginEndStepPercent": "Start / Ende Step Prozent", - "duplicate": "Kopieren", - "f": "F", - "h": "H", - "depthMidasDescription": "Tiefenmap erstellen mit Midas", - "controlnet": "$t(controlnet.controlAdapter_one) #{{number}} ($t(common.controlNet))", - "t2iEnabledControlNetDisabled": "$t(common.t2iAdapter) ist aktiv, $t(common.controlNet) ist deaktiviert", - "weight": "Breite", - "selectModel": "Wähle ein Modell", - "depthMidas": "Tiefe (Midas)", - "w": "W", - "addControlNet": "$t(common.controlNet) hinzufügen", - "none": "Kein", - "incompatibleBaseModel": "Inkompatibles Basismodell:", - "enableControlnet": "Aktiviere ControlNet", - "detectResolution": "Auflösung erkennen", - "controlNetT2IMutexDesc": "$t(common.controlNet) und $t(common.t2iAdapter) zur gleichen Zeit wird nicht unterstützt.", - "ip_adapter": "$t(controlnet.controlAdapter_one) #{{number}} ($t(common.ipAdapter))", - "fill": "Füllen", - "addIPAdapter": "$t(common.ipAdapter) hinzufügen", - "colorMapDescription": "Erstelle eine Farbkarte von diesem Bild", - "t2i_adapter": "$t(controlnet.controlAdapter_one) #{{number}} ($t(common.t2iAdapter))", - "imageResolution": "Bild Auflösung", - "depthZoe": "Tiefe (Zoe)", - "colorMap": "Farbe", - "lowThreshold": "Niedrige Schwelle", - "highThreshold": "Hohe Schwelle", - "toggleControlNet": "Schalten ControlNet um", - "delete": "Löschen", - "controlAdapter_one": "Control Adapter", - "controlAdapter_other": "Control Adapters", - "colorMapTileSize": "Tile Größe", - "depthZoeDescription": "Tiefenmap erstellen mit Zoe", - "setControlImageDimensions": "Setze Control Bild Auflösung auf Breite/Höhe", - "handAndFace": "Hand und Gesicht", - "enableIPAdapter": "Aktiviere IP Adapter", - "resize": "Größe ändern", - "resetControlImage": "Zurücksetzen vom Referenz Bild", - "balanced": "Ausgewogen", - "prompt": "Prompt", - "resizeMode": "Größenänderungsmodus", - "processor": "Prozessor", - "saveControlImage": "Speichere Referenz Bild", - "safe": "Speichern", - "ipAdapterImageFallback": "Kein IP Adapter Bild ausgewählt", - "resetIPAdapterImage": "Zurücksetzen vom IP Adapter Bild", - "pidi": "PIDI", - "normalBae": "Normales BAE", - "mlsdDescription": "Minimalistischer Liniensegmentdetektor", - "openPoseDescription": "Schätzung der menschlichen Pose mit Openpose", - "control": "Kontrolle", - "coarse": "Coarse", - "crop": "Zuschneiden", - "pidiDescription": "PIDI-Bildverarbeitung", - "mediapipeFace": "Mediapipe Gesichter", - "mlsd": "M-LSD", - "controlMode": "Steuermodus", - "cannyDescription": "Canny Ecken Erkennung", - "lineart": "Lineart", - "lineartAnimeDescription": "Lineart-Verarbeitung im Anime-Stil", - "minConfidence": "Minimales Vertrauen", - "megaControl": "Mega-Kontrolle", - "autoConfigure": "Prozessor automatisch konfigurieren", - "normalBaeDescription": "Normale BAE-Verarbeitung", - "noneDescription": "Es wurde keine Verarbeitung angewendet", - "openPose": "Openpose", - "lineartAnime": "Lineart Anime", - "mediapipeFaceDescription": "Gesichtserkennung mit Mediapipe", - "canny": "Canny", - "hedDescription": "Ganzheitlich verschachtelte Kantenerkennung", - "scribble": "Scribble", - "maxFaces": "Maximal Anzahl Gesichter" - }, - "queue": { - "status": "Status", - "cancelTooltip": "Aktuellen Aufgabe abbrechen", - "queueEmpty": "Warteschlange leer", - "in_progress": "In Arbeit", - "queueFront": "An den Anfang der Warteschlange tun", - "completed": "Fertig", - "queueBack": "In die Warteschlange", - "clearFailed": "Probleme beim leeren der Warteschlange", - "clearSucceeded": "Warteschlange geleert", - "pause": "Pause", - "cancelSucceeded": "Auftrag abgebrochen", - "queue": "Warteschlange", - "batch": "Stapel", - "pending": "Ausstehend", - "clear": "Leeren", - "prune": "Leeren", - "total": "Gesamt", - "canceled": "Abgebrochen", - "clearTooltip": "Abbrechen und alle Aufträge leeren", - "current": "Aktuell", - "failed": "Fehler", - "cancelItem": "Abbruch Auftrag", - "next": "Nächste", - "cancel": "Abbruch", - "session": "Sitzung", - "queueTotal": "{{total}} Gesamt", - "resume": "Wieder aufnehmen", - "item": "Auftrag", - "notReady": "Warteschlange noch nicht bereit", - "batchValues": "Stapel Werte", - "queueCountPrediction": "{{predicted}} zur Warteschlange hinzufügen", - "queuedCount": "{{pending}} wartenden Elemente", - "clearQueueAlertDialog": "Die Warteschlange leeren, stoppt den aktuellen Prozess und leert die Warteschlange komplett.", - "completedIn": "Fertig in", - "cancelBatchSucceeded": "Stapel abgebrochen", - "cancelBatch": "Stapel stoppen", - "enqueueing": "Stapel in der Warteschlange", - "queueMaxExceeded": "Maximum von {{max_queue_size}} Elementen erreicht, würde {{skip}} Elemente überspringen", - "cancelBatchFailed": "Problem beim Abbruch vom Stapel", - "clearQueueAlertDialog2": "bist du sicher die Warteschlange zu leeren?", - "pruneSucceeded": "{{item_count}} abgeschlossene Elemente aus der Warteschlange entfernt", - "pauseSucceeded": "Prozessor angehalten", - "cancelFailed": "Problem beim Stornieren des Auftrags", - "pauseFailed": "Problem beim Anhalten des Prozessors", - "front": "Vorne", - "pruneTooltip": "Bereinigen Sie {{item_count}} abgeschlossene Aufträge", - "resumeFailed": "Problem beim wieder aufnehmen von Prozessor", - "pruneFailed": "Problem beim leeren der Warteschlange", - "pauseTooltip": "Pause von Prozessor", - "back": "Hinten", - "resumeSucceeded": "Prozessor wieder aufgenommen", - "resumeTooltip": "Prozessor wieder aufnehmen" - }, - "metadata": { - "negativePrompt": "Negativ Beschreibung", - "metadata": "Meta-Data", - "strength": "Bild zu Bild stärke", - "imageDetails": "Bild Details", - "model": "Modell", - "noImageDetails": "Keine Bild Details gefunden", - "cfgScale": "CFG-Skala", - "fit": "Bild zu Bild passen", - "height": "Höhe", - "noMetaData": "Keine Meta-Data gefunden", - "width": "Breite", - "createdBy": "Erstellt von", - "steps": "Schritte", - "seamless": "Nahtlos", - "positivePrompt": "Positiver Prompt", - "generationMode": "Generierungsmodus", - "Threshold": "Noise Schwelle", - "seed": "Samen", - "perlin": "Perlin Noise", - "hiresFix": "Optimierung für hohe Auflösungen", - "initImage": "Erstes Bild", - "variations": "Samengewichtspaare", - "vae": "VAE", - "workflow": "Arbeitsablauf", - "scheduler": "Scheduler", - "noRecallParameters": "Es wurden keine Parameter zum Abrufen gefunden" - }, - "popovers": { - "noiseUseCPU": { - "heading": "Nutze Prozessor rauschen" - }, - "paramModel": { - "heading": "Modell" - }, - "paramIterations": { - "heading": "Iterationen" - }, - "paramCFGScale": { - "heading": "CFG-Skala" - }, - "paramSteps": { - "heading": "Schritte" - }, - "lora": { - "heading": "LoRA Gewichte" - }, - "infillMethod": { - "heading": "Füllmethode" - }, - "paramVAE": { - "heading": "VAE" - } - }, - "ui": { - "lockRatio": "Verhältnis sperren", - "hideProgressImages": "Verstecke Prozess Bild", - "showProgressImages": "Zeige Prozess Bild" - }, - "invocationCache": { - "disable": "Deaktivieren", - "misses": "Cache Nötig", - "hits": "Cache Treffer", - "enable": "Aktivieren", - "clear": "Leeren", - "maxCacheSize": "Maximale Cache Größe", - "cacheSize": "Cache Größe" - }, - "embedding": { - "noMatchingEmbedding": "Keine passenden Embeddings", - "addEmbedding": "Embedding hinzufügen", - "incompatibleModel": "Inkompatibles Basismodell:" - }, - "nodes": { - "booleanPolymorphicDescription": "Eine Sammlung boolescher Werte.", - "colorFieldDescription": "Eine RGBA-Farbe.", - "conditioningCollection": "Konditionierungssammlung", - "addNode": "Knoten hinzufügen", - "conditioningCollectionDescription": "Konditionierung kann zwischen Knoten weitergegeben werden.", - "colorPolymorphic": "Farbpolymorph", - "colorCodeEdgesHelp": "Farbkodieren Sie Kanten entsprechend ihren verbundenen Feldern", - "animatedEdges": "Animierte Kanten", - "booleanCollectionDescription": "Eine Sammlung boolescher Werte.", - "colorField": "Farbe", - "collectionItem": "Objekt in Sammlung", - "animatedEdgesHelp": "Animieren Sie ausgewählte Kanten und Kanten, die mit ausgewählten Knoten verbunden sind", - "cannotDuplicateConnection": "Es können keine doppelten Verbindungen erstellt werden", - "booleanPolymorphic": "Boolesche Polymorphie", - "colorPolymorphicDescription": "Eine Sammlung von Farben.", - "clipFieldDescription": "Tokenizer- und text_encoder-Untermodelle.", - "clipField": "Clip", - "colorCollection": "Eine Sammlung von Farben.", - "boolean": "Boolesche Werte", - "currentImage": "Aktuelles Bild", - "booleanDescription": "Boolesche Werte sind wahr oder falsch.", - "collection": "Sammlung", - "cannotConnectInputToInput": "Eingang kann nicht mit Eingang verbunden werden", - "conditioningField": "Konditionierung", - "cannotConnectOutputToOutput": "Ausgang kann nicht mit Ausgang verbunden werden", - "booleanCollection": "Boolesche Werte Sammlung", - "cannotConnectToSelf": "Es kann keine Verbindung zu sich selbst hergestellt werden", - "colorCodeEdges": "Farbkodierte Kanten", - "addNodeToolTip": "Knoten hinzufügen (Umschalt+A, Leertaste)" - }, - "hrf": { - "enableHrf": "Aktivieren Sie die Korrektur für hohe Auflösungen", - "upscaleMethod": "Vergrößerungsmethoden", - "enableHrfTooltip": "Generieren Sie mit einer niedrigeren Anfangsauflösung, skalieren Sie auf die Basisauflösung hoch und führen Sie dann Image-to-Image aus.", - "metadata": { - "strength": "Hochauflösender Fix Stärke", - "enabled": "Hochauflösender Fix aktiviert", - "method": "Hochauflösender Fix Methode" - }, - "hrf": "Hochauflösender Fix", - "hrfStrength": "Hochauflösende Fix Stärke", - "strengthTooltip": "Niedrigere Werte führen zu weniger Details, wodurch potenzielle Artefakte reduziert werden können." - }, - "models": { - "noMatchingModels": "Keine passenden Modelle", - "loading": "lade", - "noMatchingLoRAs": "Keine passenden LoRAs", - "noLoRAsAvailable": "Keine LoRAs verfügbar", - "noModelsAvailable": "Keine Modelle verfügbar", - "selectModel": "Wählen ein Modell aus", - "noRefinerModelsInstalled": "Keine SDXL Refiner-Modelle installiert", - "noLoRAsInstalled": "Keine LoRAs installiert", - "selectLoRA": "Wählen ein LoRA aus" - } -} diff --git a/invokeai/frontend/web/dist/locales/en.json b/invokeai/frontend/web/dist/locales/en.json deleted file mode 100644 index e3dd84bf5c..0000000000 --- a/invokeai/frontend/web/dist/locales/en.json +++ /dev/null @@ -1,1558 +0,0 @@ -{ - "accessibility": { - "copyMetadataJson": "Copy metadata JSON", - "exitViewer": "Exit Viewer", - "flipHorizontally": "Flip Horizontally", - "flipVertically": "Flip Vertically", - "invokeProgressBar": "Invoke progress bar", - "menu": "Menu", - "mode": "Mode", - "modelSelect": "Model Select", - "modifyConfig": "Modify Config", - "nextImage": "Next Image", - "previousImage": "Previous Image", - "reset": "Reset", - "rotateClockwise": "Rotate Clockwise", - "rotateCounterClockwise": "Rotate Counter-Clockwise", - "showGalleryPanel": "Show Gallery Panel", - "showOptionsPanel": "Show Side Panel", - "toggleAutoscroll": "Toggle autoscroll", - "toggleLogViewer": "Toggle Log Viewer", - "uploadImage": "Upload Image", - "useThisParameter": "Use this parameter", - "zoomIn": "Zoom In", - "zoomOut": "Zoom Out", - "loadMore": "Load More" - }, - "boards": { - "addBoard": "Add Board", - "autoAddBoard": "Auto-Add Board", - "bottomMessage": "Deleting this board and its images will reset any features currently using them.", - "cancel": "Cancel", - "changeBoard": "Change Board", - "clearSearch": "Clear Search", - "deleteBoard": "Delete Board", - "deleteBoardAndImages": "Delete Board and Images", - "deleteBoardOnly": "Delete Board Only", - "deletedBoardsCannotbeRestored": "Deleted boards cannot be restored", - "loading": "Loading...", - "menuItemAutoAdd": "Auto-add to this Board", - "move": "Move", - "myBoard": "My Board", - "noMatching": "No matching Boards", - "searchBoard": "Search Boards...", - "selectBoard": "Select a Board", - "topMessage": "This board contains images used in the following features:", - "uncategorized": "Uncategorized", - "downloadBoard": "Download Board" - }, - "common": { - "accept": "Accept", - "advanced": "Advanced", - "areYouSure": "Are you sure?", - "auto": "Auto", - "back": "Back", - "batch": "Batch Manager", - "cancel": "Cancel", - "close": "Close", - "on": "On", - "checkpoint": "Checkpoint", - "communityLabel": "Community", - "controlNet": "ControlNet", - "controlAdapter": "Control Adapter", - "data": "Data", - "details": "Details", - "ipAdapter": "IP Adapter", - "t2iAdapter": "T2I Adapter", - "darkMode": "Dark Mode", - "discordLabel": "Discord", - "dontAskMeAgain": "Don't ask me again", - "generate": "Generate", - "githubLabel": "Github", - "hotkeysLabel": "Hotkeys", - "imagePrompt": "Image Prompt", - "imageFailedToLoad": "Unable to Load Image", - "img2img": "Image To Image", - "inpaint": "inpaint", - "langArabic": "العربية", - "langBrPortuguese": "Português do Brasil", - "langDutch": "Nederlands", - "langEnglish": "English", - "langFrench": "Français", - "langGerman": "German", - "langHebrew": "Hebrew", - "langItalian": "Italiano", - "langJapanese": "日本語", - "langKorean": "한국어", - "langPolish": "Polski", - "langPortuguese": "Português", - "langRussian": "Русский", - "langSimplifiedChinese": "简体中文", - "langSpanish": "Español", - "languagePickerLabel": "Language", - "langUkranian": "Украї́нська", - "lightMode": "Light Mode", - "linear": "Linear", - "load": "Load", - "loading": "Loading", - "loadingInvokeAI": "Loading Invoke AI", - "learnMore": "Learn More", - "modelManager": "Model Manager", - "nodeEditor": "Node Editor", - "nodes": "Workflow Editor", - "nodesDesc": "A node based system for the generation of images is under development currently. Stay tuned for updates about this amazing feature.", - "openInNewTab": "Open in New Tab", - "outpaint": "outpaint", - "outputs": "Outputs", - "postProcessDesc1": "Invoke AI offers a wide variety of post processing features. Image Upscaling and Face Restoration are already available in the WebUI. You can access them from the Advanced Options menu of the Text To Image and Image To Image tabs. You can also process images directly, using the image action buttons above the current image display or in the viewer.", - "postProcessDesc2": "A dedicated UI will be released soon to facilitate more advanced post processing workflows.", - "postProcessDesc3": "The Invoke AI Command Line Interface offers various other features including Embiggen.", - "postprocessing": "Post Processing", - "postProcessing": "Post Processing", - "random": "Random", - "reportBugLabel": "Report Bug", - "safetensors": "Safetensors", - "settingsLabel": "Settings", - "simple": "Simple", - "statusConnected": "Connected", - "statusConvertingModel": "Converting Model", - "statusDisconnected": "Disconnected", - "statusError": "Error", - "statusGenerating": "Generating", - "statusGeneratingImageToImage": "Generating Image To Image", - "statusGeneratingInpainting": "Generating Inpainting", - "statusGeneratingOutpainting": "Generating Outpainting", - "statusGeneratingTextToImage": "Generating Text To Image", - "statusGenerationComplete": "Generation Complete", - "statusIterationComplete": "Iteration Complete", - "statusLoadingModel": "Loading Model", - "statusMergedModels": "Models Merged", - "statusMergingModels": "Merging Models", - "statusModelChanged": "Model Changed", - "statusModelConverted": "Model Converted", - "statusPreparing": "Preparing", - "statusProcessing": "Processing", - "statusProcessingCanceled": "Processing Canceled", - "statusProcessingComplete": "Processing Complete", - "statusRestoringFaces": "Restoring Faces", - "statusRestoringFacesCodeFormer": "Restoring Faces (CodeFormer)", - "statusRestoringFacesGFPGAN": "Restoring Faces (GFPGAN)", - "statusSavingImage": "Saving Image", - "statusUpscaling": "Upscaling", - "statusUpscalingESRGAN": "Upscaling (ESRGAN)", - "template": "Template", - "training": "Training", - "trainingDesc1": "A dedicated workflow for training your own embeddings and checkpoints using Textual Inversion and Dreambooth from the web interface.", - "trainingDesc2": "InvokeAI already supports training custom embeddourings using Textual Inversion using the main script.", - "txt2img": "Text To Image", - "unifiedCanvas": "Unified Canvas", - "upload": "Upload" - }, - "controlnet": { - "controlAdapter_one": "Control Adapter", - "controlAdapter_other": "Control Adapters", - "controlnet": "$t(controlnet.controlAdapter_one) #{{number}} ($t(common.controlNet))", - "ip_adapter": "$t(controlnet.controlAdapter_one) #{{number}} ($t(common.ipAdapter))", - "t2i_adapter": "$t(controlnet.controlAdapter_one) #{{number}} ($t(common.t2iAdapter))", - "addControlNet": "Add $t(common.controlNet)", - "addIPAdapter": "Add $t(common.ipAdapter)", - "addT2IAdapter": "Add $t(common.t2iAdapter)", - "controlNetEnabledT2IDisabled": "$t(common.controlNet) enabled, $t(common.t2iAdapter)s disabled", - "t2iEnabledControlNetDisabled": "$t(common.t2iAdapter) enabled, $t(common.controlNet)s disabled", - "controlNetT2IMutexDesc": "$t(common.controlNet) and $t(common.t2iAdapter) at same time is currently unsupported.", - "amult": "a_mult", - "autoConfigure": "Auto configure processor", - "balanced": "Balanced", - "beginEndStepPercent": "Begin / End Step Percentage", - "bgth": "bg_th", - "canny": "Canny", - "cannyDescription": "Canny edge detection", - "colorMap": "Color", - "colorMapDescription": "Generates a color map from the image", - "coarse": "Coarse", - "contentShuffle": "Content Shuffle", - "contentShuffleDescription": "Shuffles the content in an image", - "control": "Control", - "controlMode": "Control Mode", - "crop": "Crop", - "delete": "Delete", - "depthMidas": "Depth (Midas)", - "depthMidasDescription": "Depth map generation using Midas", - "depthZoe": "Depth (Zoe)", - "depthZoeDescription": "Depth map generation using Zoe", - "detectResolution": "Detect Resolution", - "duplicate": "Duplicate", - "enableControlnet": "Enable ControlNet", - "f": "F", - "fill": "Fill", - "h": "H", - "handAndFace": "Hand and Face", - "hed": "HED", - "hedDescription": "Holistically-Nested Edge Detection", - "hideAdvanced": "Hide Advanced", - "highThreshold": "High Threshold", - "imageResolution": "Image Resolution", - "colorMapTileSize": "Tile Size", - "importImageFromCanvas": "Import Image From Canvas", - "importMaskFromCanvas": "Import Mask From Canvas", - "incompatibleBaseModel": "Incompatible base model:", - "lineart": "Lineart", - "lineartAnime": "Lineart Anime", - "lineartAnimeDescription": "Anime-style lineart processing", - "lineartDescription": "Converts image to lineart", - "lowThreshold": "Low Threshold", - "maxFaces": "Max Faces", - "mediapipeFace": "Mediapipe Face", - "mediapipeFaceDescription": "Face detection using Mediapipe", - "megaControl": "Mega Control", - "minConfidence": "Min Confidence", - "mlsd": "M-LSD", - "mlsdDescription": "Minimalist Line Segment Detector", - "none": "None", - "noneDescription": "No processing applied", - "normalBae": "Normal BAE", - "normalBaeDescription": "Normal BAE processing", - "openPose": "Openpose", - "openPoseDescription": "Human pose estimation using Openpose", - "pidi": "PIDI", - "pidiDescription": "PIDI image processing", - "processor": "Processor", - "prompt": "Prompt", - "resetControlImage": "Reset Control Image", - "resize": "Resize", - "resizeMode": "Resize Mode", - "safe": "Safe", - "saveControlImage": "Save Control Image", - "scribble": "scribble", - "selectModel": "Select a model", - "setControlImageDimensions": "Set Control Image Dimensions To W/H", - "showAdvanced": "Show Advanced", - "toggleControlNet": "Toggle this ControlNet", - "unstarImage": "Unstar Image", - "w": "W", - "weight": "Weight", - "enableIPAdapter": "Enable IP Adapter", - "ipAdapterModel": "Adapter Model", - "resetIPAdapterImage": "Reset IP Adapter Image", - "ipAdapterImageFallback": "No IP Adapter Image Selected" - }, - "hrf": { - "hrf": "High Resolution Fix", - "enableHrf": "Enable High Resolution Fix", - "enableHrfTooltip": "Generate with a lower initial resolution, upscale to the base resolution, then run Image-to-Image.", - "upscaleMethod": "Upscale Method", - "hrfStrength": "High Resolution Fix Strength", - "strengthTooltip": "Lower values result in fewer details, which may reduce potential artifacts.", - "metadata": { - "enabled": "High Resolution Fix Enabled", - "strength": "High Resolution Fix Strength", - "method": "High Resolution Fix Method" - } - }, - "embedding": { - "addEmbedding": "Add Embedding", - "incompatibleModel": "Incompatible base model:", - "noMatchingEmbedding": "No matching Embeddings" - }, - "queue": { - "queue": "Queue", - "queueFront": "Add to Front of Queue", - "queueBack": "Add to Queue", - "queueCountPrediction": "Add {{predicted}} to Queue", - "queueMaxExceeded": "Max of {{max_queue_size}} exceeded, would skip {{skip}}", - "queuedCount": "{{pending}} Pending", - "queueTotal": "{{total}} Total", - "queueEmpty": "Queue Empty", - "enqueueing": "Queueing Batch", - "resume": "Resume", - "resumeTooltip": "Resume Processor", - "resumeSucceeded": "Processor Resumed", - "resumeFailed": "Problem Resuming Processor", - "pause": "Pause", - "pauseTooltip": "Pause Processor", - "pauseSucceeded": "Processor Paused", - "pauseFailed": "Problem Pausing Processor", - "cancel": "Cancel", - "cancelTooltip": "Cancel Current Item", - "cancelSucceeded": "Item Canceled", - "cancelFailed": "Problem Canceling Item", - "prune": "Prune", - "pruneTooltip": "Prune {{item_count}} Completed Items", - "pruneSucceeded": "Pruned {{item_count}} Completed Items from Queue", - "pruneFailed": "Problem Pruning Queue", - "clear": "Clear", - "clearTooltip": "Cancel and Clear All Items", - "clearSucceeded": "Queue Cleared", - "clearFailed": "Problem Clearing Queue", - "cancelBatch": "Cancel Batch", - "cancelItem": "Cancel Item", - "cancelBatchSucceeded": "Batch Canceled", - "cancelBatchFailed": "Problem Canceling Batch", - "clearQueueAlertDialog": "Clearing the queue immediately cancels any processing items and clears the queue entirely.", - "clearQueueAlertDialog2": "Are you sure you want to clear the queue?", - "current": "Current", - "next": "Next", - "status": "Status", - "total": "Total", - "time": "Time", - "pending": "Pending", - "in_progress": "In Progress", - "completed": "Completed", - "failed": "Failed", - "canceled": "Canceled", - "completedIn": "Completed in", - "batch": "Batch", - "batchFieldValues": "Batch Field Values", - "item": "Item", - "session": "Session", - "batchValues": "Batch Values", - "notReady": "Unable to Queue", - "batchQueued": "Batch Queued", - "batchQueuedDesc_one": "Added {{count}} sessions to {{direction}} of queue", - "batchQueuedDesc_other": "Added {{count}} sessions to {{direction}} of queue", - "front": "front", - "back": "back", - "batchFailedToQueue": "Failed to Queue Batch", - "graphQueued": "Graph queued", - "graphFailedToQueue": "Failed to queue graph" - }, - "invocationCache": { - "invocationCache": "Invocation Cache", - "cacheSize": "Cache Size", - "maxCacheSize": "Max Cache Size", - "hits": "Cache Hits", - "misses": "Cache Misses", - "clear": "Clear", - "clearSucceeded": "Invocation Cache Cleared", - "clearFailed": "Problem Clearing Invocation Cache", - "enable": "Enable", - "enableSucceeded": "Invocation Cache Enabled", - "enableFailed": "Problem Enabling Invocation Cache", - "disable": "Disable", - "disableSucceeded": "Invocation Cache Disabled", - "disableFailed": "Problem Disabling Invocation Cache" - }, - "gallery": { - "allImagesLoaded": "All Images Loaded", - "assets": "Assets", - "autoAssignBoardOnClick": "Auto-Assign Board on Click", - "autoSwitchNewImages": "Auto-Switch to New Images", - "copy": "Copy", - "currentlyInUse": "This image is currently in use in the following features:", - "deleteImage": "Delete Image", - "deleteImageBin": "Deleted images will be sent to your operating system's Bin.", - "deleteImagePermanent": "Deleted images cannot be restored.", - "download": "Download", - "featuresWillReset": "If you delete this image, those features will immediately be reset.", - "galleryImageResetSize": "Reset Size", - "galleryImageSize": "Image Size", - "gallerySettings": "Gallery Settings", - "generations": "Generations", - "images": "Images", - "loading": "Loading", - "loadMore": "Load More", - "maintainAspectRatio": "Maintain Aspect Ratio", - "noImageSelected": "No Image Selected", - "noImagesInGallery": "No Images to Display", - "setCurrentImage": "Set as Current Image", - "showGenerations": "Show Generations", - "showUploads": "Show Uploads", - "singleColumnLayout": "Single Column Layout", - "unableToLoad": "Unable to load Gallery", - "uploads": "Uploads", - "downloadSelection": "Download Selection", - "preparingDownload": "Preparing Download", - "preparingDownloadFailed": "Problem Preparing Download" - }, - "hotkeys": { - "acceptStagingImage": { - "desc": "Accept Current Staging Area Image", - "title": "Accept Staging Image" - }, - "addNodes": { - "desc": "Opens the add node menu", - "title": "Add Nodes" - }, - "appHotkeys": "App Hotkeys", - "cancel": { - "desc": "Cancel image generation", - "title": "Cancel" - }, - "changeTabs": { - "desc": "Switch to another workspace", - "title": "Change Tabs" - }, - "clearMask": { - "desc": "Clear the entire mask", - "title": "Clear Mask" - }, - "closePanels": { - "desc": "Closes open panels", - "title": "Close Panels" - }, - "colorPicker": { - "desc": "Selects the canvas color picker", - "title": "Select Color Picker" - }, - "consoleToggle": { - "desc": "Open and close console", - "title": "Console Toggle" - }, - "copyToClipboard": { - "desc": "Copy current canvas to clipboard", - "title": "Copy to Clipboard" - }, - "decreaseBrushOpacity": { - "desc": "Decreases the opacity of the canvas brush", - "title": "Decrease Brush Opacity" - }, - "decreaseBrushSize": { - "desc": "Decreases the size of the canvas brush/eraser", - "title": "Decrease Brush Size" - }, - "decreaseGalleryThumbSize": { - "desc": "Decreases gallery thumbnails size", - "title": "Decrease Gallery Image Size" - }, - "deleteImage": { - "desc": "Delete the current image", - "title": "Delete Image" - }, - "downloadImage": { - "desc": "Download current canvas", - "title": "Download Image" - }, - "eraseBoundingBox": { - "desc": "Erases the bounding box area", - "title": "Erase Bounding Box" - }, - "fillBoundingBox": { - "desc": "Fills the bounding box with brush color", - "title": "Fill Bounding Box" - }, - "focusPrompt": { - "desc": "Focus the prompt input area", - "title": "Focus Prompt" - }, - "galleryHotkeys": "Gallery Hotkeys", - "generalHotkeys": "General Hotkeys", - "hideMask": { - "desc": "Hide and unhide mask", - "title": "Hide Mask" - }, - "increaseBrushOpacity": { - "desc": "Increases the opacity of the canvas brush", - "title": "Increase Brush Opacity" - }, - "increaseBrushSize": { - "desc": "Increases the size of the canvas brush/eraser", - "title": "Increase Brush Size" - }, - "increaseGalleryThumbSize": { - "desc": "Increases gallery thumbnails size", - "title": "Increase Gallery Image Size" - }, - "invoke": { - "desc": "Generate an image", - "title": "Invoke" - }, - "keyboardShortcuts": "Keyboard Shortcuts", - "maximizeWorkSpace": { - "desc": "Close panels and maximize work area", - "title": "Maximize Workspace" - }, - "mergeVisible": { - "desc": "Merge all visible layers of canvas", - "title": "Merge Visible" - }, - "moveTool": { - "desc": "Allows canvas navigation", - "title": "Move Tool" - }, - "nextImage": { - "desc": "Display the next image in gallery", - "title": "Next Image" - }, - "nextStagingImage": { - "desc": "Next Staging Area Image", - "title": "Next Staging Image" - }, - "nodesHotkeys": "Nodes Hotkeys", - "pinOptions": { - "desc": "Pin the options panel", - "title": "Pin Options" - }, - "previousImage": { - "desc": "Display the previous image in gallery", - "title": "Previous Image" - }, - "previousStagingImage": { - "desc": "Previous Staging Area Image", - "title": "Previous Staging Image" - }, - "quickToggleMove": { - "desc": "Temporarily toggles Move mode", - "title": "Quick Toggle Move" - }, - "redoStroke": { - "desc": "Redo a brush stroke", - "title": "Redo Stroke" - }, - "resetView": { - "desc": "Reset Canvas View", - "title": "Reset View" - }, - "restoreFaces": { - "desc": "Restore the current image", - "title": "Restore Faces" - }, - "saveToGallery": { - "desc": "Save current canvas to gallery", - "title": "Save To Gallery" - }, - "selectBrush": { - "desc": "Selects the canvas brush", - "title": "Select Brush" - }, - "selectEraser": { - "desc": "Selects the canvas eraser", - "title": "Select Eraser" - }, - "sendToImageToImage": { - "desc": "Send current image to Image to Image", - "title": "Send To Image To Image" - }, - "setParameters": { - "desc": "Use all parameters of the current image", - "title": "Set Parameters" - }, - "setPrompt": { - "desc": "Use the prompt of the current image", - "title": "Set Prompt" - }, - "setSeed": { - "desc": "Use the seed of the current image", - "title": "Set Seed" - }, - "showHideBoundingBox": { - "desc": "Toggle visibility of bounding box", - "title": "Show/Hide Bounding Box" - }, - "showInfo": { - "desc": "Show metadata info of the current image", - "title": "Show Info" - }, - "toggleGallery": { - "desc": "Open and close the gallery drawer", - "title": "Toggle Gallery" - }, - "toggleGalleryPin": { - "desc": "Pins and unpins the gallery to the UI", - "title": "Toggle Gallery Pin" - }, - "toggleLayer": { - "desc": "Toggles mask/base layer selection", - "title": "Toggle Layer" - }, - "toggleOptions": { - "desc": "Open and close the options panel", - "title": "Toggle Options" - }, - "toggleSnap": { - "desc": "Toggles Snap to Grid", - "title": "Toggle Snap" - }, - "toggleViewer": { - "desc": "Open and close Image Viewer", - "title": "Toggle Viewer" - }, - "undoStroke": { - "desc": "Undo a brush stroke", - "title": "Undo Stroke" - }, - "unifiedCanvasHotkeys": "Unified Canvas Hotkeys", - "upscale": { - "desc": "Upscale the current image", - "title": "Upscale" - } - }, - "metadata": { - "cfgScale": "CFG scale", - "createdBy": "Created By", - "fit": "Image to image fit", - "generationMode": "Generation Mode", - "height": "Height", - "hiresFix": "High Resolution Optimization", - "imageDetails": "Image Details", - "initImage": "Initial image", - "metadata": "Metadata", - "model": "Model", - "negativePrompt": "Negative Prompt", - "noImageDetails": "No image details found", - "noMetaData": "No metadata found", - "noRecallParameters": "No parameters to recall found", - "perlin": "Perlin Noise", - "positivePrompt": "Positive Prompt", - "recallParameters": "Recall Parameters", - "scheduler": "Scheduler", - "seamless": "Seamless", - "seed": "Seed", - "steps": "Steps", - "strength": "Image to image strength", - "Threshold": "Noise Threshold", - "variations": "Seed-weight pairs", - "vae": "VAE", - "width": "Width", - "workflow": "Workflow" - }, - "modelManager": { - "active": "active", - "addCheckpointModel": "Add Checkpoint / Safetensor Model", - "addDifference": "Add Difference", - "addDiffuserModel": "Add Diffusers", - "addManually": "Add Manually", - "addModel": "Add Model", - "addNew": "Add New", - "addNewModel": "Add New Model", - "addSelected": "Add Selected", - "advanced": "Advanced", - "allModels": "All Models", - "alpha": "Alpha", - "availableModels": "Available Models", - "baseModel": "Base Model", - "cached": "cached", - "cannotUseSpaces": "Cannot Use Spaces", - "checkpointFolder": "Checkpoint Folder", - "checkpointModels": "Checkpoints", - "checkpointOrSafetensors": "$t(common.checkpoint) / $t(common.safetensors)", - "clearCheckpointFolder": "Clear Checkpoint Folder", - "closeAdvanced": "Close Advanced", - "config": "Config", - "configValidationMsg": "Path to the config file of your model.", - "convert": "Convert", - "convertingModelBegin": "Converting Model. Please wait.", - "convertToDiffusers": "Convert To Diffusers", - "convertToDiffusersHelpText1": "This model will be converted to the 🧨 Diffusers format.", - "convertToDiffusersHelpText2": "This process will replace your Model Manager entry with the Diffusers version of the same model.", - "convertToDiffusersHelpText3": "Your checkpoint file on disk WILL be deleted if it is in InvokeAI root folder. If it is in a custom location, then it WILL NOT be deleted.", - "convertToDiffusersHelpText4": "This is a one time process only. It might take around 30s-60s depending on the specifications of your computer.", - "convertToDiffusersHelpText5": "Please make sure you have enough disk space. Models generally vary between 2GB-7GB in size.", - "convertToDiffusersHelpText6": "Do you wish to convert this model?", - "convertToDiffusersSaveLocation": "Save Location", - "custom": "Custom", - "customConfig": "Custom Config", - "customConfigFileLocation": "Custom Config File Location", - "customSaveLocation": "Custom Save Location", - "delete": "Delete", - "deleteConfig": "Delete Config", - "deleteModel": "Delete Model", - "deleteMsg1": "Are you sure you want to delete this model from InvokeAI?", - "deleteMsg2": "This WILL delete the model from disk if it is in the InvokeAI root folder. If you are using a custom location, then the model WILL NOT be deleted from disk.", - "description": "Description", - "descriptionValidationMsg": "Add a description for your model", - "deselectAll": "Deselect All", - "diffusersModels": "Diffusers", - "findModels": "Find Models", - "formMessageDiffusersModelLocation": "Diffusers Model Location", - "formMessageDiffusersModelLocationDesc": "Please enter at least one.", - "formMessageDiffusersVAELocation": "VAE Location", - "formMessageDiffusersVAELocationDesc": "If not provided, InvokeAI will look for the VAE file inside the model location given above.", - "height": "Height", - "heightValidationMsg": "Default height of your model.", - "ignoreMismatch": "Ignore Mismatches Between Selected Models", - "importModels": "Import Models", - "inpainting": "v1 Inpainting", - "interpolationType": "Interpolation Type", - "inverseSigmoid": "Inverse Sigmoid", - "invokeAIFolder": "Invoke AI Folder", - "invokeRoot": "InvokeAI folder", - "load": "Load", - "loraModels": "LoRAs", - "manual": "Manual", - "merge": "Merge", - "mergedModelCustomSaveLocation": "Custom Path", - "mergedModelName": "Merged Model Name", - "mergedModelSaveLocation": "Save Location", - "mergeModels": "Merge Models", - "model": "Model", - "modelAdded": "Model Added", - "modelConversionFailed": "Model Conversion Failed", - "modelConverted": "Model Converted", - "modelDeleted": "Model Deleted", - "modelDeleteFailed": "Failed to delete model", - "modelEntryDeleted": "Model Entry Deleted", - "modelExists": "Model Exists", - "modelLocation": "Model Location", - "modelLocationValidationMsg": "Provide the path to a local folder where your Diffusers Model is stored", - "modelManager": "Model Manager", - "modelMergeAlphaHelp": "Alpha controls blend strength for the models. Lower alpha values lead to lower influence of the second model.", - "modelMergeHeaderHelp1": "You can merge up to three different models to create a blend that suits your needs.", - "modelMergeHeaderHelp2": "Only Diffusers are available for merging. If you want to merge a checkpoint model, please convert it to Diffusers first.", - "modelMergeInterpAddDifferenceHelp": "In this mode, Model 3 is first subtracted from Model 2. The resulting version is blended with Model 1 with the alpha rate set above.", - "modelOne": "Model 1", - "modelsFound": "Models Found", - "modelsMerged": "Models Merged", - "modelsMergeFailed": "Model Merge Failed", - "modelsSynced": "Models Synced", - "modelSyncFailed": "Model Sync Failed", - "modelThree": "Model 3", - "modelTwo": "Model 2", - "modelType": "Model Type", - "modelUpdated": "Model Updated", - "modelUpdateFailed": "Model Update Failed", - "name": "Name", - "nameValidationMsg": "Enter a name for your model", - "noCustomLocationProvided": "No Custom Location Provided", - "noModels": "No Models Found", - "noModelSelected": "No Model Selected", - "noModelsFound": "No Models Found", - "none": "none", - "notLoaded": "not loaded", - "oliveModels": "Olives", - "onnxModels": "Onnx", - "pathToCustomConfig": "Path To Custom Config", - "pickModelType": "Pick Model Type", - "predictionType": "Prediction Type (for Stable Diffusion 2.x Models and occasional Stable Diffusion 1.x Models)", - "quickAdd": "Quick Add", - "repo_id": "Repo ID", - "repoIDValidationMsg": "Online repository of your model", - "safetensorModels": "SafeTensors", - "sameFolder": "Same folder", - "scanAgain": "Scan Again", - "scanForModels": "Scan For Models", - "search": "Search", - "selectAll": "Select All", - "selectAndAdd": "Select and Add Models Listed Below", - "selected": "Selected", - "selectFolder": "Select Folder", - "selectModel": "Select Model", - "settings": "Settings", - "showExisting": "Show Existing", - "sigmoid": "Sigmoid", - "simpleModelDesc": "Provide a path to a local Diffusers model, local checkpoint / safetensors model a HuggingFace Repo ID, or a checkpoint/diffusers model URL.", - "statusConverting": "Converting", - "syncModels": "Sync Models", - "syncModelsDesc": "If your models are out of sync with the backend, you can refresh them up using this option. This is generally handy in cases where you manually update your models.yaml file or add models to the InvokeAI root folder after the application has booted.", - "updateModel": "Update Model", - "useCustomConfig": "Use Custom Config", - "v1": "v1", - "v2_768": "v2 (768px)", - "v2_base": "v2 (512px)", - "vae": "VAE", - "vaeLocation": "VAE Location", - "vaeLocationValidationMsg": "Path to where your VAE is located.", - "vaePrecision": "VAE Precision", - "vaeRepoID": "VAE Repo ID", - "vaeRepoIDValidationMsg": "Online repository of your VAE", - "variant": "Variant", - "weightedSum": "Weighted Sum", - "width": "Width", - "widthValidationMsg": "Default width of your model." - }, - "models": { - "addLora": "Add LoRA", - "esrganModel": "ESRGAN Model", - "loading": "loading", - "noLoRAsAvailable": "No LoRAs available", - "noMatchingLoRAs": "No matching LoRAs", - "noMatchingModels": "No matching Models", - "noModelsAvailable": "No models available", - "selectLoRA": "Select a LoRA", - "selectModel": "Select a Model", - "noLoRAsInstalled": "No LoRAs installed", - "noRefinerModelsInstalled": "No SDXL Refiner models installed" - }, - "nodes": { - "addNode": "Add Node", - "addNodeToolTip": "Add Node (Shift+A, Space)", - "animatedEdges": "Animated Edges", - "animatedEdgesHelp": "Animate selected edges and edges connected to selected nodes", - "boardField": "Board", - "boardFieldDescription": "A gallery board", - "boolean": "Booleans", - "booleanCollection": "Boolean Collection", - "booleanCollectionDescription": "A collection of booleans.", - "booleanDescription": "Booleans are true or false.", - "booleanPolymorphic": "Boolean Polymorphic", - "booleanPolymorphicDescription": "A collection of booleans.", - "cannotConnectInputToInput": "Cannot connect input to input", - "cannotConnectOutputToOutput": "Cannot connect output to output", - "cannotConnectToSelf": "Cannot connect to self", - "cannotDuplicateConnection": "Cannot create duplicate connections", - "clipField": "Clip", - "clipFieldDescription": "Tokenizer and text_encoder submodels.", - "collection": "Collection", - "collectionDescription": "TODO", - "collectionItem": "Collection Item", - "collectionItemDescription": "TODO", - "colorCodeEdges": "Color-Code Edges", - "colorCodeEdgesHelp": "Color-code edges according to their connected fields", - "colorCollection": "A collection of colors.", - "colorCollectionDescription": "TODO", - "colorField": "Color", - "colorFieldDescription": "A RGBA color.", - "colorPolymorphic": "Color Polymorphic", - "colorPolymorphicDescription": "A collection of colors.", - "conditioningCollection": "Conditioning Collection", - "conditioningCollectionDescription": "Conditioning may be passed between nodes.", - "conditioningField": "Conditioning", - "conditioningFieldDescription": "Conditioning may be passed between nodes.", - "conditioningPolymorphic": "Conditioning Polymorphic", - "conditioningPolymorphicDescription": "Conditioning may be passed between nodes.", - "connectionWouldCreateCycle": "Connection would create a cycle", - "controlCollection": "Control Collection", - "controlCollectionDescription": "Control info passed between nodes.", - "controlField": "Control", - "controlFieldDescription": "Control info passed between nodes.", - "currentImage": "Current Image", - "currentImageDescription": "Displays the current image in the Node Editor", - "denoiseMaskField": "Denoise Mask", - "denoiseMaskFieldDescription": "Denoise Mask may be passed between nodes", - "doesNotExist": "does not exist", - "downloadWorkflow": "Download Workflow JSON", - "edge": "Edge", - "enum": "Enum", - "enumDescription": "Enums are values that may be one of a number of options.", - "executionStateCompleted": "Completed", - "executionStateError": "Error", - "executionStateInProgress": "In Progress", - "fieldTypesMustMatch": "Field types must match", - "fitViewportNodes": "Fit View", - "float": "Float", - "floatCollection": "Float Collection", - "floatCollectionDescription": "A collection of floats.", - "floatDescription": "Floats are numbers with a decimal point.", - "floatPolymorphic": "Float Polymorphic", - "floatPolymorphicDescription": "A collection of floats.", - "fullyContainNodes": "Fully Contain Nodes to Select", - "fullyContainNodesHelp": "Nodes must be fully inside the selection box to be selected", - "hideGraphNodes": "Hide Graph Overlay", - "hideLegendNodes": "Hide Field Type Legend", - "hideMinimapnodes": "Hide MiniMap", - "imageCollection": "Image Collection", - "imageCollectionDescription": "A collection of images.", - "imageField": "Image", - "imageFieldDescription": "Images may be passed between nodes.", - "imagePolymorphic": "Image Polymorphic", - "imagePolymorphicDescription": "A collection of images.", - "inputField": "Input Field", - "inputFields": "Input Fields", - "inputMayOnlyHaveOneConnection": "Input may only have one connection", - "inputNode": "Input Node", - "integer": "Integer", - "integerCollection": "Integer Collection", - "integerCollectionDescription": "A collection of integers.", - "integerDescription": "Integers are whole numbers, without a decimal point.", - "integerPolymorphic": "Integer Polymorphic", - "integerPolymorphicDescription": "A collection of integers.", - "invalidOutputSchema": "Invalid output schema", - "ipAdapter": "IP-Adapter", - "ipAdapterCollection": "IP-Adapters Collection", - "ipAdapterCollectionDescription": "A collection of IP-Adapters.", - "ipAdapterDescription": "An Image Prompt Adapter (IP-Adapter).", - "ipAdapterModel": "IP-Adapter Model", - "ipAdapterModelDescription": "IP-Adapter Model Field", - "ipAdapterPolymorphic": "IP-Adapter Polymorphic", - "ipAdapterPolymorphicDescription": "A collection of IP-Adapters.", - "latentsCollection": "Latents Collection", - "latentsCollectionDescription": "Latents may be passed between nodes.", - "latentsField": "Latents", - "latentsFieldDescription": "Latents may be passed between nodes.", - "latentsPolymorphic": "Latents Polymorphic", - "latentsPolymorphicDescription": "Latents may be passed between nodes.", - "loadingNodes": "Loading Nodes...", - "loadWorkflow": "Load Workflow", - "noWorkflow": "No Workflow", - "loRAModelField": "LoRA", - "loRAModelFieldDescription": "TODO", - "mainModelField": "Model", - "mainModelFieldDescription": "TODO", - "maybeIncompatible": "May be Incompatible With Installed", - "mismatchedVersion": "Has Mismatched Version", - "missingCanvaInitImage": "Missing canvas init image", - "missingCanvaInitMaskImages": "Missing canvas init and mask images", - "missingTemplate": "Missing Template", - "noConnectionData": "No connection data", - "noConnectionInProgress": "No connection in progress", - "node": "Node", - "nodeOutputs": "Node Outputs", - "nodeSearch": "Search for nodes", - "nodeTemplate": "Node Template", - "nodeType": "Node Type", - "noFieldsLinearview": "No fields added to Linear View", - "noFieldType": "No field type", - "noImageFoundState": "No initial image found in state", - "noMatchingNodes": "No matching nodes", - "noNodeSelected": "No node selected", - "nodeOpacity": "Node Opacity", - "noOutputRecorded": "No outputs recorded", - "noOutputSchemaName": "No output schema name found in ref object", - "notes": "Notes", - "notesDescription": "Add notes about your workflow", - "oNNXModelField": "ONNX Model", - "oNNXModelFieldDescription": "ONNX model field.", - "outputField": "Output Field", - "outputFields": "Output Fields", - "outputNode": "Output node", - "outputSchemaNotFound": "Output schema not found", - "pickOne": "Pick One", - "problemReadingMetadata": "Problem reading metadata from image", - "problemReadingWorkflow": "Problem reading workflow from image", - "problemSettingTitle": "Problem Setting Title", - "reloadNodeTemplates": "Reload Node Templates", - "removeLinearView": "Remove from Linear View", - "resetWorkflow": "Reset Workflow", - "resetWorkflowDesc": "Are you sure you want to reset this workflow?", - "resetWorkflowDesc2": "Resetting the workflow will clear all nodes, edges and workflow details.", - "scheduler": "Scheduler", - "schedulerDescription": "TODO", - "sDXLMainModelField": "SDXL Model", - "sDXLMainModelFieldDescription": "SDXL model field.", - "sDXLRefinerModelField": "Refiner Model", - "sDXLRefinerModelFieldDescription": "TODO", - "showGraphNodes": "Show Graph Overlay", - "showLegendNodes": "Show Field Type Legend", - "showMinimapnodes": "Show MiniMap", - "skipped": "Skipped", - "skippedReservedInput": "Skipped reserved input field", - "skippedReservedOutput": "Skipped reserved output field", - "skippingInputNoTemplate": "Skipping input field with no template", - "skippingReservedFieldType": "Skipping reserved field type", - "skippingUnknownInputType": "Skipping unknown input field type", - "skippingUnknownOutputType": "Skipping unknown output field type", - "snapToGrid": "Snap to Grid", - "snapToGridHelp": "Snap nodes to grid when moved", - "sourceNode": "Source node", - "string": "String", - "stringCollection": "String Collection", - "stringCollectionDescription": "A collection of strings.", - "stringDescription": "Strings are text.", - "stringPolymorphic": "String Polymorphic", - "stringPolymorphicDescription": "A collection of strings.", - "unableToLoadWorkflow": "Unable to Validate Workflow", - "unableToParseEdge": "Unable to parse edge", - "unableToParseNode": "Unable to parse node", - "unableToValidateWorkflow": "Unable to Validate Workflow", - "uNetField": "UNet", - "uNetFieldDescription": "UNet submodel.", - "unhandledInputProperty": "Unhandled input property", - "unhandledOutputProperty": "Unhandled output property", - "unknownField": "Unknown Field", - "unknownNode": "Unknown Node", - "unknownTemplate": "Unknown Template", - "unkownInvocation": "Unknown Invocation type", - "updateNode": "Update Node", - "updateAllNodes": "Update All Nodes", - "updateApp": "Update App", - "unableToUpdateNodes_one": "Unable to update {{count}} node", - "unableToUpdateNodes_other": "Unable to update {{count}} nodes", - "vaeField": "Vae", - "vaeFieldDescription": "Vae submodel.", - "vaeModelField": "VAE", - "vaeModelFieldDescription": "TODO", - "validateConnections": "Validate Connections and Graph", - "validateConnectionsHelp": "Prevent invalid connections from being made, and invalid graphs from being invoked", - "version": "Version", - "versionUnknown": " Version Unknown", - "workflow": "Workflow", - "workflowAuthor": "Author", - "workflowContact": "Contact", - "workflowDescription": "Short Description", - "workflowName": "Name", - "workflowNotes": "Notes", - "workflowSettings": "Workflow Editor Settings", - "workflowTags": "Tags", - "workflowValidation": "Workflow Validation Error", - "workflowVersion": "Version", - "zoomInNodes": "Zoom In", - "zoomOutNodes": "Zoom Out" - }, - "parameters": { - "aspectRatio": "Aspect Ratio", - "aspectRatioFree": "Free", - "boundingBoxHeader": "Bounding Box", - "boundingBoxHeight": "Bounding Box Height", - "boundingBoxWidth": "Bounding Box Width", - "cancel": { - "cancel": "Cancel", - "immediate": "Cancel immediately", - "isScheduled": "Canceling", - "schedule": "Cancel after current iteration", - "setType": "Set cancel type" - }, - "cfgScale": "CFG Scale", - "clipSkip": "CLIP Skip", - "clipSkipWithLayerCount": "CLIP Skip {{layerCount}}", - "closeViewer": "Close Viewer", - "codeformerFidelity": "Fidelity", - "coherenceMode": "Mode", - "coherencePassHeader": "Coherence Pass", - "coherenceSteps": "Steps", - "coherenceStrength": "Strength", - "compositingSettingsHeader": "Compositing Settings", - "controlNetControlMode": "Control Mode", - "copyImage": "Copy Image", - "copyImageToLink": "Copy Image To Link", - "denoisingStrength": "Denoising Strength", - "downloadImage": "Download Image", - "enableNoiseSettings": "Enable Noise Settings", - "faceRestoration": "Face Restoration", - "general": "General", - "height": "Height", - "hidePreview": "Hide Preview", - "hiresOptim": "High Res Optimization", - "hiresStrength": "High Res Strength", - "hSymmetryStep": "H Symmetry Step", - "imageFit": "Fit Initial Image To Output Size", - "images": "Images", - "imageToImage": "Image to Image", - "img2imgStrength": "Image To Image Strength", - "infillMethod": "Infill Method", - "infillScalingHeader": "Infill and Scaling", - "info": "Info", - "initialImage": "Initial Image", - "invoke": { - "addingImagesTo": "Adding images to", - "invoke": "Invoke", - "missingFieldTemplate": "Missing field template", - "missingInputForField": "{{nodeLabel}} -> {{fieldLabel}} missing input", - "missingNodeTemplate": "Missing node template", - "noControlImageForControlAdapter": "Control Adapter #{{number}} has no control image", - "noInitialImageSelected": "No initial image selected", - "noModelForControlAdapter": "Control Adapter #{{number}} has no model selected.", - "incompatibleBaseModelForControlAdapter": "Control Adapter #{{number}} model is invalid with main model.", - "noModelSelected": "No model selected", - "noPrompts": "No prompts generated", - "noNodesInGraph": "No nodes in graph", - "readyToInvoke": "Ready to Invoke", - "systemBusy": "System busy", - "systemDisconnected": "System disconnected", - "unableToInvoke": "Unable to Invoke" - }, - "maskAdjustmentsHeader": "Mask Adjustments", - "maskBlur": "Blur", - "maskBlurMethod": "Blur Method", - "maskEdge": "Mask Edge", - "negativePromptPlaceholder": "Negative Prompt", - "noiseSettings": "Noise", - "noiseThreshold": "Noise Threshold", - "openInViewer": "Open In Viewer", - "otherOptions": "Other Options", - "patchmatchDownScaleSize": "Downscale", - "perlinNoise": "Perlin Noise", - "positivePromptPlaceholder": "Positive Prompt", - "randomizeSeed": "Randomize Seed", - "manualSeed": "Manual Seed", - "randomSeed": "Random Seed", - "restoreFaces": "Restore Faces", - "iterations": "Iterations", - "iterationsWithCount_one": "{{count}} Iteration", - "iterationsWithCount_other": "{{count}} Iterations", - "scale": "Scale", - "scaleBeforeProcessing": "Scale Before Processing", - "scaledHeight": "Scaled H", - "scaledWidth": "Scaled W", - "scheduler": "Scheduler", - "seamCorrectionHeader": "Seam Correction", - "seamHighThreshold": "High", - "seamlessTiling": "Seamless Tiling", - "seamlessXAxis": "X Axis", - "seamlessYAxis": "Y Axis", - "seamlessX": "Seamless X", - "seamlessY": "Seamless Y", - "seamlessX&Y": "Seamless X & Y", - "seamLowThreshold": "Low", - "seed": "Seed", - "seedWeights": "Seed Weights", - "imageActions": "Image Actions", - "sendTo": "Send to", - "sendToImg2Img": "Send to Image to Image", - "sendToUnifiedCanvas": "Send To Unified Canvas", - "showOptionsPanel": "Show Side Panel (O or T)", - "showPreview": "Show Preview", - "shuffle": "Shuffle Seed", - "steps": "Steps", - "strength": "Strength", - "symmetry": "Symmetry", - "tileSize": "Tile Size", - "toggleLoopback": "Toggle Loopback", - "type": "Type", - "upscale": "Upscale (Shift + U)", - "upscaleImage": "Upscale Image", - "upscaling": "Upscaling", - "unmasked": "Unmasked", - "useAll": "Use All", - "useCpuNoise": "Use CPU Noise", - "cpuNoise": "CPU Noise", - "gpuNoise": "GPU Noise", - "useInitImg": "Use Initial Image", - "usePrompt": "Use Prompt", - "useSeed": "Use Seed", - "variationAmount": "Variation Amount", - "variations": "Variations", - "vSymmetryStep": "V Symmetry Step", - "width": "Width", - "isAllowedToUpscale": { - "useX2Model": "Image is too large to upscale with x4 model, use x2 model", - "tooLarge": "Image is too large to upscale, select smaller image" - } - }, - "dynamicPrompts": { - "combinatorial": "Combinatorial Generation", - "dynamicPrompts": "Dynamic Prompts", - "enableDynamicPrompts": "Enable Dynamic Prompts", - "maxPrompts": "Max Prompts", - "promptsPreview": "Prompts Preview", - "promptsWithCount_one": "{{count}} Prompt", - "promptsWithCount_other": "{{count}} Prompts", - "seedBehaviour": { - "label": "Seed Behaviour", - "perIterationLabel": "Seed per Iteration", - "perIterationDesc": "Use a different seed for each iteration", - "perPromptLabel": "Seed per Image", - "perPromptDesc": "Use a different seed for each image" - } - }, - "sdxl": { - "cfgScale": "CFG Scale", - "concatPromptStyle": "Concatenate Prompt & Style", - "denoisingStrength": "Denoising Strength", - "loading": "Loading...", - "negAestheticScore": "Negative Aesthetic Score", - "negStylePrompt": "Negative Style Prompt", - "noModelsAvailable": "No models available", - "posAestheticScore": "Positive Aesthetic Score", - "posStylePrompt": "Positive Style Prompt", - "refiner": "Refiner", - "refinermodel": "Refiner Model", - "refinerStart": "Refiner Start", - "scheduler": "Scheduler", - "selectAModel": "Select a model", - "steps": "Steps", - "useRefiner": "Use Refiner" - }, - "settings": { - "alternateCanvasLayout": "Alternate Canvas Layout", - "antialiasProgressImages": "Antialias Progress Images", - "autoChangeDimensions": "Update W/H To Model Defaults On Change", - "beta": "Beta", - "confirmOnDelete": "Confirm On Delete", - "consoleLogLevel": "Log Level", - "developer": "Developer", - "displayHelpIcons": "Display Help Icons", - "displayInProgress": "Display Progress Images", - "enableImageDebugging": "Enable Image Debugging", - "enableInformationalPopovers": "Enable Informational Popovers", - "enableInvisibleWatermark": "Enable Invisible Watermark", - "enableNodesEditor": "Enable Nodes Editor", - "enableNSFWChecker": "Enable NSFW Checker", - "experimental": "Experimental", - "favoriteSchedulers": "Favorite Schedulers", - "favoriteSchedulersPlaceholder": "No schedulers favorited", - "general": "General", - "generation": "Generation", - "models": "Models", - "resetComplete": "Web UI has been reset.", - "resetWebUI": "Reset Web UI", - "resetWebUIDesc1": "Resetting the web UI only resets the browser's local cache of your images and remembered settings. It does not delete any images from disk.", - "resetWebUIDesc2": "If images aren't showing up in the gallery or something else isn't working, please try resetting before submitting an issue on GitHub.", - "saveSteps": "Save images every n steps", - "shouldLogToConsole": "Console Logging", - "showAdvancedOptions": "Show Advanced Options", - "showProgressInViewer": "Show Progress Images in Viewer", - "ui": "User Interface", - "useSlidersForAll": "Use Sliders For All Options", - "clearIntermediatesDisabled": "Queue must be empty to clear intermediates", - "clearIntermediatesDesc1": "Clearing intermediates will reset your Canvas and ControlNet state.", - "clearIntermediatesDesc2": "Intermediate images are byproducts of generation, different from the result images in the gallery. Clearing intermediates will free disk space.", - "clearIntermediatesDesc3": "Your gallery images will not be deleted.", - "clearIntermediates": "Clear Intermediates", - "clearIntermediatesWithCount_one": "Clear {{count}} Intermediate", - "clearIntermediatesWithCount_other": "Clear {{count}} Intermediates", - "intermediatesCleared_one": "Cleared {{count}} Intermediate", - "intermediatesCleared_other": "Cleared {{count}} Intermediates", - "intermediatesClearedFailed": "Problem Clearing Intermediates" - }, - "toast": { - "addedToBoard": "Added to board", - "baseModelChangedCleared_one": "Base model changed, cleared or disabled {{count}} incompatible submodel", - "baseModelChangedCleared_other": "Base model changed, cleared or disabled {{count}} incompatible submodels", - "canceled": "Processing Canceled", - "canvasCopiedClipboard": "Canvas Copied to Clipboard", - "canvasDownloaded": "Canvas Downloaded", - "canvasMerged": "Canvas Merged", - "canvasSavedGallery": "Canvas Saved to Gallery", - "canvasSentControlnetAssets": "Canvas Sent to ControlNet & Assets", - "connected": "Connected to Server", - "disconnected": "Disconnected from Server", - "downloadImageStarted": "Image Download Started", - "faceRestoreFailed": "Face Restoration Failed", - "imageCopied": "Image Copied", - "imageLinkCopied": "Image Link Copied", - "imageNotLoaded": "No Image Loaded", - "imageNotLoadedDesc": "Could not find image", - "imageSaved": "Image Saved", - "imageSavedToGallery": "Image Saved to Gallery", - "imageSavingFailed": "Image Saving Failed", - "imageUploaded": "Image Uploaded", - "imageUploadFailed": "Image Upload Failed", - "initialImageNotSet": "Initial Image Not Set", - "initialImageNotSetDesc": "Could not load initial image", - "initialImageSet": "Initial Image Set", - "loadedWithWarnings": "Workflow Loaded with Warnings", - "maskSavedAssets": "Mask Saved to Assets", - "maskSentControlnetAssets": "Mask Sent to ControlNet & Assets", - "metadataLoadFailed": "Failed to load metadata", - "modelAdded": "Model Added: {{modelName}}", - "modelAddedSimple": "Model Added", - "modelAddFailed": "Model Add Failed", - "nodesBrokenConnections": "Cannot load. Some connections are broken.", - "nodesCleared": "Nodes Cleared", - "nodesCorruptedGraph": "Cannot load. Graph seems to be corrupted.", - "nodesLoaded": "Nodes Loaded", - "nodesLoadedFailed": "Failed To Load Nodes", - "nodesNotValidGraph": "Not a valid InvokeAI Node Graph", - "nodesNotValidJSON": "Not a valid JSON", - "nodesSaved": "Nodes Saved", - "nodesUnrecognizedTypes": "Cannot load. Graph has unrecognized types", - "parameterNotSet": "Parameter not set", - "parameterSet": "Parameter set", - "parametersFailed": "Problem loading parameters", - "parametersFailedDesc": "Unable to load init image.", - "parametersNotSet": "Parameters Not Set", - "parametersNotSetDesc": "No metadata found for this image.", - "parametersSet": "Parameters Set", - "problemCopyingCanvas": "Problem Copying Canvas", - "problemCopyingCanvasDesc": "Unable to export base layer", - "problemCopyingImage": "Unable to Copy Image", - "problemCopyingImageLink": "Unable to Copy Image Link", - "problemDownloadingCanvas": "Problem Downloading Canvas", - "problemDownloadingCanvasDesc": "Unable to export base layer", - "problemImportingMask": "Problem Importing Mask", - "problemImportingMaskDesc": "Unable to export mask", - "problemMergingCanvas": "Problem Merging Canvas", - "problemMergingCanvasDesc": "Unable to export base layer", - "problemSavingCanvas": "Problem Saving Canvas", - "problemSavingCanvasDesc": "Unable to export base layer", - "problemSavingMask": "Problem Saving Mask", - "problemSavingMaskDesc": "Unable to export mask", - "promptNotSet": "Prompt Not Set", - "promptNotSetDesc": "Could not find prompt for this image.", - "promptSet": "Prompt Set", - "seedNotSet": "Seed Not Set", - "seedNotSetDesc": "Could not find seed for this image.", - "seedSet": "Seed Set", - "sentToImageToImage": "Sent To Image To Image", - "sentToUnifiedCanvas": "Sent to Unified Canvas", - "serverError": "Server Error", - "setAsCanvasInitialImage": "Set as canvas initial image", - "setCanvasInitialImage": "Set canvas initial image", - "setControlImage": "Set as control image", - "setIPAdapterImage": "Set as IP Adapter Image", - "setInitialImage": "Set as initial image", - "setNodeField": "Set as node field", - "tempFoldersEmptied": "Temp Folder Emptied", - "uploadFailed": "Upload failed", - "uploadFailedInvalidUploadDesc": "Must be single PNG or JPEG image", - "uploadFailedUnableToLoadDesc": "Unable to load file", - "upscalingFailed": "Upscaling Failed", - "workflowLoaded": "Workflow Loaded" - }, - "tooltip": { - "feature": { - "boundingBox": "The bounding box is the same as the Width and Height settings for Text to Image or Image to Image. Only the area in the box will be processed.", - "faceCorrection": "Face correction with GFPGAN or Codeformer: the algorithm detects faces in the image and corrects any defects. High value will change the image more, resulting in more attractive faces. Codeformer with a higher fidelity preserves the original image at the expense of stronger face correction.", - "gallery": "Gallery displays generations from the outputs folder as they're created. Settings are stored within files and accesed by context menu.", - "imageToImage": "Image to Image loads any image as initial, which is then used to generate a new one along with the prompt. The higher the value, the more the result image will change. Values from 0.0 to 1.0 are possible, the recommended range is .25-.75", - "infillAndScaling": "Manage infill methods (used on masked or erased areas of the canvas) and scaling (useful for small bounding box sizes).", - "other": "These options will enable alternative processing modes for Invoke. 'Seamless tiling' will create repeating patterns in the output. 'High resolution' is generation in two steps with img2img: use this setting when you want a larger and more coherent image without artifacts. It will take longer than usual txt2img.", - "prompt": "This is the prompt field. Prompt includes generation objects and stylistic terms. You can add weight (token importance) in the prompt as well, but CLI commands and parameters will not work.", - "seamCorrection": "Controls the handling of visible seams that occur between generated images on the canvas.", - "seed": "Seed value affects the initial noise from which the image is formed. You can use the already existing seeds from previous images. 'Noise Threshold' is used to mitigate artifacts at high CFG values (try the 0-10 range), and Perlin to add Perlin noise during generation: both serve to add variation to your outputs.", - "upscale": "Use ESRGAN to enlarge the image immediately after generation.", - "variations": "Try a variation with a value between 0.1 and 1.0 to change the result for a given seed. Interesting variations of the seed are between 0.1 and 0.3." - } - }, - "popovers": { - "clipSkip": { - "heading": "CLIP Skip", - "paragraphs": [ - "Choose how many layers of the CLIP model to skip.", - "Some models work better with certain CLIP Skip settings.", - "A higher value typically results in a less detailed image." - ] - }, - "paramNegativeConditioning": { - "heading": "Negative Prompt", - "paragraphs": [ - "The generation process avoids the concepts in the negative prompt. Use this to exclude qualities or objects from the output.", - "Supports Compel syntax and embeddings." - ] - }, - "paramPositiveConditioning": { - "heading": "Positive Prompt", - "paragraphs": [ - "Guides the generation process. You may use any words or phrases.", - "Compel and Dynamic Prompts syntaxes and embeddings." - ] - }, - "paramScheduler": { - "heading": "Scheduler", - "paragraphs": [ - "Scheduler defines how to iteratively add noise to an image or how to update a sample based on a model's output." - ] - }, - "compositingBlur": { - "heading": "Blur", - "paragraphs": [ - "The blur radius of the mask." - ] - }, - "compositingBlurMethod": { - "heading": "Blur Method", - "paragraphs": [ - "The method of blur applied to the masked area." - ] - }, - "compositingCoherencePass": { - "heading": "Coherence Pass", - "paragraphs": [ - "A second round of denoising helps to composite the Inpainted/Outpainted image." - ] - }, - "compositingCoherenceMode": { - "heading": "Mode", - "paragraphs": [ - "The mode of the Coherence Pass." - ] - }, - "compositingCoherenceSteps": { - "heading": "Steps", - "paragraphs": [ - "Number of denoising steps used in the Coherence Pass.", - "Same as the main Steps parameter." - ] - }, - "compositingStrength": { - "heading": "Strength", - "paragraphs": [ - "Denoising strength for the Coherence Pass.", - "Same as the Image to Image Denoising Strength parameter." - ] - }, - "compositingMaskAdjustments": { - "heading": "Mask Adjustments", - "paragraphs": [ - "Adjust the mask." - ] - }, - "controlNetBeginEnd": { - "heading": "Begin / End Step Percentage", - "paragraphs": [ - "Which steps of the denoising process will have the ControlNet applied.", - "ControlNets applied at the beginning of the process guide composition, and ControlNets applied at the end guide details." - ] - }, - "controlNetControlMode": { - "heading": "Control Mode", - "paragraphs": [ - "Lends more weight to either the prompt or ControlNet." - ] - }, - "controlNetResizeMode": { - "heading": "Resize Mode", - "paragraphs": [ - "How the ControlNet image will be fit to the image output size." - ] - }, - "controlNet": { - "heading": "ControlNet", - "paragraphs": [ - "ControlNets provide guidance to the generation process, helping create images with controlled composition, structure, or style, depending on the model selected." - ] - }, - "controlNetWeight": { - "heading": "Weight", - "paragraphs": [ - "How strongly the ControlNet will impact the generated image." - ] - }, - "dynamicPrompts": { - "heading": "Dynamic Prompts", - "paragraphs": [ - "Dynamic Prompts parses a single prompt into many.", - "The basic syntax is \"a {red|green|blue} ball\". This will produce three prompts: \"a red ball\", \"a green ball\" and \"a blue ball\".", - "You can use the syntax as many times as you like in a single prompt, but be sure to keep the number of prompts generated in check with the Max Prompts setting." - ] - }, - "dynamicPromptsMaxPrompts": { - "heading": "Max Prompts", - "paragraphs": [ - "Limits the number of prompts that can be generated by Dynamic Prompts." - ] - }, - "dynamicPromptsSeedBehaviour": { - "heading": "Seed Behaviour", - "paragraphs": [ - "Controls how the seed is used when generating prompts.", - "Per Iteration will use a unique seed for each iteration. Use this to explore prompt variations on a single seed.", - "For example, if you have 5 prompts, each image will use the same seed.", - "Per Image will use a unique seed for each image. This provides more variation." - ] - }, - "infillMethod": { - "heading": "Infill Method", - "paragraphs": [ - "Method to infill the selected area." - ] - }, - "lora": { - "heading": "LoRA Weight", - "paragraphs": [ - "Higher LoRA weight will lead to larger impacts on the final image." - ] - }, - "noiseUseCPU": { - "heading": "Use CPU Noise", - "paragraphs": [ - "Controls whether noise is generated on the CPU or GPU.", - "With CPU Noise enabled, a particular seed will produce the same image on any machine.", - "There is no performance impact to enabling CPU Noise." - ] - }, - "paramCFGScale": { - "heading": "CFG Scale", - "paragraphs": [ - "Controls how much your prompt influences the generation process." - ] - }, - "paramDenoisingStrength": { - "heading": "Denoising Strength", - "paragraphs": [ - "How much noise is added to the input image.", - "0 will result in an identical image, while 1 will result in a completely new image." - ] - }, - "paramIterations": { - "heading": "Iterations", - "paragraphs": [ - "The number of images to generate.", - "If Dynamic Prompts is enabled, each of the prompts will be generated this many times." - ] - }, - "paramModel": { - "heading": "Model", - "paragraphs": [ - "Model used for the denoising steps.", - "Different models are typically trained to specialize in producing particular aesthetic results and content." - ] - }, - "paramRatio": { - "heading": "Aspect Ratio", - "paragraphs": [ - "The aspect ratio of the dimensions of the image generated.", - "An image size (in number of pixels) equivalent to 512x512 is recommended for SD1.5 models and a size equivalent to 1024x1024 is recommended for SDXL models." - ] - }, - "paramSeed": { - "heading": "Seed", - "paragraphs": [ - "Controls the starting noise used for generation.", - "Disable “Random Seed” to produce identical results with the same generation settings." - ] - }, - "paramSteps": { - "heading": "Steps", - "paragraphs": [ - "Number of steps that will be performed in each generation.", - "Higher step counts will typically create better images but will require more generation time." - ] - }, - "paramVAE": { - "heading": "VAE", - "paragraphs": [ - "Model used for translating AI output into the final image." - ] - }, - "paramVAEPrecision": { - "heading": "VAE Precision", - "paragraphs": [ - "The precision used during VAE encoding and decoding. FP16/half precision is more efficient, at the expense of minor image variations." - ] - }, - "scaleBeforeProcessing": { - "heading": "Scale Before Processing", - "paragraphs": [ - "Scales the selected area to the size best suited for the model before the image generation process." - ] - } - }, - "ui": { - "hideProgressImages": "Hide Progress Images", - "lockRatio": "Lock Ratio", - "showProgressImages": "Show Progress Images", - "swapSizes": "Swap Sizes" - }, - "unifiedCanvas": { - "accept": "Accept", - "activeLayer": "Active Layer", - "antialiasing": "Antialiasing", - "autoSaveToGallery": "Auto Save to Gallery", - "base": "Base", - "betaClear": "Clear", - "betaDarkenOutside": "Darken Outside", - "betaLimitToBox": "Limit To Box", - "betaPreserveMasked": "Preserve Masked", - "boundingBox": "Bounding Box", - "boundingBoxPosition": "Bounding Box Position", - "brush": "Brush", - "brushOptions": "Brush Options", - "brushSize": "Size", - "canvasDimensions": "Canvas Dimensions", - "canvasPosition": "Canvas Position", - "canvasScale": "Canvas Scale", - "canvasSettings": "Canvas Settings", - "clearCanvas": "Clear Canvas", - "clearCanvasHistory": "Clear Canvas History", - "clearCanvasHistoryConfirm": "Are you sure you want to clear the canvas history?", - "clearCanvasHistoryMessage": "Clearing the canvas history leaves your current canvas intact, but irreversibly clears the undo and redo history.", - "clearHistory": "Clear History", - "clearMask": "Clear Mask", - "colorPicker": "Color Picker", - "copyToClipboard": "Copy to Clipboard", - "cursorPosition": "Cursor Position", - "darkenOutsideSelection": "Darken Outside Selection", - "discardAll": "Discard All", - "downloadAsImage": "Download As Image", - "emptyFolder": "Empty Folder", - "emptyTempImageFolder": "Empty Temp Image Folder", - "emptyTempImagesFolderConfirm": "Are you sure you want to empty the temp folder?", - "emptyTempImagesFolderMessage": "Emptying the temp image folder also fully resets the Unified Canvas. This includes all undo/redo history, images in the staging area, and the canvas base layer.", - "enableMask": "Enable Mask", - "eraseBoundingBox": "Erase Bounding Box", - "eraser": "Eraser", - "fillBoundingBox": "Fill Bounding Box", - "layer": "Layer", - "limitStrokesToBox": "Limit Strokes to Box", - "mask": "Mask", - "maskingOptions": "Masking Options", - "mergeVisible": "Merge Visible", - "move": "Move", - "next": "Next", - "preserveMaskedArea": "Preserve Masked Area", - "previous": "Previous", - "redo": "Redo", - "resetView": "Reset View", - "saveBoxRegionOnly": "Save Box Region Only", - "saveToGallery": "Save To Gallery", - "scaledBoundingBox": "Scaled Bounding Box", - "showCanvasDebugInfo": "Show Additional Canvas Info", - "showGrid": "Show Grid", - "showHide": "Show/Hide", - "showResultsOn": "Show Results (On)", - "showResultsOff": "Show Results (Off)", - "showIntermediates": "Show Intermediates", - "snapToGrid": "Snap to Grid", - "undo": "Undo" - } -} diff --git a/invokeai/frontend/web/dist/locales/es.json b/invokeai/frontend/web/dist/locales/es.json deleted file mode 100644 index 8ff4c53165..0000000000 --- a/invokeai/frontend/web/dist/locales/es.json +++ /dev/null @@ -1,737 +0,0 @@ -{ - "common": { - "hotkeysLabel": "Atajos de teclado", - "languagePickerLabel": "Selector de idioma", - "reportBugLabel": "Reportar errores", - "settingsLabel": "Ajustes", - "img2img": "Imagen a Imagen", - "unifiedCanvas": "Lienzo Unificado", - "nodes": "Editor del flujo de trabajo", - "langSpanish": "Español", - "nodesDesc": "Un sistema de generación de imágenes basado en nodos, actualmente se encuentra en desarrollo. Mantente pendiente a nuestras actualizaciones acerca de esta fabulosa funcionalidad.", - "postProcessing": "Post-procesamiento", - "postProcessDesc1": "Invoke AI ofrece una gran variedad de funciones de post-procesamiento, El aumento de tamaño y Restauración de Rostros ya se encuentran disponibles en la interfaz web, puedes acceder desde el menú de Opciones Avanzadas en las pestañas de Texto a Imagen y de Imagen a Imagen. También puedes acceder a estas funciones directamente mediante el botón de acciones en el menú superior de la imagen actual o en el visualizador.", - "postProcessDesc2": "Una interfaz de usuario dedicada se lanzará pronto para facilitar flujos de trabajo de postprocesamiento más avanzado.", - "postProcessDesc3": "La Interfaz de Línea de Comandos de Invoke AI ofrece muchas otras características, incluyendo -Embiggen-.", - "training": "Entrenamiento", - "trainingDesc1": "Un flujo de trabajo dedicado para el entrenamiento de sus propios -embeddings- y puntos de control utilizando Inversión Textual y Dreambooth desde la interfaz web.", - "trainingDesc2": "InvokeAI ya admite el entrenamiento de incrustaciones personalizadas mediante la inversión textual mediante el script principal.", - "upload": "Subir imagen", - "close": "Cerrar", - "load": "Cargar", - "statusConnected": "Conectado", - "statusDisconnected": "Desconectado", - "statusError": "Error", - "statusPreparing": "Preparando", - "statusProcessingCanceled": "Procesamiento Cancelado", - "statusProcessingComplete": "Procesamiento Completo", - "statusGenerating": "Generando", - "statusGeneratingTextToImage": "Generando Texto a Imagen", - "statusGeneratingImageToImage": "Generando Imagen a Imagen", - "statusGeneratingInpainting": "Generando pintura interior", - "statusGeneratingOutpainting": "Generando pintura exterior", - "statusGenerationComplete": "Generación Completa", - "statusIterationComplete": "Iteración Completa", - "statusSavingImage": "Guardando Imagen", - "statusRestoringFaces": "Restaurando Rostros", - "statusRestoringFacesGFPGAN": "Restaurando Rostros (GFPGAN)", - "statusRestoringFacesCodeFormer": "Restaurando Rostros (CodeFormer)", - "statusUpscaling": "Aumentando Tamaño", - "statusUpscalingESRGAN": "Restaurando Rostros(ESRGAN)", - "statusLoadingModel": "Cargando Modelo", - "statusModelChanged": "Modelo cambiado", - "statusMergedModels": "Modelos combinados", - "githubLabel": "Github", - "discordLabel": "Discord", - "langEnglish": "Inglés", - "langDutch": "Holandés", - "langFrench": "Francés", - "langGerman": "Alemán", - "langItalian": "Italiano", - "langArabic": "Árabe", - "langJapanese": "Japones", - "langPolish": "Polaco", - "langBrPortuguese": "Portugués brasileño", - "langRussian": "Ruso", - "langSimplifiedChinese": "Chino simplificado", - "langUkranian": "Ucraniano", - "back": "Atrás", - "statusConvertingModel": "Convertir el modelo", - "statusModelConverted": "Modelo adaptado", - "statusMergingModels": "Fusionar modelos", - "langPortuguese": "Portugués", - "langKorean": "Coreano", - "langHebrew": "Hebreo", - "loading": "Cargando", - "loadingInvokeAI": "Cargando invocar a la IA", - "postprocessing": "Tratamiento posterior", - "txt2img": "De texto a imagen", - "accept": "Aceptar", - "cancel": "Cancelar", - "linear": "Lineal", - "random": "Aleatorio", - "generate": "Generar", - "openInNewTab": "Abrir en una nueva pestaña", - "dontAskMeAgain": "No me preguntes de nuevo", - "areYouSure": "¿Estas seguro?", - "imagePrompt": "Indicación de imagen", - "batch": "Administrador de lotes", - "darkMode": "Modo oscuro", - "lightMode": "Modo claro", - "modelManager": "Administrador de modelos", - "communityLabel": "Comunidad" - }, - "gallery": { - "generations": "Generaciones", - "showGenerations": "Mostrar Generaciones", - "uploads": "Subidas de archivos", - "showUploads": "Mostar Subidas", - "galleryImageSize": "Tamaño de la imagen", - "galleryImageResetSize": "Restablecer tamaño de la imagen", - "gallerySettings": "Ajustes de la galería", - "maintainAspectRatio": "Mantener relación de aspecto", - "autoSwitchNewImages": "Auto seleccionar Imágenes nuevas", - "singleColumnLayout": "Diseño de una columna", - "allImagesLoaded": "Todas las imágenes cargadas", - "loadMore": "Cargar más", - "noImagesInGallery": "No hay imágenes para mostrar", - "deleteImage": "Eliminar Imagen", - "deleteImageBin": "Las imágenes eliminadas se enviarán a la papelera de tu sistema operativo.", - "deleteImagePermanent": "Las imágenes eliminadas no se pueden restaurar.", - "images": "Imágenes", - "assets": "Activos", - "autoAssignBoardOnClick": "Asignación automática de tableros al hacer clic" - }, - "hotkeys": { - "keyboardShortcuts": "Atajos de teclado", - "appHotkeys": "Atajos de applicación", - "generalHotkeys": "Atajos generales", - "galleryHotkeys": "Atajos de galería", - "unifiedCanvasHotkeys": "Atajos de lienzo unificado", - "invoke": { - "title": "Invocar", - "desc": "Generar una imagen" - }, - "cancel": { - "title": "Cancelar", - "desc": "Cancelar el proceso de generación de imagen" - }, - "focusPrompt": { - "title": "Mover foco a Entrada de texto", - "desc": "Mover foco hacia el campo de texto de la Entrada" - }, - "toggleOptions": { - "title": "Alternar opciones", - "desc": "Mostar y ocultar el panel de opciones" - }, - "pinOptions": { - "title": "Fijar opciones", - "desc": "Fijar el panel de opciones" - }, - "toggleViewer": { - "title": "Alternar visor", - "desc": "Mostar y ocultar el visor de imágenes" - }, - "toggleGallery": { - "title": "Alternar galería", - "desc": "Mostar y ocultar la galería de imágenes" - }, - "maximizeWorkSpace": { - "title": "Maximizar espacio de trabajo", - "desc": "Cerrar otros páneles y maximizar el espacio de trabajo" - }, - "changeTabs": { - "title": "Cambiar", - "desc": "Cambiar entre áreas de trabajo" - }, - "consoleToggle": { - "title": "Alternar consola", - "desc": "Mostar y ocultar la consola" - }, - "setPrompt": { - "title": "Establecer Entrada", - "desc": "Usar el texto de entrada de la imagen actual" - }, - "setSeed": { - "title": "Establecer semilla", - "desc": "Usar la semilla de la imagen actual" - }, - "setParameters": { - "title": "Establecer parámetros", - "desc": "Usar todos los parámetros de la imagen actual" - }, - "restoreFaces": { - "title": "Restaurar rostros", - "desc": "Restaurar rostros en la imagen actual" - }, - "upscale": { - "title": "Aumentar resolución", - "desc": "Aumentar la resolución de la imagen actual" - }, - "showInfo": { - "title": "Mostrar información", - "desc": "Mostar metadatos de la imagen actual" - }, - "sendToImageToImage": { - "title": "Enviar hacia Imagen a Imagen", - "desc": "Enviar imagen actual hacia Imagen a Imagen" - }, - "deleteImage": { - "title": "Eliminar imagen", - "desc": "Eliminar imagen actual" - }, - "closePanels": { - "title": "Cerrar páneles", - "desc": "Cerrar los páneles abiertos" - }, - "previousImage": { - "title": "Imagen anterior", - "desc": "Muetra la imagen anterior en la galería" - }, - "nextImage": { - "title": "Imagen siguiente", - "desc": "Muetra la imagen siguiente en la galería" - }, - "toggleGalleryPin": { - "title": "Alternar fijado de galería", - "desc": "Fijar o desfijar la galería en la interfaz" - }, - "increaseGalleryThumbSize": { - "title": "Aumentar imagen en galería", - "desc": "Aumenta el tamaño de las miniaturas de la galería" - }, - "decreaseGalleryThumbSize": { - "title": "Reducir imagen en galería", - "desc": "Reduce el tamaño de las miniaturas de la galería" - }, - "selectBrush": { - "title": "Seleccionar pincel", - "desc": "Selecciona el pincel en el lienzo" - }, - "selectEraser": { - "title": "Seleccionar borrador", - "desc": "Selecciona el borrador en el lienzo" - }, - "decreaseBrushSize": { - "title": "Disminuir tamaño de herramienta", - "desc": "Disminuye el tamaño del pincel/borrador en el lienzo" - }, - "increaseBrushSize": { - "title": "Aumentar tamaño del pincel", - "desc": "Aumenta el tamaño del pincel en el lienzo" - }, - "decreaseBrushOpacity": { - "title": "Disminuir opacidad del pincel", - "desc": "Disminuye la opacidad del pincel en el lienzo" - }, - "increaseBrushOpacity": { - "title": "Aumentar opacidad del pincel", - "desc": "Aumenta la opacidad del pincel en el lienzo" - }, - "moveTool": { - "title": "Herramienta de movimiento", - "desc": "Permite navegar por el lienzo" - }, - "fillBoundingBox": { - "title": "Rellenar Caja contenedora", - "desc": "Rellena la caja contenedora con el color seleccionado" - }, - "eraseBoundingBox": { - "title": "Borrar Caja contenedora", - "desc": "Borra el contenido dentro de la caja contenedora" - }, - "colorPicker": { - "title": "Selector de color", - "desc": "Selecciona un color del lienzo" - }, - "toggleSnap": { - "title": "Alternar ajuste de cuadrícula", - "desc": "Activa o desactiva el ajuste automático a la cuadrícula" - }, - "quickToggleMove": { - "title": "Alternar movimiento rápido", - "desc": "Activa momentáneamente la herramienta de movimiento" - }, - "toggleLayer": { - "title": "Alternar capa", - "desc": "Alterna entre las capas de máscara y base" - }, - "clearMask": { - "title": "Limpiar máscara", - "desc": "Limpia toda la máscara actual" - }, - "hideMask": { - "title": "Ocultar máscara", - "desc": "Oculta o muetre la máscara actual" - }, - "showHideBoundingBox": { - "title": "Alternar caja contenedora", - "desc": "Muestra u oculta la caja contenedora" - }, - "mergeVisible": { - "title": "Consolida capas visibles", - "desc": "Consolida todas las capas visibles en una sola" - }, - "saveToGallery": { - "title": "Guardar en galería", - "desc": "Guardar la imagen actual del lienzo en la galería" - }, - "copyToClipboard": { - "title": "Copiar al portapapeles", - "desc": "Copiar el lienzo actual al portapapeles" - }, - "downloadImage": { - "title": "Descargar imagen", - "desc": "Descargar la imagen actual del lienzo" - }, - "undoStroke": { - "title": "Deshar trazo", - "desc": "Desahacer el último trazo del pincel" - }, - "redoStroke": { - "title": "Rehacer trazo", - "desc": "Rehacer el último trazo del pincel" - }, - "resetView": { - "title": "Restablecer vista", - "desc": "Restablecer la vista del lienzo" - }, - "previousStagingImage": { - "title": "Imagen anterior", - "desc": "Imagen anterior en el área de preparación" - }, - "nextStagingImage": { - "title": "Imagen siguiente", - "desc": "Siguiente imagen en el área de preparación" - }, - "acceptStagingImage": { - "title": "Aceptar imagen", - "desc": "Aceptar la imagen actual en el área de preparación" - }, - "addNodes": { - "title": "Añadir Nodos", - "desc": "Abre el menú para añadir nodos" - }, - "nodesHotkeys": "Teclas de acceso rápido a los nodos" - }, - "modelManager": { - "modelManager": "Gestor de Modelos", - "model": "Modelo", - "modelAdded": "Modelo añadido", - "modelUpdated": "Modelo actualizado", - "modelEntryDeleted": "Endrada de Modelo eliminada", - "cannotUseSpaces": "No se pueden usar Spaces", - "addNew": "Añadir nuevo", - "addNewModel": "Añadir nuevo modelo", - "addManually": "Añadir manualmente", - "manual": "Manual", - "name": "Nombre", - "nameValidationMsg": "Introduce un nombre para tu modelo", - "description": "Descripción", - "descriptionValidationMsg": "Introduce una descripción para tu modelo", - "config": "Configurar", - "configValidationMsg": "Ruta del archivo de configuración del modelo.", - "modelLocation": "Ubicación del Modelo", - "modelLocationValidationMsg": "Ruta del archivo de modelo.", - "vaeLocation": "Ubicación VAE", - "vaeLocationValidationMsg": "Ruta del archivo VAE.", - "width": "Ancho", - "widthValidationMsg": "Ancho predeterminado de tu modelo.", - "height": "Alto", - "heightValidationMsg": "Alto predeterminado de tu modelo.", - "addModel": "Añadir Modelo", - "updateModel": "Actualizar Modelo", - "availableModels": "Modelos disponibles", - "search": "Búsqueda", - "load": "Cargar", - "active": "activo", - "notLoaded": "no cargado", - "cached": "en caché", - "checkpointFolder": "Directorio de Checkpoint", - "clearCheckpointFolder": "Limpiar directorio de checkpoint", - "findModels": "Buscar modelos", - "scanAgain": "Escanear de nuevo", - "modelsFound": "Modelos encontrados", - "selectFolder": "Selecciona un directorio", - "selected": "Seleccionado", - "selectAll": "Seleccionar todo", - "deselectAll": "Deseleccionar todo", - "showExisting": "Mostrar existentes", - "addSelected": "Añadir seleccionados", - "modelExists": "Modelo existente", - "selectAndAdd": "Selecciona de la lista un modelo para añadir", - "noModelsFound": "No se encontró ningún modelo", - "delete": "Eliminar", - "deleteModel": "Eliminar Modelo", - "deleteConfig": "Eliminar Configuración", - "deleteMsg1": "¿Estás seguro de que deseas eliminar este modelo de InvokeAI?", - "deleteMsg2": "Esto eliminará el modelo del disco si está en la carpeta raíz de InvokeAI. Si está utilizando una ubicación personalizada, el modelo NO se eliminará del disco.", - "safetensorModels": "SafeTensors", - "addDiffuserModel": "Añadir difusores", - "inpainting": "v1 Repintado", - "repoIDValidationMsg": "Repositorio en línea de tu modelo", - "checkpointModels": "Puntos de control", - "convertToDiffusersHelpText4": "Este proceso se realiza una sola vez. Puede tardar entre 30 y 60 segundos dependiendo de las especificaciones de tu ordenador.", - "diffusersModels": "Difusores", - "addCheckpointModel": "Agregar modelo de punto de control/Modelo Safetensor", - "vaeRepoID": "Identificador del repositorio de VAE", - "vaeRepoIDValidationMsg": "Repositorio en línea de tú VAE", - "formMessageDiffusersModelLocation": "Difusores Modelo Ubicación", - "formMessageDiffusersModelLocationDesc": "Por favor, introduzca al menos uno.", - "formMessageDiffusersVAELocation": "Ubicación VAE", - "formMessageDiffusersVAELocationDesc": "Si no se proporciona, InvokeAI buscará el archivo VAE dentro de la ubicación del modelo indicada anteriormente.", - "convert": "Convertir", - "convertToDiffusers": "Convertir en difusores", - "convertToDiffusersHelpText1": "Este modelo se convertirá al formato 🧨 Difusores.", - "convertToDiffusersHelpText2": "Este proceso sustituirá su entrada del Gestor de Modelos por la versión de Difusores del mismo modelo.", - "convertToDiffusersHelpText3": "Tu archivo del punto de control en el disco se eliminará si está en la carpeta raíz de InvokeAI. Si está en una ubicación personalizada, NO se eliminará.", - "convertToDiffusersHelpText5": "Por favor, asegúrate de tener suficiente espacio en el disco. Los modelos generalmente varían entre 2 GB y 7 GB de tamaño.", - "convertToDiffusersHelpText6": "¿Desea transformar este modelo?", - "convertToDiffusersSaveLocation": "Guardar ubicación", - "v1": "v1", - "statusConverting": "Adaptar", - "modelConverted": "Modelo adaptado", - "sameFolder": "La misma carpeta", - "invokeRoot": "Carpeta InvokeAI", - "custom": "Personalizado", - "customSaveLocation": "Ubicación personalizada para guardar", - "merge": "Fusión", - "modelsMerged": "Modelos fusionados", - "mergeModels": "Combinar modelos", - "modelOne": "Modelo 1", - "modelTwo": "Modelo 2", - "modelThree": "Modelo 3", - "mergedModelName": "Nombre del modelo combinado", - "alpha": "Alfa", - "interpolationType": "Tipo de interpolación", - "mergedModelSaveLocation": "Guardar ubicación", - "mergedModelCustomSaveLocation": "Ruta personalizada", - "invokeAIFolder": "Invocar carpeta de la inteligencia artificial", - "modelMergeHeaderHelp2": "Sólo se pueden fusionar difusores. Si desea fusionar un modelo de punto de control, conviértalo primero en difusores.", - "modelMergeAlphaHelp": "Alfa controla la fuerza de mezcla de los modelos. Los valores alfa más bajos reducen la influencia del segundo modelo.", - "modelMergeInterpAddDifferenceHelp": "En este modo, el Modelo 3 se sustrae primero del Modelo 2. La versión resultante se mezcla con el Modelo 1 con la tasa alfa establecida anteriormente. La versión resultante se mezcla con el Modelo 1 con la tasa alfa establecida anteriormente.", - "ignoreMismatch": "Ignorar discrepancias entre modelos seleccionados", - "modelMergeHeaderHelp1": "Puede unir hasta tres modelos diferentes para crear una combinación que se adapte a sus necesidades.", - "inverseSigmoid": "Sigmoideo inverso", - "weightedSum": "Modelo de suma ponderada", - "sigmoid": "Función sigmoide", - "allModels": "Todos los modelos", - "repo_id": "Identificador del repositorio", - "pathToCustomConfig": "Ruta a la configuración personalizada", - "customConfig": "Configuración personalizada", - "v2_base": "v2 (512px)", - "none": "ninguno", - "pickModelType": "Elige el tipo de modelo", - "v2_768": "v2 (768px)", - "addDifference": "Añadir una diferencia", - "scanForModels": "Buscar modelos", - "vae": "VAE", - "variant": "Variante", - "baseModel": "Modelo básico", - "modelConversionFailed": "Conversión al modelo fallida", - "selectModel": "Seleccionar un modelo", - "modelUpdateFailed": "Error al actualizar el modelo", - "modelsMergeFailed": "Fusión del modelo fallida", - "convertingModelBegin": "Convirtiendo el modelo. Por favor, espere.", - "modelDeleted": "Modelo eliminado", - "modelDeleteFailed": "Error al borrar el modelo", - "noCustomLocationProvided": "‐No se proporcionó una ubicación personalizada", - "importModels": "Importar los modelos", - "settings": "Ajustes", - "syncModels": "Sincronizar las plantillas", - "syncModelsDesc": "Si tus plantillas no están sincronizados con el backend, puedes actualizarlas usando esta opción. Esto suele ser útil en los casos en los que actualizas manualmente tu archivo models.yaml o añades plantillas a la carpeta raíz de InvokeAI después de que la aplicación haya arrancado.", - "modelsSynced": "Plantillas sincronizadas", - "modelSyncFailed": "La sincronización de la plantilla falló", - "loraModels": "LoRA", - "onnxModels": "Onnx", - "oliveModels": "Olives" - }, - "parameters": { - "images": "Imágenes", - "steps": "Pasos", - "cfgScale": "Escala CFG", - "width": "Ancho", - "height": "Alto", - "seed": "Semilla", - "randomizeSeed": "Semilla aleatoria", - "shuffle": "Semilla aleatoria", - "noiseThreshold": "Umbral de Ruido", - "perlinNoise": "Ruido Perlin", - "variations": "Variaciones", - "variationAmount": "Cantidad de Variación", - "seedWeights": "Peso de las semillas", - "faceRestoration": "Restauración de Rostros", - "restoreFaces": "Restaurar rostros", - "type": "Tipo", - "strength": "Fuerza", - "upscaling": "Aumento de resolución", - "upscale": "Aumentar resolución", - "upscaleImage": "Aumentar la resolución de la imagen", - "scale": "Escala", - "otherOptions": "Otras opciones", - "seamlessTiling": "Mosaicos sin parches", - "hiresOptim": "Optimización de Alta Resolución", - "imageFit": "Ajuste tamaño de imagen inicial al tamaño objetivo", - "codeformerFidelity": "Fidelidad", - "scaleBeforeProcessing": "Redimensionar antes de procesar", - "scaledWidth": "Ancho escalado", - "scaledHeight": "Alto escalado", - "infillMethod": "Método de relleno", - "tileSize": "Tamaño del mosaico", - "boundingBoxHeader": "Caja contenedora", - "seamCorrectionHeader": "Corrección de parches", - "infillScalingHeader": "Remplazo y escalado", - "img2imgStrength": "Peso de Imagen a Imagen", - "toggleLoopback": "Alternar Retroalimentación", - "sendTo": "Enviar a", - "sendToImg2Img": "Enviar a Imagen a Imagen", - "sendToUnifiedCanvas": "Enviar a Lienzo Unificado", - "copyImageToLink": "Copiar imagen a enlace", - "downloadImage": "Descargar imagen", - "openInViewer": "Abrir en Visor", - "closeViewer": "Cerrar Visor", - "usePrompt": "Usar Entrada", - "useSeed": "Usar Semilla", - "useAll": "Usar Todo", - "useInitImg": "Usar Imagen Inicial", - "info": "Información", - "initialImage": "Imagen Inicial", - "showOptionsPanel": "Mostrar panel de opciones", - "symmetry": "Simetría", - "vSymmetryStep": "Paso de simetría V", - "hSymmetryStep": "Paso de simetría H", - "cancel": { - "immediate": "Cancelar inmediatamente", - "schedule": "Cancelar tras la iteración actual", - "isScheduled": "Cancelando", - "setType": "Tipo de cancelación" - }, - "copyImage": "Copiar la imagen", - "general": "General", - "imageToImage": "Imagen a imagen", - "denoisingStrength": "Intensidad de la eliminación del ruido", - "hiresStrength": "Alta resistencia", - "showPreview": "Mostrar la vista previa", - "hidePreview": "Ocultar la vista previa", - "noiseSettings": "Ruido", - "seamlessXAxis": "Eje x", - "seamlessYAxis": "Eje y", - "scheduler": "Programador", - "boundingBoxWidth": "Anchura del recuadro", - "boundingBoxHeight": "Altura del recuadro", - "positivePromptPlaceholder": "Prompt Positivo", - "negativePromptPlaceholder": "Prompt Negativo", - "controlNetControlMode": "Modo de control", - "clipSkip": "Omitir el CLIP", - "aspectRatio": "Relación", - "maskAdjustmentsHeader": "Ajustes de la máscara", - "maskBlur": "Difuminar", - "maskBlurMethod": "Método del desenfoque", - "seamHighThreshold": "Alto", - "seamLowThreshold": "Bajo", - "coherencePassHeader": "Parámetros de la coherencia", - "compositingSettingsHeader": "Ajustes de la composición", - "coherenceSteps": "Pasos", - "coherenceStrength": "Fuerza", - "patchmatchDownScaleSize": "Reducir a escala", - "coherenceMode": "Modo" - }, - "settings": { - "models": "Modelos", - "displayInProgress": "Mostrar las imágenes del progreso", - "saveSteps": "Guardar imágenes cada n pasos", - "confirmOnDelete": "Confirmar antes de eliminar", - "displayHelpIcons": "Mostrar iconos de ayuda", - "enableImageDebugging": "Habilitar depuración de imágenes", - "resetWebUI": "Restablecer interfaz web", - "resetWebUIDesc1": "Al restablecer la interfaz web, solo se restablece la caché local del navegador de sus imágenes y la configuración guardada. No se elimina ninguna imagen de su disco duro.", - "resetWebUIDesc2": "Si las imágenes no se muestran en la galería o algo más no funciona, intente restablecer antes de reportar un incidente en GitHub.", - "resetComplete": "Se ha restablecido la interfaz web.", - "useSlidersForAll": "Utilice controles deslizantes para todas las opciones", - "general": "General", - "consoleLogLevel": "Nivel del registro", - "shouldLogToConsole": "Registro de la consola", - "developer": "Desarrollador", - "antialiasProgressImages": "Imágenes del progreso de Antialias", - "showProgressInViewer": "Mostrar las imágenes del progreso en el visor", - "ui": "Interfaz del usuario", - "generation": "Generación", - "favoriteSchedulers": "Programadores favoritos", - "favoriteSchedulersPlaceholder": "No hay programadores favoritos", - "showAdvancedOptions": "Mostrar las opciones avanzadas", - "alternateCanvasLayout": "Diseño alternativo del lienzo", - "beta": "Beta", - "enableNodesEditor": "Activar el editor de nodos", - "experimental": "Experimental", - "autoChangeDimensions": "Actualiza W/H a los valores predeterminados del modelo cuando se modifica" - }, - "toast": { - "tempFoldersEmptied": "Directorio temporal vaciado", - "uploadFailed": "Error al subir archivo", - "uploadFailedUnableToLoadDesc": "No se pudo cargar la imágen", - "downloadImageStarted": "Descargando imágen", - "imageCopied": "Imágen copiada", - "imageLinkCopied": "Enlace de imágen copiado", - "imageNotLoaded": "No se cargó la imágen", - "imageNotLoadedDesc": "No se pudo encontrar la imagen", - "imageSavedToGallery": "Imágen guardada en la galería", - "canvasMerged": "Lienzo consolidado", - "sentToImageToImage": "Enviar hacia Imagen a Imagen", - "sentToUnifiedCanvas": "Enviar hacia Lienzo Consolidado", - "parametersSet": "Parámetros establecidos", - "parametersNotSet": "Parámetros no establecidos", - "parametersNotSetDesc": "No se encontraron metadatos para esta imágen.", - "parametersFailed": "Error cargando parámetros", - "parametersFailedDesc": "No fue posible cargar la imagen inicial.", - "seedSet": "Semilla establecida", - "seedNotSet": "Semilla no establecida", - "seedNotSetDesc": "No se encontró una semilla para esta imágen.", - "promptSet": "Entrada establecida", - "promptNotSet": "Entrada no establecida", - "promptNotSetDesc": "No se encontró una entrada para esta imágen.", - "upscalingFailed": "Error al aumentar tamaño de imagn", - "faceRestoreFailed": "Restauración de rostro fallida", - "metadataLoadFailed": "Error al cargar metadatos", - "initialImageSet": "Imágen inicial establecida", - "initialImageNotSet": "Imagen inicial no establecida", - "initialImageNotSetDesc": "Error al establecer la imágen inicial", - "serverError": "Error en el servidor", - "disconnected": "Desconectado del servidor", - "canceled": "Procesando la cancelación", - "connected": "Conectado al servidor", - "problemCopyingImageLink": "No se puede copiar el enlace de la imagen", - "uploadFailedInvalidUploadDesc": "Debe ser una sola imagen PNG o JPEG", - "parameterSet": "Conjunto de parámetros", - "parameterNotSet": "Parámetro no configurado", - "nodesSaved": "Nodos guardados", - "nodesLoadedFailed": "Error al cargar los nodos", - "nodesLoaded": "Nodos cargados", - "nodesCleared": "Nodos borrados", - "problemCopyingImage": "No se puede copiar la imagen", - "nodesNotValidJSON": "JSON no válido", - "nodesCorruptedGraph": "No se puede cargar. El gráfico parece estar dañado.", - "nodesUnrecognizedTypes": "No se puede cargar. El gráfico tiene tipos no reconocidos", - "nodesNotValidGraph": "Gráfico del nodo InvokeAI no válido", - "nodesBrokenConnections": "No se puede cargar. Algunas conexiones están rotas." - }, - "tooltip": { - "feature": { - "prompt": "Este campo tomará todo el texto de entrada, incluidos tanto los términos de contenido como los estilísticos. Si bien se pueden incluir pesos en la solicitud, los comandos/parámetros estándar de línea de comandos no funcionarán.", - "gallery": "Conforme se generan nuevas invocaciones, los archivos del directorio de salida se mostrarán aquí. Las generaciones tienen opciones adicionales para configurar nuevas generaciones.", - "other": "Estas opciones habilitarán modos de procesamiento alternativos para Invoke. 'Seamless mosaico' creará patrones repetitivos en la salida. 'Alta resolución' es la generación en dos pasos con img2img: use esta configuración cuando desee una imagen más grande y más coherente sin artefactos. tomar más tiempo de lo habitual txt2img.", - "seed": "Los valores de semilla proporcionan un conjunto inicial de ruido que guían el proceso de eliminación de ruido y se pueden aleatorizar o rellenar con una semilla de una invocación anterior. La función Umbral se puede usar para mitigar resultados indeseables a valores CFG más altos (intente entre 0-10), y Perlin se puede usar para agregar ruido Perlin al proceso de eliminación de ruido. Ambos sirven para agregar variación a sus salidas.", - "variations": "Pruebe una variación con una cantidad entre 0 y 1 para cambiar la imagen de salida para la semilla establecida. Se encuentran variaciones interesantes en la semilla entre 0.1 y 0.3.", - "upscale": "Usando ESRGAN, puede aumentar la resolución de salida sin requerir un ancho/alto más alto en la generación inicial.", - "faceCorrection": "Usando GFPGAN o Codeformer, la corrección de rostros intentará identificar rostros en las salidas y corregir cualquier defecto/anormalidad. Los valores de fuerza más altos aplicarán una presión correctiva más fuerte en las salidas, lo que resultará en rostros más atractivos. Con Codeformer, una mayor fidelidad intentará preservar la imagen original, a expensas de la fuerza de corrección de rostros.", - "imageToImage": "Imagen a Imagen permite cargar una imagen inicial, que InvokeAI usará para guiar el proceso de generación, junto con una solicitud. Un valor más bajo para esta configuración se parecerá más a la imagen original. Se aceptan valores entre 0-1, y se recomienda un rango de .25-.75", - "boundingBox": "La caja delimitadora es análoga a las configuraciones de Ancho y Alto para Texto a Imagen o Imagen a Imagen. Solo se procesará el área en la caja.", - "seamCorrection": "Controla el manejo de parches visibles que pueden ocurrir cuando se pega una imagen generada de nuevo en el lienzo.", - "infillAndScaling": "Administra los métodos de relleno (utilizados en áreas enmascaradas o borradas del lienzo) y la escala (útil para tamaños de caja delimitadora pequeños)." - } - }, - "unifiedCanvas": { - "layer": "Capa", - "base": "Base", - "mask": "Máscara", - "maskingOptions": "Opciones de máscara", - "enableMask": "Habilitar Máscara", - "preserveMaskedArea": "Preservar área enmascarada", - "clearMask": "Limpiar máscara", - "brush": "Pincel", - "eraser": "Borrador", - "fillBoundingBox": "Rellenar Caja Contenedora", - "eraseBoundingBox": "Eliminar Caja Contenedora", - "colorPicker": "Selector de color", - "brushOptions": "Opciones de pincel", - "brushSize": "Tamaño", - "move": "Mover", - "resetView": "Restablecer vista", - "mergeVisible": "Consolidar vista", - "saveToGallery": "Guardar en galería", - "copyToClipboard": "Copiar al portapapeles", - "downloadAsImage": "Descargar como imagen", - "undo": "Deshacer", - "redo": "Rehacer", - "clearCanvas": "Limpiar lienzo", - "canvasSettings": "Ajustes de lienzo", - "showIntermediates": "Mostrar intermedios", - "showGrid": "Mostrar cuadrícula", - "snapToGrid": "Ajustar a cuadrícula", - "darkenOutsideSelection": "Oscurecer fuera de la selección", - "autoSaveToGallery": "Guardar automáticamente en galería", - "saveBoxRegionOnly": "Guardar solo región dentro de la caja", - "limitStrokesToBox": "Limitar trazos a la caja", - "showCanvasDebugInfo": "Mostrar la información adicional del lienzo", - "clearCanvasHistory": "Limpiar historial de lienzo", - "clearHistory": "Limpiar historial", - "clearCanvasHistoryMessage": "Limpiar el historial de lienzo también restablece completamente el lienzo unificado. Esto incluye todo el historial de deshacer/rehacer, las imágenes en el área de preparación y la capa base del lienzo.", - "clearCanvasHistoryConfirm": "¿Está seguro de que desea limpiar el historial del lienzo?", - "emptyTempImageFolder": "Vaciar directorio de imágenes temporales", - "emptyFolder": "Vaciar directorio", - "emptyTempImagesFolderMessage": "Vaciar el directorio de imágenes temporales también restablece completamente el lienzo unificado. Esto incluye todo el historial de deshacer/rehacer, las imágenes en el área de preparación y la capa base del lienzo.", - "emptyTempImagesFolderConfirm": "¿Está seguro de que desea vaciar el directorio temporal?", - "activeLayer": "Capa activa", - "canvasScale": "Escala de lienzo", - "boundingBox": "Caja contenedora", - "scaledBoundingBox": "Caja contenedora escalada", - "boundingBoxPosition": "Posición de caja contenedora", - "canvasDimensions": "Dimensiones de lienzo", - "canvasPosition": "Posición de lienzo", - "cursorPosition": "Posición del cursor", - "previous": "Anterior", - "next": "Siguiente", - "accept": "Aceptar", - "showHide": "Mostrar/Ocultar", - "discardAll": "Descartar todo", - "betaClear": "Limpiar", - "betaDarkenOutside": "Oscurecer fuera", - "betaLimitToBox": "Limitar a caja", - "betaPreserveMasked": "Preservar área enmascarada", - "antialiasing": "Suavizado" - }, - "accessibility": { - "invokeProgressBar": "Activar la barra de progreso", - "modelSelect": "Seleccionar modelo", - "reset": "Reiniciar", - "uploadImage": "Cargar imagen", - "previousImage": "Imagen anterior", - "nextImage": "Siguiente imagen", - "useThisParameter": "Utiliza este parámetro", - "copyMetadataJson": "Copiar los metadatos JSON", - "exitViewer": "Salir del visor", - "zoomIn": "Acercar", - "zoomOut": "Alejar", - "rotateCounterClockwise": "Girar en sentido antihorario", - "rotateClockwise": "Girar en sentido horario", - "flipHorizontally": "Voltear horizontalmente", - "flipVertically": "Voltear verticalmente", - "modifyConfig": "Modificar la configuración", - "toggleAutoscroll": "Activar el autodesplazamiento", - "toggleLogViewer": "Alternar el visor de registros", - "showOptionsPanel": "Mostrar el panel lateral", - "menu": "Menú" - }, - "ui": { - "hideProgressImages": "Ocultar el progreso de la imagen", - "showProgressImages": "Mostrar el progreso de la imagen", - "swapSizes": "Cambiar los tamaños", - "lockRatio": "Proporción del bloqueo" - }, - "nodes": { - "showGraphNodes": "Mostrar la superposición de los gráficos", - "zoomInNodes": "Acercar", - "hideMinimapnodes": "Ocultar el minimapa", - "fitViewportNodes": "Ajustar la vista", - "zoomOutNodes": "Alejar", - "hideGraphNodes": "Ocultar la superposición de los gráficos", - "hideLegendNodes": "Ocultar la leyenda del tipo de campo", - "showLegendNodes": "Mostrar la leyenda del tipo de campo", - "showMinimapnodes": "Mostrar el minimapa", - "reloadNodeTemplates": "Recargar las plantillas de nodos", - "loadWorkflow": "Cargar el flujo de trabajo", - "resetWorkflow": "Reiniciar e flujo de trabajo", - "resetWorkflowDesc": "¿Está seguro de que deseas restablecer este flujo de trabajo?", - "resetWorkflowDesc2": "Al reiniciar el flujo de trabajo se borrarán todos los nodos, aristas y detalles del flujo de trabajo.", - "downloadWorkflow": "Descargar el flujo de trabajo en un archivo JSON" - } -} diff --git a/invokeai/frontend/web/dist/locales/fi.json b/invokeai/frontend/web/dist/locales/fi.json deleted file mode 100644 index cf7fc6701b..0000000000 --- a/invokeai/frontend/web/dist/locales/fi.json +++ /dev/null @@ -1,114 +0,0 @@ -{ - "accessibility": { - "reset": "Resetoi", - "useThisParameter": "Käytä tätä parametria", - "modelSelect": "Mallin Valinta", - "exitViewer": "Poistu katselimesta", - "uploadImage": "Lataa kuva", - "copyMetadataJson": "Kopioi metadata JSON:iin", - "invokeProgressBar": "Invoken edistymispalkki", - "nextImage": "Seuraava kuva", - "previousImage": "Edellinen kuva", - "zoomIn": "Lähennä", - "flipHorizontally": "Käännä vaakasuoraan", - "zoomOut": "Loitonna", - "rotateCounterClockwise": "Kierrä vastapäivään", - "rotateClockwise": "Kierrä myötäpäivään", - "flipVertically": "Käännä pystysuoraan", - "modifyConfig": "Muokkaa konfiguraatiota", - "toggleAutoscroll": "Kytke automaattinen vieritys", - "toggleLogViewer": "Kytke lokin katselutila", - "showOptionsPanel": "Näytä asetukset" - }, - "common": { - "postProcessDesc2": "Erillinen käyttöliittymä tullaan julkaisemaan helpottaaksemme työnkulkua jälkikäsittelyssä.", - "training": "Kouluta", - "statusLoadingModel": "Ladataan mallia", - "statusModelChanged": "Malli vaihdettu", - "statusConvertingModel": "Muunnetaan mallia", - "statusModelConverted": "Malli muunnettu", - "langFrench": "Ranska", - "langItalian": "Italia", - "languagePickerLabel": "Kielen valinta", - "hotkeysLabel": "Pikanäppäimet", - "reportBugLabel": "Raportoi Bugista", - "langPolish": "Puola", - "langDutch": "Hollanti", - "settingsLabel": "Asetukset", - "githubLabel": "Github", - "langGerman": "Saksa", - "langPortuguese": "Portugali", - "discordLabel": "Discord", - "langEnglish": "Englanti", - "langRussian": "Venäjä", - "langUkranian": "Ukraina", - "langSpanish": "Espanja", - "upload": "Lataa", - "statusMergedModels": "Mallit yhdistelty", - "img2img": "Kuva kuvaksi", - "nodes": "Solmut", - "nodesDesc": "Solmupohjainen järjestelmä kuvien generoimiseen on parhaillaan kehitteillä. Pysy kuulolla päivityksistä tähän uskomattomaan ominaisuuteen liittyen.", - "postProcessDesc1": "Invoke AI tarjoaa monenlaisia jälkikäsittelyominaisuukisa. Kuvan laadun skaalaus sekä kasvojen korjaus ovat jo saatavilla WebUI:ssä. Voit ottaa ne käyttöön lisäasetusten valikosta teksti kuvaksi sekä kuva kuvaksi -välilehdiltä. Voit myös suoraan prosessoida kuvia käyttämällä kuvan toimintapainikkeita nykyisen kuvan yläpuolella tai tarkastelussa.", - "postprocessing": "Jälkikäsitellään", - "postProcessing": "Jälkikäsitellään", - "cancel": "Peruuta", - "close": "Sulje", - "accept": "Hyväksy", - "statusConnected": "Yhdistetty", - "statusError": "Virhe", - "statusProcessingComplete": "Prosessointi valmis", - "load": "Lataa", - "back": "Takaisin", - "statusGeneratingTextToImage": "Generoidaan tekstiä kuvaksi", - "trainingDesc2": "InvokeAI tukee jo mukautettujen upotusten kouluttamista tekstin inversiolla käyttäen pääskriptiä.", - "statusDisconnected": "Yhteys katkaistu", - "statusPreparing": "Valmistellaan", - "statusIterationComplete": "Iteraatio valmis", - "statusMergingModels": "Yhdistellään malleja", - "statusProcessingCanceled": "Valmistelu peruutettu", - "statusSavingImage": "Tallennetaan kuvaa", - "statusGeneratingImageToImage": "Generoidaan kuvaa kuvaksi", - "statusRestoringFacesGFPGAN": "Korjataan kasvoja (GFPGAN)", - "statusRestoringFacesCodeFormer": "Korjataan kasvoja (CodeFormer)", - "statusGeneratingInpainting": "Generoidaan sisällemaalausta", - "statusGeneratingOutpainting": "Generoidaan ulosmaalausta", - "statusRestoringFaces": "Korjataan kasvoja", - "loadingInvokeAI": "Ladataan Invoke AI:ta", - "loading": "Ladataan", - "statusGenerating": "Generoidaan", - "txt2img": "Teksti kuvaksi", - "trainingDesc1": "Erillinen työnkulku omien upotusten ja tarkastuspisteiden kouluttamiseksi käyttäen tekstin inversiota ja dreamboothia selaimen käyttöliittymässä.", - "postProcessDesc3": "Invoke AI:n komentorivi tarjoaa paljon muita ominaisuuksia, kuten esimerkiksi Embiggenin.", - "unifiedCanvas": "Yhdistetty kanvas", - "statusGenerationComplete": "Generointi valmis" - }, - "gallery": { - "uploads": "Lataukset", - "showUploads": "Näytä lataukset", - "galleryImageResetSize": "Resetoi koko", - "maintainAspectRatio": "Säilytä kuvasuhde", - "galleryImageSize": "Kuvan koko", - "showGenerations": "Näytä generaatiot", - "singleColumnLayout": "Yhden sarakkeen asettelu", - "generations": "Generoinnit", - "gallerySettings": "Gallerian asetukset", - "autoSwitchNewImages": "Vaihda uusiin kuviin automaattisesti", - "allImagesLoaded": "Kaikki kuvat ladattu", - "noImagesInGallery": "Ei kuvia galleriassa", - "loadMore": "Lataa lisää" - }, - "hotkeys": { - "keyboardShortcuts": "näppäimistön pikavalinnat", - "appHotkeys": "Sovelluksen pikanäppäimet", - "generalHotkeys": "Yleiset pikanäppäimet", - "galleryHotkeys": "Gallerian pikanäppäimet", - "unifiedCanvasHotkeys": "Yhdistetyn kanvaan pikanäppäimet", - "cancel": { - "desc": "Peruuta kuvan luominen", - "title": "Peruuta" - }, - "invoke": { - "desc": "Luo kuva" - } - } -} diff --git a/invokeai/frontend/web/dist/locales/fr.json b/invokeai/frontend/web/dist/locales/fr.json deleted file mode 100644 index b7ab932fcc..0000000000 --- a/invokeai/frontend/web/dist/locales/fr.json +++ /dev/null @@ -1,531 +0,0 @@ -{ - "common": { - "hotkeysLabel": "Raccourcis clavier", - "languagePickerLabel": "Sélecteur de langue", - "reportBugLabel": "Signaler un bug", - "settingsLabel": "Paramètres", - "img2img": "Image en image", - "unifiedCanvas": "Canvas unifié", - "nodes": "Nœuds", - "langFrench": "Français", - "nodesDesc": "Un système basé sur les nœuds pour la génération d'images est actuellement en développement. Restez à l'écoute pour des mises à jour à ce sujet.", - "postProcessing": "Post-traitement", - "postProcessDesc1": "Invoke AI offre une grande variété de fonctionnalités de post-traitement. Le redimensionnement d'images et la restauration de visages sont déjà disponibles dans la WebUI. Vous pouvez y accéder à partir du menu 'Options avancées' des onglets 'Texte vers image' et 'Image vers image'. Vous pouvez également traiter les images directement en utilisant les boutons d'action d'image au-dessus de l'affichage d'image actuel ou dans le visualiseur.", - "postProcessDesc2": "Une interface dédiée sera bientôt disponible pour faciliter les workflows de post-traitement plus avancés.", - "postProcessDesc3": "L'interface en ligne de commande d'Invoke AI offre diverses autres fonctionnalités, notamment Embiggen.", - "training": "Formation", - "trainingDesc1": "Un workflow dédié pour former vos propres embeddings et checkpoints en utilisant Textual Inversion et Dreambooth depuis l'interface web.", - "trainingDesc2": "InvokeAI prend déjà en charge la formation d'embeddings personnalisés en utilisant Textual Inversion en utilisant le script principal.", - "upload": "Télécharger", - "close": "Fermer", - "load": "Charger", - "back": "Retour", - "statusConnected": "En ligne", - "statusDisconnected": "Hors ligne", - "statusError": "Erreur", - "statusPreparing": "Préparation", - "statusProcessingCanceled": "Traitement annulé", - "statusProcessingComplete": "Traitement terminé", - "statusGenerating": "Génération", - "statusGeneratingTextToImage": "Génération Texte vers Image", - "statusGeneratingImageToImage": "Génération Image vers Image", - "statusGeneratingInpainting": "Génération de réparation", - "statusGeneratingOutpainting": "Génération de complétion", - "statusGenerationComplete": "Génération terminée", - "statusIterationComplete": "Itération terminée", - "statusSavingImage": "Sauvegarde de l'image", - "statusRestoringFaces": "Restauration des visages", - "statusRestoringFacesGFPGAN": "Restauration des visages (GFPGAN)", - "statusRestoringFacesCodeFormer": "Restauration des visages (CodeFormer)", - "statusUpscaling": "Mise à échelle", - "statusUpscalingESRGAN": "Mise à échelle (ESRGAN)", - "statusLoadingModel": "Chargement du modèle", - "statusModelChanged": "Modèle changé", - "discordLabel": "Discord", - "githubLabel": "Github", - "accept": "Accepter", - "statusMergingModels": "Mélange des modèles", - "loadingInvokeAI": "Chargement de Invoke AI", - "cancel": "Annuler", - "langEnglish": "Anglais", - "statusConvertingModel": "Conversion du modèle", - "statusModelConverted": "Modèle converti", - "loading": "Chargement", - "statusMergedModels": "Modèles mélangés", - "txt2img": "Texte vers image", - "postprocessing": "Post-Traitement" - }, - "gallery": { - "generations": "Générations", - "showGenerations": "Afficher les générations", - "uploads": "Téléchargements", - "showUploads": "Afficher les téléchargements", - "galleryImageSize": "Taille de l'image", - "galleryImageResetSize": "Réinitialiser la taille", - "gallerySettings": "Paramètres de la galerie", - "maintainAspectRatio": "Maintenir le rapport d'aspect", - "autoSwitchNewImages": "Basculer automatiquement vers de nouvelles images", - "singleColumnLayout": "Mise en page en colonne unique", - "allImagesLoaded": "Toutes les images chargées", - "loadMore": "Charger plus", - "noImagesInGallery": "Aucune image dans la galerie" - }, - "hotkeys": { - "keyboardShortcuts": "Raccourcis clavier", - "appHotkeys": "Raccourcis de l'application", - "generalHotkeys": "Raccourcis généraux", - "galleryHotkeys": "Raccourcis de la galerie", - "unifiedCanvasHotkeys": "Raccourcis du canvas unifié", - "invoke": { - "title": "Invoquer", - "desc": "Générer une image" - }, - "cancel": { - "title": "Annuler", - "desc": "Annuler la génération d'image" - }, - "focusPrompt": { - "title": "Prompt de focus", - "desc": "Mettre en focus la zone de saisie de la commande" - }, - "toggleOptions": { - "title": "Affichage des options", - "desc": "Afficher et masquer le panneau d'options" - }, - "pinOptions": { - "title": "Epinglage des options", - "desc": "Epingler le panneau d'options" - }, - "toggleViewer": { - "title": "Affichage de la visionneuse", - "desc": "Afficher et masquer la visionneuse d'image" - }, - "toggleGallery": { - "title": "Affichage de la galerie", - "desc": "Afficher et masquer la galerie" - }, - "maximizeWorkSpace": { - "title": "Maximiser la zone de travail", - "desc": "Fermer les panneaux et maximiser la zone de travail" - }, - "changeTabs": { - "title": "Changer d'onglet", - "desc": "Passer à un autre espace de travail" - }, - "consoleToggle": { - "title": "Affichage de la console", - "desc": "Afficher et masquer la console" - }, - "setPrompt": { - "title": "Définir le prompt", - "desc": "Utiliser le prompt de l'image actuelle" - }, - "setSeed": { - "title": "Définir la graine", - "desc": "Utiliser la graine de l'image actuelle" - }, - "setParameters": { - "title": "Définir les paramètres", - "desc": "Utiliser tous les paramètres de l'image actuelle" - }, - "restoreFaces": { - "title": "Restaurer les visages", - "desc": "Restaurer l'image actuelle" - }, - "upscale": { - "title": "Agrandir", - "desc": "Agrandir l'image actuelle" - }, - "showInfo": { - "title": "Afficher les informations", - "desc": "Afficher les informations de métadonnées de l'image actuelle" - }, - "sendToImageToImage": { - "title": "Envoyer à l'image à l'image", - "desc": "Envoyer l'image actuelle à l'image à l'image" - }, - "deleteImage": { - "title": "Supprimer l'image", - "desc": "Supprimer l'image actuelle" - }, - "closePanels": { - "title": "Fermer les panneaux", - "desc": "Fermer les panneaux ouverts" - }, - "previousImage": { - "title": "Image précédente", - "desc": "Afficher l'image précédente dans la galerie" - }, - "nextImage": { - "title": "Image suivante", - "desc": "Afficher l'image suivante dans la galerie" - }, - "toggleGalleryPin": { - "title": "Activer/désactiver l'épinglage de la galerie", - "desc": "Épingle ou dépingle la galerie à l'interface" - }, - "increaseGalleryThumbSize": { - "title": "Augmenter la taille des miniatures de la galerie", - "desc": "Augmente la taille des miniatures de la galerie" - }, - "decreaseGalleryThumbSize": { - "title": "Diminuer la taille des miniatures de la galerie", - "desc": "Diminue la taille des miniatures de la galerie" - }, - "selectBrush": { - "title": "Sélectionner un pinceau", - "desc": "Sélectionne le pinceau de la toile" - }, - "selectEraser": { - "title": "Sélectionner un gomme", - "desc": "Sélectionne la gomme de la toile" - }, - "decreaseBrushSize": { - "title": "Diminuer la taille du pinceau", - "desc": "Diminue la taille du pinceau/gomme de la toile" - }, - "increaseBrushSize": { - "title": "Augmenter la taille du pinceau", - "desc": "Augmente la taille du pinceau/gomme de la toile" - }, - "decreaseBrushOpacity": { - "title": "Diminuer l'opacité du pinceau", - "desc": "Diminue l'opacité du pinceau de la toile" - }, - "increaseBrushOpacity": { - "title": "Augmenter l'opacité du pinceau", - "desc": "Augmente l'opacité du pinceau de la toile" - }, - "moveTool": { - "title": "Outil de déplacement", - "desc": "Permet la navigation sur la toile" - }, - "fillBoundingBox": { - "title": "Remplir la boîte englobante", - "desc": "Remplit la boîte englobante avec la couleur du pinceau" - }, - "eraseBoundingBox": { - "title": "Effacer la boîte englobante", - "desc": "Efface la zone de la boîte englobante" - }, - "colorPicker": { - "title": "Sélectionnez le sélecteur de couleur", - "desc": "Sélectionne le sélecteur de couleur de la toile" - }, - "toggleSnap": { - "title": "Basculer Snap", - "desc": "Basculer Snap à la grille" - }, - "quickToggleMove": { - "title": "Basculer rapidement déplacer", - "desc": "Basculer temporairement le mode Déplacer" - }, - "toggleLayer": { - "title": "Basculer la couche", - "desc": "Basculer la sélection de la couche masque/base" - }, - "clearMask": { - "title": "Effacer le masque", - "desc": "Effacer entièrement le masque" - }, - "hideMask": { - "title": "Masquer le masque", - "desc": "Masquer et démasquer le masque" - }, - "showHideBoundingBox": { - "title": "Afficher/Masquer la boîte englobante", - "desc": "Basculer la visibilité de la boîte englobante" - }, - "mergeVisible": { - "title": "Fusionner visible", - "desc": "Fusionner toutes les couches visibles de la toile" - }, - "saveToGallery": { - "title": "Enregistrer dans la galerie", - "desc": "Enregistrer la toile actuelle dans la galerie" - }, - "copyToClipboard": { - "title": "Copier dans le presse-papiers", - "desc": "Copier la toile actuelle dans le presse-papiers" - }, - "downloadImage": { - "title": "Télécharger l'image", - "desc": "Télécharger la toile actuelle" - }, - "undoStroke": { - "title": "Annuler le trait", - "desc": "Annuler un coup de pinceau" - }, - "redoStroke": { - "title": "Rétablir le trait", - "desc": "Rétablir un coup de pinceau" - }, - "resetView": { - "title": "Réinitialiser la vue", - "desc": "Réinitialiser la vue de la toile" - }, - "previousStagingImage": { - "title": "Image de mise en scène précédente", - "desc": "Image précédente de la zone de mise en scène" - }, - "nextStagingImage": { - "title": "Image de mise en scène suivante", - "desc": "Image suivante de la zone de mise en scène" - }, - "acceptStagingImage": { - "title": "Accepter l'image de mise en scène", - "desc": "Accepter l'image actuelle de la zone de mise en scène" - } - }, - "modelManager": { - "modelManager": "Gestionnaire de modèle", - "model": "Modèle", - "allModels": "Tous les modèles", - "checkpointModels": "Points de contrôle", - "diffusersModels": "Diffuseurs", - "safetensorModels": "SafeTensors", - "modelAdded": "Modèle ajouté", - "modelUpdated": "Modèle mis à jour", - "modelEntryDeleted": "Entrée de modèle supprimée", - "cannotUseSpaces": "Ne peut pas utiliser d'espaces", - "addNew": "Ajouter un nouveau", - "addNewModel": "Ajouter un nouveau modèle", - "addCheckpointModel": "Ajouter un modèle de point de contrôle / SafeTensor", - "addDiffuserModel": "Ajouter des diffuseurs", - "addManually": "Ajouter manuellement", - "manual": "Manuel", - "name": "Nom", - "nameValidationMsg": "Entrez un nom pour votre modèle", - "description": "Description", - "descriptionValidationMsg": "Ajoutez une description pour votre modèle", - "config": "Config", - "configValidationMsg": "Chemin vers le fichier de configuration de votre modèle.", - "modelLocation": "Emplacement du modèle", - "modelLocationValidationMsg": "Chemin vers où votre modèle est situé localement.", - "repo_id": "ID de dépôt", - "repoIDValidationMsg": "Dépôt en ligne de votre modèle", - "vaeLocation": "Emplacement VAE", - "vaeLocationValidationMsg": "Chemin vers où votre VAE est situé.", - "vaeRepoID": "ID de dépôt VAE", - "vaeRepoIDValidationMsg": "Dépôt en ligne de votre VAE", - "width": "Largeur", - "widthValidationMsg": "Largeur par défaut de votre modèle.", - "height": "Hauteur", - "heightValidationMsg": "Hauteur par défaut de votre modèle.", - "addModel": "Ajouter un modèle", - "updateModel": "Mettre à jour le modèle", - "availableModels": "Modèles disponibles", - "search": "Rechercher", - "load": "Charger", - "active": "actif", - "notLoaded": "non chargé", - "cached": "en cache", - "checkpointFolder": "Dossier de point de contrôle", - "clearCheckpointFolder": "Effacer le dossier de point de contrôle", - "findModels": "Trouver des modèles", - "scanAgain": "Scanner à nouveau", - "modelsFound": "Modèles trouvés", - "selectFolder": "Sélectionner un dossier", - "selected": "Sélectionné", - "selectAll": "Tout sélectionner", - "deselectAll": "Tout désélectionner", - "showExisting": "Afficher existant", - "addSelected": "Ajouter sélectionné", - "modelExists": "Modèle existant", - "selectAndAdd": "Sélectionner et ajouter les modèles listés ci-dessous", - "noModelsFound": "Aucun modèle trouvé", - "delete": "Supprimer", - "deleteModel": "Supprimer le modèle", - "deleteConfig": "Supprimer la configuration", - "deleteMsg1": "Voulez-vous vraiment supprimer cette entrée de modèle dans InvokeAI ?", - "deleteMsg2": "Cela n'effacera pas le fichier de point de contrôle du modèle de votre disque. Vous pouvez les réajouter si vous le souhaitez.", - "formMessageDiffusersModelLocation": "Emplacement du modèle de diffuseurs", - "formMessageDiffusersModelLocationDesc": "Veuillez en entrer au moins un.", - "formMessageDiffusersVAELocation": "Emplacement VAE", - "formMessageDiffusersVAELocationDesc": "Si non fourni, InvokeAI recherchera le fichier VAE à l'emplacement du modèle donné ci-dessus." - }, - "parameters": { - "images": "Images", - "steps": "Etapes", - "cfgScale": "CFG Echelle", - "width": "Largeur", - "height": "Hauteur", - "seed": "Graine", - "randomizeSeed": "Graine Aléatoire", - "shuffle": "Mélanger", - "noiseThreshold": "Seuil de Bruit", - "perlinNoise": "Bruit de Perlin", - "variations": "Variations", - "variationAmount": "Montant de Variation", - "seedWeights": "Poids des Graines", - "faceRestoration": "Restauration de Visage", - "restoreFaces": "Restaurer les Visages", - "type": "Type", - "strength": "Force", - "upscaling": "Agrandissement", - "upscale": "Agrandir", - "upscaleImage": "Image en Agrandissement", - "scale": "Echelle", - "otherOptions": "Autres Options", - "seamlessTiling": "Carreau Sans Joint", - "hiresOptim": "Optimisation Haute Résolution", - "imageFit": "Ajuster Image Initiale à la Taille de Sortie", - "codeformerFidelity": "Fidélité", - "scaleBeforeProcessing": "Echelle Avant Traitement", - "scaledWidth": "Larg. Échelle", - "scaledHeight": "Haut. Échelle", - "infillMethod": "Méthode de Remplissage", - "tileSize": "Taille des Tuiles", - "boundingBoxHeader": "Boîte Englobante", - "seamCorrectionHeader": "Correction des Joints", - "infillScalingHeader": "Remplissage et Mise à l'Échelle", - "img2imgStrength": "Force de l'Image à l'Image", - "toggleLoopback": "Activer/Désactiver la Boucle", - "sendTo": "Envoyer à", - "sendToImg2Img": "Envoyer à Image à Image", - "sendToUnifiedCanvas": "Envoyer au Canvas Unifié", - "copyImage": "Copier Image", - "copyImageToLink": "Copier l'Image en Lien", - "downloadImage": "Télécharger Image", - "openInViewer": "Ouvrir dans le visualiseur", - "closeViewer": "Fermer le visualiseur", - "usePrompt": "Utiliser la suggestion", - "useSeed": "Utiliser la graine", - "useAll": "Tout utiliser", - "useInitImg": "Utiliser l'image initiale", - "info": "Info", - "initialImage": "Image initiale", - "showOptionsPanel": "Afficher le panneau d'options" - }, - "settings": { - "models": "Modèles", - "displayInProgress": "Afficher les images en cours", - "saveSteps": "Enregistrer les images tous les n étapes", - "confirmOnDelete": "Confirmer la suppression", - "displayHelpIcons": "Afficher les icônes d'aide", - "enableImageDebugging": "Activer le débogage d'image", - "resetWebUI": "Réinitialiser l'interface Web", - "resetWebUIDesc1": "Réinitialiser l'interface Web ne réinitialise que le cache local du navigateur de vos images et de vos paramètres enregistrés. Cela n'efface pas les images du disque.", - "resetWebUIDesc2": "Si les images ne s'affichent pas dans la galerie ou si quelque chose d'autre ne fonctionne pas, veuillez essayer de réinitialiser avant de soumettre une demande sur GitHub.", - "resetComplete": "L'interface Web a été réinitialisée. Rafraîchissez la page pour recharger." - }, - "toast": { - "tempFoldersEmptied": "Dossiers temporaires vidés", - "uploadFailed": "Téléchargement échoué", - "uploadFailedUnableToLoadDesc": "Impossible de charger le fichier", - "downloadImageStarted": "Téléchargement de l'image démarré", - "imageCopied": "Image copiée", - "imageLinkCopied": "Lien d'image copié", - "imageNotLoaded": "Aucune image chargée", - "imageNotLoadedDesc": "Aucune image trouvée pour envoyer à module d'image", - "imageSavedToGallery": "Image enregistrée dans la galerie", - "canvasMerged": "Canvas fusionné", - "sentToImageToImage": "Envoyé à Image à Image", - "sentToUnifiedCanvas": "Envoyé à Canvas unifié", - "parametersSet": "Paramètres définis", - "parametersNotSet": "Paramètres non définis", - "parametersNotSetDesc": "Aucune métadonnée trouvée pour cette image.", - "parametersFailed": "Problème de chargement des paramètres", - "parametersFailedDesc": "Impossible de charger l'image d'initiation.", - "seedSet": "Graine définie", - "seedNotSet": "Graine non définie", - "seedNotSetDesc": "Impossible de trouver la graine pour cette image.", - "promptSet": "Invite définie", - "promptNotSet": "Invite non définie", - "promptNotSetDesc": "Impossible de trouver l'invite pour cette image.", - "upscalingFailed": "Échec de la mise à l'échelle", - "faceRestoreFailed": "Échec de la restauration du visage", - "metadataLoadFailed": "Échec du chargement des métadonnées", - "initialImageSet": "Image initiale définie", - "initialImageNotSet": "Image initiale non définie", - "initialImageNotSetDesc": "Impossible de charger l'image initiale" - }, - "tooltip": { - "feature": { - "prompt": "Ceci est le champ prompt. Le prompt inclut des objets de génération et des termes stylistiques. Vous pouvez également ajouter un poids (importance du jeton) dans le prompt, mais les commandes CLI et les paramètres ne fonctionneront pas.", - "gallery": "La galerie affiche les générations à partir du dossier de sortie à mesure qu'elles sont créées. Les paramètres sont stockés dans des fichiers et accessibles via le menu contextuel.", - "other": "Ces options activent des modes de traitement alternatifs pour Invoke. 'Tuilage seamless' créera des motifs répétitifs dans la sortie. 'Haute résolution' est la génération en deux étapes avec img2img : utilisez ce paramètre lorsque vous souhaitez une image plus grande et plus cohérente sans artefacts. Cela prendra plus de temps que d'habitude txt2img.", - "seed": "La valeur de grain affecte le bruit initial à partir duquel l'image est formée. Vous pouvez utiliser les graines déjà existantes provenant d'images précédentes. 'Seuil de bruit' est utilisé pour atténuer les artefacts à des valeurs CFG élevées (essayez la plage de 0 à 10), et Perlin pour ajouter du bruit Perlin pendant la génération : les deux servent à ajouter de la variété à vos sorties.", - "variations": "Essayez une variation avec une valeur comprise entre 0,1 et 1,0 pour changer le résultat pour une graine donnée. Des variations intéressantes de la graine sont entre 0,1 et 0,3.", - "upscale": "Utilisez ESRGAN pour agrandir l'image immédiatement après la génération.", - "faceCorrection": "Correction de visage avec GFPGAN ou Codeformer : l'algorithme détecte les visages dans l'image et corrige tout défaut. La valeur élevée changera plus l'image, ce qui donnera des visages plus attirants. Codeformer avec une fidélité plus élevée préserve l'image originale au prix d'une correction de visage plus forte.", - "imageToImage": "Image to Image charge n'importe quelle image en tant qu'initiale, qui est ensuite utilisée pour générer une nouvelle avec le prompt. Plus la valeur est élevée, plus l'image de résultat changera. Des valeurs de 0,0 à 1,0 sont possibles, la plage recommandée est de 0,25 à 0,75", - "boundingBox": "La boîte englobante est la même que les paramètres Largeur et Hauteur pour Texte à Image ou Image à Image. Seulement la zone dans la boîte sera traitée.", - "seamCorrection": "Contrôle la gestion des coutures visibles qui se produisent entre les images générées sur la toile.", - "infillAndScaling": "Gérer les méthodes de remplissage (utilisées sur les zones masquées ou effacées de la toile) et le redimensionnement (utile pour les petites tailles de boîte englobante)." - } - }, - "unifiedCanvas": { - "layer": "Couche", - "base": "Base", - "mask": "Masque", - "maskingOptions": "Options de masquage", - "enableMask": "Activer le masque", - "preserveMaskedArea": "Préserver la zone masquée", - "clearMask": "Effacer le masque", - "brush": "Pinceau", - "eraser": "Gomme", - "fillBoundingBox": "Remplir la boîte englobante", - "eraseBoundingBox": "Effacer la boîte englobante", - "colorPicker": "Sélecteur de couleur", - "brushOptions": "Options de pinceau", - "brushSize": "Taille", - "move": "Déplacer", - "resetView": "Réinitialiser la vue", - "mergeVisible": "Fusionner les visibles", - "saveToGallery": "Enregistrer dans la galerie", - "copyToClipboard": "Copier dans le presse-papiers", - "downloadAsImage": "Télécharger en tant qu'image", - "undo": "Annuler", - "redo": "Refaire", - "clearCanvas": "Effacer le canvas", - "canvasSettings": "Paramètres du canvas", - "showIntermediates": "Afficher les intermédiaires", - "showGrid": "Afficher la grille", - "snapToGrid": "Aligner sur la grille", - "darkenOutsideSelection": "Assombrir à l'extérieur de la sélection", - "autoSaveToGallery": "Enregistrement automatique dans la galerie", - "saveBoxRegionOnly": "Enregistrer uniquement la région de la boîte", - "limitStrokesToBox": "Limiter les traits à la boîte", - "showCanvasDebugInfo": "Afficher les informations de débogage du canvas", - "clearCanvasHistory": "Effacer l'historique du canvas", - "clearHistory": "Effacer l'historique", - "clearCanvasHistoryMessage": "Effacer l'historique du canvas laisse votre canvas actuel intact, mais efface de manière irréversible l'historique annuler et refaire.", - "clearCanvasHistoryConfirm": "Voulez-vous vraiment effacer l'historique du canvas ?", - "emptyTempImageFolder": "Vider le dossier d'images temporaires", - "emptyFolder": "Vider le dossier", - "emptyTempImagesFolderMessage": "Vider le dossier d'images temporaires réinitialise également complètement le canvas unifié. Cela inclut tout l'historique annuler/refaire, les images dans la zone de mise en attente et la couche de base du canvas.", - "emptyTempImagesFolderConfirm": "Voulez-vous vraiment vider le dossier temporaire ?", - "activeLayer": "Calque actif", - "canvasScale": "Échelle du canevas", - "boundingBox": "Boîte englobante", - "scaledBoundingBox": "Boîte englobante mise à l'échelle", - "boundingBoxPosition": "Position de la boîte englobante", - "canvasDimensions": "Dimensions du canevas", - "canvasPosition": "Position du canevas", - "cursorPosition": "Position du curseur", - "previous": "Précédent", - "next": "Suivant", - "accept": "Accepter", - "showHide": "Afficher/Masquer", - "discardAll": "Tout abandonner", - "betaClear": "Effacer", - "betaDarkenOutside": "Assombrir à l'extérieur", - "betaLimitToBox": "Limiter à la boîte", - "betaPreserveMasked": "Conserver masqué" - }, - "accessibility": { - "uploadImage": "Charger une image", - "reset": "Réinitialiser", - "nextImage": "Image suivante", - "previousImage": "Image précédente", - "useThisParameter": "Utiliser ce paramètre", - "zoomIn": "Zoom avant", - "zoomOut": "Zoom arrière", - "showOptionsPanel": "Montrer la page d'options", - "modelSelect": "Choix du modèle", - "invokeProgressBar": "Barre de Progression Invoke", - "copyMetadataJson": "Copie des métadonnées JSON", - "menu": "Menu" - } -} diff --git a/invokeai/frontend/web/dist/locales/he.json b/invokeai/frontend/web/dist/locales/he.json deleted file mode 100644 index dfb5ea0360..0000000000 --- a/invokeai/frontend/web/dist/locales/he.json +++ /dev/null @@ -1,575 +0,0 @@ -{ - "modelManager": { - "cannotUseSpaces": "לא ניתן להשתמש ברווחים", - "addNew": "הוסף חדש", - "vaeLocationValidationMsg": "נתיב למקום שבו ממוקם ה- VAE שלך.", - "height": "גובה", - "load": "טען", - "search": "חיפוש", - "heightValidationMsg": "גובה ברירת המחדל של המודל שלך.", - "addNewModel": "הוסף מודל חדש", - "allModels": "כל המודלים", - "checkpointModels": "נקודות ביקורת", - "diffusersModels": "מפזרים", - "safetensorModels": "טנסורים בטוחים", - "modelAdded": "מודל התווסף", - "modelUpdated": "מודל עודכן", - "modelEntryDeleted": "רשומת המודל נמחקה", - "addCheckpointModel": "הוסף נקודת ביקורת / מודל טנסור בטוח", - "addDiffuserModel": "הוסף מפזרים", - "addManually": "הוספה ידנית", - "manual": "ידני", - "name": "שם", - "description": "תיאור", - "descriptionValidationMsg": "הוסף תיאור למודל שלך", - "config": "תצורה", - "configValidationMsg": "נתיב לקובץ התצורה של המודל שלך.", - "modelLocation": "מיקום המודל", - "modelLocationValidationMsg": "נתיב למקום שבו המודל שלך ממוקם באופן מקומי.", - "repo_id": "מזהה מאגר", - "repoIDValidationMsg": "מאגר מקוון של המודל שלך", - "vaeLocation": "מיקום VAE", - "vaeRepoIDValidationMsg": "המאגר המקוון של VAE שלך", - "width": "רוחב", - "widthValidationMsg": "רוחב ברירת המחדל של המודל שלך.", - "addModel": "הוסף מודל", - "updateModel": "עדכן מודל", - "active": "פעיל", - "modelsFound": "מודלים נמצאו", - "cached": "נשמר במטמון", - "checkpointFolder": "תיקיית נקודות ביקורת", - "findModels": "מצא מודלים", - "scanAgain": "סרוק מחדש", - "selectFolder": "בחירת תיקייה", - "selected": "נבחר", - "selectAll": "בחר הכל", - "deselectAll": "ביטול בחירת הכל", - "showExisting": "הצג קיים", - "addSelected": "הוסף פריטים שנבחרו", - "modelExists": "המודל קיים", - "selectAndAdd": "בחר והוסך מודלים המפורטים להלן", - "deleteModel": "מחיקת מודל", - "deleteConfig": "מחיקת תצורה", - "formMessageDiffusersModelLocation": "מיקום מפזרי המודל", - "formMessageDiffusersModelLocationDesc": "נא להזין לפחות אחד.", - "convertToDiffusersHelpText5": "אנא ודא/י שיש לך מספיק מקום בדיסק. גדלי מודלים בדרך כלל הינם בין 4GB-7GB.", - "convertToDiffusersHelpText1": "מודל זה יומר לפורמט 🧨 המפזרים.", - "convertToDiffusersHelpText2": "תהליך זה יחליף את הרשומה של מנהל המודלים שלך בגרסת המפזרים של אותו המודל.", - "convertToDiffusersHelpText6": "האם ברצונך להמיר מודל זה?", - "convertToDiffusersSaveLocation": "שמירת מיקום", - "inpainting": "v1 צביעת תוך", - "statusConverting": "ממיר", - "modelConverted": "מודל הומר", - "sameFolder": "אותה תיקיה", - "custom": "התאמה אישית", - "merge": "מזג", - "modelsMerged": "מודלים מוזגו", - "mergeModels": "מזג מודלים", - "modelOne": "מודל 1", - "customSaveLocation": "מיקום שמירה מותאם אישית", - "alpha": "אלפא", - "mergedModelSaveLocation": "שמירת מיקום", - "mergedModelCustomSaveLocation": "נתיב מותאם אישית", - "ignoreMismatch": "התעלמות מאי-התאמות בין מודלים שנבחרו", - "modelMergeHeaderHelp1": "ניתן למזג עד שלושה מודלים שונים כדי ליצור שילוב שמתאים לצרכים שלכם.", - "modelMergeAlphaHelp": "אלפא שולט בחוזק מיזוג עבור המודלים. ערכי אלפא נמוכים יותר מובילים להשפעה נמוכה יותר של המודל השני.", - "nameValidationMsg": "הכנס שם למודל שלך", - "vaeRepoID": "מזהה מאגר ה VAE", - "modelManager": "מנהל המודלים", - "model": "מודל", - "availableModels": "מודלים זמינים", - "notLoaded": "לא נטען", - "clearCheckpointFolder": "נקה את תיקיית נקודות הביקורת", - "noModelsFound": "לא נמצאו מודלים", - "delete": "מחיקה", - "deleteMsg1": "האם אתה בטוח שברצונך למחוק רשומת מודל זו מ- InvokeAI?", - "deleteMsg2": "פעולה זו לא תמחק את קובץ נקודת הביקורת מהדיסק שלך. ניתן לקרוא אותם מחדש במידת הצורך.", - "formMessageDiffusersVAELocation": "מיקום VAE", - "formMessageDiffusersVAELocationDesc": "במידה ולא מסופק, InvokeAI תחפש את קובץ ה-VAE במיקום המודל המופיע לעיל.", - "convertToDiffusers": "המרה למפזרים", - "convert": "המרה", - "modelTwo": "מודל 2", - "modelThree": "מודל 3", - "mergedModelName": "שם מודל ממוזג", - "v1": "v1", - "invokeRoot": "תיקיית InvokeAI", - "customConfig": "תצורה מותאמת אישית", - "pathToCustomConfig": "נתיב לתצורה מותאמת אישית", - "interpolationType": "סוג אינטרפולציה", - "invokeAIFolder": "תיקיית InvokeAI", - "sigmoid": "סיגמואיד", - "weightedSum": "סכום משוקלל", - "modelMergeHeaderHelp2": "רק מפזרים זמינים למיזוג. אם ברצונך למזג מודל של נקודת ביקורת, המר אותו תחילה למפזרים.", - "inverseSigmoid": "הפוך סיגמואיד", - "convertToDiffusersHelpText3": "קובץ נקודת הביקורת שלך בדיסק לא יימחק או ישונה בכל מקרה. אתה יכול להוסיף את נקודת הביקורת שלך למנהל המודלים שוב אם תרצה בכך.", - "convertToDiffusersHelpText4": "זהו תהליך חד פעמי בלבד. התהליך עשוי לקחת בסביבות 30-60 שניות, תלוי במפרט המחשב שלך.", - "modelMergeInterpAddDifferenceHelp": "במצב זה, מודל 3 מופחת תחילה ממודל 2. הגרסה המתקבלת משולבת עם מודל 1 עם קצב האלפא שנקבע לעיל." - }, - "common": { - "nodesDesc": "מערכת מבוססת צמתים עבור יצירת תמונות עדיין תחת פיתוח. השארו קשובים לעדכונים עבור הפיצ׳ר המדהים הזה.", - "languagePickerLabel": "בחירת שפה", - "githubLabel": "גיטהאב", - "discordLabel": "דיסקורד", - "settingsLabel": "הגדרות", - "langEnglish": "אנגלית", - "langDutch": "הולנדית", - "langArabic": "ערבית", - "langFrench": "צרפתית", - "langGerman": "גרמנית", - "langJapanese": "יפנית", - "langBrPortuguese": "פורטוגזית", - "langRussian": "רוסית", - "langSimplifiedChinese": "סינית", - "langUkranian": "אוקראינית", - "langSpanish": "ספרדית", - "img2img": "תמונה לתמונה", - "unifiedCanvas": "קנבס מאוחד", - "nodes": "צמתים", - "postProcessing": "לאחר עיבוד", - "postProcessDesc2": "תצוגה ייעודית תשוחרר בקרוב על מנת לתמוך בתהליכים ועיבודים מורכבים.", - "postProcessDesc3": "ממשק שורת הפקודה של Invoke AI מציע תכונות שונות אחרות כולל Embiggen.", - "close": "סגירה", - "statusConnected": "מחובר", - "statusDisconnected": "מנותק", - "statusError": "שגיאה", - "statusPreparing": "בהכנה", - "statusProcessingCanceled": "עיבוד בוטל", - "statusProcessingComplete": "עיבוד הסתיים", - "statusGenerating": "מייצר", - "statusGeneratingTextToImage": "מייצר טקסט לתמונה", - "statusGeneratingImageToImage": "מייצר תמונה לתמונה", - "statusGeneratingInpainting": "מייצר ציור לתוך", - "statusGeneratingOutpainting": "מייצר ציור החוצה", - "statusIterationComplete": "איטרציה הסתיימה", - "statusRestoringFaces": "משחזר פרצופים", - "statusRestoringFacesCodeFormer": "משחזר פרצופים (CodeFormer)", - "statusUpscaling": "העלאת קנה מידה", - "statusUpscalingESRGAN": "העלאת קנה מידה (ESRGAN)", - "statusModelChanged": "מודל השתנה", - "statusConvertingModel": "ממיר מודל", - "statusModelConverted": "מודל הומר", - "statusMergingModels": "מיזוג מודלים", - "statusMergedModels": "מודלים מוזגו", - "hotkeysLabel": "מקשים חמים", - "reportBugLabel": "דווח באג", - "langItalian": "איטלקית", - "upload": "העלאה", - "langPolish": "פולנית", - "training": "אימון", - "load": "טעינה", - "back": "אחורה", - "statusSavingImage": "שומר תמונה", - "statusGenerationComplete": "ייצור הסתיים", - "statusRestoringFacesGFPGAN": "משחזר פרצופים (GFPGAN)", - "statusLoadingModel": "טוען מודל", - "trainingDesc2": "InvokeAI כבר תומך באימון הטמעות מותאמות אישית באמצעות היפוך טקסט באמצעות הסקריפט הראשי.", - "postProcessDesc1": "InvokeAI מציעה מגוון רחב של תכונות עיבוד שלאחר. העלאת קנה מידה של תמונה ושחזור פנים כבר זמינים בממשק המשתמש. ניתן לגשת אליהם מתפריט 'אפשרויות מתקדמות' בכרטיסיות 'טקסט לתמונה' ו'תמונה לתמונה'. ניתן גם לעבד תמונות ישירות, באמצעות לחצני הפעולה של התמונה מעל תצוגת התמונה הנוכחית או בתוך המציג.", - "trainingDesc1": "תהליך עבודה ייעודי לאימון ההטמעות ונקודות הביקורת שלך באמצעות היפוך טקסט ו-Dreambooth מממשק המשתמש." - }, - "hotkeys": { - "toggleGallery": { - "desc": "פתח וסגור את מגירת הגלריה", - "title": "הצג את הגלריה" - }, - "keyboardShortcuts": "קיצורי מקלדת", - "appHotkeys": "קיצורי אפליקציה", - "generalHotkeys": "קיצורי דרך כלליים", - "galleryHotkeys": "קיצורי דרך של הגלריה", - "unifiedCanvasHotkeys": "קיצורי דרך לקנבס המאוחד", - "invoke": { - "title": "הפעל", - "desc": "צור תמונה" - }, - "focusPrompt": { - "title": "התמקדות על הבקשה", - "desc": "התמקדות על איזור הקלדת הבקשה" - }, - "toggleOptions": { - "desc": "פתח וסגור את פאנל ההגדרות", - "title": "הצג הגדרות" - }, - "pinOptions": { - "title": "הצמד הגדרות", - "desc": "הצמד את פאנל ההגדרות" - }, - "toggleViewer": { - "title": "הצג את חלון ההצגה", - "desc": "פתח וסגור את מציג התמונות" - }, - "changeTabs": { - "title": "החלף לשוניות", - "desc": "החלף לאיזור עבודה אחר" - }, - "consoleToggle": { - "desc": "פתח וסגור את הקונסול", - "title": "הצג קונסול" - }, - "setPrompt": { - "title": "הגדרת בקשה", - "desc": "שימוש בבקשה של התמונה הנוכחית" - }, - "restoreFaces": { - "desc": "שחזור התמונה הנוכחית", - "title": "שחזור פרצופים" - }, - "upscale": { - "title": "הגדלת קנה מידה", - "desc": "הגדל את התמונה הנוכחית" - }, - "showInfo": { - "title": "הצג מידע", - "desc": "הצגת פרטי מטא-נתונים של התמונה הנוכחית" - }, - "sendToImageToImage": { - "title": "שלח לתמונה לתמונה", - "desc": "שלח תמונה נוכחית לתמונה לתמונה" - }, - "deleteImage": { - "title": "מחק תמונה", - "desc": "מחק את התמונה הנוכחית" - }, - "closePanels": { - "title": "סגור לוחות", - "desc": "סוגר לוחות פתוחים" - }, - "previousImage": { - "title": "תמונה קודמת", - "desc": "הצג את התמונה הקודמת בגלריה" - }, - "toggleGalleryPin": { - "title": "הצג את מצמיד הגלריה", - "desc": "הצמדה וביטול הצמדה של הגלריה לממשק המשתמש" - }, - "decreaseGalleryThumbSize": { - "title": "הקטנת גודל תמונת גלריה", - "desc": "מקטין את גודל התמונות הממוזערות של הגלריה" - }, - "selectBrush": { - "desc": "בוחר את מברשת הקנבס", - "title": "בחר מברשת" - }, - "selectEraser": { - "title": "בחר מחק", - "desc": "בוחר את מחק הקנבס" - }, - "decreaseBrushSize": { - "title": "הקטנת גודל המברשת", - "desc": "מקטין את גודל מברשת הקנבס/מחק" - }, - "increaseBrushSize": { - "desc": "מגדיל את גודל מברשת הקנבס/מחק", - "title": "הגדלת גודל המברשת" - }, - "decreaseBrushOpacity": { - "title": "הפחת את אטימות המברשת", - "desc": "מקטין את האטימות של מברשת הקנבס" - }, - "increaseBrushOpacity": { - "title": "הגדל את אטימות המברשת", - "desc": "מגביר את האטימות של מברשת הקנבס" - }, - "moveTool": { - "title": "כלי הזזה", - "desc": "מאפשר ניווט על קנבס" - }, - "fillBoundingBox": { - "desc": "ממלא את התיבה התוחמת בצבע מברשת", - "title": "מילוי תיבה תוחמת" - }, - "eraseBoundingBox": { - "desc": "מוחק את אזור התיבה התוחמת", - "title": "מחק תיבה תוחמת" - }, - "colorPicker": { - "title": "בחר בבורר צבעים", - "desc": "בוחר את בורר צבעי הקנבס" - }, - "toggleSnap": { - "title": "הפעל הצמדה", - "desc": "מפעיל הצמדה לרשת" - }, - "quickToggleMove": { - "title": "הפעלה מהירה להזזה", - "desc": "מפעיל זמנית את מצב ההזזה" - }, - "toggleLayer": { - "title": "הפעל שכבה", - "desc": "הפעל בחירת שכבת בסיס/מסיכה" - }, - "clearMask": { - "title": "נקה מסיכה", - "desc": "נקה את כל המסכה" - }, - "hideMask": { - "desc": "הסתרה והצגה של מסיכה", - "title": "הסתר מסיכה" - }, - "showHideBoundingBox": { - "title": "הצגה/הסתרה של תיבה תוחמת", - "desc": "הפעל תצוגה של התיבה התוחמת" - }, - "mergeVisible": { - "title": "מיזוג תוכן גלוי", - "desc": "מיזוג כל השכבות הגלויות של הקנבס" - }, - "saveToGallery": { - "title": "שמור לגלריה", - "desc": "שמור את הקנבס הנוכחי בגלריה" - }, - "copyToClipboard": { - "title": "העתק ללוח ההדבקה", - "desc": "העתק את הקנבס הנוכחי ללוח ההדבקה" - }, - "downloadImage": { - "title": "הורד תמונה", - "desc": "הורד את הקנבס הנוכחי" - }, - "undoStroke": { - "title": "בטל משיכה", - "desc": "בטל משיכת מברשת" - }, - "redoStroke": { - "title": "בצע שוב משיכה", - "desc": "ביצוע מחדש של משיכת מברשת" - }, - "resetView": { - "title": "איפוס תצוגה", - "desc": "אפס תצוגת קנבס" - }, - "previousStagingImage": { - "desc": "תמונת אזור ההערכות הקודמת", - "title": "תמונת הערכות קודמת" - }, - "nextStagingImage": { - "title": "תמנות הערכות הבאה", - "desc": "תמונת אזור ההערכות הבאה" - }, - "acceptStagingImage": { - "desc": "אשר את תמונת איזור ההערכות הנוכחית", - "title": "אשר תמונת הערכות" - }, - "cancel": { - "desc": "ביטול יצירת תמונה", - "title": "ביטול" - }, - "maximizeWorkSpace": { - "title": "מקסם את איזור העבודה", - "desc": "סגור פאנלים ומקסם את איזור העבודה" - }, - "setSeed": { - "title": "הגדר זרע", - "desc": "השתמש בזרע התמונה הנוכחית" - }, - "setParameters": { - "title": "הגדרת פרמטרים", - "desc": "שימוש בכל הפרמטרים של התמונה הנוכחית" - }, - "increaseGalleryThumbSize": { - "title": "הגדל את גודל תמונת הגלריה", - "desc": "מגדיל את התמונות הממוזערות של הגלריה" - }, - "nextImage": { - "title": "תמונה הבאה", - "desc": "הצג את התמונה הבאה בגלריה" - } - }, - "gallery": { - "uploads": "העלאות", - "galleryImageSize": "גודל תמונה", - "gallerySettings": "הגדרות גלריה", - "maintainAspectRatio": "שמור על יחס רוחב-גובה", - "autoSwitchNewImages": "החלף אוטומטית לתמונות חדשות", - "singleColumnLayout": "תצוגת עמודה אחת", - "allImagesLoaded": "כל התמונות נטענו", - "loadMore": "טען עוד", - "noImagesInGallery": "אין תמונות בגלריה", - "galleryImageResetSize": "איפוס גודל", - "generations": "דורות", - "showGenerations": "הצג דורות", - "showUploads": "הצג העלאות" - }, - "parameters": { - "images": "תמונות", - "steps": "צעדים", - "cfgScale": "סולם CFG", - "width": "רוחב", - "height": "גובה", - "seed": "זרע", - "imageToImage": "תמונה לתמונה", - "randomizeSeed": "זרע אקראי", - "variationAmount": "כמות וריאציה", - "seedWeights": "משקלי זרע", - "faceRestoration": "שחזור פנים", - "restoreFaces": "שחזר פנים", - "type": "סוג", - "strength": "חוזק", - "upscale": "הגדלת קנה מידה", - "upscaleImage": "הגדלת קנה מידת התמונה", - "denoisingStrength": "חוזק מנטרל הרעש", - "otherOptions": "אפשרויות אחרות", - "hiresOptim": "אופטימיזצית רזולוציה גבוהה", - "hiresStrength": "חוזק רזולוציה גבוהה", - "codeformerFidelity": "דבקות", - "scaleBeforeProcessing": "שנה קנה מידה לפני עיבוד", - "scaledWidth": "קנה מידה לאחר שינוי W", - "scaledHeight": "קנה מידה לאחר שינוי H", - "infillMethod": "שיטת מילוי", - "tileSize": "גודל אריח", - "boundingBoxHeader": "תיבה תוחמת", - "seamCorrectionHeader": "תיקון תפר", - "infillScalingHeader": "מילוי וקנה מידה", - "toggleLoopback": "הפעל לולאה חוזרת", - "symmetry": "סימטריה", - "vSymmetryStep": "צעד סימטריה V", - "hSymmetryStep": "צעד סימטריה H", - "cancel": { - "schedule": "ביטול לאחר האיטרציה הנוכחית", - "isScheduled": "מבטל", - "immediate": "ביטול מיידי", - "setType": "הגדר סוג ביטול" - }, - "sendTo": "שליחה אל", - "copyImage": "העתקת תמונה", - "downloadImage": "הורדת תמונה", - "sendToImg2Img": "שליחה לתמונה לתמונה", - "sendToUnifiedCanvas": "שליחה אל קנבס מאוחד", - "openInViewer": "פתח במציג", - "closeViewer": "סגור מציג", - "usePrompt": "שימוש בבקשה", - "useSeed": "שימוש בזרע", - "useAll": "שימוש בהכל", - "useInitImg": "שימוש בתמונה ראשונית", - "info": "פרטים", - "showOptionsPanel": "הצג חלונית אפשרויות", - "shuffle": "ערבוב", - "noiseThreshold": "סף רעש", - "perlinNoise": "רעש פרלין", - "variations": "וריאציות", - "imageFit": "התאמת תמונה ראשונית לגודל הפלט", - "general": "כללי", - "upscaling": "מגדיל את קנה מידה", - "scale": "סולם", - "seamlessTiling": "ריצוף חלק", - "img2imgStrength": "חוזק תמונה לתמונה", - "initialImage": "תמונה ראשונית", - "copyImageToLink": "העתקת תמונה לקישור" - }, - "settings": { - "models": "מודלים", - "displayInProgress": "הצגת תמונות בתהליך", - "confirmOnDelete": "אישור בעת המחיקה", - "useSlidersForAll": "שימוש במחוונים לכל האפשרויות", - "resetWebUI": "איפוס ממשק משתמש", - "resetWebUIDesc1": "איפוס ממשק המשתמש האינטרנטי מאפס רק את המטמון המקומי של הדפדפן של התמונות וההגדרות שנשמרו. זה לא מוחק תמונות מהדיסק.", - "resetComplete": "ממשק המשתמש אופס. יש לבצע רענון דף בכדי לטעון אותו מחדש.", - "enableImageDebugging": "הפעלת איתור באגים בתמונה", - "displayHelpIcons": "הצג סמלי עזרה", - "saveSteps": "שמירת תמונות כל n צעדים", - "resetWebUIDesc2": "אם תמונות לא מופיעות בגלריה או שמשהו אחר לא עובד, נא לנסות איפוס /או אתחול לפני שליחת תקלה ב-GitHub." - }, - "toast": { - "uploadFailed": "העלאה נכשלה", - "imageCopied": "התמונה הועתקה", - "imageLinkCopied": "קישור תמונה הועתק", - "imageNotLoadedDesc": "לא נמצאה תמונה לשליחה למודול תמונה לתמונה", - "imageSavedToGallery": "התמונה נשמרה בגלריה", - "canvasMerged": "קנבס מוזג", - "sentToImageToImage": "נשלח לתמונה לתמונה", - "sentToUnifiedCanvas": "נשלח אל קנבס מאוחד", - "parametersSet": "הגדרת פרמטרים", - "parametersNotSet": "פרמטרים לא הוגדרו", - "parametersNotSetDesc": "לא נמצאו מטא-נתונים עבור תמונה זו.", - "parametersFailedDesc": "לא ניתן לטעון תמונת התחלה.", - "seedSet": "זרע הוגדר", - "seedNotSetDesc": "לא ניתן היה למצוא זרע לתמונה זו.", - "promptNotSetDesc": "לא היתה אפשרות למצוא בקשה עבור תמונה זו.", - "metadataLoadFailed": "טעינת מטא-נתונים נכשלה", - "initialImageSet": "סט תמונה ראשוני", - "initialImageNotSet": "התמונה הראשונית לא הוגדרה", - "initialImageNotSetDesc": "לא ניתן היה לטעון את התמונה הראשונית", - "uploadFailedUnableToLoadDesc": "לא ניתן לטעון את הקובץ", - "tempFoldersEmptied": "התיקייה הזמנית רוקנה", - "downloadImageStarted": "הורדת התמונה החלה", - "imageNotLoaded": "לא נטענה תמונה", - "parametersFailed": "בעיה בטעינת פרמטרים", - "promptNotSet": "בקשה לא הוגדרה", - "upscalingFailed": "העלאת קנה המידה נכשלה", - "faceRestoreFailed": "שחזור הפנים נכשל", - "seedNotSet": "זרע לא הוגדר", - "promptSet": "בקשה הוגדרה" - }, - "tooltip": { - "feature": { - "gallery": "הגלריה מציגה יצירות מתיקיית הפלטים בעת יצירתם. ההגדרות מאוחסנות בתוך קבצים ונגישות באמצעות תפריט הקשר.", - "upscale": "השתמש ב-ESRGAN כדי להגדיל את התמונה מיד לאחר היצירה.", - "imageToImage": "תמונה לתמונה טוענת כל תמונה כראשונית, המשמשת לאחר מכן ליצירת תמונה חדשה יחד עם הבקשה. ככל שהערך גבוה יותר, כך תמונת התוצאה תשתנה יותר. ערכים מ- 0.0 עד 1.0 אפשריים, הטווח המומלץ הוא .25-.75", - "seamCorrection": "שליטה בטיפול בתפרים גלויים המתרחשים בין תמונות שנוצרו על בד הציור.", - "prompt": "זהו שדה הבקשה. הבקשה כוללת אובייקטי יצירה ומונחים סגנוניים. באפשרותך להוסיף משקל (חשיבות אסימון) גם בשורת הפקודה, אך פקודות ופרמטרים של CLI לא יפעלו.", - "variations": "נסה וריאציה עם ערך בין 0.1 ל- 1.0 כדי לשנות את התוצאה עבור זרע נתון. וריאציות מעניינות של הזרע הן בין 0.1 ל -0.3.", - "other": "אפשרויות אלה יאפשרו מצבי עיבוד חלופיים עבור ההרצה. 'ריצוף חלק' ייצור תבניות חוזרות בפלט. 'רזולוציה גבוהה' נוצר בשני שלבים עם img2img: השתמש בהגדרה זו כאשר אתה רוצה תמונה גדולה וקוהרנטית יותר ללא חפצים. פעולה זאת תקח יותר זמן מפעולת טקסט לתמונה רגילה.", - "faceCorrection": "תיקון פנים עם GFPGAN או Codeformer: האלגוריתם מזהה פרצופים בתמונה ומתקן כל פגם. ערך גבוה ישנה את התמונה יותר, וכתוצאה מכך הפרצופים יהיו אטרקטיביים יותר. Codeformer עם נאמנות גבוהה יותר משמר את התמונה המקורית על חשבון תיקון פנים חזק יותר.", - "seed": "ערך הזרע משפיע על הרעש הראשוני שממנו נוצרת התמונה. אתה יכול להשתמש בזרעים שכבר קיימים מתמונות קודמות. 'סף רעש' משמש להפחתת חפצים בערכי CFG גבוהים (נסה את טווח 0-10), ופרלין כדי להוסיף רעשי פרלין במהלך היצירה: שניהם משמשים להוספת וריאציה לתפוקות שלך.", - "infillAndScaling": "נהל שיטות מילוי (המשמשות באזורים עם מסיכה או אזורים שנמחקו בבד הציור) ושינוי קנה מידה (שימושי לגדלים קטנים של תיבות תוחמות).", - "boundingBox": "התיבה התוחמת זהה להגדרות 'רוחב' ו'גובה' עבור 'טקסט לתמונה' או 'תמונה לתמונה'. רק האזור בתיבה יעובד." - } - }, - "unifiedCanvas": { - "layer": "שכבה", - "base": "בסיס", - "maskingOptions": "אפשרויות מסכות", - "enableMask": "הפעלת מסיכה", - "colorPicker": "בוחר הצבעים", - "preserveMaskedArea": "שימור איזור ממוסך", - "clearMask": "ניקוי מסיכה", - "brush": "מברשת", - "eraser": "מחק", - "fillBoundingBox": "מילוי תיבה תוחמת", - "eraseBoundingBox": "מחק תיבה תוחמת", - "copyToClipboard": "העתק ללוח ההדבקה", - "downloadAsImage": "הורדה כתמונה", - "undo": "ביטול", - "redo": "ביצוע מחדש", - "clearCanvas": "ניקוי קנבס", - "showGrid": "הצגת רשת", - "snapToGrid": "הצמדה לרשת", - "darkenOutsideSelection": "הכהיית בחירה חיצונית", - "saveBoxRegionOnly": "שמירת איזור תיבה בלבד", - "limitStrokesToBox": "הגבלת משיכות לקופסא", - "showCanvasDebugInfo": "הצגת מידע איתור באגים בקנבס", - "clearCanvasHistory": "ניקוי הסטוריית קנבס", - "clearHistory": "ניקוי היסטוריה", - "clearCanvasHistoryConfirm": "האם את/ה בטוח/ה שברצונך לנקות את היסטוריית הקנבס?", - "emptyFolder": "ריקון תיקייה", - "emptyTempImagesFolderConfirm": "האם את/ה בטוח/ה שברצונך לרוקן את התיקיה הזמנית?", - "activeLayer": "שכבה פעילה", - "canvasScale": "קנה מידה של קנבס", - "betaLimitToBox": "הגבל לקופסא", - "betaDarkenOutside": "הכההת הבחוץ", - "canvasDimensions": "מידות קנבס", - "previous": "הקודם", - "next": "הבא", - "accept": "אישור", - "showHide": "הצג/הסתר", - "discardAll": "בטל הכל", - "betaClear": "איפוס", - "boundingBox": "תיבה תוחמת", - "scaledBoundingBox": "תיבה תוחמת לאחר שינוי קנה מידה", - "betaPreserveMasked": "שמר מסיכה", - "brushOptions": "אפשרויות מברשת", - "brushSize": "גודל", - "mergeVisible": "מיזוג תוכן גלוי", - "move": "הזזה", - "resetView": "איפוס תצוגה", - "saveToGallery": "שמור לגלריה", - "canvasSettings": "הגדרות קנבס", - "showIntermediates": "הצגת מתווכים", - "autoSaveToGallery": "שמירה אוטומטית בגלריה", - "emptyTempImageFolder": "ריקון תיקיית תמונות זמניות", - "clearCanvasHistoryMessage": "ניקוי היסטוריית הקנבס משאיר את הקנבס הנוכחי ללא שינוי, אך מנקה באופן בלתי הפיך את היסטוריית הביטול והביצוע מחדש.", - "emptyTempImagesFolderMessage": "ריקון תיקיית התמונה הזמנית גם מאפס באופן מלא את הקנבס המאוחד. זה כולל את כל היסטוריית הביטול/ביצוע מחדש, תמונות באזור ההערכות ושכבת הבסיס של בד הציור.", - "boundingBoxPosition": "מיקום תיבה תוחמת", - "canvasPosition": "מיקום קנבס", - "cursorPosition": "מיקום הסמן", - "mask": "מסכה" - } -} diff --git a/invokeai/frontend/web/dist/locales/it.json b/invokeai/frontend/web/dist/locales/it.json deleted file mode 100644 index 53b0339ae4..0000000000 --- a/invokeai/frontend/web/dist/locales/it.json +++ /dev/null @@ -1,1504 +0,0 @@ -{ - "common": { - "hotkeysLabel": "Tasti di scelta rapida", - "languagePickerLabel": "Lingua", - "reportBugLabel": "Segnala un errore", - "settingsLabel": "Impostazioni", - "img2img": "Immagine a Immagine", - "unifiedCanvas": "Tela unificata", - "nodes": "Editor del flusso di lavoro", - "langItalian": "Italiano", - "nodesDesc": "Attualmente è in fase di sviluppo un sistema basato su nodi per la generazione di immagini. Resta sintonizzato per gli aggiornamenti su questa fantastica funzionalità.", - "postProcessing": "Post-elaborazione", - "postProcessDesc1": "Invoke AI offre un'ampia varietà di funzionalità di post-elaborazione. Ampliamento Immagine e Restaura Volti sono già disponibili nell'interfaccia Web. È possibile accedervi dal menu 'Opzioni avanzate' delle schede 'Testo a Immagine' e 'Immagine a Immagine'. È inoltre possibile elaborare le immagini direttamente, utilizzando i pulsanti di azione dell'immagine sopra la visualizzazione dell'immagine corrente o nel visualizzatore.", - "postProcessDesc2": "Presto verrà rilasciata un'interfaccia utente dedicata per facilitare flussi di lavoro di post-elaborazione più avanzati.", - "postProcessDesc3": "L'interfaccia da riga di comando di 'Invoke AI' offre varie altre funzionalità tra cui Embiggen.", - "training": "Addestramento", - "trainingDesc1": "Un flusso di lavoro dedicato per addestrare i tuoi Incorporamenti e Checkpoint utilizzando Inversione Testuale e Dreambooth dall'interfaccia web.", - "trainingDesc2": "InvokeAI supporta già l'addestramento di incorporamenti personalizzati utilizzando l'inversione testuale tramite lo script principale.", - "upload": "Caricamento", - "close": "Chiudi", - "load": "Carica", - "back": "Indietro", - "statusConnected": "Collegato", - "statusDisconnected": "Disconnesso", - "statusError": "Errore", - "statusPreparing": "Preparazione", - "statusProcessingCanceled": "Elaborazione annullata", - "statusProcessingComplete": "Elaborazione completata", - "statusGenerating": "Generazione in corso", - "statusGeneratingTextToImage": "Generazione Testo a Immagine", - "statusGeneratingImageToImage": "Generazione da Immagine a Immagine", - "statusGeneratingInpainting": "Generazione Inpainting", - "statusGeneratingOutpainting": "Generazione Outpainting", - "statusGenerationComplete": "Generazione completata", - "statusIterationComplete": "Iterazione completata", - "statusSavingImage": "Salvataggio dell'immagine", - "statusRestoringFaces": "Restaura volti", - "statusRestoringFacesGFPGAN": "Restaura volti (GFPGAN)", - "statusRestoringFacesCodeFormer": "Restaura volti (CodeFormer)", - "statusUpscaling": "Ampliamento", - "statusUpscalingESRGAN": "Ampliamento (ESRGAN)", - "statusLoadingModel": "Caricamento del modello", - "statusModelChanged": "Modello cambiato", - "githubLabel": "GitHub", - "discordLabel": "Discord", - "langArabic": "Arabo", - "langEnglish": "Inglese", - "langFrench": "Francese", - "langGerman": "Tedesco", - "langJapanese": "Giapponese", - "langPolish": "Polacco", - "langBrPortuguese": "Portoghese Basiliano", - "langRussian": "Russo", - "langUkranian": "Ucraino", - "langSpanish": "Spagnolo", - "statusMergingModels": "Fusione Modelli", - "statusMergedModels": "Modelli fusi", - "langSimplifiedChinese": "Cinese semplificato", - "langDutch": "Olandese", - "statusModelConverted": "Modello Convertito", - "statusConvertingModel": "Conversione Modello", - "langKorean": "Coreano", - "langPortuguese": "Portoghese", - "loading": "Caricamento in corso", - "langHebrew": "Ebraico", - "loadingInvokeAI": "Caricamento Invoke AI", - "postprocessing": "Post Elaborazione", - "txt2img": "Testo a Immagine", - "accept": "Accetta", - "cancel": "Annulla", - "linear": "Lineare", - "generate": "Genera", - "random": "Casuale", - "openInNewTab": "Apri in una nuova scheda", - "areYouSure": "Sei sicuro?", - "dontAskMeAgain": "Non chiedermelo più", - "imagePrompt": "Prompt Immagine", - "darkMode": "Modalità scura", - "lightMode": "Modalità chiara", - "batch": "Gestione Lotto", - "modelManager": "Gestore modello", - "communityLabel": "Comunità", - "nodeEditor": "Editor dei nodi", - "statusProcessing": "Elaborazione in corso", - "advanced": "Avanzate", - "imageFailedToLoad": "Impossibile caricare l'immagine", - "learnMore": "Per saperne di più", - "ipAdapter": "Adattatore IP", - "t2iAdapter": "Adattatore T2I", - "controlAdapter": "Adattatore di Controllo", - "controlNet": "ControlNet", - "auto": "Automatico" - }, - "gallery": { - "generations": "Generazioni", - "showGenerations": "Mostra Generazioni", - "uploads": "Caricamenti", - "showUploads": "Mostra caricamenti", - "galleryImageSize": "Dimensione dell'immagine", - "galleryImageResetSize": "Ripristina dimensioni", - "gallerySettings": "Impostazioni della galleria", - "maintainAspectRatio": "Mantenere le proporzioni", - "autoSwitchNewImages": "Passaggio automatico a nuove immagini", - "singleColumnLayout": "Layout a colonna singola", - "allImagesLoaded": "Tutte le immagini caricate", - "loadMore": "Carica altro", - "noImagesInGallery": "Nessuna immagine da visualizzare", - "deleteImage": "Elimina l'immagine", - "deleteImagePermanent": "Le immagini eliminate non possono essere ripristinate.", - "deleteImageBin": "Le immagini eliminate verranno spostate nel Cestino del tuo sistema operativo.", - "images": "Immagini", - "assets": "Risorse", - "autoAssignBoardOnClick": "Assegna automaticamente la bacheca al clic", - "featuresWillReset": "Se elimini questa immagine, quelle funzionalità verranno immediatamente ripristinate.", - "loading": "Caricamento in corso", - "unableToLoad": "Impossibile caricare la Galleria", - "currentlyInUse": "Questa immagine è attualmente utilizzata nelle seguenti funzionalità:", - "copy": "Copia", - "download": "Scarica", - "setCurrentImage": "Imposta come immagine corrente", - "preparingDownload": "Preparazione del download", - "preparingDownloadFailed": "Problema durante la preparazione del download", - "downloadSelection": "Scarica gli elementi selezionati" - }, - "hotkeys": { - "keyboardShortcuts": "Tasti rapidi", - "appHotkeys": "Tasti di scelta rapida dell'applicazione", - "generalHotkeys": "Tasti di scelta rapida generali", - "galleryHotkeys": "Tasti di scelta rapida della galleria", - "unifiedCanvasHotkeys": "Tasti di scelta rapida Tela Unificata", - "invoke": { - "title": "Invoke", - "desc": "Genera un'immagine" - }, - "cancel": { - "title": "Annulla", - "desc": "Annulla la generazione dell'immagine" - }, - "focusPrompt": { - "title": "Metti a fuoco il Prompt", - "desc": "Mette a fuoco l'area di immissione del prompt" - }, - "toggleOptions": { - "title": "Attiva/disattiva le opzioni", - "desc": "Apre e chiude il pannello delle opzioni" - }, - "pinOptions": { - "title": "Appunta le opzioni", - "desc": "Blocca il pannello delle opzioni" - }, - "toggleViewer": { - "title": "Attiva/disattiva visualizzatore", - "desc": "Apre e chiude il visualizzatore immagini" - }, - "toggleGallery": { - "title": "Attiva/disattiva Galleria", - "desc": "Apre e chiude il pannello della galleria" - }, - "maximizeWorkSpace": { - "title": "Massimizza lo spazio di lavoro", - "desc": "Chiude i pannelli e massimizza l'area di lavoro" - }, - "changeTabs": { - "title": "Cambia scheda", - "desc": "Passa a un'altra area di lavoro" - }, - "consoleToggle": { - "title": "Attiva/disattiva console", - "desc": "Apre e chiude la console" - }, - "setPrompt": { - "title": "Imposta Prompt", - "desc": "Usa il prompt dell'immagine corrente" - }, - "setSeed": { - "title": "Imposta seme", - "desc": "Usa il seme dell'immagine corrente" - }, - "setParameters": { - "title": "Imposta parametri", - "desc": "Utilizza tutti i parametri dell'immagine corrente" - }, - "restoreFaces": { - "title": "Restaura volti", - "desc": "Restaura l'immagine corrente" - }, - "upscale": { - "title": "Amplia", - "desc": "Amplia l'immagine corrente" - }, - "showInfo": { - "title": "Mostra informazioni", - "desc": "Mostra le informazioni sui metadati dell'immagine corrente" - }, - "sendToImageToImage": { - "title": "Invia a Immagine a Immagine", - "desc": "Invia l'immagine corrente a da Immagine a Immagine" - }, - "deleteImage": { - "title": "Elimina immagine", - "desc": "Elimina l'immagine corrente" - }, - "closePanels": { - "title": "Chiudi pannelli", - "desc": "Chiude i pannelli aperti" - }, - "previousImage": { - "title": "Immagine precedente", - "desc": "Visualizza l'immagine precedente nella galleria" - }, - "nextImage": { - "title": "Immagine successiva", - "desc": "Visualizza l'immagine successiva nella galleria" - }, - "toggleGalleryPin": { - "title": "Attiva/disattiva il blocco della galleria", - "desc": "Blocca/sblocca la galleria dall'interfaccia utente" - }, - "increaseGalleryThumbSize": { - "title": "Aumenta dimensione immagini nella galleria", - "desc": "Aumenta la dimensione delle miniature della galleria" - }, - "decreaseGalleryThumbSize": { - "title": "Riduci dimensione immagini nella galleria", - "desc": "Riduce le dimensioni delle miniature della galleria" - }, - "selectBrush": { - "title": "Seleziona Pennello", - "desc": "Seleziona il pennello della tela" - }, - "selectEraser": { - "title": "Seleziona Cancellino", - "desc": "Seleziona il cancellino della tela" - }, - "decreaseBrushSize": { - "title": "Riduci la dimensione del pennello", - "desc": "Riduce la dimensione del pennello/cancellino della tela" - }, - "increaseBrushSize": { - "title": "Aumenta la dimensione del pennello", - "desc": "Aumenta la dimensione del pennello/cancellino della tela" - }, - "decreaseBrushOpacity": { - "title": "Riduci l'opacità del pennello", - "desc": "Diminuisce l'opacità del pennello della tela" - }, - "increaseBrushOpacity": { - "title": "Aumenta l'opacità del pennello", - "desc": "Aumenta l'opacità del pennello della tela" - }, - "moveTool": { - "title": "Strumento Sposta", - "desc": "Consente la navigazione nella tela" - }, - "fillBoundingBox": { - "title": "Riempi riquadro di selezione", - "desc": "Riempie il riquadro di selezione con il colore del pennello" - }, - "eraseBoundingBox": { - "title": "Cancella riquadro di selezione", - "desc": "Cancella l'area del riquadro di selezione" - }, - "colorPicker": { - "title": "Seleziona Selettore colore", - "desc": "Seleziona il selettore colore della tela" - }, - "toggleSnap": { - "title": "Attiva/disattiva Aggancia", - "desc": "Attiva/disattiva Aggancia alla griglia" - }, - "quickToggleMove": { - "title": "Attiva/disattiva Sposta rapido", - "desc": "Attiva/disattiva temporaneamente la modalità Sposta" - }, - "toggleLayer": { - "title": "Attiva/disattiva livello", - "desc": "Attiva/disattiva la selezione del livello base/maschera" - }, - "clearMask": { - "title": "Cancella maschera", - "desc": "Cancella l'intera maschera" - }, - "hideMask": { - "title": "Nascondi maschera", - "desc": "Nasconde e mostra la maschera" - }, - "showHideBoundingBox": { - "title": "Mostra/Nascondi riquadro di selezione", - "desc": "Attiva/disattiva la visibilità del riquadro di selezione" - }, - "mergeVisible": { - "title": "Fondi il visibile", - "desc": "Fonde tutti gli strati visibili della tela" - }, - "saveToGallery": { - "title": "Salva nella galleria", - "desc": "Salva la tela corrente nella galleria" - }, - "copyToClipboard": { - "title": "Copia negli appunti", - "desc": "Copia la tela corrente negli appunti" - }, - "downloadImage": { - "title": "Scarica l'immagine", - "desc": "Scarica la tela corrente" - }, - "undoStroke": { - "title": "Annulla tratto", - "desc": "Annulla una pennellata" - }, - "redoStroke": { - "title": "Ripeti tratto", - "desc": "Ripeti una pennellata" - }, - "resetView": { - "title": "Reimposta vista", - "desc": "Ripristina la visualizzazione della tela" - }, - "previousStagingImage": { - "title": "Immagine della sessione precedente", - "desc": "Immagine dell'area della sessione precedente" - }, - "nextStagingImage": { - "title": "Immagine della sessione successivo", - "desc": "Immagine dell'area della sessione successiva" - }, - "acceptStagingImage": { - "title": "Accetta l'immagine della sessione", - "desc": "Accetta l'immagine dell'area della sessione corrente" - }, - "nodesHotkeys": "Tasti di scelta rapida dei Nodi", - "addNodes": { - "title": "Aggiungi Nodi", - "desc": "Apre il menu Aggiungi Nodi" - } - }, - "modelManager": { - "modelManager": "Gestione Modelli", - "model": "Modello", - "allModels": "Tutti i Modelli", - "checkpointModels": "Checkpoint", - "diffusersModels": "Diffusori", - "safetensorModels": "SafeTensor", - "modelAdded": "Modello Aggiunto", - "modelUpdated": "Modello Aggiornato", - "modelEntryDeleted": "Voce del modello eliminata", - "cannotUseSpaces": "Impossibile utilizzare gli spazi", - "addNew": "Aggiungi nuovo", - "addNewModel": "Aggiungi nuovo Modello", - "addCheckpointModel": "Aggiungi modello Checkpoint / Safetensor", - "addDiffuserModel": "Aggiungi Diffusori", - "addManually": "Aggiungi manualmente", - "manual": "Manuale", - "name": "Nome", - "nameValidationMsg": "Inserisci un nome per il modello", - "description": "Descrizione", - "descriptionValidationMsg": "Aggiungi una descrizione per il modello", - "config": "Configurazione", - "configValidationMsg": "Percorso del file di configurazione del modello.", - "modelLocation": "Posizione del modello", - "modelLocationValidationMsg": "Fornisci il percorso di una cartella locale in cui è archiviato il tuo modello di diffusori", - "repo_id": "Repo ID", - "repoIDValidationMsg": "Repository online del modello", - "vaeLocation": "Posizione file VAE", - "vaeLocationValidationMsg": "Percorso dove si trova il file VAE.", - "vaeRepoID": "VAE Repo ID", - "vaeRepoIDValidationMsg": "Repository online del file VAE", - "width": "Larghezza", - "widthValidationMsg": "Larghezza predefinita del modello.", - "height": "Altezza", - "heightValidationMsg": "Altezza predefinita del modello.", - "addModel": "Aggiungi modello", - "updateModel": "Aggiorna modello", - "availableModels": "Modelli disponibili", - "search": "Ricerca", - "load": "Carica", - "active": "attivo", - "notLoaded": "non caricato", - "cached": "memorizzato nella cache", - "checkpointFolder": "Cartella Checkpoint", - "clearCheckpointFolder": "Svuota cartella checkpoint", - "findModels": "Trova modelli", - "scanAgain": "Scansiona nuovamente", - "modelsFound": "Modelli trovati", - "selectFolder": "Seleziona cartella", - "selected": "Selezionato", - "selectAll": "Seleziona tutto", - "deselectAll": "Deseleziona tutto", - "showExisting": "Mostra esistenti", - "addSelected": "Aggiungi selezionato", - "modelExists": "Il modello esiste", - "selectAndAdd": "Seleziona e aggiungi i modelli elencati", - "noModelsFound": "Nessun modello trovato", - "delete": "Elimina", - "deleteModel": "Elimina modello", - "deleteConfig": "Elimina configurazione", - "deleteMsg1": "Sei sicuro di voler eliminare questo modello da InvokeAI?", - "deleteMsg2": "Questo eliminerà il modello dal disco se si trova nella cartella principale di InvokeAI. Se utilizzi una cartella personalizzata, il modello NON verrà eliminato dal disco.", - "formMessageDiffusersModelLocation": "Ubicazione modelli diffusori", - "formMessageDiffusersModelLocationDesc": "Inseriscine almeno uno.", - "formMessageDiffusersVAELocation": "Ubicazione file VAE", - "formMessageDiffusersVAELocationDesc": "Se non fornito, InvokeAI cercherà il file VAE all'interno dell'ubicazione del modello sopra indicata.", - "convert": "Converti", - "convertToDiffusers": "Converti in Diffusori", - "convertToDiffusersHelpText2": "Questo processo sostituirà la voce in Gestione Modelli con la versione Diffusori dello stesso modello.", - "convertToDiffusersHelpText4": "Questo è un processo una tantum. Potrebbero essere necessari circa 30-60 secondi a seconda delle specifiche del tuo computer.", - "convertToDiffusersHelpText5": "Assicurati di avere spazio su disco sufficiente. I modelli generalmente variano tra 2 GB e 7 GB di dimensioni.", - "convertToDiffusersHelpText6": "Vuoi convertire questo modello?", - "convertToDiffusersSaveLocation": "Ubicazione salvataggio", - "inpainting": "v1 Inpainting", - "customConfig": "Configurazione personalizzata", - "statusConverting": "Conversione in corso", - "modelConverted": "Modello convertito", - "sameFolder": "Stessa cartella", - "invokeRoot": "Cartella InvokeAI", - "merge": "Unisci", - "modelsMerged": "Modelli uniti", - "mergeModels": "Unisci Modelli", - "modelOne": "Modello 1", - "modelTwo": "Modello 2", - "mergedModelName": "Nome del modello unito", - "alpha": "Alpha", - "interpolationType": "Tipo di interpolazione", - "mergedModelCustomSaveLocation": "Percorso personalizzato", - "invokeAIFolder": "Cartella Invoke AI", - "ignoreMismatch": "Ignora le discrepanze tra i modelli selezionati", - "modelMergeHeaderHelp2": "Solo i diffusori sono disponibili per l'unione. Se desideri unire un modello Checkpoint, convertilo prima in Diffusori.", - "modelMergeInterpAddDifferenceHelp": "In questa modalità, il Modello 3 viene prima sottratto dal Modello 2. La versione risultante viene unita al Modello 1 con il tasso Alpha impostato sopra.", - "mergedModelSaveLocation": "Ubicazione salvataggio", - "convertToDiffusersHelpText1": "Questo modello verrà convertito nel formato 🧨 Diffusore.", - "custom": "Personalizzata", - "convertToDiffusersHelpText3": "Il file checkpoint su disco SARÀ eliminato se si trova nella cartella principale di InvokeAI. Se si trova in una posizione personalizzata, NON verrà eliminato.", - "v1": "v1", - "pathToCustomConfig": "Percorso alla configurazione personalizzata", - "modelThree": "Modello 3", - "modelMergeHeaderHelp1": "Puoi unire fino a tre diversi modelli per creare una miscela adatta alle tue esigenze.", - "modelMergeAlphaHelp": "Il valore Alpha controlla la forza di miscelazione dei modelli. Valori Alpha più bassi attenuano l'influenza del secondo modello.", - "customSaveLocation": "Ubicazione salvataggio personalizzata", - "weightedSum": "Somma pesata", - "sigmoid": "Sigmoide", - "inverseSigmoid": "Sigmoide inverso", - "v2_base": "v2 (512px)", - "v2_768": "v2 (768px)", - "none": "nessuno", - "addDifference": "Aggiungi differenza", - "pickModelType": "Scegli il tipo di modello", - "scanForModels": "Cerca modelli", - "variant": "Variante", - "baseModel": "Modello Base", - "vae": "VAE", - "modelUpdateFailed": "Aggiornamento del modello non riuscito", - "modelConversionFailed": "Conversione del modello non riuscita", - "modelsMergeFailed": "Unione modelli non riuscita", - "selectModel": "Seleziona Modello", - "modelDeleted": "Modello eliminato", - "modelDeleteFailed": "Impossibile eliminare il modello", - "noCustomLocationProvided": "Nessuna posizione personalizzata fornita", - "convertingModelBegin": "Conversione del modello. Attendere prego.", - "importModels": "Importa modelli", - "modelsSynced": "Modelli sincronizzati", - "modelSyncFailed": "Sincronizzazione modello non riuscita", - "settings": "Impostazioni", - "syncModels": "Sincronizza Modelli", - "syncModelsDesc": "Se i tuoi modelli non sono sincronizzati con il back-end, puoi aggiornarli utilizzando questa opzione. Questo è generalmente utile nei casi in cui aggiorni manualmente il tuo file models.yaml o aggiungi modelli alla cartella principale di InvokeAI dopo l'avvio dell'applicazione.", - "loraModels": "LoRA", - "oliveModels": "Olive", - "onnxModels": "ONNX", - "noModels": "Nessun modello trovato", - "predictionType": "Tipo di previsione (per modelli Stable Diffusion 2.x ed alcuni modelli Stable Diffusion 1.x)", - "quickAdd": "Aggiunta rapida", - "simpleModelDesc": "Fornire un percorso a un modello diffusori locale, un modello checkpoint/safetensor locale, un ID repository HuggingFace o un URL del modello checkpoint/diffusori.", - "advanced": "Avanzate", - "useCustomConfig": "Utilizza configurazione personalizzata", - "closeAdvanced": "Chiudi Avanzate", - "modelType": "Tipo di modello", - "customConfigFileLocation": "Posizione del file di configurazione personalizzato", - "vaePrecision": "Precisione VAE" - }, - "parameters": { - "images": "Immagini", - "steps": "Passi", - "cfgScale": "Scala CFG", - "width": "Larghezza", - "height": "Altezza", - "seed": "Seme", - "randomizeSeed": "Seme randomizzato", - "shuffle": "Mescola il seme", - "noiseThreshold": "Soglia del rumore", - "perlinNoise": "Rumore Perlin", - "variations": "Variazioni", - "variationAmount": "Quantità di variazione", - "seedWeights": "Pesi dei semi", - "faceRestoration": "Restauro volti", - "restoreFaces": "Restaura volti", - "type": "Tipo", - "strength": "Forza", - "upscaling": "Ampliamento", - "upscale": "Amplia (Shift + U)", - "upscaleImage": "Amplia Immagine", - "scale": "Scala", - "otherOptions": "Altre opzioni", - "seamlessTiling": "Piastrella senza cuciture", - "hiresOptim": "Ottimizzazione alta risoluzione", - "imageFit": "Adatta l'immagine iniziale alle dimensioni di output", - "codeformerFidelity": "Fedeltà", - "scaleBeforeProcessing": "Scala prima dell'elaborazione", - "scaledWidth": "Larghezza ridimensionata", - "scaledHeight": "Altezza ridimensionata", - "infillMethod": "Metodo di riempimento", - "tileSize": "Dimensione piastrella", - "boundingBoxHeader": "Rettangolo di selezione", - "seamCorrectionHeader": "Correzione della cucitura", - "infillScalingHeader": "Riempimento e ridimensionamento", - "img2imgStrength": "Forza da Immagine a Immagine", - "toggleLoopback": "Attiva/disattiva elaborazione ricorsiva", - "sendTo": "Invia a", - "sendToImg2Img": "Invia a Immagine a Immagine", - "sendToUnifiedCanvas": "Invia a Tela Unificata", - "copyImageToLink": "Copia l'immagine nel collegamento", - "downloadImage": "Scarica l'immagine", - "openInViewer": "Apri nel visualizzatore", - "closeViewer": "Chiudi visualizzatore", - "usePrompt": "Usa Prompt", - "useSeed": "Usa Seme", - "useAll": "Usa Tutto", - "useInitImg": "Usa l'immagine iniziale", - "info": "Informazioni", - "initialImage": "Immagine iniziale", - "showOptionsPanel": "Mostra il pannello laterale (O o T)", - "general": "Generale", - "denoisingStrength": "Forza di riduzione del rumore", - "copyImage": "Copia immagine", - "hiresStrength": "Forza Alta Risoluzione", - "imageToImage": "Immagine a Immagine", - "cancel": { - "schedule": "Annulla dopo l'iterazione corrente", - "isScheduled": "Annullamento", - "setType": "Imposta il tipo di annullamento", - "immediate": "Annulla immediatamente", - "cancel": "Annulla" - }, - "hSymmetryStep": "Passi Simmetria Orizzontale", - "vSymmetryStep": "Passi Simmetria Verticale", - "symmetry": "Simmetria", - "hidePreview": "Nascondi l'anteprima", - "showPreview": "Mostra l'anteprima", - "noiseSettings": "Rumore", - "seamlessXAxis": "Asse X", - "seamlessYAxis": "Asse Y", - "scheduler": "Campionatore", - "boundingBoxWidth": "Larghezza riquadro di delimitazione", - "boundingBoxHeight": "Altezza riquadro di delimitazione", - "positivePromptPlaceholder": "Prompt Positivo", - "negativePromptPlaceholder": "Prompt Negativo", - "controlNetControlMode": "Modalità di controllo", - "clipSkip": "CLIP Skip", - "aspectRatio": "Proporzioni", - "maskAdjustmentsHeader": "Regolazioni della maschera", - "maskBlur": "Sfocatura", - "maskBlurMethod": "Metodo di sfocatura", - "seamLowThreshold": "Basso", - "seamHighThreshold": "Alto", - "coherencePassHeader": "Passaggio di coerenza", - "coherenceSteps": "Passi", - "coherenceStrength": "Forza", - "compositingSettingsHeader": "Impostazioni di composizione", - "patchmatchDownScaleSize": "Ridimensiona", - "coherenceMode": "Modalità", - "invoke": { - "noNodesInGraph": "Nessun nodo nel grafico", - "noModelSelected": "Nessun modello selezionato", - "noPrompts": "Nessun prompt generato", - "noInitialImageSelected": "Nessuna immagine iniziale selezionata", - "readyToInvoke": "Pronto per invocare", - "addingImagesTo": "Aggiungi immagini a", - "systemBusy": "Sistema occupato", - "unableToInvoke": "Impossibile invocare", - "systemDisconnected": "Sistema disconnesso", - "noControlImageForControlAdapter": "L'adattatore di controllo #{{number}} non ha un'immagine di controllo", - "noModelForControlAdapter": "Nessun modello selezionato per l'adattatore di controllo #{{number}}.", - "incompatibleBaseModelForControlAdapter": "Il modello dell'adattatore di controllo #{{number}} non è compatibile con il modello principale.", - "missingNodeTemplate": "Modello di nodo mancante", - "missingInputForField": "{{nodeLabel}} -> {{fieldLabel}} ingresso mancante", - "missingFieldTemplate": "Modello di campo mancante" - }, - "enableNoiseSettings": "Abilita le impostazioni del rumore", - "cpuNoise": "Rumore CPU", - "gpuNoise": "Rumore GPU", - "useCpuNoise": "Usa la CPU per generare rumore", - "manualSeed": "Seme manuale", - "randomSeed": "Seme casuale", - "iterations": "Iterazioni", - "iterationsWithCount_one": "{{count}} Iterazione", - "iterationsWithCount_many": "{{count}} Iterazioni", - "iterationsWithCount_other": "{{count}} Iterazioni", - "seamlessX&Y": "Senza cuciture X & Y", - "isAllowedToUpscale": { - "useX2Model": "L'immagine è troppo grande per l'ampliamento con il modello x4, utilizza il modello x2", - "tooLarge": "L'immagine è troppo grande per l'ampliamento, seleziona un'immagine più piccola" - }, - "seamlessX": "Senza cuciture X", - "seamlessY": "Senza cuciture Y", - "imageActions": "Azioni Immagine", - "aspectRatioFree": "Libere" - }, - "settings": { - "models": "Modelli", - "displayInProgress": "Visualizza le immagini di avanzamento", - "saveSteps": "Salva le immagini ogni n passaggi", - "confirmOnDelete": "Conferma l'eliminazione", - "displayHelpIcons": "Visualizza le icone della Guida", - "enableImageDebugging": "Abilita il debug dell'immagine", - "resetWebUI": "Reimposta l'interfaccia utente Web", - "resetWebUIDesc1": "Il ripristino dell'interfaccia utente Web reimposta solo la cache locale del browser delle immagini e le impostazioni memorizzate. Non cancella alcuna immagine dal disco.", - "resetWebUIDesc2": "Se le immagini non vengono visualizzate nella galleria o qualcos'altro non funziona, prova a reimpostare prima di segnalare un problema su GitHub.", - "resetComplete": "L'interfaccia utente Web è stata reimpostata.", - "useSlidersForAll": "Usa i cursori per tutte le opzioni", - "general": "Generale", - "consoleLogLevel": "Livello del registro", - "shouldLogToConsole": "Registrazione della console", - "developer": "Sviluppatore", - "antialiasProgressImages": "Anti aliasing delle immagini di avanzamento", - "showProgressInViewer": "Mostra le immagini di avanzamento nel visualizzatore", - "generation": "Generazione", - "ui": "Interfaccia Utente", - "favoriteSchedulersPlaceholder": "Nessun campionatore preferito", - "favoriteSchedulers": "Campionatori preferiti", - "showAdvancedOptions": "Mostra Opzioni Avanzate", - "alternateCanvasLayout": "Layout alternativo della tela", - "beta": "Beta", - "enableNodesEditor": "Abilita l'editor dei nodi", - "experimental": "Sperimentale", - "autoChangeDimensions": "Aggiorna L/A alle impostazioni predefinite del modello in caso di modifica", - "clearIntermediates": "Cancella le immagini intermedie", - "clearIntermediatesDesc3": "Le immagini della galleria non verranno eliminate.", - "clearIntermediatesDesc2": "Le immagini intermedie sono sottoprodotti della generazione, diversi dalle immagini risultanti nella galleria. La cancellazione degli intermedi libererà spazio su disco.", - "intermediatesCleared_one": "Cancellata {{count}} immagine intermedia", - "intermediatesCleared_many": "Cancellate {{count}} immagini intermedie", - "intermediatesCleared_other": "Cancellate {{count}} immagini intermedie", - "clearIntermediatesDesc1": "La cancellazione delle immagini intermedie ripristinerà lo stato di Tela Unificata e ControlNet.", - "intermediatesClearedFailed": "Problema con la cancellazione delle immagini intermedie", - "clearIntermediatesWithCount_one": "Cancella {{count}} immagine intermedia", - "clearIntermediatesWithCount_many": "Cancella {{count}} immagini intermedie", - "clearIntermediatesWithCount_other": "Cancella {{count}} immagini intermedie", - "clearIntermediatesDisabled": "La coda deve essere vuota per cancellare le immagini intermedie" - }, - "toast": { - "tempFoldersEmptied": "Cartella temporanea svuotata", - "uploadFailed": "Caricamento fallito", - "uploadFailedUnableToLoadDesc": "Impossibile caricare il file", - "downloadImageStarted": "Download dell'immagine avviato", - "imageCopied": "Immagine copiata", - "imageLinkCopied": "Collegamento immagine copiato", - "imageNotLoaded": "Nessuna immagine caricata", - "imageNotLoadedDesc": "Impossibile trovare l'immagine", - "imageSavedToGallery": "Immagine salvata nella Galleria", - "canvasMerged": "Tela unita", - "sentToImageToImage": "Inviato a Immagine a Immagine", - "sentToUnifiedCanvas": "Inviato a Tela Unificata", - "parametersSet": "Parametri impostati", - "parametersNotSet": "Parametri non impostati", - "parametersNotSetDesc": "Nessun metadato trovato per questa immagine.", - "parametersFailed": "Problema durante il caricamento dei parametri", - "parametersFailedDesc": "Impossibile caricare l'immagine iniziale.", - "seedSet": "Seme impostato", - "seedNotSet": "Seme non impostato", - "seedNotSetDesc": "Impossibile trovare il seme per questa immagine.", - "promptSet": "Prompt impostato", - "promptNotSet": "Prompt non impostato", - "promptNotSetDesc": "Impossibile trovare il prompt per questa immagine.", - "upscalingFailed": "Ampliamento non riuscito", - "faceRestoreFailed": "Restauro facciale non riuscito", - "metadataLoadFailed": "Impossibile caricare i metadati", - "initialImageSet": "Immagine iniziale impostata", - "initialImageNotSet": "Immagine iniziale non impostata", - "initialImageNotSetDesc": "Impossibile caricare l'immagine iniziale", - "serverError": "Errore del Server", - "disconnected": "Disconnesso dal Server", - "connected": "Connesso al Server", - "canceled": "Elaborazione annullata", - "problemCopyingImageLink": "Impossibile copiare il collegamento dell'immagine", - "uploadFailedInvalidUploadDesc": "Deve essere una singola immagine PNG o JPEG", - "parameterSet": "Parametro impostato", - "parameterNotSet": "Parametro non impostato", - "nodesLoadedFailed": "Impossibile caricare i nodi", - "nodesSaved": "Nodi salvati", - "nodesLoaded": "Nodi caricati", - "nodesCleared": "Nodi cancellati", - "problemCopyingImage": "Impossibile copiare l'immagine", - "nodesNotValidGraph": "Grafico del nodo InvokeAI non valido", - "nodesCorruptedGraph": "Impossibile caricare. Il grafico sembra essere danneggiato.", - "nodesUnrecognizedTypes": "Impossibile caricare. Il grafico ha tipi di dati non riconosciuti", - "nodesNotValidJSON": "JSON non valido", - "nodesBrokenConnections": "Impossibile caricare. Alcune connessioni sono interrotte.", - "baseModelChangedCleared_one": "Il modello base è stato modificato, cancellato o disabilitato {{count}} sotto-modello incompatibile", - "baseModelChangedCleared_many": "Il modello base è stato modificato, cancellato o disabilitato {{count}} sotto-modelli incompatibili", - "baseModelChangedCleared_other": "Il modello base è stato modificato, cancellato o disabilitato {{count}} sotto-modelli incompatibili", - "imageSavingFailed": "Salvataggio dell'immagine non riuscito", - "canvasSentControlnetAssets": "Tela inviata a ControlNet & Risorse", - "problemCopyingCanvasDesc": "Impossibile copiare la tela", - "loadedWithWarnings": "Flusso di lavoro caricato con avvisi", - "canvasCopiedClipboard": "Tela copiata negli appunti", - "maskSavedAssets": "Maschera salvata nelle risorse", - "modelAddFailed": "Aggiunta del modello non riuscita", - "problemDownloadingCanvas": "Problema durante il download della tela", - "problemMergingCanvas": "Problema nell'unione delle tele", - "imageUploaded": "Immagine caricata", - "addedToBoard": "Aggiunto alla bacheca", - "modelAddedSimple": "Modello aggiunto", - "problemImportingMaskDesc": "Impossibile importare la maschera", - "problemCopyingCanvas": "Problema durante la copia della tela", - "problemSavingCanvas": "Problema nel salvataggio della tela", - "canvasDownloaded": "Tela scaricata", - "problemMergingCanvasDesc": "Impossibile unire le tele", - "problemDownloadingCanvasDesc": "Impossibile scaricare la tela", - "imageSaved": "Immagine salvata", - "maskSentControlnetAssets": "Maschera inviata a ControlNet & Risorse", - "canvasSavedGallery": "Tela salvata nella Galleria", - "imageUploadFailed": "Caricamento immagine non riuscito", - "modelAdded": "Modello aggiunto: {{modelName}}", - "problemImportingMask": "Problema durante l'importazione della maschera", - "setInitialImage": "Imposta come immagine iniziale", - "setControlImage": "Imposta come immagine di controllo", - "setNodeField": "Imposta come campo nodo", - "problemSavingMask": "Problema nel salvataggio della maschera", - "problemSavingCanvasDesc": "Impossibile salvare la tela", - "setCanvasInitialImage": "Imposta come immagine iniziale della tela", - "workflowLoaded": "Flusso di lavoro caricato", - "setIPAdapterImage": "Imposta come immagine per l'Adattatore IP", - "problemSavingMaskDesc": "Impossibile salvare la maschera" - }, - "tooltip": { - "feature": { - "prompt": "Questo è il campo del prompt. Il prompt include oggetti di generazione e termini stilistici. Puoi anche aggiungere il peso (importanza del token) nel prompt, ma i comandi e i parametri dell'interfaccia a linea di comando non funzioneranno.", - "gallery": "Galleria visualizza le generazioni dalla cartella degli output man mano che vengono create. Le impostazioni sono memorizzate all'interno di file e accessibili dal menu contestuale.", - "other": "Queste opzioni abiliteranno modalità di elaborazione alternative per Invoke. 'Piastrella senza cuciture' creerà modelli ripetuti nell'output. 'Ottimizzazione Alta risoluzione' è la generazione in due passaggi con 'Immagine a Immagine': usa questa impostazione quando vuoi un'immagine più grande e più coerente senza artefatti. Ci vorrà più tempo del solito 'Testo a Immagine'.", - "seed": "Il valore del Seme influenza il rumore iniziale da cui è formata l'immagine. Puoi usare i semi già esistenti dalle immagini precedenti. 'Soglia del rumore' viene utilizzato per mitigare gli artefatti a valori CFG elevati (provare l'intervallo 0-10) e Perlin per aggiungere il rumore Perlin durante la generazione: entrambi servono per aggiungere variazioni ai risultati.", - "variations": "Prova una variazione con un valore compreso tra 0.1 e 1.0 per modificare il risultato per un dato seme. Variazioni interessanti del seme sono comprese tra 0.1 e 0.3.", - "upscale": "Utilizza ESRGAN per ingrandire l'immagine subito dopo la generazione.", - "faceCorrection": "Correzione del volto con GFPGAN o Codeformer: l'algoritmo rileva i volti nell'immagine e corregge eventuali difetti. Un valore alto cambierà maggiormente l'immagine, dando luogo a volti più attraenti. Codeformer con una maggiore fedeltà preserva l'immagine originale a scapito di una correzione facciale più forte.", - "imageToImage": "Da Immagine a Immagine carica qualsiasi immagine come iniziale, che viene quindi utilizzata per generarne una nuova in base al prompt. Più alto è il valore, più cambierà l'immagine risultante. Sono possibili valori da 0.0 a 1.0, l'intervallo consigliato è 0.25-0.75", - "boundingBox": "Il riquadro di selezione è lo stesso delle impostazioni Larghezza e Altezza per da Testo a Immagine o da Immagine a Immagine. Verrà elaborata solo l'area nella casella.", - "seamCorrection": "Controlla la gestione delle giunzioni visibili che si verificano tra le immagini generate sulla tela.", - "infillAndScaling": "Gestisce i metodi di riempimento (utilizzati su aree mascherate o cancellate dell'area di disegno) e il ridimensionamento (utile per i riquadri di selezione di piccole dimensioni)." - } - }, - "unifiedCanvas": { - "layer": "Livello", - "base": "Base", - "mask": "Maschera", - "maskingOptions": "Opzioni di mascheramento", - "enableMask": "Abilita maschera", - "preserveMaskedArea": "Mantieni area mascherata", - "clearMask": "Elimina la maschera", - "brush": "Pennello", - "eraser": "Cancellino", - "fillBoundingBox": "Riempi rettangolo di selezione", - "eraseBoundingBox": "Cancella rettangolo di selezione", - "colorPicker": "Selettore Colore", - "brushOptions": "Opzioni pennello", - "brushSize": "Dimensioni", - "move": "Sposta", - "resetView": "Reimposta vista", - "mergeVisible": "Fondi il visibile", - "saveToGallery": "Salva nella galleria", - "copyToClipboard": "Copia negli appunti", - "downloadAsImage": "Scarica come immagine", - "undo": "Annulla", - "redo": "Ripeti", - "clearCanvas": "Cancella la Tela", - "canvasSettings": "Impostazioni Tela", - "showIntermediates": "Mostra intermedi", - "showGrid": "Mostra griglia", - "snapToGrid": "Aggancia alla griglia", - "darkenOutsideSelection": "Scurisci l'esterno della selezione", - "autoSaveToGallery": "Salvataggio automatico nella Galleria", - "saveBoxRegionOnly": "Salva solo l'area di selezione", - "limitStrokesToBox": "Limita i tratti all'area di selezione", - "showCanvasDebugInfo": "Mostra ulteriori informazioni sulla Tela", - "clearCanvasHistory": "Cancella cronologia Tela", - "clearHistory": "Cancella la cronologia", - "clearCanvasHistoryMessage": "La cancellazione della cronologia della tela lascia intatta la tela corrente, ma cancella in modo irreversibile la cronologia degli annullamenti e dei ripristini.", - "clearCanvasHistoryConfirm": "Sei sicuro di voler cancellare la cronologia della Tela?", - "emptyTempImageFolder": "Svuota la cartella delle immagini temporanee", - "emptyFolder": "Svuota la cartella", - "emptyTempImagesFolderMessage": "Lo svuotamento della cartella delle immagini temporanee ripristina completamente anche la Tela Unificata. Ciò include tutta la cronologia di annullamento/ripristino, le immagini nell'area di staging e il livello di base della tela.", - "emptyTempImagesFolderConfirm": "Sei sicuro di voler svuotare la cartella temporanea?", - "activeLayer": "Livello attivo", - "canvasScale": "Scala della Tela", - "boundingBox": "Rettangolo di selezione", - "scaledBoundingBox": "Rettangolo di selezione scalato", - "boundingBoxPosition": "Posizione del Rettangolo di selezione", - "canvasDimensions": "Dimensioni della Tela", - "canvasPosition": "Posizione Tela", - "cursorPosition": "Posizione del cursore", - "previous": "Precedente", - "next": "Successivo", - "accept": "Accetta", - "showHide": "Mostra/nascondi", - "discardAll": "Scarta tutto", - "betaClear": "Svuota", - "betaDarkenOutside": "Oscura all'esterno", - "betaLimitToBox": "Limita al rettangolo", - "betaPreserveMasked": "Conserva quanto mascherato", - "antialiasing": "Anti aliasing", - "showResultsOn": "Mostra i risultati (attivato)", - "showResultsOff": "Mostra i risultati (disattivato)" - }, - "accessibility": { - "modelSelect": "Seleziona modello", - "invokeProgressBar": "Barra di avanzamento generazione", - "uploadImage": "Carica immagine", - "previousImage": "Immagine precedente", - "nextImage": "Immagine successiva", - "useThisParameter": "Usa questo parametro", - "reset": "Reimposta", - "copyMetadataJson": "Copia i metadati JSON", - "exitViewer": "Esci dal visualizzatore", - "zoomIn": "Zoom avanti", - "zoomOut": "Zoom indietro", - "rotateCounterClockwise": "Ruotare in senso antiorario", - "rotateClockwise": "Ruotare in senso orario", - "flipHorizontally": "Capovolgi orizzontalmente", - "toggleLogViewer": "Attiva/disattiva visualizzatore registro", - "showOptionsPanel": "Mostra il pannello laterale", - "flipVertically": "Capovolgi verticalmente", - "toggleAutoscroll": "Attiva/disattiva lo scorrimento automatico", - "modifyConfig": "Modifica configurazione", - "menu": "Menu", - "showGalleryPanel": "Mostra il pannello Galleria", - "loadMore": "Carica altro" - }, - "ui": { - "hideProgressImages": "Nascondi avanzamento immagini", - "showProgressImages": "Mostra avanzamento immagini", - "swapSizes": "Scambia dimensioni", - "lockRatio": "Blocca le proporzioni" - }, - "nodes": { - "zoomOutNodes": "Rimpicciolire", - "hideGraphNodes": "Nascondi sovrapposizione grafico", - "hideLegendNodes": "Nascondi la legenda del tipo di campo", - "showLegendNodes": "Mostra legenda del tipo di campo", - "hideMinimapnodes": "Nascondi minimappa", - "showMinimapnodes": "Mostra minimappa", - "zoomInNodes": "Ingrandire", - "fitViewportNodes": "Adatta vista", - "showGraphNodes": "Mostra sovrapposizione grafico", - "resetWorkflowDesc2": "Reimpostare il flusso di lavoro cancellerà tutti i nodi, i bordi e i dettagli del flusso di lavoro.", - "reloadNodeTemplates": "Ricarica i modelli di nodo", - "loadWorkflow": "Importa flusso di lavoro JSON", - "resetWorkflow": "Reimposta flusso di lavoro", - "resetWorkflowDesc": "Sei sicuro di voler reimpostare questo flusso di lavoro?", - "downloadWorkflow": "Esporta flusso di lavoro JSON", - "scheduler": "Campionatore", - "addNode": "Aggiungi nodo", - "sDXLMainModelFieldDescription": "Campo del modello SDXL.", - "boardField": "Bacheca", - "animatedEdgesHelp": "Anima i bordi selezionati e i bordi collegati ai nodi selezionati", - "sDXLMainModelField": "Modello SDXL", - "executionStateInProgress": "In corso", - "executionStateError": "Errore", - "executionStateCompleted": "Completato", - "boardFieldDescription": "Una bacheca della galleria", - "addNodeToolTip": "Aggiungi nodo (Shift+A, Space)", - "sDXLRefinerModelField": "Modello Refiner", - "problemReadingMetadata": "Problema durante la lettura dei metadati dall'immagine", - "colorCodeEdgesHelp": "Bordi con codice colore in base ai campi collegati", - "animatedEdges": "Bordi animati", - "snapToGrid": "Aggancia alla griglia", - "validateConnections": "Convalida connessioni e grafico", - "validateConnectionsHelp": "Impedisce che vengano effettuate connessioni non valide e che vengano \"invocati\" grafici non validi", - "fullyContainNodesHelp": "I nodi devono essere completamente all'interno della casella di selezione per essere selezionati", - "fullyContainNodes": "Contenere completamente i nodi da selezionare", - "snapToGridHelp": "Aggancia i nodi alla griglia quando vengono spostati", - "workflowSettings": "Impostazioni Editor del flusso di lavoro", - "colorCodeEdges": "Bordi con codice colore", - "mainModelField": "Modello", - "noOutputRecorded": "Nessun output registrato", - "noFieldsLinearview": "Nessun campo aggiunto alla vista lineare", - "removeLinearView": "Rimuovi dalla vista lineare", - "workflowDescription": "Breve descrizione", - "workflowContact": "Contatto", - "workflowVersion": "Versione", - "workflow": "Flusso di lavoro", - "noWorkflow": "Nessun flusso di lavoro", - "workflowTags": "Tag", - "workflowValidation": "Errore di convalida del flusso di lavoro", - "workflowAuthor": "Autore", - "workflowName": "Nome", - "workflowNotes": "Note", - "unhandledInputProperty": "Proprietà di input non gestita", - "versionUnknown": " Versione sconosciuta", - "unableToValidateWorkflow": "Impossibile convalidare il flusso di lavoro", - "updateApp": "Aggiorna App", - "problemReadingWorkflow": "Problema durante la lettura del flusso di lavoro dall'immagine", - "unableToLoadWorkflow": "Impossibile caricare il flusso di lavoro", - "updateNode": "Aggiorna nodo", - "version": "Versione", - "notes": "Note", - "problemSettingTitle": "Problema nell'impostazione del titolo", - "unkownInvocation": "Tipo di invocazione sconosciuta", - "unknownTemplate": "Modello sconosciuto", - "nodeType": "Tipo di nodo", - "vaeField": "VAE", - "unhandledOutputProperty": "Proprietà di output non gestita", - "notesDescription": "Aggiunge note sul tuo flusso di lavoro", - "unknownField": "Campo sconosciuto", - "unknownNode": "Nodo sconosciuto", - "vaeFieldDescription": "Sotto modello VAE.", - "booleanPolymorphicDescription": "Una raccolta di booleani.", - "missingTemplate": "Modello mancante", - "outputSchemaNotFound": "Schema di output non trovato", - "colorFieldDescription": "Un colore RGBA.", - "maybeIncompatible": "Potrebbe essere incompatibile con quello installato", - "noNodeSelected": "Nessun nodo selezionato", - "colorPolymorphic": "Colore polimorfico", - "booleanCollectionDescription": "Una raccolta di booleani.", - "colorField": "Colore", - "nodeTemplate": "Modello di nodo", - "nodeOpacity": "Opacità del nodo", - "pickOne": "Sceglierne uno", - "outputField": "Campo di output", - "nodeSearch": "Cerca nodi", - "nodeOutputs": "Uscite del nodo", - "collectionItem": "Oggetto della raccolta", - "noConnectionInProgress": "Nessuna connessione in corso", - "noConnectionData": "Nessun dato di connessione", - "outputFields": "Campi di output", - "cannotDuplicateConnection": "Impossibile creare connessioni duplicate", - "booleanPolymorphic": "Polimorfico booleano", - "colorPolymorphicDescription": "Una collezione di colori polimorfici.", - "missingCanvaInitImage": "Immagine iniziale della tela mancante", - "clipFieldDescription": "Sottomodelli di tokenizzatore e codificatore di testo.", - "noImageFoundState": "Nessuna immagine iniziale trovata nello stato", - "clipField": "CLIP", - "noMatchingNodes": "Nessun nodo corrispondente", - "noFieldType": "Nessun tipo di campo", - "colorCollection": "Una collezione di colori.", - "noOutputSchemaName": "Nessun nome dello schema di output trovato nell'oggetto di riferimento", - "boolean": "Booleani", - "missingCanvaInitMaskImages": "Immagini di inizializzazione e maschera della tela mancanti", - "oNNXModelField": "Modello ONNX", - "node": "Nodo", - "booleanDescription": "I booleani sono veri o falsi.", - "collection": "Raccolta", - "cannotConnectInputToInput": "Impossibile collegare Input a Input", - "cannotConnectOutputToOutput": "Impossibile collegare Output ad Output", - "booleanCollection": "Raccolta booleana", - "cannotConnectToSelf": "Impossibile connettersi a se stesso", - "mismatchedVersion": "Ha una versione non corrispondente", - "outputNode": "Nodo di Output", - "loadingNodes": "Caricamento nodi...", - "oNNXModelFieldDescription": "Campo del modello ONNX.", - "denoiseMaskFieldDescription": "La maschera di riduzione del rumore può essere passata tra i nodi", - "floatCollectionDescription": "Una raccolta di numeri virgola mobile.", - "enum": "Enumeratore", - "float": "In virgola mobile", - "doesNotExist": "non esiste", - "currentImageDescription": "Visualizza l'immagine corrente nell'editor dei nodi", - "fieldTypesMustMatch": "I tipi di campo devono corrispondere", - "edge": "Bordo", - "enumDescription": "Gli enumeratori sono valori che possono essere una delle diverse opzioni.", - "denoiseMaskField": "Maschera riduzione rumore", - "currentImage": "Immagine corrente", - "floatCollection": "Raccolta in virgola mobile", - "inputField": "Campo di Input", - "controlFieldDescription": "Informazioni di controllo passate tra i nodi.", - "skippingUnknownOutputType": "Tipo di campo di output sconosciuto saltato", - "latentsFieldDescription": "Le immagini latenti possono essere passate tra i nodi.", - "ipAdapterPolymorphicDescription": "Una raccolta di adattatori IP.", - "latentsPolymorphicDescription": "Le immagini latenti possono essere passate tra i nodi.", - "ipAdapterCollection": "Raccolta Adattatori IP", - "conditioningCollection": "Raccolta condizionamenti", - "ipAdapterPolymorphic": "Adattatore IP Polimorfico", - "integerPolymorphicDescription": "Una raccolta di numeri interi.", - "conditioningCollectionDescription": "Il condizionamento può essere passato tra i nodi.", - "skippingReservedFieldType": "Tipo di campo riservato saltato", - "conditioningPolymorphic": "Condizionamento Polimorfico", - "integer": "Numero Intero", - "latentsCollection": "Raccolta Latenti", - "sourceNode": "Nodo di origine", - "integerDescription": "Gli interi sono numeri senza punto decimale.", - "stringPolymorphic": "Stringa polimorfica", - "conditioningPolymorphicDescription": "Il condizionamento può essere passato tra i nodi.", - "skipped": "Saltato", - "imagePolymorphic": "Immagine Polimorfica", - "imagePolymorphicDescription": "Una raccolta di immagini.", - "floatPolymorphic": "Numeri in virgola mobile Polimorfici", - "ipAdapterCollectionDescription": "Una raccolta di adattatori IP.", - "stringCollectionDescription": "Una raccolta di stringhe.", - "unableToParseNode": "Impossibile analizzare il nodo", - "controlCollection": "Raccolta di Controllo", - "stringCollection": "Raccolta di stringhe", - "inputMayOnlyHaveOneConnection": "L'ingresso può avere solo una connessione", - "ipAdapter": "Adattatore IP", - "integerCollection": "Raccolta di numeri interi", - "controlCollectionDescription": "Informazioni di controllo passate tra i nodi.", - "skippedReservedInput": "Campo di input riservato saltato", - "inputNode": "Nodo di Input", - "imageField": "Immagine", - "skippedReservedOutput": "Campo di output riservato saltato", - "integerCollectionDescription": "Una raccolta di numeri interi.", - "conditioningFieldDescription": "Il condizionamento può essere passato tra i nodi.", - "stringDescription": "Le stringhe sono testo.", - "integerPolymorphic": "Numero intero Polimorfico", - "ipAdapterModel": "Modello Adattatore IP", - "latentsPolymorphic": "Latenti polimorfici", - "skippingInputNoTemplate": "Campo di input senza modello saltato", - "ipAdapterDescription": "Un adattatore di prompt di immagini (Adattatore IP).", - "stringPolymorphicDescription": "Una raccolta di stringhe.", - "skippingUnknownInputType": "Tipo di campo di input sconosciuto saltato", - "controlField": "Controllo", - "ipAdapterModelDescription": "Campo Modello adattatore IP", - "invalidOutputSchema": "Schema di output non valido", - "floatDescription": "I numeri in virgola mobile sono numeri con un punto decimale.", - "floatPolymorphicDescription": "Una raccolta di numeri in virgola mobile.", - "conditioningField": "Condizionamento", - "string": "Stringa", - "latentsField": "Latenti", - "connectionWouldCreateCycle": "La connessione creerebbe un ciclo", - "inputFields": "Campi di Input", - "uNetFieldDescription": "Sub-modello UNet.", - "imageCollectionDescription": "Una raccolta di immagini.", - "imageFieldDescription": "Le immagini possono essere passate tra i nodi.", - "unableToParseEdge": "Impossibile analizzare il bordo", - "latentsCollectionDescription": "Le immagini latenti possono essere passate tra i nodi.", - "imageCollection": "Raccolta Immagini", - "loRAModelField": "LoRA" - }, - "boards": { - "autoAddBoard": "Aggiungi automaticamente bacheca", - "menuItemAutoAdd": "Aggiungi automaticamente a questa Bacheca", - "cancel": "Annulla", - "addBoard": "Aggiungi Bacheca", - "bottomMessage": "L'eliminazione di questa bacheca e delle sue immagini ripristinerà tutte le funzionalità che le stanno attualmente utilizzando.", - "changeBoard": "Cambia Bacheca", - "loading": "Caricamento in corso ...", - "clearSearch": "Cancella Ricerca", - "topMessage": "Questa bacheca contiene immagini utilizzate nelle seguenti funzionalità:", - "move": "Sposta", - "myBoard": "Bacheca", - "searchBoard": "Cerca bacheche ...", - "noMatching": "Nessuna bacheca corrispondente", - "selectBoard": "Seleziona una Bacheca", - "uncategorized": "Non categorizzato", - "downloadBoard": "Scarica la bacheca" - }, - "controlnet": { - "contentShuffleDescription": "Rimescola il contenuto di un'immagine", - "contentShuffle": "Rimescola contenuto", - "beginEndStepPercent": "Percentuale passi Inizio / Fine", - "duplicate": "Duplica", - "balanced": "Bilanciato", - "depthMidasDescription": "Generazione di mappe di profondità usando Midas", - "control": "ControlNet", - "crop": "Ritaglia", - "depthMidas": "Profondità (Midas)", - "enableControlnet": "Abilita ControlNet", - "detectResolution": "Rileva risoluzione", - "controlMode": "Modalità Controllo", - "cannyDescription": "Canny rilevamento bordi", - "depthZoe": "Profondità (Zoe)", - "autoConfigure": "Configura automaticamente il processore", - "delete": "Elimina", - "depthZoeDescription": "Generazione di mappe di profondità usando Zoe", - "resize": "Ridimensiona", - "showAdvanced": "Mostra opzioni Avanzate", - "bgth": "Soglia rimozione sfondo", - "importImageFromCanvas": "Importa immagine dalla Tela", - "lineartDescription": "Converte l'immagine in lineart", - "importMaskFromCanvas": "Importa maschera dalla Tela", - "hideAdvanced": "Nascondi opzioni avanzate", - "ipAdapterModel": "Modello Adattatore", - "resetControlImage": "Reimposta immagine di controllo", - "f": "F", - "h": "H", - "prompt": "Prompt", - "openPoseDescription": "Stima della posa umana utilizzando Openpose", - "resizeMode": "Modalità ridimensionamento", - "weight": "Peso", - "selectModel": "Seleziona un modello", - "w": "W", - "processor": "Processore", - "none": "Nessuno", - "incompatibleBaseModel": "Modello base incompatibile:", - "pidiDescription": "Elaborazione immagini PIDI", - "fill": "Riempire", - "colorMapDescription": "Genera una mappa dei colori dall'immagine", - "lineartAnimeDescription": "Elaborazione lineart in stile anime", - "imageResolution": "Risoluzione dell'immagine", - "colorMap": "Colore", - "lowThreshold": "Soglia inferiore", - "highThreshold": "Soglia superiore", - "normalBaeDescription": "Elaborazione BAE normale", - "noneDescription": "Nessuna elaborazione applicata", - "saveControlImage": "Salva immagine di controllo", - "toggleControlNet": "Attiva/disattiva questo ControlNet", - "safe": "Sicuro", - "colorMapTileSize": "Dimensione piastrella", - "ipAdapterImageFallback": "Nessuna immagine dell'Adattatore IP selezionata", - "mediapipeFaceDescription": "Rilevamento dei volti tramite Mediapipe", - "hedDescription": "Rilevamento dei bordi nidificati olisticamente", - "setControlImageDimensions": "Imposta le dimensioni dell'immagine di controllo su L/A", - "resetIPAdapterImage": "Reimposta immagine Adattatore IP", - "handAndFace": "Mano e faccia", - "enableIPAdapter": "Abilita Adattatore IP", - "maxFaces": "Numero massimo di volti", - "addT2IAdapter": "Aggiungi $t(common.t2iAdapter)", - "controlNetEnabledT2IDisabled": "$t(common.controlNet) abilitato, $t(common.t2iAdapter) disabilitati", - "t2iEnabledControlNetDisabled": "$t(common.t2iAdapter) abilitato, $t(common.controlNet) disabilitati", - "addControlNet": "Aggiungi $t(common.controlNet)", - "controlNetT2IMutexDesc": "$t(common.controlNet) e $t(common.t2iAdapter) contemporaneamente non sono attualmente supportati.", - "addIPAdapter": "Aggiungi $t(common.ipAdapter)", - "controlAdapter_one": "Adattatore di Controllo", - "controlAdapter_many": "Adattatori di Controllo", - "controlAdapter_other": "Adattatori di Controllo", - "megaControl": "Mega ControlNet", - "minConfidence": "Confidenza minima", - "scribble": "Scribble", - "amult": "Angolo di illuminazione" - }, - "queue": { - "queueFront": "Aggiungi all'inizio della coda", - "queueBack": "Aggiungi alla coda", - "queueCountPrediction": "Aggiungi {{predicted}} alla coda", - "queue": "Coda", - "status": "Stato", - "pruneSucceeded": "Rimossi {{item_count}} elementi completati dalla coda", - "cancelTooltip": "Annulla l'elemento corrente", - "queueEmpty": "Coda vuota", - "pauseSucceeded": "Elaborazione sospesa", - "in_progress": "In corso", - "notReady": "Impossibile mettere in coda", - "batchFailedToQueue": "Impossibile mettere in coda il lotto", - "completed": "Completati", - "batchValues": "Valori del lotto", - "cancelFailed": "Problema durante l'annullamento dell'elemento", - "batchQueued": "Lotto aggiunto alla coda", - "pauseFailed": "Problema durante la sospensione dell'elaborazione", - "clearFailed": "Problema nella cancellazione della coda", - "queuedCount": "{{pending}} In attesa", - "front": "inizio", - "clearSucceeded": "Coda cancellata", - "pause": "Sospendi", - "pruneTooltip": "Rimuovi {{item_count}} elementi completati", - "cancelSucceeded": "Elemento annullato", - "batchQueuedDesc_one": "Aggiunta {{count}} sessione a {{direction}} della coda", - "batchQueuedDesc_many": "Aggiunte {{count}} sessioni a {{direction}} della coda", - "batchQueuedDesc_other": "Aggiunte {{count}} sessioni a {{direction}} della coda", - "graphQueued": "Grafico in coda", - "batch": "Lotto", - "clearQueueAlertDialog": "Lo svuotamento della coda annulla immediatamente tutti gli elementi in elaborazione e cancella completamente la coda.", - "pending": "In attesa", - "completedIn": "Completato in", - "resumeFailed": "Problema nel riavvio dell'elaborazione", - "clear": "Cancella", - "prune": "Rimuovi", - "total": "Totale", - "canceled": "Annullati", - "pruneFailed": "Problema nel rimuovere la coda", - "cancelBatchSucceeded": "Lotto annullato", - "clearTooltip": "Annulla e cancella tutti gli elementi", - "current": "Attuale", - "pauseTooltip": "Sospende l'elaborazione", - "failed": "Falliti", - "cancelItem": "Annulla l'elemento", - "next": "Prossimo", - "cancelBatch": "Annulla lotto", - "back": "fine", - "cancel": "Annulla", - "session": "Sessione", - "queueTotal": "{{total}} Totale", - "resumeSucceeded": "Elaborazione ripresa", - "enqueueing": "Lotto in coda", - "resumeTooltip": "Riprendi l'elaborazione", - "resume": "Riprendi", - "cancelBatchFailed": "Problema durante l'annullamento del lotto", - "clearQueueAlertDialog2": "Sei sicuro di voler cancellare la coda?", - "item": "Elemento", - "graphFailedToQueue": "Impossibile mettere in coda il grafico", - "queueMaxExceeded": "È stato superato il limite massimo di {{max_queue_size}} e {{skip}} elementi verrebbero saltati" - }, - "embedding": { - "noMatchingEmbedding": "Nessun Incorporamento corrispondente", - "addEmbedding": "Aggiungi Incorporamento", - "incompatibleModel": "Modello base incompatibile:" - }, - "models": { - "noMatchingModels": "Nessun modello corrispondente", - "loading": "caricamento", - "noMatchingLoRAs": "Nessun LoRA corrispondente", - "noLoRAsAvailable": "Nessun LoRA disponibile", - "noModelsAvailable": "Nessun modello disponibile", - "selectModel": "Seleziona un modello", - "selectLoRA": "Seleziona un LoRA", - "noRefinerModelsInstalled": "Nessun modello SDXL Refiner installato", - "noLoRAsInstalled": "Nessun LoRA installato" - }, - "invocationCache": { - "disable": "Disabilita", - "misses": "Non trovati in cache", - "enableFailed": "Problema nell'abilitazione della cache delle invocazioni", - "invocationCache": "Cache delle invocazioni", - "clearSucceeded": "Cache delle invocazioni svuotata", - "enableSucceeded": "Cache delle invocazioni abilitata", - "clearFailed": "Problema durante lo svuotamento della cache delle invocazioni", - "hits": "Trovati in cache", - "disableSucceeded": "Cache delle invocazioni disabilitata", - "disableFailed": "Problema durante la disabilitazione della cache delle invocazioni", - "enable": "Abilita", - "clear": "Svuota", - "maxCacheSize": "Dimensione max cache", - "cacheSize": "Dimensione cache" - }, - "dynamicPrompts": { - "seedBehaviour": { - "perPromptDesc": "Utilizza un seme diverso per ogni immagine", - "perIterationLabel": "Per iterazione", - "perIterationDesc": "Utilizza un seme diverso per ogni iterazione", - "perPromptLabel": "Per immagine", - "label": "Comportamento del seme" - }, - "enableDynamicPrompts": "Abilita prompt dinamici", - "combinatorial": "Generazione combinatoria", - "maxPrompts": "Numero massimo di prompt", - "promptsWithCount_one": "{{count}} Prompt", - "promptsWithCount_many": "{{count}} Prompt", - "promptsWithCount_other": "{{count}} Prompt", - "dynamicPrompts": "Prompt dinamici" - }, - "popovers": { - "paramScheduler": { - "paragraphs": [ - "Il campionatore definisce come aggiungere in modo iterativo il rumore a un'immagine o come aggiornare un campione in base all'output di un modello." - ], - "heading": "Campionatore" - }, - "compositingMaskAdjustments": { - "heading": "Regolazioni della maschera", - "paragraphs": [ - "Regola la maschera." - ] - }, - "compositingCoherenceSteps": { - "heading": "Passi", - "paragraphs": [ - "Numero di passi di riduzione del rumore utilizzati nel Passaggio di Coerenza.", - "Uguale al parametro principale Passi." - ] - }, - "compositingBlur": { - "heading": "Sfocatura", - "paragraphs": [ - "Il raggio di sfocatura della maschera." - ] - }, - "compositingCoherenceMode": { - "heading": "Modalità", - "paragraphs": [ - "La modalità del Passaggio di Coerenza." - ] - }, - "clipSkip": { - "paragraphs": [ - "Scegli quanti livelli del modello CLIP saltare.", - "Alcuni modelli funzionano meglio con determinate impostazioni di CLIP Skip.", - "Un valore più alto in genere produce un'immagine meno dettagliata." - ] - }, - "compositingCoherencePass": { - "heading": "Passaggio di Coerenza", - "paragraphs": [ - "Un secondo ciclo di riduzione del rumore aiuta a comporre l'immagine Inpaint/Outpaint." - ] - }, - "compositingStrength": { - "heading": "Forza", - "paragraphs": [ - "Intensità di riduzione del rumore per il passaggio di coerenza.", - "Uguale al parametro intensità di riduzione del rumore da immagine a immagine." - ] - }, - "paramNegativeConditioning": { - "paragraphs": [ - "Il processo di generazione evita i concetti nel prompt negativo. Utilizzatelo per escludere qualità o oggetti dall'output.", - "Supporta la sintassi e gli incorporamenti di Compel." - ], - "heading": "Prompt negativo" - }, - "compositingBlurMethod": { - "heading": "Metodo di sfocatura", - "paragraphs": [ - "Il metodo di sfocatura applicato all'area mascherata." - ] - }, - "paramPositiveConditioning": { - "heading": "Prompt positivo", - "paragraphs": [ - "Guida il processo di generazione. Puoi usare qualsiasi parola o frase.", - "Supporta sintassi e incorporamenti di Compel e Prompt Dinamici." - ] - }, - "controlNetBeginEnd": { - "heading": "Percentuale passi Inizio / Fine", - "paragraphs": [ - "A quali passi del processo di rimozione del rumore verrà applicato ControlNet.", - "I ControlNet applicati all'inizio del processo guidano la composizione, mentre i ControlNet applicati alla fine guidano i dettagli." - ] - }, - "noiseUseCPU": { - "paragraphs": [ - "Controlla se viene generato rumore sulla CPU o sulla GPU.", - "Con il rumore della CPU abilitato, un seme particolare produrrà la stessa immagine su qualsiasi macchina.", - "Non vi è alcun impatto sulle prestazioni nell'abilitare il rumore della CPU." - ], - "heading": "Usa la CPU per generare rumore" - }, - "scaleBeforeProcessing": { - "paragraphs": [ - "Ridimensiona l'area selezionata alla dimensione più adatta al modello prima del processo di generazione dell'immagine." - ], - "heading": "Scala prima dell'elaborazione" - }, - "paramRatio": { - "heading": "Proporzioni", - "paragraphs": [ - "Le proporzioni delle dimensioni dell'immagine generata.", - "Per i modelli SD1.5 si consiglia una dimensione dell'immagine (in numero di pixel) equivalente a 512x512 mentre per i modelli SDXL si consiglia una dimensione equivalente a 1024x1024." - ] - }, - "dynamicPrompts": { - "paragraphs": [ - "Prompt Dinamici crea molte variazioni a partire da un singolo prompt.", - "La sintassi di base è \"a {red|green|blue} ball\". Ciò produrrà tre prompt: \"a red ball\", \"a green ball\" e \"a blue ball\".", - "Puoi utilizzare la sintassi quante volte vuoi in un singolo prompt, ma assicurati di tenere sotto controllo il numero di prompt generati con l'impostazione \"Numero massimo di prompt\"." - ], - "heading": "Prompt Dinamici" - }, - "paramVAE": { - "paragraphs": [ - "Modello utilizzato per tradurre l'output dell'intelligenza artificiale nell'immagine finale." - ], - "heading": "VAE" - }, - "paramIterations": { - "paragraphs": [ - "Il numero di immagini da generare.", - "Se i prompt dinamici sono abilitati, ciascuno dei prompt verrà generato questo numero di volte." - ], - "heading": "Iterazioni" - }, - "paramVAEPrecision": { - "heading": "Precisione VAE", - "paragraphs": [ - "La precisione utilizzata durante la codifica e decodifica VAE. FP16/mezza precisione è più efficiente, a scapito di minori variazioni dell'immagine." - ] - }, - "paramSeed": { - "paragraphs": [ - "Controlla il rumore iniziale utilizzato per la generazione.", - "Disabilita seme \"Casuale\" per produrre risultati identici con le stesse impostazioni di generazione." - ], - "heading": "Seme" - }, - "controlNetResizeMode": { - "heading": "Modalità ridimensionamento", - "paragraphs": [ - "Come l'immagine ControlNet verrà adattata alle dimensioni di output dell'immagine." - ] - }, - "dynamicPromptsSeedBehaviour": { - "paragraphs": [ - "Controlla il modo in cui viene utilizzato il seme durante la generazione dei prompt.", - "Per iterazione utilizzerà un seme univoco per ogni iterazione. Usalo per esplorare variazioni del prompt su un singolo seme.", - "Ad esempio, se hai 5 prompt, ogni immagine utilizzerà lo stesso seme.", - "Per immagine utilizzerà un seme univoco per ogni immagine. Ciò fornisce più variazione." - ], - "heading": "Comportamento del seme" - }, - "paramModel": { - "heading": "Modello", - "paragraphs": [ - "Modello utilizzato per i passaggi di riduzione del rumore.", - "Diversi modelli sono generalmente addestrati per specializzarsi nella produzione di particolari risultati e contenuti estetici." - ] - }, - "paramDenoisingStrength": { - "paragraphs": [ - "Quanto rumore viene aggiunto all'immagine in ingresso.", - "0 risulterà in un'immagine identica, mentre 1 risulterà in un'immagine completamente nuova." - ], - "heading": "Forza di riduzione del rumore" - }, - "dynamicPromptsMaxPrompts": { - "heading": "Numero massimo di prompt", - "paragraphs": [ - "Limita il numero di prompt che possono essere generati da Prompt Dinamici." - ] - }, - "infillMethod": { - "paragraphs": [ - "Metodo per riempire l'area selezionata." - ], - "heading": "Metodo di riempimento" - }, - "controlNetWeight": { - "heading": "Peso", - "paragraphs": [ - "Quanto forte sarà l'impatto di ControlNet sull'immagine generata." - ] - }, - "paramCFGScale": { - "heading": "Scala CFG", - "paragraphs": [ - "Controlla quanto il tuo prompt influenza il processo di generazione." - ] - }, - "controlNetControlMode": { - "paragraphs": [ - "Attribuisce più peso al prompt o a ControlNet." - ], - "heading": "Modalità di controllo" - }, - "paramSteps": { - "heading": "Passi", - "paragraphs": [ - "Numero di passi che verranno eseguiti in ogni generazione.", - "Un numero di passi più elevato generalmente creerà immagini migliori ma richiederà più tempo di generazione." - ] - }, - "lora": { - "heading": "Peso LoRA", - "paragraphs": [ - "Un peso LoRA più elevato porterà a impatti maggiori sull'immagine finale." - ] - }, - "controlNet": { - "paragraphs": [ - "ControlNet fornisce una guida al processo di generazione, aiutando a creare immagini con composizione, struttura o stile controllati, a seconda del modello selezionato." - ], - "heading": "ControlNet" - } - }, - "sdxl": { - "selectAModel": "Seleziona un modello", - "scheduler": "Campionatore", - "noModelsAvailable": "Nessun modello disponibile", - "denoisingStrength": "Forza di riduzione del rumore", - "concatPromptStyle": "Concatena Prompt & Stile", - "loading": "Caricamento...", - "steps": "Passi", - "refinerStart": "Inizio Affinamento", - "cfgScale": "Scala CFG", - "negStylePrompt": "Prompt Stile negativo", - "refiner": "Affinatore", - "negAestheticScore": "Punteggio estetico negativo", - "useRefiner": "Utilizza l'affinatore", - "refinermodel": "Modello Affinatore", - "posAestheticScore": "Punteggio estetico positivo", - "posStylePrompt": "Prompt Stile positivo" - }, - "metadata": { - "initImage": "Immagine iniziale", - "seamless": "Senza giunture", - "positivePrompt": "Prompt positivo", - "negativePrompt": "Prompt negativo", - "generationMode": "Modalità generazione", - "Threshold": "Livello di soglia del rumore", - "metadata": "Metadati", - "strength": "Forza Immagine a Immagine", - "seed": "Seme", - "imageDetails": "Dettagli dell'immagine", - "perlin": "Rumore Perlin", - "model": "Modello", - "noImageDetails": "Nessun dettaglio dell'immagine trovato", - "hiresFix": "Ottimizzazione Alta Risoluzione", - "cfgScale": "Scala CFG", - "fit": "Adatta Immagine a Immagine", - "height": "Altezza", - "variations": "Coppie Peso-Seme", - "noMetaData": "Nessun metadato trovato", - "width": "Larghezza", - "createdBy": "Creato da", - "workflow": "Flusso di lavoro", - "steps": "Passi", - "scheduler": "Campionatore", - "recallParameters": "Richiama i parametri", - "noRecallParameters": "Nessun parametro da richiamare trovato" - }, - "hrf": { - "enableHrf": "Abilita Correzione Alta Risoluzione", - "upscaleMethod": "Metodo di ampliamento", - "enableHrfTooltip": "Genera con una risoluzione iniziale inferiore, esegue l'ampliamento alla risoluzione di base, quindi esegue Immagine a Immagine.", - "metadata": { - "strength": "Forza della Correzione Alta Risoluzione", - "enabled": "Correzione Alta Risoluzione Abilitata", - "method": "Metodo della Correzione Alta Risoluzione" - }, - "hrf": "Correzione Alta Risoluzione", - "hrfStrength": "Forza della Correzione Alta Risoluzione", - "strengthTooltip": "Valori più bassi comportano meno dettagli, il che può ridurre potenziali artefatti." - } -} diff --git a/invokeai/frontend/web/dist/locales/ja.json b/invokeai/frontend/web/dist/locales/ja.json deleted file mode 100644 index c7718e7b7c..0000000000 --- a/invokeai/frontend/web/dist/locales/ja.json +++ /dev/null @@ -1,816 +0,0 @@ -{ - "common": { - "languagePickerLabel": "言語", - "reportBugLabel": "バグ報告", - "settingsLabel": "設定", - "langJapanese": "日本語", - "nodesDesc": "現在、画像生成のためのノードベースシステムを開発中です。機能についてのアップデートにご期待ください。", - "postProcessing": "後処理", - "postProcessDesc1": "Invoke AIは、多彩な後処理の機能を備えています。アップスケーリングと顔修復は、すでにWebUI上で利用可能です。これらは、[Text To Image]および[Image To Image]タブの[詳細オプション]メニューからアクセスできます。また、現在の画像表示の上やビューア内の画像アクションボタンを使って、画像を直接処理することもできます。", - "postProcessDesc2": "より高度な後処理の機能を実現するための専用UIを近日中にリリース予定です。", - "postProcessDesc3": "Invoke AI CLIでは、この他にもEmbiggenをはじめとする様々な機能を利用することができます。", - "training": "追加学習", - "trainingDesc1": "Textual InversionとDreamboothを使って、WebUIから独自のEmbeddingとチェックポイントを追加学習するための専用ワークフローです。", - "trainingDesc2": "InvokeAIは、すでにメインスクリプトを使ったTextual Inversionによるカスタム埋め込み追加学習にも対応しています。", - "upload": "アップロード", - "close": "閉じる", - "load": "ロード", - "back": "戻る", - "statusConnected": "接続済", - "statusDisconnected": "切断済", - "statusError": "エラー", - "statusPreparing": "準備中", - "statusProcessingCanceled": "処理をキャンセル", - "statusProcessingComplete": "処理完了", - "statusGenerating": "生成中", - "statusGeneratingTextToImage": "Text To Imageで生成中", - "statusGeneratingImageToImage": "Image To Imageで生成中", - "statusGenerationComplete": "生成完了", - "statusSavingImage": "画像を保存", - "statusRestoringFaces": "顔の修復", - "statusRestoringFacesGFPGAN": "顔の修復 (GFPGAN)", - "statusRestoringFacesCodeFormer": "顔の修復 (CodeFormer)", - "statusUpscaling": "アップスケーリング", - "statusUpscalingESRGAN": "アップスケーリング (ESRGAN)", - "statusLoadingModel": "モデルを読み込む", - "statusModelChanged": "モデルを変更", - "cancel": "キャンセル", - "accept": "同意", - "langBrPortuguese": "Português do Brasil", - "langRussian": "Русский", - "langSimplifiedChinese": "简体中文", - "langUkranian": "Украї́нська", - "langSpanish": "Español", - "img2img": "img2img", - "unifiedCanvas": "Unified Canvas", - "statusMergingModels": "モデルのマージ", - "statusModelConverted": "変換済モデル", - "statusGeneratingInpainting": "Inpaintingを生成", - "statusIterationComplete": "Iteration Complete", - "statusGeneratingOutpainting": "Outpaintingを生成", - "loading": "ロード中", - "loadingInvokeAI": "Invoke AIをロード中", - "statusConvertingModel": "モデルの変換", - "statusMergedModels": "マージ済モデル", - "githubLabel": "Github", - "hotkeysLabel": "ホットキー", - "langHebrew": "עברית", - "discordLabel": "Discord", - "langItalian": "Italiano", - "langEnglish": "English", - "langArabic": "アラビア語", - "langDutch": "Nederlands", - "langFrench": "Français", - "langGerman": "Deutsch", - "langPortuguese": "Português", - "nodes": "ワークフローエディター", - "langKorean": "한국어", - "langPolish": "Polski", - "txt2img": "txt2img", - "postprocessing": "Post Processing", - "t2iAdapter": "T2I アダプター", - "communityLabel": "コミュニティ", - "dontAskMeAgain": "次回から確認しない", - "areYouSure": "本当によろしいですか?", - "on": "オン", - "nodeEditor": "ノードエディター", - "ipAdapter": "IPアダプター", - "controlAdapter": "コントロールアダプター", - "auto": "自動", - "openInNewTab": "新しいタブで開く", - "controlNet": "コントロールネット", - "statusProcessing": "処理中", - "linear": "リニア", - "imageFailedToLoad": "画像が読み込めません", - "imagePrompt": "画像プロンプト", - "modelManager": "モデルマネージャー", - "lightMode": "ライトモード", - "generate": "生成", - "learnMore": "もっと学ぶ", - "darkMode": "ダークモード", - "random": "ランダム", - "batch": "バッチマネージャー", - "advanced": "高度な設定" - }, - "gallery": { - "uploads": "アップロード", - "showUploads": "アップロードした画像を見る", - "galleryImageSize": "画像のサイズ", - "galleryImageResetSize": "サイズをリセット", - "gallerySettings": "ギャラリーの設定", - "maintainAspectRatio": "アスペクト比を維持", - "singleColumnLayout": "1カラムレイアウト", - "allImagesLoaded": "すべての画像を読み込む", - "loadMore": "さらに読み込む", - "noImagesInGallery": "ギャラリーに画像がありません", - "generations": "生成", - "showGenerations": "生成過程を見る", - "autoSwitchNewImages": "新しい画像に自動切替" - }, - "hotkeys": { - "keyboardShortcuts": "キーボードショートカット", - "appHotkeys": "アプリのホットキー", - "generalHotkeys": "Generalのホットキー", - "galleryHotkeys": "ギャラリーのホットキー", - "unifiedCanvasHotkeys": "Unified Canvasのホットキー", - "invoke": { - "desc": "画像を生成", - "title": "Invoke" - }, - "cancel": { - "title": "キャンセル", - "desc": "画像の生成をキャンセル" - }, - "focusPrompt": { - "desc": "プロンプトテキストボックスにフォーカス", - "title": "プロジェクトにフォーカス" - }, - "toggleOptions": { - "title": "オプションパネルのトグル", - "desc": "オプションパネルの開閉" - }, - "pinOptions": { - "title": "ピン", - "desc": "オプションパネルを固定" - }, - "toggleViewer": { - "title": "ビュワーのトグル", - "desc": "ビュワーを開閉" - }, - "toggleGallery": { - "title": "ギャラリーのトグル", - "desc": "ギャラリードロワーの開閉" - }, - "maximizeWorkSpace": { - "title": "作業領域の最大化", - "desc": "パネルを閉じて、作業領域を最大に" - }, - "changeTabs": { - "title": "タブの切替", - "desc": "他の作業領域と切替" - }, - "consoleToggle": { - "title": "コンソールのトグル", - "desc": "コンソールの開閉" - }, - "setPrompt": { - "title": "プロンプトをセット", - "desc": "現在の画像のプロンプトを使用" - }, - "setSeed": { - "title": "シード値をセット", - "desc": "現在の画像のシード値を使用" - }, - "setParameters": { - "title": "パラメータをセット", - "desc": "現在の画像のすべてのパラメータを使用" - }, - "restoreFaces": { - "title": "顔の修復", - "desc": "現在の画像を修復" - }, - "upscale": { - "title": "アップスケール", - "desc": "現在の画像をアップスケール" - }, - "showInfo": { - "title": "情報を見る", - "desc": "現在の画像のメタデータ情報を表示" - }, - "sendToImageToImage": { - "title": "Image To Imageに転送", - "desc": "現在の画像をImage to Imageに転送" - }, - "deleteImage": { - "title": "画像を削除", - "desc": "現在の画像を削除" - }, - "closePanels": { - "title": "パネルを閉じる", - "desc": "開いているパネルを閉じる" - }, - "previousImage": { - "title": "前の画像", - "desc": "ギャラリー内の1つ前の画像を表示" - }, - "nextImage": { - "title": "次の画像", - "desc": "ギャラリー内の1つ後の画像を表示" - }, - "toggleGalleryPin": { - "title": "ギャラリードロワーの固定", - "desc": "ギャラリーをUIにピン留め/解除" - }, - "increaseGalleryThumbSize": { - "title": "ギャラリーの画像を拡大", - "desc": "ギャラリーのサムネイル画像を拡大" - }, - "decreaseGalleryThumbSize": { - "title": "ギャラリーの画像サイズを縮小", - "desc": "ギャラリーのサムネイル画像を縮小" - }, - "selectBrush": { - "title": "ブラシを選択", - "desc": "ブラシを選択" - }, - "selectEraser": { - "title": "消しゴムを選択", - "desc": "消しゴムを選択" - }, - "decreaseBrushSize": { - "title": "ブラシサイズを縮小", - "desc": "ブラシ/消しゴムのサイズを縮小" - }, - "increaseBrushSize": { - "title": "ブラシサイズを拡大", - "desc": "ブラシ/消しゴムのサイズを拡大" - }, - "decreaseBrushOpacity": { - "title": "ブラシの不透明度を下げる", - "desc": "キャンバスブラシの不透明度を下げる" - }, - "increaseBrushOpacity": { - "title": "ブラシの不透明度を上げる", - "desc": "キャンバスブラシの不透明度を上げる" - }, - "fillBoundingBox": { - "title": "バウンディングボックスを塗りつぶす", - "desc": "ブラシの色でバウンディングボックス領域を塗りつぶす" - }, - "eraseBoundingBox": { - "title": "バウンディングボックスを消す", - "desc": "バウンディングボックス領域を消す" - }, - "colorPicker": { - "title": "カラーピッカーを選択", - "desc": "カラーピッカーを選択" - }, - "toggleLayer": { - "title": "レイヤーを切替", - "desc": "マスク/ベースレイヤの選択を切替" - }, - "clearMask": { - "title": "マスクを消す", - "desc": "マスク全体を消す" - }, - "hideMask": { - "title": "マスクを非表示", - "desc": "マスクを表示/非表示" - }, - "showHideBoundingBox": { - "title": "バウンディングボックスを表示/非表示", - "desc": "バウンディングボックスの表示/非表示を切替" - }, - "saveToGallery": { - "title": "ギャラリーに保存", - "desc": "現在のキャンバスをギャラリーに保存" - }, - "copyToClipboard": { - "title": "クリップボードにコピー", - "desc": "現在のキャンバスをクリップボードにコピー" - }, - "downloadImage": { - "title": "画像をダウンロード", - "desc": "現在の画像をダウンロード" - }, - "resetView": { - "title": "キャンバスをリセット", - "desc": "キャンバスをリセット" - } - }, - "modelManager": { - "modelManager": "モデルマネージャ", - "model": "モデル", - "allModels": "すべてのモデル", - "modelAdded": "モデルを追加", - "modelUpdated": "モデルをアップデート", - "addNew": "新規に追加", - "addNewModel": "新規モデル追加", - "addCheckpointModel": "Checkpointを追加 / Safetensorモデル", - "addDiffuserModel": "Diffusersを追加", - "addManually": "手動で追加", - "manual": "手動", - "name": "名前", - "nameValidationMsg": "モデルの名前を入力", - "description": "概要", - "descriptionValidationMsg": "モデルの概要を入力", - "config": "Config", - "configValidationMsg": "モデルの設定ファイルへのパス", - "modelLocation": "モデルの場所", - "modelLocationValidationMsg": "ディフューザーモデルのあるローカルフォルダーのパスを入力してください", - "repo_id": "Repo ID", - "repoIDValidationMsg": "モデルのリモートリポジトリ", - "vaeLocation": "VAEの場所", - "vaeLocationValidationMsg": "Vaeが配置されている場所へのパス", - "vaeRepoIDValidationMsg": "Vaeのリモートリポジトリ", - "width": "幅", - "widthValidationMsg": "モデルのデフォルトの幅", - "height": "高さ", - "heightValidationMsg": "モデルのデフォルトの高さ", - "addModel": "モデルを追加", - "updateModel": "モデルをアップデート", - "availableModels": "モデルを有効化", - "search": "検索", - "load": "Load", - "active": "active", - "notLoaded": "読み込まれていません", - "cached": "キャッシュ済", - "checkpointFolder": "Checkpointフォルダ", - "clearCheckpointFolder": "Checkpointフォルダ内を削除", - "findModels": "モデルを見つける", - "scanAgain": "再度スキャン", - "modelsFound": "モデルを発見", - "selectFolder": "フォルダを選択", - "selected": "選択済", - "selectAll": "すべて選択", - "deselectAll": "すべて選択解除", - "showExisting": "既存を表示", - "addSelected": "選択済を追加", - "modelExists": "モデルの有無", - "selectAndAdd": "以下のモデルを選択し、追加できます。", - "noModelsFound": "モデルが見つかりません。", - "delete": "削除", - "deleteModel": "モデルを削除", - "deleteConfig": "設定を削除", - "deleteMsg1": "InvokeAIからこのモデルを削除してよろしいですか?", - "deleteMsg2": "これは、モデルがInvokeAIルートフォルダ内にある場合、ディスクからモデルを削除します。カスタム保存場所を使用している場合、モデルはディスクから削除されません。", - "formMessageDiffusersModelLocation": "Diffusersモデルの場所", - "formMessageDiffusersModelLocationDesc": "最低でも1つは入力してください。", - "formMessageDiffusersVAELocation": "VAEの場所s", - "formMessageDiffusersVAELocationDesc": "指定しない場合、InvokeAIは上記のモデルの場所にあるVAEファイルを探します。", - "importModels": "モデルをインポート", - "custom": "カスタム", - "none": "なし", - "convert": "変換", - "statusConverting": "変換中", - "cannotUseSpaces": "スペースは使えません", - "convertToDiffusersHelpText6": "このモデルを変換しますか?", - "checkpointModels": "チェックポイント", - "settings": "設定", - "convertingModelBegin": "モデルを変換しています...", - "baseModel": "ベースモデル", - "modelDeleteFailed": "モデルの削除ができませんでした", - "convertToDiffusers": "ディフューザーに変換", - "alpha": "アルファ", - "diffusersModels": "ディフューザー", - "pathToCustomConfig": "カスタム設定のパス", - "noCustomLocationProvided": "カスタムロケーションが指定されていません", - "modelConverted": "モデル変換が完了しました", - "weightedSum": "重み付け総和", - "inverseSigmoid": "逆シグモイド", - "invokeAIFolder": "Invoke AI フォルダ", - "syncModelsDesc": "モデルがバックエンドと同期していない場合、このオプションを使用してモデルを更新できます。通常、モデル.yamlファイルを手動で更新したり、アプリケーションの起動後にモデルをInvokeAIルートフォルダに追加した場合に便利です。", - "noModels": "モデルが見つかりません", - "sigmoid": "シグモイド", - "merge": "マージ", - "modelMergeInterpAddDifferenceHelp": "このモードでは、モデル3がまずモデル2から減算されます。その結果得られたバージョンが、上記で設定されたアルファ率でモデル1とブレンドされます。", - "customConfig": "カスタム設定", - "predictionType": "予測タイプ(安定したディフュージョン 2.x モデルおよび一部の安定したディフュージョン 1.x モデル用)", - "selectModel": "モデルを選択", - "modelSyncFailed": "モデルの同期に失敗しました", - "quickAdd": "クイック追加", - "simpleModelDesc": "ローカルのDiffusersモデル、ローカルのチェックポイント/safetensorsモデル、HuggingFaceリポジトリのID、またはチェックポイント/ DiffusersモデルのURLへのパスを指定してください。", - "customSaveLocation": "カスタム保存場所", - "advanced": "高度な設定", - "modelDeleted": "モデルが削除されました", - "convertToDiffusersHelpText2": "このプロセスでは、モデルマネージャーのエントリーを同じモデルのディフューザーバージョンに置き換えます。", - "modelUpdateFailed": "モデル更新が失敗しました", - "useCustomConfig": "カスタム設定を使用する", - "convertToDiffusersHelpText5": "十分なディスク空き容量があることを確認してください。モデルは一般的に2GBから7GBのサイズがあります。", - "modelConversionFailed": "モデル変換が失敗しました", - "modelEntryDeleted": "モデルエントリーが削除されました", - "syncModels": "モデルを同期", - "mergedModelSaveLocation": "保存場所", - "closeAdvanced": "高度な設定を閉じる", - "modelType": "モデルタイプ", - "modelsMerged": "モデルマージ完了", - "modelsMergeFailed": "モデルマージ失敗", - "scanForModels": "モデルをスキャン", - "customConfigFileLocation": "カスタム設定ファイルの場所", - "convertToDiffusersHelpText1": "このモデルは 🧨 Diffusers フォーマットに変換されます。", - "modelsSynced": "モデルが同期されました", - "invokeRoot": "InvokeAIフォルダ", - "mergedModelCustomSaveLocation": "カスタムパス", - "mergeModels": "マージモデル", - "interpolationType": "補間タイプ", - "modelMergeHeaderHelp2": "マージできるのはDiffusersのみです。チェックポイントモデルをマージしたい場合は、まずDiffusersに変換してください。", - "convertToDiffusersSaveLocation": "保存場所", - "pickModelType": "モデルタイプを選択", - "sameFolder": "同じフォルダ", - "convertToDiffusersHelpText3": "チェックポイントファイルは、InvokeAIルートフォルダ内にある場合、ディスクから削除されます。カスタムロケーションにある場合は、削除されません。", - "loraModels": "LoRA", - "modelMergeAlphaHelp": "アルファはモデルのブレンド強度を制御します。アルファ値が低いと、2番目のモデルの影響が低くなります。", - "addDifference": "差分を追加", - "modelMergeHeaderHelp1": "あなたのニーズに適したブレンドを作成するために、異なるモデルを最大3つまでマージすることができます。", - "ignoreMismatch": "選択されたモデル間の不一致を無視する", - "convertToDiffusersHelpText4": "これは一回限りのプロセスです。コンピュータの仕様によっては、約30秒から60秒かかる可能性があります。", - "mergedModelName": "マージされたモデル名" - }, - "parameters": { - "images": "画像", - "steps": "ステップ数", - "width": "幅", - "height": "高さ", - "seed": "シード値", - "randomizeSeed": "ランダムなシード値", - "shuffle": "シャッフル", - "seedWeights": "シード値の重み", - "faceRestoration": "顔の修復", - "restoreFaces": "顔の修復", - "strength": "強度", - "upscaling": "アップスケーリング", - "upscale": "アップスケール", - "upscaleImage": "画像をアップスケール", - "scale": "Scale", - "otherOptions": "その他のオプション", - "scaleBeforeProcessing": "処理前のスケール", - "scaledWidth": "幅のスケール", - "scaledHeight": "高さのスケール", - "boundingBoxHeader": "バウンディングボックス", - "img2imgStrength": "Image To Imageの強度", - "sendTo": "転送", - "sendToImg2Img": "Image to Imageに転送", - "sendToUnifiedCanvas": "Unified Canvasに転送", - "downloadImage": "画像をダウンロード", - "openInViewer": "ビュワーを開く", - "closeViewer": "ビュワーを閉じる", - "usePrompt": "プロンプトを使用", - "useSeed": "シード値を使用", - "useAll": "すべてを使用", - "info": "情報", - "showOptionsPanel": "オプションパネルを表示" - }, - "settings": { - "models": "モデル", - "displayInProgress": "生成中の画像を表示する", - "saveSteps": "nステップごとに画像を保存", - "confirmOnDelete": "削除時に確認", - "displayHelpIcons": "ヘルプアイコンを表示", - "enableImageDebugging": "画像のデバッグを有効化", - "resetWebUI": "WebUIをリセット", - "resetWebUIDesc1": "WebUIのリセットは、画像と保存された設定のキャッシュをリセットするだけです。画像を削除するわけではありません。", - "resetWebUIDesc2": "もしギャラリーに画像が表示されないなど、何か問題が発生した場合はGitHubにissueを提出する前にリセットを試してください。", - "resetComplete": "WebUIはリセットされました。F5を押して再読み込みしてください。" - }, - "toast": { - "uploadFailed": "アップロード失敗", - "uploadFailedUnableToLoadDesc": "ファイルを読み込むことができません。", - "downloadImageStarted": "画像ダウンロード開始", - "imageCopied": "画像をコピー", - "imageLinkCopied": "画像のURLをコピー", - "imageNotLoaded": "画像を読み込めません。", - "imageNotLoadedDesc": "Image To Imageに転送する画像が見つかりません。", - "imageSavedToGallery": "画像をギャラリーに保存する", - "canvasMerged": "Canvas Merged", - "sentToImageToImage": "Image To Imageに転送", - "sentToUnifiedCanvas": "Unified Canvasに転送", - "parametersNotSetDesc": "この画像にはメタデータがありません。", - "parametersFailed": "パラメータ読み込みの不具合", - "parametersFailedDesc": "initイメージを読み込めません。", - "seedNotSetDesc": "この画像のシード値が見つかりません。", - "promptNotSetDesc": "この画像のプロンプトが見つかりませんでした。", - "upscalingFailed": "アップスケーリング失敗", - "faceRestoreFailed": "顔の修復に失敗", - "metadataLoadFailed": "メタデータの読み込みに失敗。" - }, - "tooltip": { - "feature": { - "prompt": "これはプロンプトフィールドです。プロンプトには生成オブジェクトや文法用語が含まれます。プロンプトにも重み(Tokenの重要度)を付けることができますが、CLIコマンドやパラメータは機能しません。", - "gallery": "ギャラリーは、出力先フォルダから生成物を表示します。設定はファイル内に保存され、コンテキストメニューからアクセスできます。.", - "seed": "シード値は、画像が形成される際の初期ノイズに影響します。以前の画像から既に存在するシードを使用することができます。ノイズしきい値は高いCFG値でのアーティファクトを軽減するために使用され、Perlinは生成中にPerlinノイズを追加します(0-10の範囲を試してみてください): どちらも出力にバリエーションを追加するのに役立ちます。", - "variations": "0.1から1.0の間の値で試し、付与されたシードに対する結果を変えてみてください。面白いバリュエーションは0.1〜0.3の間です。", - "upscale": "生成直後の画像をアップスケールするには、ESRGANを使用します。", - "faceCorrection": "GFPGANまたはCodeformerによる顔の修復: 画像内の顔を検出し不具合を修正するアルゴリズムです。高い値を設定すると画像がより変化し、より魅力的な顔になります。Codeformerは顔の修復を犠牲にして、元の画像をできる限り保持します。", - "imageToImage": "Image To Imageは任意の画像を初期値として読み込み、プロンプトとともに新しい画像を生成するために使用されます。値が高いほど結果画像はより変化します。0.0から1.0までの値が可能で、推奨範囲は0.25から0.75です。", - "boundingBox": "バウンディングボックスは、Text To ImageまたはImage To Imageの幅/高さの設定と同じです。ボックス内の領域のみが処理されます。", - "seamCorrection": "キャンバス上の生成された画像間に発生する可視可能な境界の処理を制御します。" - } - }, - "unifiedCanvas": { - "mask": "マスク", - "maskingOptions": "マスクのオプション", - "enableMask": "マスクを有効化", - "preserveMaskedArea": "マスク領域の保存", - "clearMask": "マスクを解除", - "brush": "ブラシ", - "eraser": "消しゴム", - "fillBoundingBox": "バウンディングボックスの塗りつぶし", - "eraseBoundingBox": "バウンディングボックスの消去", - "colorPicker": "カラーピッカー", - "brushOptions": "ブラシオプション", - "brushSize": "サイズ", - "saveToGallery": "ギャラリーに保存", - "copyToClipboard": "クリップボードにコピー", - "downloadAsImage": "画像としてダウンロード", - "undo": "取り消し", - "redo": "やり直し", - "clearCanvas": "キャンバスを片付ける", - "canvasSettings": "キャンバスの設定", - "showGrid": "グリッドを表示", - "darkenOutsideSelection": "外周を暗くする", - "autoSaveToGallery": "ギャラリーに自動保存", - "saveBoxRegionOnly": "ボックス領域のみ保存", - "showCanvasDebugInfo": "キャンバスのデバッグ情報を表示", - "clearCanvasHistory": "キャンバスの履歴を削除", - "clearHistory": "履歴を削除", - "clearCanvasHistoryMessage": "履歴を消去すると現在のキャンバスは残りますが、取り消しややり直しの履歴は不可逆的に消去されます。", - "clearCanvasHistoryConfirm": "履歴を削除しますか?", - "emptyTempImageFolder": "Empty Temp Image Folde", - "emptyFolder": "空のフォルダ", - "emptyTempImagesFolderMessage": "一時フォルダを空にすると、Unified Canvasも完全にリセットされます。これには、すべての取り消し/やり直しの履歴、ステージング領域の画像、およびキャンバスのベースレイヤーが含まれます。", - "emptyTempImagesFolderConfirm": "一時フォルダを削除しますか?", - "activeLayer": "Active Layer", - "canvasScale": "Canvas Scale", - "boundingBox": "バウンディングボックス", - "boundingBoxPosition": "バウンディングボックスの位置", - "canvasDimensions": "キャンバスの大きさ", - "canvasPosition": "キャンバスの位置", - "cursorPosition": "カーソルの位置", - "previous": "前", - "next": "次", - "accept": "同意", - "showHide": "表示/非表示", - "discardAll": "すべて破棄", - "snapToGrid": "グリッドにスナップ" - }, - "accessibility": { - "modelSelect": "モデルを選択", - "invokeProgressBar": "進捗バー", - "reset": "リセット", - "uploadImage": "画像をアップロード", - "previousImage": "前の画像", - "nextImage": "次の画像", - "useThisParameter": "このパラメータを使用する", - "copyMetadataJson": "メタデータをコピー(JSON)", - "zoomIn": "ズームイン", - "exitViewer": "ビューアーを終了", - "zoomOut": "ズームアウト", - "rotateCounterClockwise": "反時計回りに回転", - "rotateClockwise": "時計回りに回転", - "flipHorizontally": "水平方向に反転", - "flipVertically": "垂直方向に反転", - "toggleAutoscroll": "自動スクロールの切替", - "modifyConfig": "Modify Config", - "toggleLogViewer": "Log Viewerの切替", - "showOptionsPanel": "サイドパネルを表示", - "showGalleryPanel": "ギャラリーパネルを表示", - "menu": "メニュー", - "loadMore": "さらに読み込む" - }, - "controlnet": { - "resize": "リサイズ", - "showAdvanced": "高度な設定を表示", - "addT2IAdapter": "$t(common.t2iAdapter)を追加", - "importImageFromCanvas": "キャンバスから画像をインポート", - "lineartDescription": "画像を線画に変換", - "importMaskFromCanvas": "キャンバスからマスクをインポート", - "hideAdvanced": "高度な設定を非表示", - "ipAdapterModel": "アダプターモデル", - "resetControlImage": "コントロール画像をリセット", - "beginEndStepPercent": "開始 / 終了ステップパーセンテージ", - "duplicate": "複製", - "balanced": "バランス", - "prompt": "プロンプト", - "depthMidasDescription": "Midasを使用して深度マップを生成", - "openPoseDescription": "Openposeを使用してポーズを推定", - "control": "コントロール", - "resizeMode": "リサイズモード", - "weight": "重み", - "selectModel": "モデルを選択", - "crop": "切り抜き", - "w": "幅", - "processor": "プロセッサー", - "addControlNet": "$t(common.controlNet)を追加", - "none": "なし", - "incompatibleBaseModel": "互換性のないベースモデル:", - "enableControlnet": "コントロールネットを有効化", - "detectResolution": "検出解像度", - "controlNetT2IMutexDesc": "$t(common.controlNet)と$t(common.t2iAdapter)の同時使用は現在サポートされていません。", - "pidiDescription": "PIDI画像処理", - "controlMode": "コントロールモード", - "fill": "塗りつぶし", - "cannyDescription": "Canny 境界検出", - "addIPAdapter": "$t(common.ipAdapter)を追加", - "colorMapDescription": "画像からカラーマップを生成", - "lineartAnimeDescription": "アニメスタイルの線画処理", - "imageResolution": "画像解像度", - "megaControl": "メガコントロール", - "lowThreshold": "最低閾値", - "autoConfigure": "プロセッサーを自動設定", - "highThreshold": "最大閾値", - "saveControlImage": "コントロール画像を保存", - "toggleControlNet": "このコントロールネットを切り替え", - "delete": "削除", - "controlAdapter_other": "コントロールアダプター", - "colorMapTileSize": "タイルサイズ", - "ipAdapterImageFallback": "IP Adapterの画像が選択されていません", - "mediapipeFaceDescription": "Mediapipeを使用して顔を検出", - "depthZoeDescription": "Zoeを使用して深度マップを生成", - "setControlImageDimensions": "コントロール画像のサイズを幅と高さにセット", - "resetIPAdapterImage": "IP Adapterの画像をリセット", - "handAndFace": "手と顔", - "enableIPAdapter": "IP Adapterを有効化", - "amult": "a_mult", - "contentShuffleDescription": "画像の内容をシャッフルします", - "bgth": "bg_th", - "controlNetEnabledT2IDisabled": "$t(common.controlNet) が有効化され、$t(common.t2iAdapter)s が無効化されました", - "controlnet": "$t(controlnet.controlAdapter_one) #{{number}} ($t(common.controlNet))", - "t2iEnabledControlNetDisabled": "$t(common.t2iAdapter) が有効化され、$t(common.controlNet)s が無効化されました", - "ip_adapter": "$t(controlnet.controlAdapter_one) #{{number}} ($t(common.ipAdapter))", - "t2i_adapter": "$t(controlnet.controlAdapter_one) #{{number}} ($t(common.t2iAdapter))", - "minConfidence": "最小確信度", - "colorMap": "Color", - "noneDescription": "処理は行われていません", - "canny": "Canny", - "hedDescription": "階層的エッジ検出", - "maxFaces": "顔の最大数" - }, - "metadata": { - "seamless": "シームレス", - "Threshold": "ノイズ閾値", - "seed": "シード", - "width": "幅", - "workflow": "ワークフロー", - "steps": "ステップ", - "scheduler": "スケジューラー", - "positivePrompt": "ポジティブプロンプト", - "strength": "Image to Image 強度", - "perlin": "パーリンノイズ", - "recallParameters": "パラメータを呼び出す" - }, - "queue": { - "queueEmpty": "キューが空です", - "pauseSucceeded": "処理が一時停止されました", - "queueFront": "キューの先頭へ追加", - "queueBack": "キューに追加", - "queueCountPrediction": "{{predicted}}をキューに追加", - "queuedCount": "保留中 {{pending}}", - "pause": "一時停止", - "queue": "キュー", - "pauseTooltip": "処理を一時停止", - "cancel": "キャンセル", - "queueTotal": "合計 {{total}}", - "resumeSucceeded": "処理が再開されました", - "resumeTooltip": "処理を再開", - "resume": "再会", - "status": "ステータス", - "pruneSucceeded": "キューから完了アイテム{{item_count}}件を削除しました", - "cancelTooltip": "現在のアイテムをキャンセル", - "in_progress": "進行中", - "notReady": "キューに追加できません", - "batchFailedToQueue": "バッチをキューに追加できませんでした", - "completed": "完了", - "batchValues": "バッチの値", - "cancelFailed": "アイテムのキャンセルに問題があります", - "batchQueued": "バッチをキューに追加しました", - "pauseFailed": "処理の一時停止に問題があります", - "clearFailed": "キューのクリアに問題があります", - "front": "先頭", - "clearSucceeded": "キューがクリアされました", - "pruneTooltip": "{{item_count}} の完了アイテムを削除", - "cancelSucceeded": "アイテムがキャンセルされました", - "batchQueuedDesc_other": "{{count}} セッションをキューの{{direction}}に追加しました", - "graphQueued": "グラフをキューに追加しました", - "batch": "バッチ", - "clearQueueAlertDialog": "キューをクリアすると、処理中のアイテムは直ちにキャンセルされ、キューは完全にクリアされます。", - "pending": "保留中", - "resumeFailed": "処理の再開に問題があります", - "clear": "クリア", - "total": "合計", - "canceled": "キャンセル", - "pruneFailed": "キューの削除に問題があります", - "cancelBatchSucceeded": "バッチがキャンセルされました", - "clearTooltip": "全てのアイテムをキャンセルしてクリア", - "current": "現在", - "failed": "失敗", - "cancelItem": "項目をキャンセル", - "next": "次", - "cancelBatch": "バッチをキャンセル", - "session": "セッション", - "enqueueing": "バッチをキューに追加", - "queueMaxExceeded": "{{max_queue_size}} の最大値を超えたため、{{skip}} をスキップします", - "cancelBatchFailed": "バッチのキャンセルに問題があります", - "clearQueueAlertDialog2": "キューをクリアしてもよろしいですか?", - "item": "アイテム", - "graphFailedToQueue": "グラフをキューに追加できませんでした" - }, - "models": { - "noMatchingModels": "一致するモデルがありません", - "loading": "読み込み中", - "noMatchingLoRAs": "一致するLoRAがありません", - "noLoRAsAvailable": "使用可能なLoRAがありません", - "noModelsAvailable": "使用可能なモデルがありません", - "selectModel": "モデルを選択してください", - "selectLoRA": "LoRAを選択してください" - }, - "nodes": { - "addNode": "ノードを追加", - "boardField": "ボード", - "boolean": "ブーリアン", - "boardFieldDescription": "ギャラリーボード", - "addNodeToolTip": "ノードを追加 (Shift+A, Space)", - "booleanPolymorphicDescription": "ブーリアンのコレクション。", - "inputField": "入力フィールド", - "latentsFieldDescription": "潜在空間はノード間で伝達できます。", - "floatCollectionDescription": "浮動小数点のコレクション。", - "missingTemplate": "テンプレートが見つかりません", - "ipAdapterPolymorphicDescription": "IP-Adaptersのコレクション。", - "latentsPolymorphicDescription": "潜在空間はノード間で伝達できます。", - "colorFieldDescription": "RGBAカラー。", - "ipAdapterCollection": "IP-Adapterコレクション", - "conditioningCollection": "条件付きコレクション", - "hideGraphNodes": "グラフオーバーレイを非表示", - "loadWorkflow": "ワークフローを読み込み", - "integerPolymorphicDescription": "整数のコレクション。", - "hideLegendNodes": "フィールドタイプの凡例を非表示", - "float": "浮動小数点", - "booleanCollectionDescription": "ブーリアンのコレクション。", - "integer": "整数", - "colorField": "カラー", - "nodeTemplate": "ノードテンプレート", - "integerDescription": "整数は小数点を持たない数値です。", - "imagePolymorphicDescription": "画像のコレクション。", - "doesNotExist": "存在しません", - "ipAdapterCollectionDescription": "IP-Adaptersのコレクション。", - "inputMayOnlyHaveOneConnection": "入力は1つの接続しか持つことができません", - "nodeOutputs": "ノード出力", - "currentImageDescription": "ノードエディタ内の現在の画像を表示", - "downloadWorkflow": "ワークフローのJSONをダウンロード", - "integerCollection": "整数コレクション", - "collectionItem": "コレクションアイテム", - "fieldTypesMustMatch": "フィールドタイプが一致している必要があります", - "edge": "輪郭", - "inputNode": "入力ノード", - "imageField": "画像", - "animatedEdgesHelp": "選択したエッジおよび選択したノードに接続されたエッジをアニメーション化します", - "cannotDuplicateConnection": "重複した接続は作れません", - "noWorkflow": "ワークフローがありません", - "integerCollectionDescription": "整数のコレクション。", - "colorPolymorphicDescription": "カラーのコレクション。", - "missingCanvaInitImage": "キャンバスの初期画像が見つかりません", - "clipFieldDescription": "トークナイザーとテキストエンコーダーサブモデル。", - "fullyContainNodesHelp": "ノードは選択ボックス内に完全に存在する必要があります", - "clipField": "クリップ", - "nodeType": "ノードタイプ", - "executionStateInProgress": "処理中", - "executionStateError": "エラー", - "ipAdapterModel": "IP-Adapterモデル", - "ipAdapterDescription": "イメージプロンプトアダプター(IP-Adapter)。", - "missingCanvaInitMaskImages": "キャンバスの初期画像およびマスクが見つかりません", - "hideMinimapnodes": "ミニマップを非表示", - "fitViewportNodes": "全体を表示", - "executionStateCompleted": "完了", - "node": "ノード", - "currentImage": "現在の画像", - "controlField": "コントロール", - "booleanDescription": "ブーリアンはtrueかfalseです。", - "collection": "コレクション", - "ipAdapterModelDescription": "IP-Adapterモデルフィールド", - "cannotConnectInputToInput": "入力から入力には接続できません", - "invalidOutputSchema": "無効な出力スキーマ", - "floatDescription": "浮動小数点は、小数点を持つ数値です。", - "floatPolymorphicDescription": "浮動小数点のコレクション。", - "floatCollection": "浮動小数点コレクション", - "latentsField": "潜在空間", - "cannotConnectOutputToOutput": "出力から出力には接続できません", - "booleanCollection": "ブーリアンコレクション", - "cannotConnectToSelf": "自身のノードには接続できません", - "inputFields": "入力フィールド(複数)", - "colorCodeEdges": "カラー-Code Edges", - "imageCollectionDescription": "画像のコレクション。", - "loadingNodes": "ノードを読み込み中...", - "imageCollection": "画像コレクション" - }, - "boards": { - "autoAddBoard": "自動追加するボード", - "move": "移動", - "menuItemAutoAdd": "このボードに自動追加", - "myBoard": "マイボード", - "searchBoard": "ボードを検索...", - "noMatching": "一致するボードがありません", - "selectBoard": "ボードを選択", - "cancel": "キャンセル", - "addBoard": "ボードを追加", - "uncategorized": "未分類", - "downloadBoard": "ボードをダウンロード", - "changeBoard": "ボードを変更", - "loading": "ロード中...", - "topMessage": "このボードには、以下の機能で使用されている画像が含まれています:", - "bottomMessage": "このボードおよび画像を削除すると、現在これらを利用している機能はリセットされます。", - "clearSearch": "検索をクリア" - }, - "embedding": { - "noMatchingEmbedding": "一致する埋め込みがありません", - "addEmbedding": "埋め込みを追加", - "incompatibleModel": "互換性のないベースモデル:" - }, - "invocationCache": { - "invocationCache": "呼び出しキャッシュ", - "clearSucceeded": "呼び出しキャッシュをクリアしました", - "clearFailed": "呼び出しキャッシュのクリアに問題があります", - "enable": "有効", - "clear": "クリア", - "maxCacheSize": "最大キャッシュサイズ", - "cacheSize": "キャッシュサイズ" - } -} diff --git a/invokeai/frontend/web/dist/locales/ko.json b/invokeai/frontend/web/dist/locales/ko.json deleted file mode 100644 index 8baab54ac9..0000000000 --- a/invokeai/frontend/web/dist/locales/ko.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "common": { - "languagePickerLabel": "언어 설정", - "reportBugLabel": "버그 리포트", - "githubLabel": "Github", - "settingsLabel": "설정", - "langArabic": "العربية", - "langEnglish": "English", - "langDutch": "Nederlands", - "unifiedCanvas": "통합 캔버스", - "langFrench": "Français", - "langGerman": "Deutsch", - "langItalian": "Italiano", - "langJapanese": "日本語", - "langBrPortuguese": "Português do Brasil", - "langRussian": "Русский", - "langSpanish": "Español", - "nodes": "노드", - "nodesDesc": "이미지 생성을 위한 노드 기반 시스템은 현재 개발 중입니다. 이 놀라운 기능에 대한 업데이트를 계속 지켜봐 주세요.", - "postProcessing": "후처리", - "postProcessDesc2": "보다 진보된 후처리 작업을 위한 전용 UI가 곧 출시될 예정입니다.", - "postProcessDesc3": "Invoke AI CLI는 Embiggen을 비롯한 다양한 기능을 제공합니다.", - "training": "학습", - "trainingDesc1": "Textual Inversion과 Dreambooth를 이용해 Web UI에서 나만의 embedding 및 checkpoint를 교육하기 위한 전용 워크플로우입니다.", - "trainingDesc2": "InvokeAI는 이미 메인 스크립트를 사용한 Textual Inversion를 이용한 Custom embedding 학습을 지원하고 있습니다.", - "upload": "업로드", - "close": "닫기", - "load": "로드", - "back": "뒤로 가기", - "statusConnected": "연결됨", - "statusDisconnected": "연결 끊김", - "statusError": "에러", - "statusPreparing": "준비 중", - "langSimplifiedChinese": "简体中文", - "statusGenerating": "생성 중", - "statusGeneratingTextToImage": "텍스트->이미지 생성", - "statusGeneratingInpainting": "인페인팅 생성", - "statusGeneratingOutpainting": "아웃페인팅 생성", - "statusGenerationComplete": "생성 완료", - "statusRestoringFaces": "얼굴 복원", - "statusRestoringFacesGFPGAN": "얼굴 복원 (GFPGAN)", - "statusRestoringFacesCodeFormer": "얼굴 복원 (CodeFormer)", - "statusUpscaling": "업스케일링", - "statusUpscalingESRGAN": "업스케일링 (ESRGAN)", - "statusLoadingModel": "모델 로딩중", - "statusModelChanged": "모델 변경됨", - "statusConvertingModel": "모델 컨버팅", - "statusModelConverted": "모델 컨버팅됨", - "statusMergedModels": "모델 병합됨", - "statusMergingModels": "모델 병합중", - "hotkeysLabel": "단축키 설정", - "img2img": "이미지->이미지", - "discordLabel": "Discord", - "langPolish": "Polski", - "postProcessDesc1": "Invoke AI는 다양한 후처리 기능을 제공합니다. 이미지 업스케일링 및 얼굴 복원은 이미 Web UI에서 사용할 수 있습니다. 텍스트->이미지 또는 이미지->이미지 탭의 고급 옵션 메뉴에서 사용할 수 있습니다. 또한 현재 이미지 표시 위, 또는 뷰어에서 액션 버튼을 사용하여 이미지를 직접 처리할 수도 있습니다.", - "langUkranian": "Украї́нська", - "statusProcessingCanceled": "처리 취소됨", - "statusGeneratingImageToImage": "이미지->이미지 생성", - "statusProcessingComplete": "처리 완료", - "statusIterationComplete": "반복(Iteration) 완료", - "statusSavingImage": "이미지 저장" - }, - "gallery": { - "showGenerations": "생성된 이미지 보기", - "generations": "생성된 이미지", - "uploads": "업로드된 이미지", - "showUploads": "업로드된 이미지 보기", - "galleryImageSize": "이미지 크기", - "galleryImageResetSize": "사이즈 리셋", - "gallerySettings": "갤러리 설정", - "maintainAspectRatio": "종횡비 유지" - }, - "unifiedCanvas": { - "betaPreserveMasked": "마스크 레이어 유지" - } -} diff --git a/invokeai/frontend/web/dist/locales/mn.json b/invokeai/frontend/web/dist/locales/mn.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/invokeai/frontend/web/dist/locales/mn.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/invokeai/frontend/web/dist/locales/nl.json b/invokeai/frontend/web/dist/locales/nl.json deleted file mode 100644 index 2d50a602d1..0000000000 --- a/invokeai/frontend/web/dist/locales/nl.json +++ /dev/null @@ -1,1509 +0,0 @@ -{ - "common": { - "hotkeysLabel": "Sneltoetsen", - "languagePickerLabel": "Taal", - "reportBugLabel": "Meld bug", - "settingsLabel": "Instellingen", - "img2img": "Afbeelding naar afbeelding", - "unifiedCanvas": "Centraal canvas", - "nodes": "Werkstroom-editor", - "langDutch": "Nederlands", - "nodesDesc": "Een op knooppunten gebaseerd systeem voor het genereren van afbeeldingen is momenteel in ontwikkeling. Blijf op de hoogte voor nieuws over deze verbluffende functie.", - "postProcessing": "Naverwerking", - "postProcessDesc1": "Invoke AI biedt een breed scala aan naverwerkingsfuncties. Afbeeldingsopschaling en Gezichtsherstel zijn al beschikbaar in de web-UI. Je kunt ze openen via het menu Uitgebreide opties in de tabbladen Tekst naar afbeelding en Afbeelding naar afbeelding. Je kunt een afbeelding ook direct verwerken via de afbeeldingsactieknoppen boven de weergave van de huidigde afbeelding of in de Viewer.", - "postProcessDesc2": "Een individuele gebruikersinterface voor uitgebreidere naverwerkingsworkflows.", - "postProcessDesc3": "De opdrachtregelinterface van InvokeAI biedt diverse andere functies, waaronder Embiggen.", - "trainingDesc1": "Een individuele workflow in de webinterface voor het trainen van je eigen embeddings en checkpoints via Textual Inversion en Dreambooth.", - "trainingDesc2": "InvokeAI ondersteunt al het trainen van eigen embeddings via Textual Inversion via het hoofdscript.", - "upload": "Upload", - "close": "Sluit", - "load": "Laad", - "statusConnected": "Verbonden", - "statusDisconnected": "Niet verbonden", - "statusError": "Fout", - "statusPreparing": "Voorbereiden", - "statusProcessingCanceled": "Verwerking geannuleerd", - "statusProcessingComplete": "Verwerking voltooid", - "statusGenerating": "Genereren", - "statusGeneratingTextToImage": "Genereren van tekst naar afbeelding", - "statusGeneratingImageToImage": "Genereren van afbeelding naar afbeelding", - "statusGeneratingInpainting": "Genereren van Inpainting", - "statusGeneratingOutpainting": "Genereren van Outpainting", - "statusGenerationComplete": "Genereren voltooid", - "statusIterationComplete": "Iteratie voltooid", - "statusSavingImage": "Afbeelding bewaren", - "statusRestoringFaces": "Gezichten herstellen", - "statusRestoringFacesGFPGAN": "Gezichten herstellen (GFPGAN)", - "statusRestoringFacesCodeFormer": "Gezichten herstellen (CodeFormer)", - "statusUpscaling": "Opschaling", - "statusUpscalingESRGAN": "Opschaling (ESRGAN)", - "statusLoadingModel": "Laden van model", - "statusModelChanged": "Model gewijzigd", - "githubLabel": "Github", - "discordLabel": "Discord", - "langArabic": "Arabisch", - "langEnglish": "Engels", - "langFrench": "Frans", - "langGerman": "Duits", - "langItalian": "Italiaans", - "langJapanese": "Japans", - "langPolish": "Pools", - "langBrPortuguese": "Portugees (Brazilië)", - "langRussian": "Russisch", - "langSimplifiedChinese": "Chinees (vereenvoudigd)", - "langUkranian": "Oekraïens", - "langSpanish": "Spaans", - "training": "Training", - "back": "Terug", - "statusConvertingModel": "Omzetten van model", - "statusModelConverted": "Model omgezet", - "statusMergingModels": "Samenvoegen van modellen", - "statusMergedModels": "Modellen samengevoegd", - "cancel": "Annuleer", - "accept": "Akkoord", - "langPortuguese": "Portugees", - "loading": "Bezig met laden", - "loadingInvokeAI": "Bezig met laden van Invoke AI", - "langHebrew": "עברית", - "langKorean": "한국어", - "txt2img": "Tekst naar afbeelding", - "postprocessing": "Naverwerking", - "dontAskMeAgain": "Vraag niet opnieuw", - "imagePrompt": "Afbeeldingsprompt", - "random": "Willekeurig", - "generate": "Genereer", - "openInNewTab": "Open in nieuw tabblad", - "areYouSure": "Weet je het zeker?", - "linear": "Lineair", - "batch": "Seriebeheer", - "modelManager": "Modelbeheer", - "darkMode": "Donkere modus", - "lightMode": "Lichte modus", - "communityLabel": "Gemeenschap", - "t2iAdapter": "T2I-adapter", - "on": "Aan", - "nodeEditor": "Knooppunteditor", - "ipAdapter": "IP-adapter", - "controlAdapter": "Control-adapter", - "auto": "Autom.", - "controlNet": "ControlNet", - "statusProcessing": "Bezig met verwerken", - "imageFailedToLoad": "Kan afbeelding niet laden", - "learnMore": "Meer informatie", - "advanced": "Uitgebreid" - }, - "gallery": { - "generations": "Gegenereerde afbeeldingen", - "showGenerations": "Toon gegenereerde afbeeldingen", - "uploads": "Uploads", - "showUploads": "Toon uploads", - "galleryImageSize": "Afbeeldingsgrootte", - "galleryImageResetSize": "Herstel grootte", - "gallerySettings": "Instellingen galerij", - "maintainAspectRatio": "Behoud beeldverhoiding", - "autoSwitchNewImages": "Wissel autom. naar nieuwe afbeeldingen", - "singleColumnLayout": "Eenkolomsindeling", - "allImagesLoaded": "Alle afbeeldingen geladen", - "loadMore": "Laad meer", - "noImagesInGallery": "Geen afbeeldingen om te tonen", - "deleteImage": "Verwijder afbeelding", - "deleteImageBin": "Verwijderde afbeeldingen worden naar de prullenbak van je besturingssysteem gestuurd.", - "deleteImagePermanent": "Verwijderde afbeeldingen kunnen niet worden hersteld.", - "assets": "Eigen onderdelen", - "images": "Afbeeldingen", - "autoAssignBoardOnClick": "Ken automatisch bord toe bij klikken", - "featuresWillReset": "Als je deze afbeelding verwijdert, dan worden deze functies onmiddellijk teruggezet.", - "loading": "Bezig met laden", - "unableToLoad": "Kan galerij niet laden", - "preparingDownload": "Bezig met voorbereiden van download", - "preparingDownloadFailed": "Fout bij voorbereiden van download", - "downloadSelection": "Download selectie", - "currentlyInUse": "Deze afbeelding is momenteel in gebruik door de volgende functies:", - "copy": "Kopieer", - "download": "Download", - "setCurrentImage": "Stel in als huidige afbeelding" - }, - "hotkeys": { - "keyboardShortcuts": "Sneltoetsen", - "appHotkeys": "Appsneltoetsen", - "generalHotkeys": "Algemene sneltoetsen", - "galleryHotkeys": "Sneltoetsen galerij", - "unifiedCanvasHotkeys": "Sneltoetsen centraal canvas", - "invoke": { - "title": "Genereer", - "desc": "Genereert een afbeelding" - }, - "cancel": { - "title": "Annuleer", - "desc": "Annuleert het genereren van een afbeelding" - }, - "focusPrompt": { - "title": "Focus op invoer", - "desc": "Legt de focus op het invoertekstvak" - }, - "toggleOptions": { - "title": "Open/sluit Opties", - "desc": "Opent of sluit het deelscherm Opties" - }, - "pinOptions": { - "title": "Zet Opties vast", - "desc": "Zet het deelscherm Opties vast" - }, - "toggleViewer": { - "title": "Zet Viewer vast", - "desc": "Opent of sluit Afbeeldingsviewer" - }, - "toggleGallery": { - "title": "Zet Galerij vast", - "desc": "Opent of sluit het deelscherm Galerij" - }, - "maximizeWorkSpace": { - "title": "Maximaliseer werkgebied", - "desc": "Sluit deelschermen en maximaliseer het werkgebied" - }, - "changeTabs": { - "title": "Wissel van tabblad", - "desc": "Wissel naar een ander werkgebied" - }, - "consoleToggle": { - "title": "Open/sluit console", - "desc": "Opent of sluit de console" - }, - "setPrompt": { - "title": "Stel invoertekst in", - "desc": "Gebruikt de invoertekst van de huidige afbeelding" - }, - "setSeed": { - "title": "Stel seed in", - "desc": "Gebruikt de seed van de huidige afbeelding" - }, - "setParameters": { - "title": "Stel parameters in", - "desc": "Gebruikt alle parameters van de huidige afbeelding" - }, - "restoreFaces": { - "title": "Herstel gezichten", - "desc": "Herstelt de huidige afbeelding" - }, - "upscale": { - "title": "Schaal op", - "desc": "Schaalt de huidige afbeelding op" - }, - "showInfo": { - "title": "Toon info", - "desc": "Toont de metagegevens van de huidige afbeelding" - }, - "sendToImageToImage": { - "title": "Stuur naar Afbeelding naar afbeelding", - "desc": "Stuurt de huidige afbeelding naar Afbeelding naar afbeelding" - }, - "deleteImage": { - "title": "Verwijder afbeelding", - "desc": "Verwijdert de huidige afbeelding" - }, - "closePanels": { - "title": "Sluit deelschermen", - "desc": "Sluit geopende deelschermen" - }, - "previousImage": { - "title": "Vorige afbeelding", - "desc": "Toont de vorige afbeelding in de galerij" - }, - "nextImage": { - "title": "Volgende afbeelding", - "desc": "Toont de volgende afbeelding in de galerij" - }, - "toggleGalleryPin": { - "title": "Zet galerij vast/los", - "desc": "Zet de galerij vast of los aan de gebruikersinterface" - }, - "increaseGalleryThumbSize": { - "title": "Vergroot afbeeldingsgrootte galerij", - "desc": "Vergroot de grootte van de galerijminiaturen" - }, - "decreaseGalleryThumbSize": { - "title": "Verklein afbeeldingsgrootte galerij", - "desc": "Verkleint de grootte van de galerijminiaturen" - }, - "selectBrush": { - "title": "Kies penseel", - "desc": "Kiest de penseel op het canvas" - }, - "selectEraser": { - "title": "Kies gum", - "desc": "Kiest de gum op het canvas" - }, - "decreaseBrushSize": { - "title": "Verklein penseelgrootte", - "desc": "Verkleint de grootte van het penseel/gum op het canvas" - }, - "increaseBrushSize": { - "title": "Vergroot penseelgrootte", - "desc": "Vergroot de grootte van het penseel/gum op het canvas" - }, - "decreaseBrushOpacity": { - "title": "Verlaag ondoorzichtigheid penseel", - "desc": "Verlaagt de ondoorzichtigheid van de penseel op het canvas" - }, - "increaseBrushOpacity": { - "title": "Verhoog ondoorzichtigheid penseel", - "desc": "Verhoogt de ondoorzichtigheid van de penseel op het canvas" - }, - "moveTool": { - "title": "Verplaats canvas", - "desc": "Maakt canvasnavigatie mogelijk" - }, - "fillBoundingBox": { - "title": "Vul tekenvak", - "desc": "Vult het tekenvak met de penseelkleur" - }, - "eraseBoundingBox": { - "title": "Wis tekenvak", - "desc": "Wist het gebied van het tekenvak" - }, - "colorPicker": { - "title": "Kleurkiezer", - "desc": "Opent de kleurkiezer op het canvas" - }, - "toggleSnap": { - "title": "Zet uitlijnen aan/uit", - "desc": "Zet uitlijnen op raster aan/uit" - }, - "quickToggleMove": { - "title": "Verplaats canvas even", - "desc": "Verplaats kortstondig het canvas" - }, - "toggleLayer": { - "title": "Zet laag aan/uit", - "desc": "Wisselt tussen de masker- en basislaag" - }, - "clearMask": { - "title": "Wis masker", - "desc": "Wist het volledig masker" - }, - "hideMask": { - "title": "Toon/verberg masker", - "desc": "Toont of verbegt het masker" - }, - "showHideBoundingBox": { - "title": "Toon/verberg tekenvak", - "desc": "Wisselt de zichtbaarheid van het tekenvak" - }, - "mergeVisible": { - "title": "Voeg lagen samen", - "desc": "Voegt alle zichtbare lagen op het canvas samen" - }, - "saveToGallery": { - "title": "Bewaar in galerij", - "desc": "Bewaart het huidige canvas in de galerij" - }, - "copyToClipboard": { - "title": "Kopieer naar klembord", - "desc": "Kopieert het huidige canvas op het klembord" - }, - "downloadImage": { - "title": "Download afbeelding", - "desc": "Downloadt het huidige canvas" - }, - "undoStroke": { - "title": "Maak streek ongedaan", - "desc": "Maakt een penseelstreek ongedaan" - }, - "redoStroke": { - "title": "Herhaal streek", - "desc": "Voert een ongedaan gemaakte penseelstreek opnieuw uit" - }, - "resetView": { - "title": "Herstel weergave", - "desc": "Herstelt de canvasweergave" - }, - "previousStagingImage": { - "title": "Vorige sessie-afbeelding", - "desc": "Bladert terug naar de vorige afbeelding in het sessiegebied" - }, - "nextStagingImage": { - "title": "Volgende sessie-afbeelding", - "desc": "Bladert vooruit naar de volgende afbeelding in het sessiegebied" - }, - "acceptStagingImage": { - "title": "Accepteer sessie-afbeelding", - "desc": "Accepteert de huidige sessie-afbeelding" - }, - "addNodes": { - "title": "Voeg knooppunten toe", - "desc": "Opent het menu Voeg knooppunt toe" - }, - "nodesHotkeys": "Sneltoetsen knooppunten" - }, - "modelManager": { - "modelManager": "Modelonderhoud", - "model": "Model", - "modelAdded": "Model toegevoegd", - "modelUpdated": "Model bijgewerkt", - "modelEntryDeleted": "Modelregel verwijderd", - "cannotUseSpaces": "Spaties zijn niet toegestaan", - "addNew": "Voeg nieuwe toe", - "addNewModel": "Voeg nieuw model toe", - "addManually": "Voeg handmatig toe", - "manual": "Handmatig", - "name": "Naam", - "nameValidationMsg": "Geef een naam voor je model", - "description": "Beschrijving", - "descriptionValidationMsg": "Voeg een beschrijving toe voor je model", - "config": "Configuratie", - "configValidationMsg": "Pad naar het configuratiebestand van je model.", - "modelLocation": "Locatie model", - "modelLocationValidationMsg": "Geef het pad naar een lokale map waar je Diffusers-model wordt bewaard", - "vaeLocation": "Locatie VAE", - "vaeLocationValidationMsg": "Pad naar waar je VAE zich bevindt.", - "width": "Breedte", - "widthValidationMsg": "Standaardbreedte van je model.", - "height": "Hoogte", - "heightValidationMsg": "Standaardhoogte van je model.", - "addModel": "Voeg model toe", - "updateModel": "Werk model bij", - "availableModels": "Beschikbare modellen", - "search": "Zoek", - "load": "Laad", - "active": "actief", - "notLoaded": "niet geladen", - "cached": "gecachet", - "checkpointFolder": "Checkpointmap", - "clearCheckpointFolder": "Wis checkpointmap", - "findModels": "Zoek modellen", - "scanAgain": "Kijk opnieuw", - "modelsFound": "Gevonden modellen", - "selectFolder": "Kies map", - "selected": "Gekozen", - "selectAll": "Kies alles", - "deselectAll": "Kies niets", - "showExisting": "Toon bestaande", - "addSelected": "Voeg gekozen toe", - "modelExists": "Model bestaat", - "selectAndAdd": "Kies en voeg de hieronder opgesomde modellen toe", - "noModelsFound": "Geen modellen gevonden", - "delete": "Verwijder", - "deleteModel": "Verwijder model", - "deleteConfig": "Verwijder configuratie", - "deleteMsg1": "Weet je zeker dat je dit model wilt verwijderen uit InvokeAI?", - "deleteMsg2": "Hiermee ZAL het model van schijf worden verwijderd als het zich bevindt in de beginmap van InvokeAI. Als je het model vanaf een eigen locatie gebruikt, dan ZAL het model NIET van schijf worden verwijderd.", - "formMessageDiffusersVAELocationDesc": "Indien niet opgegeven, dan zal InvokeAI kijken naar het VAE-bestand in de hierboven gegeven modellocatie.", - "repoIDValidationMsg": "Online repository van je model", - "formMessageDiffusersModelLocation": "Locatie Diffusers-model", - "convertToDiffusersHelpText3": "Je checkpoint-bestand op de schijf ZAL worden verwijderd als het zich in de beginmap van InvokeAI bevindt. Het ZAL NIET worden verwijderd als het zich in een andere locatie bevindt.", - "convertToDiffusersHelpText6": "Wil je dit model omzetten?", - "allModels": "Alle modellen", - "checkpointModels": "Checkpoints", - "safetensorModels": "SafeTensors", - "addCheckpointModel": "Voeg Checkpoint-/SafeTensor-model toe", - "addDiffuserModel": "Voeg Diffusers-model toe", - "diffusersModels": "Diffusers", - "repo_id": "Repo-id", - "vaeRepoID": "Repo-id VAE", - "vaeRepoIDValidationMsg": "Online repository van je VAE", - "formMessageDiffusersModelLocationDesc": "Voer er minimaal een in.", - "formMessageDiffusersVAELocation": "Locatie VAE", - "convert": "Omzetten", - "convertToDiffusers": "Omzetten naar Diffusers", - "convertToDiffusersHelpText1": "Dit model wordt omgezet naar de🧨 Diffusers-indeling.", - "convertToDiffusersHelpText2": "Dit proces vervangt het onderdeel in Modelonderhoud met de Diffusers-versie van hetzelfde model.", - "convertToDiffusersHelpText4": "Dit is een eenmalig proces. Dit neemt ongeveer 30 tot 60 sec. in beslag, afhankelijk van de specificaties van je computer.", - "convertToDiffusersHelpText5": "Zorg ervoor dat je genoeg schijfruimte hebt. Modellen nemen gewoonlijk ongeveer 2 tot 7 GB ruimte in beslag.", - "convertToDiffusersSaveLocation": "Bewaarlocatie", - "v1": "v1", - "inpainting": "v1-inpainting", - "customConfig": "Eigen configuratie", - "pathToCustomConfig": "Pad naar eigen configuratie", - "statusConverting": "Omzetten", - "modelConverted": "Model omgezet", - "sameFolder": "Dezelfde map", - "invokeRoot": "InvokeAI-map", - "custom": "Eigen", - "customSaveLocation": "Eigen bewaarlocatie", - "merge": "Samenvoegen", - "modelsMerged": "Modellen samengevoegd", - "mergeModels": "Voeg modellen samen", - "modelOne": "Model 1", - "modelTwo": "Model 2", - "modelThree": "Model 3", - "mergedModelName": "Samengevoegde modelnaam", - "alpha": "Alfa", - "interpolationType": "Soort interpolatie", - "mergedModelSaveLocation": "Bewaarlocatie", - "mergedModelCustomSaveLocation": "Eigen pad", - "invokeAIFolder": "InvokeAI-map", - "ignoreMismatch": "Negeer discrepanties tussen gekozen modellen", - "modelMergeHeaderHelp1": "Je kunt tot drie verschillende modellen samenvoegen om een mengvorm te maken die aan je behoeften voldoet.", - "modelMergeHeaderHelp2": "Alleen Diffusers kunnen worden samengevoegd. Als je een Checkpointmodel wilt samenvoegen, zet deze eerst om naar Diffusers.", - "modelMergeAlphaHelp": "Alfa stuurt de mengsterkte aan voor de modellen. Lagere alfawaarden leiden tot een kleinere invloed op het tweede model.", - "modelMergeInterpAddDifferenceHelp": "In deze stand wordt model 3 eerst van model 2 afgehaald. Wat daar uitkomt wordt gemengd met model 1, gebruikmakend van de hierboven ingestelde alfawaarde.", - "inverseSigmoid": "Keer Sigmoid om", - "sigmoid": "Sigmoid", - "weightedSum": "Gewogen som", - "v2_base": "v2 (512px)", - "v2_768": "v2 (768px)", - "none": "geen", - "addDifference": "Voeg verschil toe", - "scanForModels": "Scan naar modellen", - "pickModelType": "Kies modelsoort", - "baseModel": "Basismodel", - "vae": "VAE", - "variant": "Variant", - "modelConversionFailed": "Omzetten model mislukt", - "modelUpdateFailed": "Bijwerken model mislukt", - "modelsMergeFailed": "Samenvoegen model mislukt", - "selectModel": "Kies model", - "settings": "Instellingen", - "modelDeleted": "Model verwijderd", - "noCustomLocationProvided": "Geen Aangepaste Locatie Opgegeven", - "syncModels": "Synchroniseer Modellen", - "modelsSynced": "Modellen Gesynchroniseerd", - "modelSyncFailed": "Synchronisatie modellen mislukt", - "modelDeleteFailed": "Model kon niet verwijderd worden", - "convertingModelBegin": "Model aan het converteren. Even geduld.", - "importModels": "Importeer Modellen", - "syncModelsDesc": "Als je modellen niet meer synchroon zijn met de backend, kan je ze met deze optie vernieuwen. Dit wordt meestal gebruikt in het geval je het bestand models.yaml met de hand bewerkt of als je modellen aan de beginmap van InvokeAI toevoegt nadat de applicatie gestart is.", - "loraModels": "LoRA's", - "onnxModels": "Onnx", - "oliveModels": "Olives", - "noModels": "Geen modellen gevonden", - "predictionType": "Soort voorspelling (voor Stable Diffusion 2.x-modellen en incidentele Stable Diffusion 1.x-modellen)", - "quickAdd": "Voeg snel toe", - "simpleModelDesc": "Geef een pad naar een lokaal Diffusers-model, lokale-checkpoint- / safetensors-model, een HuggingFace-repo-ID of een url naar een checkpoint- / Diffusers-model.", - "advanced": "Uitgebreid", - "useCustomConfig": "Gebruik eigen configuratie", - "closeAdvanced": "Sluit uitgebreid", - "modelType": "Soort model", - "customConfigFileLocation": "Locatie eigen configuratiebestand", - "vaePrecision": "Nauwkeurigheid VAE" - }, - "parameters": { - "images": "Afbeeldingen", - "steps": "Stappen", - "cfgScale": "CFG-schaal", - "width": "Breedte", - "height": "Hoogte", - "seed": "Seed", - "randomizeSeed": "Willekeurige seed", - "shuffle": "Mengseed", - "noiseThreshold": "Drempelwaarde ruis", - "perlinNoise": "Perlinruis", - "variations": "Variaties", - "variationAmount": "Hoeveelheid variatie", - "seedWeights": "Gewicht seed", - "faceRestoration": "Gezichtsherstel", - "restoreFaces": "Herstel gezichten", - "type": "Soort", - "strength": "Sterkte", - "upscaling": "Opschalen", - "upscale": "Vergroot (Shift + U)", - "upscaleImage": "Schaal afbeelding op", - "scale": "Schaal", - "otherOptions": "Andere opties", - "seamlessTiling": "Naadloze tegels", - "hiresOptim": "Hogeresolutie-optimalisatie", - "imageFit": "Pas initiële afbeelding in uitvoergrootte", - "codeformerFidelity": "Getrouwheid", - "scaleBeforeProcessing": "Schalen voor verwerking", - "scaledWidth": "Geschaalde B", - "scaledHeight": "Geschaalde H", - "infillMethod": "Infill-methode", - "tileSize": "Grootte tegel", - "boundingBoxHeader": "Tekenvak", - "seamCorrectionHeader": "Correctie naad", - "infillScalingHeader": "Infill en schaling", - "img2imgStrength": "Sterkte Afbeelding naar afbeelding", - "toggleLoopback": "Zet recursieve verwerking aan/uit", - "sendTo": "Stuur naar", - "sendToImg2Img": "Stuur naar Afbeelding naar afbeelding", - "sendToUnifiedCanvas": "Stuur naar Centraal canvas", - "copyImageToLink": "Stuur afbeelding naar koppeling", - "downloadImage": "Download afbeelding", - "openInViewer": "Open in Viewer", - "closeViewer": "Sluit Viewer", - "usePrompt": "Hergebruik invoertekst", - "useSeed": "Hergebruik seed", - "useAll": "Hergebruik alles", - "useInitImg": "Gebruik initiële afbeelding", - "info": "Info", - "initialImage": "Initiële afbeelding", - "showOptionsPanel": "Toon deelscherm Opties (O of T)", - "symmetry": "Symmetrie", - "hSymmetryStep": "Stap horiz. symmetrie", - "vSymmetryStep": "Stap vert. symmetrie", - "cancel": { - "immediate": "Annuleer direct", - "isScheduled": "Annuleren", - "setType": "Stel annuleervorm in", - "schedule": "Annuleer na huidige iteratie", - "cancel": "Annuleer" - }, - "general": "Algemeen", - "copyImage": "Kopieer afbeelding", - "imageToImage": "Afbeelding naar afbeelding", - "denoisingStrength": "Sterkte ontruisen", - "hiresStrength": "Sterkte hogere resolutie", - "scheduler": "Planner", - "noiseSettings": "Ruis", - "seamlessXAxis": "X-as", - "seamlessYAxis": "Y-as", - "hidePreview": "Verberg voorvertoning", - "showPreview": "Toon voorvertoning", - "boundingBoxWidth": "Tekenvak breedte", - "boundingBoxHeight": "Tekenvak hoogte", - "clipSkip": "Overslaan CLIP", - "aspectRatio": "Beeldverhouding", - "negativePromptPlaceholder": "Negatieve prompt", - "controlNetControlMode": "Aansturingsmodus", - "positivePromptPlaceholder": "Positieve prompt", - "maskAdjustmentsHeader": "Maskeraanpassingen", - "compositingSettingsHeader": "Instellingen afbeeldingsopbouw", - "coherencePassHeader": "Coherentiestap", - "maskBlur": "Vervaag", - "maskBlurMethod": "Vervagingsmethode", - "coherenceSteps": "Stappen", - "coherenceStrength": "Sterkte", - "seamHighThreshold": "Hoog", - "seamLowThreshold": "Laag", - "invoke": { - "noNodesInGraph": "Geen knooppunten in graaf", - "noModelSelected": "Geen model ingesteld", - "invoke": "Start", - "noPrompts": "Geen prompts gegenereerd", - "systemBusy": "Systeem is bezig", - "noInitialImageSelected": "Geen initiële afbeelding gekozen", - "missingInputForField": "{{nodeLabel}} -> {{fieldLabel}} invoer ontbreekt", - "noControlImageForControlAdapter": "Controle-adapter #{{number}} heeft geen controle-afbeelding", - "noModelForControlAdapter": "Control-adapter #{{number}} heeft geen model ingesteld staan.", - "unableToInvoke": "Kan niet starten", - "incompatibleBaseModelForControlAdapter": "Model van controle-adapter #{{number}} is ongeldig in combinatie met het hoofdmodel.", - "systemDisconnected": "Systeem is niet verbonden", - "missingNodeTemplate": "Knooppuntsjabloon ontbreekt", - "readyToInvoke": "Klaar om te starten", - "missingFieldTemplate": "Veldsjabloon ontbreekt", - "addingImagesTo": "Bezig met toevoegen van afbeeldingen aan" - }, - "seamlessX&Y": "Naadloos X en Y", - "isAllowedToUpscale": { - "useX2Model": "Afbeelding is te groot om te vergroten met het x4-model. Gebruik hiervoor het x2-model", - "tooLarge": "Afbeelding is te groot om te vergoten. Kies een kleinere afbeelding" - }, - "aspectRatioFree": "Vrij", - "cpuNoise": "CPU-ruis", - "patchmatchDownScaleSize": "Verklein", - "gpuNoise": "GPU-ruis", - "seamlessX": "Naadloos X", - "useCpuNoise": "Gebruik CPU-ruis", - "clipSkipWithLayerCount": "Overslaan CLIP {{layerCount}}", - "seamlessY": "Naadloos Y", - "manualSeed": "Handmatige seedwaarde", - "imageActions": "Afbeeldingshandeling", - "randomSeed": "Willekeurige seedwaarde", - "iterations": "Iteraties", - "iterationsWithCount_one": "{{count}} iteratie", - "iterationsWithCount_other": "{{count}} iteraties", - "enableNoiseSettings": "Schakel ruisinstellingen in", - "coherenceMode": "Modus" - }, - "settings": { - "models": "Modellen", - "displayInProgress": "Toon voortgangsafbeeldingen", - "saveSteps": "Bewaar afbeeldingen elke n stappen", - "confirmOnDelete": "Bevestig bij verwijderen", - "displayHelpIcons": "Toon hulppictogrammen", - "enableImageDebugging": "Schakel foutopsporing afbeelding in", - "resetWebUI": "Herstel web-UI", - "resetWebUIDesc1": "Herstel web-UI herstelt alleen de lokale afbeeldingscache en de onthouden instellingen van je browser. Het verwijdert geen afbeeldingen van schijf.", - "resetWebUIDesc2": "Als afbeeldingen niet getoond worden in de galerij of iets anders werkt niet, probeer dan eerst deze herstelfunctie voordat je een fout aanmeldt op GitHub.", - "resetComplete": "Webinterface is hersteld.", - "useSlidersForAll": "Gebruik schuifbalken voor alle opties", - "consoleLogLevel": "Niveau logboek", - "shouldLogToConsole": "Schrijf logboek naar console", - "developer": "Ontwikkelaar", - "general": "Algemeen", - "showProgressInViewer": "Toon voortgangsafbeeldingen in viewer", - "generation": "Genereren", - "ui": "Gebruikersinterface", - "antialiasProgressImages": "Voer anti-aliasing uit op voortgangsafbeeldingen", - "showAdvancedOptions": "Toon uitgebreide opties", - "favoriteSchedulers": "Favoriete planners", - "favoriteSchedulersPlaceholder": "Geen favoriete planners ingesteld", - "beta": "Bèta", - "experimental": "Experimenteel", - "alternateCanvasLayout": "Omwisselen Canvas Layout", - "enableNodesEditor": "Schakel Knooppunteditor in", - "autoChangeDimensions": "Werk B/H bij naar modelstandaard bij wijziging", - "clearIntermediates": "Wis tussentijdse afbeeldingen", - "clearIntermediatesDesc3": "Je galerijafbeeldingen zullen niet worden verwijderd.", - "clearIntermediatesWithCount_one": "Wis {{count}} tussentijdse afbeelding", - "clearIntermediatesWithCount_other": "Wis {{count}} tussentijdse afbeeldingen", - "clearIntermediatesDesc2": "Tussentijdse afbeeldingen zijn nevenproducten bij het genereren. Deze wijken af van de uitvoerafbeeldingen in de galerij. Als je tussentijdse afbeeldingen wist, wordt schijfruimte vrijgemaakt.", - "intermediatesCleared_one": "{{count}} tussentijdse afbeelding gewist", - "intermediatesCleared_other": "{{count}} tussentijdse afbeeldingen gewist", - "clearIntermediatesDesc1": "Als je tussentijdse afbeeldingen wist, dan wordt de staat hersteld van je canvas en van ControlNet.", - "intermediatesClearedFailed": "Fout bij wissen van tussentijdse afbeeldingen" - }, - "toast": { - "tempFoldersEmptied": "Tijdelijke map geleegd", - "uploadFailed": "Upload mislukt", - "uploadFailedUnableToLoadDesc": "Kan bestand niet laden", - "downloadImageStarted": "Afbeeldingsdownload gestart", - "imageCopied": "Afbeelding gekopieerd", - "imageLinkCopied": "Afbeeldingskoppeling gekopieerd", - "imageNotLoaded": "Geen afbeelding geladen", - "imageNotLoadedDesc": "Geen afbeeldingen gevonden", - "imageSavedToGallery": "Afbeelding opgeslagen naar galerij", - "canvasMerged": "Canvas samengevoegd", - "sentToImageToImage": "Gestuurd naar Afbeelding naar afbeelding", - "sentToUnifiedCanvas": "Gestuurd naar Centraal canvas", - "parametersSet": "Parameters ingesteld", - "parametersNotSet": "Parameters niet ingesteld", - "parametersNotSetDesc": "Geen metagegevens gevonden voor deze afbeelding.", - "parametersFailed": "Fout bij laden van parameters", - "parametersFailedDesc": "Kan initiële afbeelding niet laden.", - "seedSet": "Seed ingesteld", - "seedNotSet": "Seed niet ingesteld", - "seedNotSetDesc": "Kan seed niet vinden voor deze afbeelding.", - "promptSet": "Invoertekst ingesteld", - "promptNotSet": "Invoertekst niet ingesteld", - "promptNotSetDesc": "Kan invoertekst niet vinden voor deze afbeelding.", - "upscalingFailed": "Opschalen mislukt", - "faceRestoreFailed": "Gezichtsherstel mislukt", - "metadataLoadFailed": "Fout bij laden metagegevens", - "initialImageSet": "Initiële afbeelding ingesteld", - "initialImageNotSet": "Initiële afbeelding niet ingesteld", - "initialImageNotSetDesc": "Kan initiële afbeelding niet laden", - "serverError": "Serverfout", - "disconnected": "Verbinding met server verbroken", - "connected": "Verbonden met server", - "canceled": "Verwerking geannuleerd", - "uploadFailedInvalidUploadDesc": "Moet een enkele PNG- of JPEG-afbeelding zijn", - "problemCopyingImageLink": "Kan afbeeldingslink niet kopiëren", - "parameterNotSet": "Parameter niet ingesteld", - "parameterSet": "Instellen parameters", - "nodesSaved": "Knooppunten bewaard", - "nodesLoaded": "Knooppunten geladen", - "nodesCleared": "Knooppunten weggehaald", - "nodesLoadedFailed": "Laden knooppunten mislukt", - "problemCopyingImage": "Kan Afbeelding Niet Kopiëren", - "nodesNotValidJSON": "Ongeldige JSON", - "nodesCorruptedGraph": "Kan niet laden. Graph lijkt corrupt.", - "nodesUnrecognizedTypes": "Laden mislukt. Graph heeft onherkenbare types", - "nodesBrokenConnections": "Laden mislukt. Sommige verbindingen zijn verbroken.", - "nodesNotValidGraph": "Geen geldige knooppunten graph", - "baseModelChangedCleared_one": "Basismodel is gewijzigd: {{count}} niet-compatibel submodel weggehaald of uitgeschakeld", - "baseModelChangedCleared_other": "Basismodel is gewijzigd: {{count}} niet-compatibele submodellen weggehaald of uitgeschakeld", - "imageSavingFailed": "Fout bij bewaren afbeelding", - "canvasSentControlnetAssets": "Canvas gestuurd naar ControlNet en Assets", - "problemCopyingCanvasDesc": "Kan basislaag niet exporteren", - "loadedWithWarnings": "Werkstroom geladen met waarschuwingen", - "setInitialImage": "Ingesteld als initiële afbeelding", - "canvasCopiedClipboard": "Canvas gekopieerd naar klembord", - "setControlImage": "Ingesteld als controle-afbeelding", - "setNodeField": "Ingesteld als knooppuntveld", - "problemSavingMask": "Fout bij bewaren masker", - "problemSavingCanvasDesc": "Kan basislaag niet exporteren", - "maskSavedAssets": "Masker bewaard in Assets", - "modelAddFailed": "Fout bij toevoegen model", - "problemDownloadingCanvas": "Fout bij downloaden van canvas", - "problemMergingCanvas": "Fout bij samenvoegen canvas", - "setCanvasInitialImage": "Ingesteld als initiële canvasafbeelding", - "imageUploaded": "Afbeelding geüpload", - "addedToBoard": "Toegevoegd aan bord", - "workflowLoaded": "Werkstroom geladen", - "modelAddedSimple": "Model toegevoegd", - "problemImportingMaskDesc": "Kan masker niet exporteren", - "problemCopyingCanvas": "Fout bij kopiëren canvas", - "problemSavingCanvas": "Fout bij bewaren canvas", - "canvasDownloaded": "Canvas gedownload", - "setIPAdapterImage": "Ingesteld als IP-adapterafbeelding", - "problemMergingCanvasDesc": "Kan basislaag niet exporteren", - "problemDownloadingCanvasDesc": "Kan basislaag niet exporteren", - "problemSavingMaskDesc": "Kan masker niet exporteren", - "imageSaved": "Afbeelding bewaard", - "maskSentControlnetAssets": "Masker gestuurd naar ControlNet en Assets", - "canvasSavedGallery": "Canvas bewaard in galerij", - "imageUploadFailed": "Fout bij uploaden afbeelding", - "modelAdded": "Model toegevoegd: {{modelName}}", - "problemImportingMask": "Fout bij importeren masker" - }, - "tooltip": { - "feature": { - "prompt": "Dit is het invoertekstvak. De invoertekst bevat de te genereren voorwerpen en stylistische termen. Je kunt hiernaast in de invoertekst ook het gewicht (het belang van een trefwoord) toekennen. Opdrachten en parameters voor op de opdrachtregelinterface werken hier niet.", - "gallery": "De galerij toont gegenereerde afbeeldingen uit de uitvoermap nadat ze gegenereerd zijn. Instellingen worden opgeslagen binnen de bestanden zelf en zijn toegankelijk via het contextmenu.", - "other": "Deze opties maken alternative werkingsstanden voor Invoke mogelijk. De optie 'Naadloze tegels' maakt herhalende patronen in de uitvoer. 'Hoge resolutie' genereert in twee stappen via Afbeelding naar afbeelding: gebruik dit als je een grotere en coherentere afbeelding wilt zonder artifacten. Dit zal meer tijd in beslag nemen t.o.v. Tekst naar afbeelding.", - "seed": "Seedwaarden hebben invloed op de initiële ruis op basis waarvan de afbeelding wordt gevormd. Je kunt de al bestaande seeds van eerdere afbeeldingen gebruiken. De waarde 'Drempelwaarde ruis' wordt gebruikt om de hoeveelheid artifacten te verkleinen bij hoge CFG-waarden (beperk je tot 0 - 10). De Perlinruiswaarde wordt gebruikt om Perlinruis toe te voegen bij het genereren: beide dienen als variatie op de uitvoer.", - "variations": "Probeer een variatie met een waarden tussen 0,1 en 1,0 om het resultaat voor een bepaalde seed te beïnvloeden. Interessante seedvariaties ontstaan bij waarden tussen 0,1 en 0,3.", - "upscale": "Gebruik ESRGAN om de afbeelding direct na het genereren te vergroten.", - "faceCorrection": "Gezichtsherstel via GFPGAN of Codeformer: het algoritme herkent gezichten die voorkomen in de afbeelding en herstelt onvolkomenheden. Een hogere waarde heeft meer invloed op de afbeelding, wat leidt tot aantrekkelijkere gezichten. Codeformer met een hogere getrouwheid behoudt de oorspronkelijke afbeelding ten koste van een sterkere gezichtsherstel.", - "imageToImage": "Afbeelding naar afbeelding laadt een afbeelding als initiële afbeelding, welke vervolgens gebruikt wordt om een nieuwe afbeelding mee te maken i.c.m. de invoertekst. Hoe hoger de waarde, des te meer invloed dit heeft op de uiteindelijke afbeelding. Waarden tussen 0,1 en 1,0 zijn mogelijk. Aanbevolen waarden zijn 0,25 - 0,75", - "boundingBox": "Het tekenvak is gelijk aan de instellingen Breedte en Hoogte voor de functies Tekst naar afbeelding en Afbeelding naar afbeelding. Alleen het gebied in het tekenvak wordt verwerkt.", - "seamCorrection": "Heeft invloed op hoe wordt omgegaan met zichtbare naden die voorkomen tussen gegenereerde afbeeldingen op het canvas.", - "infillAndScaling": "Onderhoud van infillmethodes (gebruikt op gemaskeerde of gewiste gebieden op het canvas) en opschaling (nuttig bij kleine tekenvakken)." - } - }, - "unifiedCanvas": { - "layer": "Laag", - "base": "Basis", - "mask": "Masker", - "maskingOptions": "Maskeropties", - "enableMask": "Schakel masker in", - "preserveMaskedArea": "Behoud gemaskeerd gebied", - "clearMask": "Wis masker", - "brush": "Penseel", - "eraser": "Gum", - "fillBoundingBox": "Vul tekenvak", - "eraseBoundingBox": "Wis tekenvak", - "colorPicker": "Kleurenkiezer", - "brushOptions": "Penseelopties", - "brushSize": "Grootte", - "move": "Verplaats", - "resetView": "Herstel weergave", - "mergeVisible": "Voeg lagen samen", - "saveToGallery": "Bewaar in galerij", - "copyToClipboard": "Kopieer naar klembord", - "downloadAsImage": "Download als afbeelding", - "undo": "Maak ongedaan", - "redo": "Herhaal", - "clearCanvas": "Wis canvas", - "canvasSettings": "Canvasinstellingen", - "showIntermediates": "Toon tussenafbeeldingen", - "showGrid": "Toon raster", - "snapToGrid": "Lijn uit op raster", - "darkenOutsideSelection": "Verduister buiten selectie", - "autoSaveToGallery": "Bewaar automatisch naar galerij", - "saveBoxRegionOnly": "Bewaar alleen tekengebied", - "limitStrokesToBox": "Beperk streken tot tekenvak", - "showCanvasDebugInfo": "Toon aanvullende canvasgegevens", - "clearCanvasHistory": "Wis canvasgeschiedenis", - "clearHistory": "Wis geschiedenis", - "clearCanvasHistoryMessage": "Het wissen van de canvasgeschiedenis laat het huidige canvas ongemoeid, maar wist onherstelbaar de geschiedenis voor het ongedaan maken en herhalen.", - "clearCanvasHistoryConfirm": "Weet je zeker dat je de canvasgeschiedenis wilt wissen?", - "emptyTempImageFolder": "Leeg tijdelijke afbeeldingenmap", - "emptyFolder": "Leeg map", - "emptyTempImagesFolderMessage": "Het legen van de tijdelijke afbeeldingenmap herstelt ook volledig het Centraal canvas. Hieronder valt de geschiedenis voor het ongedaan maken en herhalen, de afbeeldingen in het sessiegebied en de basislaag van het canvas.", - "emptyTempImagesFolderConfirm": "Weet je zeker dat je de tijdelijke afbeeldingenmap wilt legen?", - "activeLayer": "Actieve laag", - "canvasScale": "Schaal canvas", - "boundingBox": "Tekenvak", - "scaledBoundingBox": "Geschaalde tekenvak", - "boundingBoxPosition": "Positie tekenvak", - "canvasDimensions": "Afmetingen canvas", - "canvasPosition": "Positie canvas", - "cursorPosition": "Positie cursor", - "previous": "Vorige", - "next": "Volgende", - "accept": "Accepteer", - "showHide": "Toon/verberg", - "discardAll": "Gooi alles weg", - "betaClear": "Wis", - "betaDarkenOutside": "Verduister buiten tekenvak", - "betaLimitToBox": "Beperk tot tekenvak", - "betaPreserveMasked": "Behoud masker", - "antialiasing": "Anti-aliasing", - "showResultsOn": "Toon resultaten (aan)", - "showResultsOff": "Toon resultaten (uit)" - }, - "accessibility": { - "exitViewer": "Stop viewer", - "zoomIn": "Zoom in", - "rotateCounterClockwise": "Draai tegen de klok in", - "modelSelect": "Modelkeuze", - "invokeProgressBar": "Voortgangsbalk Invoke", - "reset": "Herstel", - "uploadImage": "Upload afbeelding", - "previousImage": "Vorige afbeelding", - "nextImage": "Volgende afbeelding", - "useThisParameter": "Gebruik deze parameter", - "copyMetadataJson": "Kopieer metagegevens-JSON", - "zoomOut": "Zoom uit", - "rotateClockwise": "Draai met de klok mee", - "flipHorizontally": "Spiegel horizontaal", - "flipVertically": "Spiegel verticaal", - "modifyConfig": "Wijzig configuratie", - "toggleAutoscroll": "Autom. scrollen aan/uit", - "toggleLogViewer": "Logboekviewer aan/uit", - "showOptionsPanel": "Toon zijscherm", - "menu": "Menu", - "showGalleryPanel": "Toon deelscherm Galerij", - "loadMore": "Laad meer" - }, - "ui": { - "showProgressImages": "Toon voortgangsafbeeldingen", - "hideProgressImages": "Verberg voortgangsafbeeldingen", - "swapSizes": "Wissel afmetingen om", - "lockRatio": "Zet verhouding vast" - }, - "nodes": { - "zoomOutNodes": "Uitzoomen", - "fitViewportNodes": "Aanpassen aan beeld", - "hideMinimapnodes": "Minimap verbergen", - "showLegendNodes": "Typelegende veld tonen", - "zoomInNodes": "Inzoomen", - "hideGraphNodes": "Graph overlay verbergen", - "showGraphNodes": "Graph overlay tonen", - "showMinimapnodes": "Minimap tonen", - "hideLegendNodes": "Typelegende veld verbergen", - "reloadNodeTemplates": "Herlaad knooppuntsjablonen", - "loadWorkflow": "Laad werkstroom", - "resetWorkflow": "Herstel werkstroom", - "resetWorkflowDesc": "Weet je zeker dat je deze werkstroom wilt herstellen?", - "resetWorkflowDesc2": "Herstel van een werkstroom haalt alle knooppunten, randen en werkstroomdetails weg.", - "downloadWorkflow": "Download JSON van werkstroom", - "booleanPolymorphicDescription": "Een verzameling Booleanse waarden.", - "scheduler": "Planner", - "inputField": "Invoerveld", - "controlFieldDescription": "Controlegegevens doorgegeven tussen knooppunten.", - "skippingUnknownOutputType": "Overslaan van onbekend soort uitvoerveld", - "latentsFieldDescription": "Latents kunnen worden doorgegeven tussen knooppunten.", - "denoiseMaskFieldDescription": "Ontruisingsmasker kan worden doorgegeven tussen knooppunten", - "floatCollectionDescription": "Een verzameling zwevende-kommagetallen.", - "missingTemplate": "Ontbrekende sjabloon", - "outputSchemaNotFound": "Uitvoerschema niet gevonden", - "ipAdapterPolymorphicDescription": "Een verzameling IP-adapters.", - "workflowDescription": "Korte beschrijving", - "latentsPolymorphicDescription": "Latents kunnen worden doorgegeven tussen knooppunten.", - "colorFieldDescription": "Een RGBA-kleur.", - "mainModelField": "Model", - "unhandledInputProperty": "Onverwerkt invoerkenmerk", - "versionUnknown": " Versie onbekend", - "ipAdapterCollection": "Verzameling IP-adapters", - "conditioningCollection": "Verzameling conditionering", - "maybeIncompatible": "Is mogelijk niet compatibel met geïnstalleerde knooppunten", - "ipAdapterPolymorphic": "Polymorfisme IP-adapter", - "noNodeSelected": "Geen knooppunt gekozen", - "addNode": "Voeg knooppunt toe", - "unableToValidateWorkflow": "Kan werkstroom niet valideren", - "enum": "Enumeratie", - "integerPolymorphicDescription": "Een verzameling gehele getallen.", - "noOutputRecorded": "Geen uitvoer opgenomen", - "updateApp": "Werk app bij", - "conditioningCollectionDescription": "Conditionering kan worden doorgegeven tussen knooppunten.", - "colorPolymorphic": "Polymorfisme kleur", - "colorCodeEdgesHelp": "Kleurgecodeerde randen op basis van hun verbonden velden", - "collectionDescription": "TODO", - "float": "Zwevende-kommagetal", - "workflowContact": "Contactpersoon", - "skippingReservedFieldType": "Overslaan van gereserveerd veldsoort", - "animatedEdges": "Geanimeerde randen", - "booleanCollectionDescription": "Een verzameling van Booleanse waarden.", - "sDXLMainModelFieldDescription": "SDXL-modelveld.", - "conditioningPolymorphic": "Polymorfisme conditionering", - "integer": "Geheel getal", - "colorField": "Kleur", - "boardField": "Bord", - "nodeTemplate": "Sjabloon knooppunt", - "latentsCollection": "Verzameling latents", - "problemReadingWorkflow": "Fout bij lezen van werkstroom uit afbeelding", - "sourceNode": "Bronknooppunt", - "nodeOpacity": "Dekking knooppunt", - "pickOne": "Kies er een", - "collectionItemDescription": "TODO", - "integerDescription": "Gehele getallen zijn getallen zonder een decimaalteken.", - "outputField": "Uitvoerveld", - "unableToLoadWorkflow": "Kan werkstroom niet valideren", - "snapToGrid": "Lijn uit op raster", - "stringPolymorphic": "Polymorfisme tekenreeks", - "conditioningPolymorphicDescription": "Conditionering kan worden doorgegeven tussen knooppunten.", - "noFieldsLinearview": "Geen velden toegevoegd aan lineaire weergave", - "skipped": "Overgeslagen", - "imagePolymorphic": "Polymorfisme afbeelding", - "nodeSearch": "Zoek naar knooppunten", - "updateNode": "Werk knooppunt bij", - "sDXLRefinerModelFieldDescription": "Beschrijving", - "imagePolymorphicDescription": "Een verzameling afbeeldingen.", - "floatPolymorphic": "Polymorfisme zwevende-kommagetal", - "version": "Versie", - "doesNotExist": "bestaat niet", - "ipAdapterCollectionDescription": "Een verzameling van IP-adapters.", - "stringCollectionDescription": "Een verzameling tekenreeksen.", - "unableToParseNode": "Kan knooppunt niet inlezen", - "controlCollection": "Controle-verzameling", - "validateConnections": "Valideer verbindingen en graaf", - "stringCollection": "Verzameling tekenreeksen", - "inputMayOnlyHaveOneConnection": "Invoer mag slechts een enkele verbinding hebben", - "notes": "Opmerkingen", - "uNetField": "UNet", - "nodeOutputs": "Uitvoer knooppunt", - "currentImageDescription": "Toont de huidige afbeelding in de knooppunteditor", - "validateConnectionsHelp": "Voorkom dat er ongeldige verbindingen worden gelegd en dat er ongeldige grafen worden aangeroepen", - "problemSettingTitle": "Fout bij instellen titel", - "ipAdapter": "IP-adapter", - "integerCollection": "Verzameling gehele getallen", - "collectionItem": "Verzamelingsonderdeel", - "noConnectionInProgress": "Geen verbinding bezig te maken", - "vaeModelField": "VAE", - "controlCollectionDescription": "Controlegegevens doorgegeven tussen knooppunten.", - "skippedReservedInput": "Overgeslagen gereserveerd invoerveld", - "workflowVersion": "Versie", - "noConnectionData": "Geen verbindingsgegevens", - "outputFields": "Uitvoervelden", - "fieldTypesMustMatch": "Veldsoorten moeten overeenkomen", - "workflow": "Werkstroom", - "edge": "Rand", - "inputNode": "Invoerknooppunt", - "enumDescription": "Enumeraties zijn waarden die uit een aantal opties moeten worden gekozen.", - "unkownInvocation": "Onbekende aanroepsoort", - "loRAModelFieldDescription": "TODO", - "imageField": "Afbeelding", - "skippedReservedOutput": "Overgeslagen gereserveerd uitvoerveld", - "animatedEdgesHelp": "Animeer gekozen randen en randen verbonden met de gekozen knooppunten", - "cannotDuplicateConnection": "Kan geen dubbele verbindingen maken", - "booleanPolymorphic": "Polymorfisme Booleaanse waarden", - "unknownTemplate": "Onbekend sjabloon", - "noWorkflow": "Geen werkstroom", - "removeLinearView": "Verwijder uit lineaire weergave", - "colorCollectionDescription": "TODO", - "integerCollectionDescription": "Een verzameling gehele getallen.", - "colorPolymorphicDescription": "Een verzameling kleuren.", - "sDXLMainModelField": "SDXL-model", - "workflowTags": "Labels", - "denoiseMaskField": "Ontruisingsmasker", - "schedulerDescription": "Beschrijving", - "missingCanvaInitImage": "Ontbrekende initialisatie-afbeelding voor canvas", - "conditioningFieldDescription": "Conditionering kan worden doorgegeven tussen knooppunten.", - "clipFieldDescription": "Submodellen voor tokenizer en text_encoder.", - "fullyContainNodesHelp": "Knooppunten moeten zich volledig binnen het keuzevak bevinden om te worden gekozen", - "noImageFoundState": "Geen initiële afbeelding gevonden in de staat", - "workflowValidation": "Validatiefout werkstroom", - "clipField": "Clip", - "stringDescription": "Tekenreeksen zijn tekst.", - "nodeType": "Soort knooppunt", - "noMatchingNodes": "Geen overeenkomende knooppunten", - "fullyContainNodes": "Omvat knooppunten volledig om ze te kiezen", - "integerPolymorphic": "Polymorfisme geheel getal", - "executionStateInProgress": "Bezig", - "noFieldType": "Geen soort veld", - "colorCollection": "Een verzameling kleuren.", - "executionStateError": "Fout", - "noOutputSchemaName": "Geen naam voor uitvoerschema gevonden in referentieobject", - "ipAdapterModel": "Model IP-adapter", - "latentsPolymorphic": "Polymorfisme latents", - "vaeModelFieldDescription": "Beschrijving", - "skippingInputNoTemplate": "Overslaan van invoerveld zonder sjabloon", - "ipAdapterDescription": "Een Afbeeldingsprompt-adapter (IP-adapter).", - "boolean": "Booleaanse waarden", - "missingCanvaInitMaskImages": "Ontbrekende initialisatie- en maskerafbeeldingen voor canvas", - "problemReadingMetadata": "Fout bij lezen van metagegevens uit afbeelding", - "stringPolymorphicDescription": "Een verzameling tekenreeksen.", - "oNNXModelField": "ONNX-model", - "executionStateCompleted": "Voltooid", - "node": "Knooppunt", - "skippingUnknownInputType": "Overslaan van onbekend soort invoerveld", - "workflowAuthor": "Auteur", - "currentImage": "Huidige afbeelding", - "controlField": "Controle", - "workflowName": "Naam", - "booleanDescription": "Booleanse waarden zijn waar en onwaar.", - "collection": "Verzameling", - "ipAdapterModelDescription": "Modelveld IP-adapter", - "cannotConnectInputToInput": "Kan invoer niet aan invoer verbinden", - "invalidOutputSchema": "Ongeldig uitvoerschema", - "boardFieldDescription": "Een galerijbord", - "floatDescription": "Zwevende-kommagetallen zijn getallen met een decimaalteken.", - "floatPolymorphicDescription": "Een verzameling zwevende-kommagetallen.", - "vaeField": "Vae", - "conditioningField": "Conditionering", - "unhandledOutputProperty": "Onverwerkt uitvoerkenmerk", - "workflowNotes": "Opmerkingen", - "string": "Tekenreeks", - "floatCollection": "Verzameling zwevende-kommagetallen", - "latentsField": "Latents", - "cannotConnectOutputToOutput": "Kan uitvoer niet aan uitvoer verbinden", - "booleanCollection": "Verzameling Booleaanse waarden", - "connectionWouldCreateCycle": "Verbinding zou cyclisch worden", - "cannotConnectToSelf": "Kan niet aan zichzelf verbinden", - "notesDescription": "Voeg opmerkingen toe aan je werkstroom", - "unknownField": "Onbekend veld", - "inputFields": "Invoervelden", - "colorCodeEdges": "Kleurgecodeerde randen", - "uNetFieldDescription": "UNet-submodel.", - "unknownNode": "Onbekend knooppunt", - "imageCollectionDescription": "Een verzameling afbeeldingen.", - "mismatchedVersion": "Heeft niet-overeenkomende versie", - "vaeFieldDescription": "Vae-submodel.", - "imageFieldDescription": "Afbeeldingen kunnen worden doorgegeven tussen knooppunten.", - "outputNode": "Uitvoerknooppunt", - "addNodeToolTip": "Voeg knooppunt toe (Shift+A, spatie)", - "loadingNodes": "Bezig met laden van knooppunten...", - "snapToGridHelp": "Lijn knooppunten uit op raster bij verplaatsing", - "workflowSettings": "Instellingen werkstroomeditor", - "mainModelFieldDescription": "TODO", - "sDXLRefinerModelField": "Verfijningsmodel", - "loRAModelField": "LoRA", - "unableToParseEdge": "Kan rand niet inlezen", - "latentsCollectionDescription": "Latents kunnen worden doorgegeven tussen knooppunten.", - "oNNXModelFieldDescription": "ONNX-modelveld.", - "imageCollection": "Afbeeldingsverzameling" - }, - "controlnet": { - "amult": "a_mult", - "resize": "Schaal", - "showAdvanced": "Toon uitgebreide opties", - "contentShuffleDescription": "Verschuift het materiaal in de afbeelding", - "bgth": "bg_th", - "addT2IAdapter": "Voeg $t(common.t2iAdapter) toe", - "pidi": "PIDI", - "importImageFromCanvas": "Importeer afbeelding uit canvas", - "lineartDescription": "Zet afbeelding om naar line-art", - "normalBae": "Normale BAE", - "importMaskFromCanvas": "Importeer masker uit canvas", - "hed": "HED", - "hideAdvanced": "Verberg uitgebreid", - "contentShuffle": "Verschuif materiaal", - "controlNetEnabledT2IDisabled": "$t(common.controlNet) ingeschakeld, $t(common.t2iAdapter)s uitgeschakeld", - "ipAdapterModel": "Adaptermodel", - "resetControlImage": "Herstel controle-afbeelding", - "beginEndStepPercent": "Percentage begin-/eindstap", - "mlsdDescription": "Minimalistische herkenning lijnsegmenten", - "duplicate": "Maak kopie", - "balanced": "Gebalanceerd", - "f": "F", - "h": "H", - "prompt": "Prompt", - "depthMidasDescription": "Genereer diepteblad via Midas", - "controlnet": "$t(controlnet.controlAdapter_one) #{{number}} ($t(common.controlNet))", - "openPoseDescription": "Menselijke pose-benadering via Openpose", - "control": "Controle", - "resizeMode": "Modus schaling", - "t2iEnabledControlNetDisabled": "$t(common.t2iAdapter) ingeschakeld, $t(common.controlNet)s uitgeschakeld", - "coarse": "Grof", - "weight": "Gewicht", - "selectModel": "Kies een model", - "crop": "Snij bij", - "depthMidas": "Diepte (Midas)", - "w": "B", - "processor": "Verwerker", - "addControlNet": "Voeg $t(common.controlNet) toe", - "none": "Geen", - "incompatibleBaseModel": "Niet-compatibel basismodel:", - "enableControlnet": "Schakel ControlNet in", - "detectResolution": "Herken resolutie", - "controlNetT2IMutexDesc": "Gelijktijdig gebruik van $t(common.controlNet) en $t(common.t2iAdapter) wordt op dit moment niet ondersteund.", - "ip_adapter": "$t(controlnet.controlAdapter_one) #{{number}} ($t(common.ipAdapter))", - "pidiDescription": "PIDI-afbeeldingsverwerking", - "mediapipeFace": "Mediapipe - Gezicht", - "mlsd": "M-LSD", - "controlMode": "Controlemodus", - "fill": "Vul", - "cannyDescription": "Herkenning Canny-rand", - "addIPAdapter": "Voeg $t(common.ipAdapter) toe", - "lineart": "Line-art", - "colorMapDescription": "Genereert een kleurenblad van de afbeelding", - "lineartAnimeDescription": "Lineartverwerking in anime-stijl", - "t2i_adapter": "$t(controlnet.controlAdapter_one) #{{number}} ($t(common.t2iAdapter))", - "minConfidence": "Min. vertrouwensniveau", - "imageResolution": "Resolutie afbeelding", - "megaControl": "Zeer veel controle", - "depthZoe": "Diepte (Zoe)", - "colorMap": "Kleur", - "lowThreshold": "Lage drempelwaarde", - "autoConfigure": "Configureer verwerker automatisch", - "highThreshold": "Hoge drempelwaarde", - "normalBaeDescription": "Normale BAE-verwerking", - "noneDescription": "Geen verwerking toegepast", - "saveControlImage": "Bewaar controle-afbeelding", - "openPose": "Openpose", - "toggleControlNet": "Zet deze ControlNet aan/uit", - "delete": "Verwijder", - "controlAdapter_one": "Control-adapter", - "controlAdapter_other": "Control-adapters", - "safe": "Veilig", - "colorMapTileSize": "Grootte tegel", - "lineartAnime": "Line-art voor anime", - "ipAdapterImageFallback": "Geen IP-adapterafbeelding gekozen", - "mediapipeFaceDescription": "Gezichtsherkenning met Mediapipe", - "canny": "Canny", - "depthZoeDescription": "Genereer diepteblad via Zoe", - "hedDescription": "Herkenning van holistisch-geneste randen", - "setControlImageDimensions": "Stel afmetingen controle-afbeelding in op B/H", - "scribble": "Krabbel", - "resetIPAdapterImage": "Herstel IP-adapterafbeelding", - "handAndFace": "Hand en gezicht", - "enableIPAdapter": "Schakel IP-adapter in", - "maxFaces": "Max. gezichten" - }, - "dynamicPrompts": { - "seedBehaviour": { - "perPromptDesc": "Gebruik een verschillende seedwaarde per afbeelding", - "perIterationLabel": "Seedwaarde per iteratie", - "perIterationDesc": "Gebruik een verschillende seedwaarde per iteratie", - "perPromptLabel": "Seedwaarde per afbeelding", - "label": "Gedrag seedwaarde" - }, - "enableDynamicPrompts": "Schakel dynamische prompts in", - "combinatorial": "Combinatorisch genereren", - "maxPrompts": "Max. prompts", - "promptsWithCount_one": "{{count}} prompt", - "promptsWithCount_other": "{{count}} prompts", - "dynamicPrompts": "Dynamische prompts" - }, - "popovers": { - "noiseUseCPU": { - "paragraphs": [ - "Bepaalt of ruis wordt gegenereerd op de CPU of de GPU.", - "Met CPU-ruis ingeschakeld zal een bepaalde seedwaarde dezelfde afbeelding opleveren op welke machine dan ook.", - "Er is geen prestatieverschil bij het inschakelen van CPU-ruis." - ], - "heading": "Gebruik CPU-ruis" - }, - "paramScheduler": { - "paragraphs": [ - "De planner bepaalt hoe ruis per iteratie wordt toegevoegd aan een afbeelding of hoe een monster wordt bijgewerkt op basis van de uitvoer van een model." - ], - "heading": "Planner" - }, - "scaleBeforeProcessing": { - "paragraphs": [ - "Schaalt het gekozen gebied naar de grootte die het meest geschikt is voor het model, vooraf aan het proces van het afbeeldingen genereren." - ], - "heading": "Schaal vooraf aan verwerking" - }, - "compositingMaskAdjustments": { - "heading": "Aanpassingen masker", - "paragraphs": [ - "Pas het masker aan." - ] - }, - "paramRatio": { - "heading": "Beeldverhouding", - "paragraphs": [ - "De beeldverhouding van de afmetingen van de afbeelding die wordt gegenereerd.", - "Een afbeeldingsgrootte (in aantal pixels) equivalent aan 512x512 wordt aanbevolen voor SD1.5-modellen. Een grootte-equivalent van 1024x1024 wordt aanbevolen voor SDXL-modellen." - ] - }, - "compositingCoherenceSteps": { - "heading": "Stappen", - "paragraphs": [ - "Het aantal te gebruiken ontruisingsstappen in de coherentiefase.", - "Gelijk aan de hoofdparameter Stappen." - ] - }, - "dynamicPrompts": { - "paragraphs": [ - "Dynamische prompts vormt een enkele prompt om in vele.", - "De basissyntax is \"a {red|green|blue} ball\". Dit zal de volgende drie prompts geven: \"a red ball\", \"a green ball\" en \"a blue ball\".", - "Gebruik de syntax zo vaak als je wilt in een enkele prompt, maar zorg ervoor dat het aantal gegenereerde prompts in lijn ligt met de instelling Max. prompts." - ], - "heading": "Dynamische prompts" - }, - "paramVAE": { - "paragraphs": [ - "Het model gebruikt voor het vertalen van AI-uitvoer naar de uiteindelijke afbeelding." - ], - "heading": "VAE" - }, - "compositingBlur": { - "heading": "Vervaging", - "paragraphs": [ - "De vervagingsstraal van het masker." - ] - }, - "paramIterations": { - "paragraphs": [ - "Het aantal te genereren afbeeldingen.", - "Als dynamische prompts is ingeschakeld, dan zal elke prompt dit aantal keer gegenereerd worden." - ], - "heading": "Iteraties" - }, - "paramVAEPrecision": { - "heading": "Nauwkeurigheid VAE", - "paragraphs": [ - "De nauwkeurigheid gebruikt tijdens de VAE-codering en -decodering. FP16/halve nauwkeurig is efficiënter, ten koste van kleine afbeeldingsvariaties." - ] - }, - "compositingCoherenceMode": { - "heading": "Modus", - "paragraphs": [ - "De modus van de coherentiefase." - ] - }, - "paramSeed": { - "paragraphs": [ - "Bepaalt de startruis die gebruikt wordt bij het genereren.", - "Schakel \"Willekeurige seedwaarde\" uit om identieke resultaten te krijgen met dezelfde genereer-instellingen." - ], - "heading": "Seedwaarde" - }, - "controlNetResizeMode": { - "heading": "Schaalmodus", - "paragraphs": [ - "Hoe de ControlNet-afbeelding zal worden geschaald aan de uitvoergrootte van de afbeelding." - ] - }, - "controlNetBeginEnd": { - "paragraphs": [ - "Op welke stappen van het ontruisingsproces ControlNet worden toegepast.", - "ControlNets die worden toegepast aan het begin begeleiden het compositieproces. ControlNets die worden toegepast aan het eind zorgen voor details." - ], - "heading": "Percentage begin- / eindstap" - }, - "dynamicPromptsSeedBehaviour": { - "paragraphs": [ - "Bepaalt hoe de seedwaarde wordt gebruikt bij het genereren van prompts.", - "Per iteratie zal een unieke seedwaarde worden gebruikt voor elke iteratie. Gebruik dit om de promptvariaties binnen een enkele seedwaarde te verkennen.", - "Bijvoorbeeld: als je vijf prompts heb, dan zal voor elke afbeelding dezelfde seedwaarde gebruikt worden.", - "De optie Per afbeelding zal een unieke seedwaarde voor elke afbeelding gebruiken. Dit biedt meer variatie." - ], - "heading": "Gedrag seedwaarde" - }, - "clipSkip": { - "paragraphs": [ - "Kies hoeveel CLIP-modellagen je wilt overslaan.", - "Bepaalde modellen werken beter met bepaalde Overslaan CLIP-instellingen.", - "Een hogere waarde geeft meestal een minder gedetailleerde afbeelding." - ], - "heading": "Overslaan CLIP" - }, - "paramModel": { - "heading": "Model", - "paragraphs": [ - "Model gebruikt voor de ontruisingsstappen.", - "Verschillende modellen zijn meestal getraind om zich te specialiseren in het maken van bepaalde esthetische resultaten en materiaal." - ] - }, - "compositingCoherencePass": { - "heading": "Coherentiefase", - "paragraphs": [ - "Een tweede ronde ontruising helpt bij het samenstellen van de erin- of eruitgetekende afbeelding." - ] - }, - "paramDenoisingStrength": { - "paragraphs": [ - "Hoeveel ruis wordt toegevoegd aan de invoerafbeelding.", - "0 levert een identieke afbeelding op, waarbij 1 een volledig nieuwe afbeelding oplevert." - ], - "heading": "Ontruisingssterkte" - }, - "compositingStrength": { - "heading": "Sterkte", - "paragraphs": [ - "Ontruisingssterkte voor de coherentiefase.", - "Gelijk aan de parameter Ontruisingssterkte Afbeelding naar afbeelding." - ] - }, - "paramNegativeConditioning": { - "paragraphs": [ - "Het genereerproces voorkomt de gegeven begrippen in de negatieve prompt. Gebruik dit om bepaalde zaken of voorwerpen uit te sluiten van de uitvoerafbeelding.", - "Ondersteunt Compel-syntax en -embeddingen." - ], - "heading": "Negatieve prompt" - }, - "compositingBlurMethod": { - "heading": "Vervagingsmethode", - "paragraphs": [ - "De methode van de vervaging die wordt toegepast op het gemaskeerd gebied." - ] - }, - "dynamicPromptsMaxPrompts": { - "heading": "Max. prompts", - "paragraphs": [ - "Beperkt het aantal prompts die kunnen worden gegenereerd door dynamische prompts." - ] - }, - "infillMethod": { - "paragraphs": [ - "Methode om een gekozen gebied in te vullen." - ], - "heading": "Invulmethode" - }, - "controlNetWeight": { - "heading": "Gewicht", - "paragraphs": [ - "Hoe sterk ControlNet effect heeft op de gegeneerde afbeelding." - ] - }, - "controlNet": { - "heading": "ControlNet", - "paragraphs": [ - "ControlNets begeleidt het genereerproces, waarbij geholpen wordt bij het maken van afbeeldingen met aangestuurde compositie, structuur of stijl, afhankelijk van het gekozen model." - ] - }, - "paramCFGScale": { - "heading": "CFG-schaal", - "paragraphs": [ - "Bepaalt hoeveel je prompt invloed heeft op het genereerproces." - ] - }, - "controlNetControlMode": { - "paragraphs": [ - "Geeft meer gewicht aan ofwel de prompt danwel ControlNet." - ], - "heading": "Controlemodus" - }, - "paramSteps": { - "heading": "Stappen", - "paragraphs": [ - "Het aantal uit te voeren stappen tijdens elke generatie.", - "Een hoger aantal stappen geven meestal betere afbeeldingen, ten koste van een hogere benodigde tijd om te genereren." - ] - }, - "paramPositiveConditioning": { - "heading": "Positieve prompt", - "paragraphs": [ - "Begeleidt het generartieproces. Gebruik een woord of frase naar keuze.", - "Syntaxes en embeddings voor Compel en dynamische prompts." - ] - }, - "lora": { - "heading": "Gewicht LoRA", - "paragraphs": [ - "Een hogere LoRA-gewicht zal leiden tot een groter effect op de uiteindelijke afbeelding." - ] - } - }, - "metadata": { - "seamless": "Naadloos", - "positivePrompt": "Positieve prompt", - "negativePrompt": "Negatieve prompt", - "generationMode": "Genereermodus", - "Threshold": "Drempelwaarde ruis", - "metadata": "Metagegevens", - "strength": "Sterkte Afbeelding naar afbeelding", - "seed": "Seedwaarde", - "imageDetails": "Afbeeldingsdetails", - "perlin": "Perlin-ruis", - "model": "Model", - "noImageDetails": "Geen afbeeldingsdetails gevonden", - "hiresFix": "Optimalisatie voor hoge resolutie", - "cfgScale": "CFG-schaal", - "fit": "Schaal aanpassen in Afbeelding naar afbeelding", - "initImage": "Initiële afbeelding", - "recallParameters": "Opnieuw aan te roepen parameters", - "height": "Hoogte", - "variations": "Paren seedwaarde-gewicht", - "noMetaData": "Geen metagegevens gevonden", - "width": "Breedte", - "createdBy": "Gemaakt door", - "workflow": "Werkstroom", - "steps": "Stappen", - "scheduler": "Planner", - "noRecallParameters": "Geen opnieuw uit te voeren parameters gevonden" - }, - "queue": { - "status": "Status", - "pruneSucceeded": "{{item_count}} voltooide onderdelen uit wachtrij opgeruimd", - "cancelTooltip": "Annuleer huidig onderdeel", - "queueEmpty": "Wachtrij leeg", - "pauseSucceeded": "Verwerker onderbroken", - "in_progress": "Bezig", - "queueFront": "Voeg vooraan toe in wachtrij", - "notReady": "Fout bij plaatsen in wachtrij", - "batchFailedToQueue": "Fout bij reeks in wachtrij plaatsen", - "completed": "Voltooid", - "queueBack": "Voeg toe aan wachtrij", - "batchValues": "Reekswaarden", - "cancelFailed": "Fout bij annuleren onderdeel", - "queueCountPrediction": "Voeg {{predicted}} toe aan wachtrij", - "batchQueued": "Reeks in wachtrij geplaatst", - "pauseFailed": "Fout bij onderbreken verwerker", - "clearFailed": "Fout bij wissen van wachtrij", - "queuedCount": "{{pending}} wachtend", - "front": "begin", - "clearSucceeded": "Wachtrij gewist", - "pause": "Onderbreek", - "pruneTooltip": "Ruim {{item_count}} voltooide onderdelen op", - "cancelSucceeded": "Onderdeel geannuleerd", - "batchQueuedDesc_one": "Voeg {{count}} sessie toe aan het {{direction}} van de wachtrij", - "batchQueuedDesc_other": "Voeg {{count}} sessies toe aan het {{direction}} van de wachtrij", - "graphQueued": "Graaf in wachtrij geplaatst", - "queue": "Wachtrij", - "batch": "Reeks", - "clearQueueAlertDialog": "Als je de wachtrij onmiddellijk wist, dan worden alle onderdelen die bezig zijn geannuleerd en wordt de wachtrij volledig gewist.", - "pending": "Wachtend", - "completedIn": "Voltooid na", - "resumeFailed": "Fout bij hervatten verwerker", - "clear": "Wis", - "prune": "Ruim op", - "total": "Totaal", - "canceled": "Geannuleerd", - "pruneFailed": "Fout bij opruimen van wachtrij", - "cancelBatchSucceeded": "Reeks geannuleerd", - "clearTooltip": "Annuleer en wis alle onderdelen", - "current": "Huidig", - "pauseTooltip": "Onderbreek verwerker", - "failed": "Mislukt", - "cancelItem": "Annuleer onderdeel", - "next": "Volgende", - "cancelBatch": "Annuleer reeks", - "back": "eind", - "cancel": "Annuleer", - "session": "Sessie", - "queueTotal": "Totaal {{total}}", - "resumeSucceeded": "Verwerker hervat", - "enqueueing": "Bezig met toevoegen van reeks aan wachtrij", - "resumeTooltip": "Hervat verwerker", - "queueMaxExceeded": "Max. aantal van {{max_queue_size}} overschreden, {{skip}} worden overgeslagen", - "resume": "Hervat", - "cancelBatchFailed": "Fout bij annuleren van reeks", - "clearQueueAlertDialog2": "Weet je zeker dat je de wachtrij wilt wissen?", - "item": "Onderdeel", - "graphFailedToQueue": "Fout bij toevoegen graaf aan wachtrij" - }, - "sdxl": { - "refinerStart": "Startwaarde verfijning", - "selectAModel": "Kies een model", - "scheduler": "Planner", - "cfgScale": "CFG-schaal", - "negStylePrompt": "Negatieve-stijlprompt", - "noModelsAvailable": "Geen modellen beschikbaar", - "refiner": "Verfijning", - "negAestheticScore": "Negatieve esthetische score", - "useRefiner": "Gebruik verfijning", - "denoisingStrength": "Sterkte ontruising", - "refinermodel": "Verfijningsmodel", - "posAestheticScore": "Positieve esthetische score", - "concatPromptStyle": "Plak prompt- en stijltekst aan elkaar", - "loading": "Bezig met laden...", - "steps": "Stappen", - "posStylePrompt": "Positieve-stijlprompt" - }, - "models": { - "noMatchingModels": "Geen overeenkomend modellen", - "loading": "bezig met laden", - "noMatchingLoRAs": "Geen overeenkomende LoRA's", - "noLoRAsAvailable": "Geen LoRA's beschikbaar", - "noModelsAvailable": "Geen modellen beschikbaar", - "selectModel": "Kies een model", - "selectLoRA": "Kies een LoRA" - }, - "boards": { - "autoAddBoard": "Voeg automatisch bord toe", - "topMessage": "Dit bord bevat afbeeldingen die in gebruik zijn door de volgende functies:", - "move": "Verplaats", - "menuItemAutoAdd": "Voeg dit automatisch toe aan bord", - "myBoard": "Mijn bord", - "searchBoard": "Zoek borden...", - "noMatching": "Geen overeenkomende borden", - "selectBoard": "Kies een bord", - "cancel": "Annuleer", - "addBoard": "Voeg bord toe", - "bottomMessage": "Als je dit bord en alle afbeeldingen erop verwijdert, dan worden alle functies teruggezet die ervan gebruik maken.", - "uncategorized": "Zonder categorie", - "downloadBoard": "Download bord", - "changeBoard": "Wijzig bord", - "loading": "Bezig met laden...", - "clearSearch": "Maak zoekopdracht leeg" - }, - "invocationCache": { - "disable": "Schakel uit", - "misses": "Mislukt cacheverzoek", - "enableFailed": "Fout bij inschakelen aanroepcache", - "invocationCache": "Aanroepcache", - "clearSucceeded": "Aanroepcache gewist", - "enableSucceeded": "Aanroepcache ingeschakeld", - "clearFailed": "Fout bij wissen aanroepcache", - "hits": "Gelukt cacheverzoek", - "disableSucceeded": "Aanroepcache uitgeschakeld", - "disableFailed": "Fout bij uitschakelen aanroepcache", - "enable": "Schakel in", - "clear": "Wis", - "maxCacheSize": "Max. grootte cache", - "cacheSize": "Grootte cache" - }, - "embedding": { - "noMatchingEmbedding": "Geen overeenkomende embeddings", - "addEmbedding": "Voeg embedding toe", - "incompatibleModel": "Niet-compatibel basismodel:" - } -} diff --git a/invokeai/frontend/web/dist/locales/pl.json b/invokeai/frontend/web/dist/locales/pl.json deleted file mode 100644 index f77c0c4710..0000000000 --- a/invokeai/frontend/web/dist/locales/pl.json +++ /dev/null @@ -1,461 +0,0 @@ -{ - "common": { - "hotkeysLabel": "Skróty klawiszowe", - "languagePickerLabel": "Wybór języka", - "reportBugLabel": "Zgłoś błąd", - "settingsLabel": "Ustawienia", - "img2img": "Obraz na obraz", - "unifiedCanvas": "Tryb uniwersalny", - "nodes": "Węzły", - "langPolish": "Polski", - "nodesDesc": "W tym miejscu powstanie graficzny system generowania obrazów oparty na węzłach. Jest na co czekać!", - "postProcessing": "Przetwarzanie końcowe", - "postProcessDesc1": "Invoke AI oferuje wiele opcji przetwarzania końcowego. Z poziomu przeglądarki dostępne jest już zwiększanie rozdzielczości oraz poprawianie twarzy. Znajdziesz je wśród ustawień w trybach \"Tekst na obraz\" oraz \"Obraz na obraz\". Są również obecne w pasku menu wyświetlanym nad podglądem wygenerowanego obrazu.", - "postProcessDesc2": "Niedługo zostanie udostępniony specjalny interfejs, który będzie oferował jeszcze więcej możliwości.", - "postProcessDesc3": "Z poziomu linii poleceń już teraz dostępne są inne opcje, takie jak skalowanie obrazu metodą Embiggen.", - "training": "Trenowanie", - "trainingDesc1": "W tym miejscu dostępny będzie system przeznaczony do tworzenia własnych zanurzeń (ang. embeddings) i punktów kontrolnych przy użyciu metod w rodzaju inwersji tekstowej lub Dreambooth.", - "trainingDesc2": "Obecnie jest możliwe tworzenie własnych zanurzeń przy użyciu skryptów wywoływanych z linii poleceń.", - "upload": "Prześlij", - "close": "Zamknij", - "load": "Załaduj", - "statusConnected": "Połączono z serwerem", - "statusDisconnected": "Odłączono od serwera", - "statusError": "Błąd", - "statusPreparing": "Przygotowywanie", - "statusProcessingCanceled": "Anulowano przetwarzanie", - "statusProcessingComplete": "Zakończono przetwarzanie", - "statusGenerating": "Przetwarzanie", - "statusGeneratingTextToImage": "Przetwarzanie tekstu na obraz", - "statusGeneratingImageToImage": "Przetwarzanie obrazu na obraz", - "statusGeneratingInpainting": "Przemalowywanie", - "statusGeneratingOutpainting": "Domalowywanie", - "statusGenerationComplete": "Zakończono generowanie", - "statusIterationComplete": "Zakończono iterację", - "statusSavingImage": "Zapisywanie obrazu", - "statusRestoringFaces": "Poprawianie twarzy", - "statusRestoringFacesGFPGAN": "Poprawianie twarzy (GFPGAN)", - "statusRestoringFacesCodeFormer": "Poprawianie twarzy (CodeFormer)", - "statusUpscaling": "Powiększanie obrazu", - "statusUpscalingESRGAN": "Powiększanie (ESRGAN)", - "statusLoadingModel": "Wczytywanie modelu", - "statusModelChanged": "Zmieniono model", - "githubLabel": "GitHub", - "discordLabel": "Discord", - "darkMode": "Tryb ciemny", - "lightMode": "Tryb jasny" - }, - "gallery": { - "generations": "Wygenerowane", - "showGenerations": "Pokaż wygenerowane obrazy", - "uploads": "Przesłane", - "showUploads": "Pokaż przesłane obrazy", - "galleryImageSize": "Rozmiar obrazów", - "galleryImageResetSize": "Resetuj rozmiar", - "gallerySettings": "Ustawienia galerii", - "maintainAspectRatio": "Zachowaj proporcje", - "autoSwitchNewImages": "Przełączaj na nowe obrazy", - "singleColumnLayout": "Układ jednokolumnowy", - "allImagesLoaded": "Koniec listy", - "loadMore": "Wczytaj więcej", - "noImagesInGallery": "Brak obrazów w galerii" - }, - "hotkeys": { - "keyboardShortcuts": "Skróty klawiszowe", - "appHotkeys": "Podstawowe", - "generalHotkeys": "Pomocnicze", - "galleryHotkeys": "Galeria", - "unifiedCanvasHotkeys": "Tryb uniwersalny", - "invoke": { - "title": "Wywołaj", - "desc": "Generuje nowy obraz" - }, - "cancel": { - "title": "Anuluj", - "desc": "Zatrzymuje generowanie obrazu" - }, - "focusPrompt": { - "title": "Aktywuj pole tekstowe", - "desc": "Aktywuje pole wprowadzania sugestii" - }, - "toggleOptions": { - "title": "Przełącz panel opcji", - "desc": "Wysuwa lub chowa panel opcji" - }, - "pinOptions": { - "title": "Przypnij opcje", - "desc": "Przypina panel opcji" - }, - "toggleViewer": { - "title": "Przełącz podgląd", - "desc": "Otwiera lub zamyka widok podglądu" - }, - "toggleGallery": { - "title": "Przełącz galerię", - "desc": "Wysuwa lub chowa galerię" - }, - "maximizeWorkSpace": { - "title": "Powiększ obraz roboczy", - "desc": "Chowa wszystkie panele, zostawia tylko podgląd obrazu" - }, - "changeTabs": { - "title": "Przełącznie trybu", - "desc": "Przełącza na n-ty tryb pracy" - }, - "consoleToggle": { - "title": "Przełącz konsolę", - "desc": "Otwiera lub chowa widok konsoli" - }, - "setPrompt": { - "title": "Skopiuj sugestie", - "desc": "Kopiuje sugestie z aktywnego obrazu" - }, - "setSeed": { - "title": "Skopiuj inicjator", - "desc": "Kopiuje inicjator z aktywnego obrazu" - }, - "setParameters": { - "title": "Skopiuj wszystko", - "desc": "Kopiuje wszystkie parametry z aktualnie aktywnego obrazu" - }, - "restoreFaces": { - "title": "Popraw twarze", - "desc": "Uruchamia proces poprawiania twarzy dla aktywnego obrazu" - }, - "upscale": { - "title": "Powiększ", - "desc": "Uruchamia proces powiększania aktywnego obrazu" - }, - "showInfo": { - "title": "Pokaż informacje", - "desc": "Pokazuje metadane zapisane w aktywnym obrazie" - }, - "sendToImageToImage": { - "title": "Użyj w trybie \"Obraz na obraz\"", - "desc": "Ustawia aktywny obraz jako źródło w trybie \"Obraz na obraz\"" - }, - "deleteImage": { - "title": "Usuń obraz", - "desc": "Usuwa aktywny obraz" - }, - "closePanels": { - "title": "Zamknij panele", - "desc": "Zamyka wszystkie otwarte panele" - }, - "previousImage": { - "title": "Poprzedni obraz", - "desc": "Aktywuje poprzedni obraz z galerii" - }, - "nextImage": { - "title": "Następny obraz", - "desc": "Aktywuje następny obraz z galerii" - }, - "toggleGalleryPin": { - "title": "Przypnij galerię", - "desc": "Przypina lub odpina widok galerii" - }, - "increaseGalleryThumbSize": { - "title": "Powiększ obrazy", - "desc": "Powiększa rozmiar obrazów w galerii" - }, - "decreaseGalleryThumbSize": { - "title": "Pomniejsz obrazy", - "desc": "Pomniejsza rozmiar obrazów w galerii" - }, - "selectBrush": { - "title": "Aktywuj pędzel", - "desc": "Aktywuje narzędzie malowania" - }, - "selectEraser": { - "title": "Aktywuj gumkę", - "desc": "Aktywuje narzędzie usuwania" - }, - "decreaseBrushSize": { - "title": "Zmniejsz rozmiar narzędzia", - "desc": "Zmniejsza rozmiar aktywnego narzędzia" - }, - "increaseBrushSize": { - "title": "Zwiększ rozmiar narzędzia", - "desc": "Zwiększa rozmiar aktywnego narzędzia" - }, - "decreaseBrushOpacity": { - "title": "Zmniejsz krycie", - "desc": "Zmniejsza poziom krycia pędzla" - }, - "increaseBrushOpacity": { - "title": "Zwiększ", - "desc": "Zwiększa poziom krycia pędzla" - }, - "moveTool": { - "title": "Aktywuj przesunięcie", - "desc": "Włącza narzędzie przesuwania" - }, - "fillBoundingBox": { - "title": "Wypełnij zaznaczenie", - "desc": "Wypełnia zaznaczony obszar aktualnym kolorem pędzla" - }, - "eraseBoundingBox": { - "title": "Wyczyść zaznaczenia", - "desc": "Usuwa całą zawartość zaznaczonego obszaru" - }, - "colorPicker": { - "title": "Aktywuj pipetę", - "desc": "Włącza narzędzie kopiowania koloru" - }, - "toggleSnap": { - "title": "Przyciąganie do siatki", - "desc": "Włącza lub wyłącza opcje przyciągania do siatki" - }, - "quickToggleMove": { - "title": "Szybkie przesunięcie", - "desc": "Tymczasowo włącza tryb przesuwania obszaru roboczego" - }, - "toggleLayer": { - "title": "Przełącz wartwę", - "desc": "Przełącza pomiędzy warstwą bazową i maskowania" - }, - "clearMask": { - "title": "Wyczyść maskę", - "desc": "Usuwa całą zawartość warstwy maskowania" - }, - "hideMask": { - "title": "Przełącz maskę", - "desc": "Pokazuje lub ukrywa podgląd maski" - }, - "showHideBoundingBox": { - "title": "Przełącz zaznaczenie", - "desc": "Pokazuje lub ukrywa podgląd zaznaczenia" - }, - "mergeVisible": { - "title": "Połącz widoczne", - "desc": "Łączy wszystkie widoczne maski w jeden obraz" - }, - "saveToGallery": { - "title": "Zapisz w galerii", - "desc": "Zapisuje całą zawartość płótna w galerii" - }, - "copyToClipboard": { - "title": "Skopiuj do schowka", - "desc": "Zapisuje zawartość płótna w schowku systemowym" - }, - "downloadImage": { - "title": "Pobierz obraz", - "desc": "Zapisuje zawartość płótna do pliku obrazu" - }, - "undoStroke": { - "title": "Cofnij", - "desc": "Cofa ostatnie pociągnięcie pędzlem" - }, - "redoStroke": { - "title": "Ponawia", - "desc": "Ponawia cofnięte pociągnięcie pędzlem" - }, - "resetView": { - "title": "Resetuj widok", - "desc": "Centruje widok płótna" - }, - "previousStagingImage": { - "title": "Poprzedni obraz tymczasowy", - "desc": "Pokazuje poprzedni obraz tymczasowy" - }, - "nextStagingImage": { - "title": "Następny obraz tymczasowy", - "desc": "Pokazuje następny obraz tymczasowy" - }, - "acceptStagingImage": { - "title": "Akceptuj obraz tymczasowy", - "desc": "Akceptuje aktualnie wybrany obraz tymczasowy" - } - }, - "parameters": { - "images": "L. obrazów", - "steps": "L. kroków", - "cfgScale": "Skala CFG", - "width": "Szerokość", - "height": "Wysokość", - "seed": "Inicjator", - "randomizeSeed": "Losowy inicjator", - "shuffle": "Losuj", - "noiseThreshold": "Poziom szumu", - "perlinNoise": "Szum Perlina", - "variations": "Wariacje", - "variationAmount": "Poziom zróżnicowania", - "seedWeights": "Wariacje inicjatora", - "faceRestoration": "Poprawianie twarzy", - "restoreFaces": "Popraw twarze", - "type": "Metoda", - "strength": "Siła", - "upscaling": "Powiększanie", - "upscale": "Powiększ", - "upscaleImage": "Powiększ obraz", - "scale": "Skala", - "otherOptions": "Pozostałe opcje", - "seamlessTiling": "Płynne scalanie", - "hiresOptim": "Optymalizacja wys. rozdzielczości", - "imageFit": "Przeskaluj oryginalny obraz", - "codeformerFidelity": "Dokładność", - "scaleBeforeProcessing": "Tryb skalowania", - "scaledWidth": "Sk. do szer.", - "scaledHeight": "Sk. do wys.", - "infillMethod": "Metoda wypełniania", - "tileSize": "Rozmiar kafelka", - "boundingBoxHeader": "Zaznaczony obszar", - "seamCorrectionHeader": "Scalanie", - "infillScalingHeader": "Wypełnienie i skalowanie", - "img2imgStrength": "Wpływ sugestii na obraz", - "toggleLoopback": "Wł/wył sprzężenie zwrotne", - "sendTo": "Wyślij do", - "sendToImg2Img": "Użyj w trybie \"Obraz na obraz\"", - "sendToUnifiedCanvas": "Użyj w trybie uniwersalnym", - "copyImageToLink": "Skopiuj adres obrazu", - "downloadImage": "Pobierz obraz", - "openInViewer": "Otwórz podgląd", - "closeViewer": "Zamknij podgląd", - "usePrompt": "Skopiuj sugestie", - "useSeed": "Skopiuj inicjator", - "useAll": "Skopiuj wszystko", - "useInitImg": "Użyj oryginalnego obrazu", - "info": "Informacje", - "initialImage": "Oryginalny obraz", - "showOptionsPanel": "Pokaż panel ustawień" - }, - "settings": { - "models": "Modele", - "displayInProgress": "Podgląd generowanego obrazu", - "saveSteps": "Zapisuj obrazy co X kroków", - "confirmOnDelete": "Potwierdzaj usuwanie", - "displayHelpIcons": "Wyświetlaj ikony pomocy", - "enableImageDebugging": "Włącz debugowanie obrazu", - "resetWebUI": "Zresetuj interfejs", - "resetWebUIDesc1": "Resetowanie interfejsu wyczyści jedynie dane i ustawienia zapisane w pamięci przeglądarki. Nie usunie żadnych obrazów z dysku.", - "resetWebUIDesc2": "Jeśli obrazy nie są poprawnie wyświetlane w galerii lub doświadczasz innych problemów, przed zgłoszeniem błędu spróbuj zresetować interfejs.", - "resetComplete": "Interfejs został zresetowany. Odśwież stronę, aby załadować ponownie." - }, - "toast": { - "tempFoldersEmptied": "Wyczyszczono folder tymczasowy", - "uploadFailed": "Błąd przesyłania obrazu", - "uploadFailedUnableToLoadDesc": "Błąd wczytywania obrazu", - "downloadImageStarted": "Rozpoczęto pobieranie", - "imageCopied": "Skopiowano obraz", - "imageLinkCopied": "Skopiowano link do obrazu", - "imageNotLoaded": "Nie wczytano obrazu", - "imageNotLoadedDesc": "Nie znaleziono obrazu, który można użyć w Obraz na obraz", - "imageSavedToGallery": "Zapisano obraz w galerii", - "canvasMerged": "Scalono widoczne warstwy", - "sentToImageToImage": "Wysłano do Obraz na obraz", - "sentToUnifiedCanvas": "Wysłano do trybu uniwersalnego", - "parametersSet": "Ustawiono parametry", - "parametersNotSet": "Nie ustawiono parametrów", - "parametersNotSetDesc": "Nie znaleziono metadanych dla wybranego obrazu", - "parametersFailed": "Problem z wczytaniem parametrów", - "parametersFailedDesc": "Problem z wczytaniem oryginalnego obrazu", - "seedSet": "Ustawiono inicjator", - "seedNotSet": "Nie ustawiono inicjatora", - "seedNotSetDesc": "Nie znaleziono inicjatora dla wybranego obrazu", - "promptSet": "Ustawiono sugestie", - "promptNotSet": "Nie ustawiono sugestii", - "promptNotSetDesc": "Nie znaleziono zapytania dla wybranego obrazu", - "upscalingFailed": "Błąd powiększania obrazu", - "faceRestoreFailed": "Błąd poprawiania twarzy", - "metadataLoadFailed": "Błąd wczytywania metadanych", - "initialImageSet": "Ustawiono oryginalny obraz", - "initialImageNotSet": "Nie ustawiono oryginalnego obrazu", - "initialImageNotSetDesc": "Błąd wczytywania oryginalnego obrazu" - }, - "tooltip": { - "feature": { - "prompt": "To pole musi zawierać cały tekst sugestii, w tym zarówno opis oczekiwanej zawartości, jak i terminy stylistyczne. Chociaż wagi mogą być zawarte w sugestiach, inne parametry znane z linii poleceń nie będą działać.", - "gallery": "W miarę generowania nowych wywołań w tym miejscu będą wyświetlane pliki z katalogu wyjściowego. Obrazy mają dodatkowo opcje konfiguracji nowych wywołań.", - "other": "Opcje umożliwią alternatywne tryby przetwarzania. Płynne scalanie będzie pomocne przy generowaniu powtarzających się wzorów. Optymalizacja wysokiej rozdzielczości wykonuje dwuetapowy cykl generowania i powinna być używana przy wyższych rozdzielczościach, gdy potrzebny jest bardziej spójny obraz/kompozycja.", - "seed": "Inicjator określa początkowy zestaw szumów, który kieruje procesem odszumiania i może być losowy lub pobrany z poprzedniego wywołania. Funkcja \"Poziom szumu\" może być użyta do złagodzenia saturacji przy wyższych wartościach CFG (spróbuj między 0-10), a Perlin może być użyty w celu dodania wariacji do twoich wyników.", - "variations": "Poziom zróżnicowania przyjmuje wartości od 0 do 1 i pozwala zmienić obraz wyjściowy dla ustawionego inicjatora. Interesujące wyniki uzyskuje się zwykle między 0,1 a 0,3.", - "upscale": "Korzystając z ESRGAN, możesz zwiększyć rozdzielczość obrazu wyjściowego bez konieczności zwiększania szerokości/wysokości w ustawieniach początkowych.", - "faceCorrection": "Poprawianie twarzy próbuje identyfikować twarze na obrazie wyjściowym i korygować wszelkie defekty/nieprawidłowości. W GFPGAN im większa siła, tym mocniejszy efekt. W metodzie Codeformer wyższa wartość oznacza bardziej wierne odtworzenie oryginalnej twarzy, nawet kosztem siły korekcji.", - "imageToImage": "Tryb \"Obraz na obraz\" pozwala na załadowanie obrazu wzorca, który obok wprowadzonych sugestii zostanie użyty porzez InvokeAI do wygenerowania nowego obrazu. Niższa wartość tego ustawienia będzie bardziej przypominać oryginalny obraz. Akceptowane są wartości od 0 do 1, a zalecany jest zakres od 0,25 do 0,75.", - "boundingBox": "Zaznaczony obszar odpowiada ustawieniom wysokości i szerokości w trybach Tekst na obraz i Obraz na obraz. Jedynie piksele znajdujące się w obszarze zaznaczenia zostaną uwzględnione podczas wywoływania nowego obrazu.", - "seamCorrection": "Opcje wpływające na poziom widoczności szwów, które mogą wystąpić, gdy wygenerowany obraz jest ponownie wklejany na płótno.", - "infillAndScaling": "Zarządzaj metodami wypełniania (używanymi na zamaskowanych lub wymazanych obszarach płótna) i skalowaniem (przydatne w przypadku zaznaczonego obszaru o b. małych rozmiarach)." - } - }, - "unifiedCanvas": { - "layer": "Warstwa", - "base": "Główna", - "mask": "Maska", - "maskingOptions": "Opcje maski", - "enableMask": "Włącz maskę", - "preserveMaskedArea": "Zachowaj obszar", - "clearMask": "Wyczyść maskę", - "brush": "Pędzel", - "eraser": "Gumka", - "fillBoundingBox": "Wypełnij zaznaczenie", - "eraseBoundingBox": "Wyczyść zaznaczenie", - "colorPicker": "Pipeta", - "brushOptions": "Ustawienia pędzla", - "brushSize": "Rozmiar", - "move": "Przesunięcie", - "resetView": "Resetuj widok", - "mergeVisible": "Scal warstwy", - "saveToGallery": "Zapisz w galerii", - "copyToClipboard": "Skopiuj do schowka", - "downloadAsImage": "Zapisz do pliku", - "undo": "Cofnij", - "redo": "Ponów", - "clearCanvas": "Wyczyść obraz", - "canvasSettings": "Ustawienia obrazu", - "showIntermediates": "Pokazuj stany pośrednie", - "showGrid": "Pokazuj siatkę", - "snapToGrid": "Przyciągaj do siatki", - "darkenOutsideSelection": "Przyciemnij poza zaznaczeniem", - "autoSaveToGallery": "Zapisuj automatycznie do galerii", - "saveBoxRegionOnly": "Zapisuj tylko zaznaczony obszar", - "limitStrokesToBox": "Rysuj tylko wewnątrz zaznaczenia", - "showCanvasDebugInfo": "Informacje dla developera", - "clearCanvasHistory": "Wyczyść historię operacji", - "clearHistory": "Wyczyść historię", - "clearCanvasHistoryMessage": "Wyczyszczenie historii nie będzie miało wpływu na sam obraz, ale niemożliwe będzie cofnięcie i otworzenie wszystkich wykonanych do tej pory operacji.", - "clearCanvasHistoryConfirm": "Czy na pewno chcesz wyczyścić historię operacji?", - "emptyTempImageFolder": "Wyczyść folder tymczasowy", - "emptyFolder": "Wyczyść", - "emptyTempImagesFolderMessage": "Wyczyszczenie folderu tymczasowego spowoduje usunięcie obrazu i maski w trybie uniwersalnym, historii operacji, oraz wszystkich wygenerowanych ale niezapisanych obrazów.", - "emptyTempImagesFolderConfirm": "Czy na pewno chcesz wyczyścić folder tymczasowy?", - "activeLayer": "Warstwa aktywna", - "canvasScale": "Poziom powiększenia", - "boundingBox": "Rozmiar zaznaczenia", - "scaledBoundingBox": "Rozmiar po skalowaniu", - "boundingBoxPosition": "Pozycja zaznaczenia", - "canvasDimensions": "Rozmiar płótna", - "canvasPosition": "Pozycja płótna", - "cursorPosition": "Pozycja kursora", - "previous": "Poprzedni", - "next": "Następny", - "accept": "Zaakceptuj", - "showHide": "Pokaż/Ukryj", - "discardAll": "Odrzuć wszystkie", - "betaClear": "Wyczyść", - "betaDarkenOutside": "Przyciemnienie", - "betaLimitToBox": "Ogranicz do zaznaczenia", - "betaPreserveMasked": "Zachowaj obszar" - }, - "accessibility": { - "zoomIn": "Przybliż", - "exitViewer": "Wyjdź z podglądu", - "modelSelect": "Wybór modelu", - "invokeProgressBar": "Pasek postępu", - "reset": "Zerowanie", - "useThisParameter": "Użyj tego parametru", - "copyMetadataJson": "Kopiuj metadane JSON", - "uploadImage": "Wgrywanie obrazu", - "previousImage": "Poprzedni obraz", - "nextImage": "Następny obraz", - "zoomOut": "Oddal", - "rotateClockwise": "Obróć zgodnie ze wskazówkami zegara", - "rotateCounterClockwise": "Obróć przeciwnie do wskazówek zegara", - "flipHorizontally": "Odwróć horyzontalnie", - "flipVertically": "Odwróć wertykalnie", - "modifyConfig": "Modyfikuj ustawienia", - "toggleAutoscroll": "Przełącz autoprzewijanie", - "toggleLogViewer": "Przełącz podgląd logów", - "showOptionsPanel": "Pokaż panel opcji", - "menu": "Menu" - } -} diff --git a/invokeai/frontend/web/dist/locales/pt.json b/invokeai/frontend/web/dist/locales/pt.json deleted file mode 100644 index ac9dd50b4d..0000000000 --- a/invokeai/frontend/web/dist/locales/pt.json +++ /dev/null @@ -1,602 +0,0 @@ -{ - "common": { - "langArabic": "العربية", - "reportBugLabel": "Reportar Bug", - "settingsLabel": "Configurações", - "langBrPortuguese": "Português do Brasil", - "languagePickerLabel": "Seletor de Idioma", - "langDutch": "Nederlands", - "langEnglish": "English", - "hotkeysLabel": "Hotkeys", - "langPolish": "Polski", - "langFrench": "Français", - "langGerman": "Deutsch", - "langItalian": "Italiano", - "langJapanese": "日本語", - "langSimplifiedChinese": "简体中文", - "langSpanish": "Espanhol", - "langRussian": "Русский", - "langUkranian": "Украї́нська", - "img2img": "Imagem para Imagem", - "unifiedCanvas": "Tela Unificada", - "nodes": "Nós", - "nodesDesc": "Um sistema baseado em nós para a geração de imagens está em desenvolvimento atualmente. Fique atento para atualizações sobre este recurso incrível.", - "postProcessDesc3": "A Interface de Linha de Comando do Invoke AI oferece vários outros recursos, incluindo o Embiggen.", - "postProcessing": "Pós Processamento", - "postProcessDesc1": "O Invoke AI oferece uma ampla variedade de recursos de pós-processamento. O aumento de resolução de imagem e a restauração de rosto já estão disponíveis na interface do usuário da Web. Você pode acessá-los no menu Opções Avançadas das guias Texto para Imagem e Imagem para Imagem. Você também pode processar imagens diretamente, usando os botões de ação de imagem acima da exibição da imagem atual ou no visualizador.", - "postProcessDesc2": "Em breve, uma interface do usuário dedicada será lançada para facilitar fluxos de trabalho de pós-processamento mais avançados.", - "trainingDesc1": "Um fluxo de trabalho dedicado para treinar seus próprios embeddings e checkpoints usando Textual Inversion e Dreambooth da interface da web.", - "trainingDesc2": "O InvokeAI já oferece suporte ao treinamento de embeddings personalizados usando a Inversão Textual por meio do script principal.", - "upload": "Upload", - "statusError": "Erro", - "statusGeneratingTextToImage": "Gerando Texto para Imagem", - "close": "Fechar", - "load": "Abrir", - "back": "Voltar", - "statusConnected": "Conectado", - "statusDisconnected": "Desconectado", - "statusPreparing": "Preparando", - "statusGenerating": "Gerando", - "statusProcessingCanceled": "Processamento Cancelado", - "statusProcessingComplete": "Processamento Completo", - "statusGeneratingImageToImage": "Gerando Imagem para Imagem", - "statusGeneratingInpainting": "Geração de Preenchimento de Lacunas", - "statusIterationComplete": "Iteração Completa", - "statusSavingImage": "Salvando Imagem", - "statusRestoringFacesGFPGAN": "Restaurando Faces (GFPGAN)", - "statusRestoringFaces": "Restaurando Faces", - "statusRestoringFacesCodeFormer": "Restaurando Faces (CodeFormer)", - "statusUpscaling": "Ampliando", - "statusUpscalingESRGAN": "Ampliando (ESRGAN)", - "statusConvertingModel": "Convertendo Modelo", - "statusModelConverted": "Modelo Convertido", - "statusLoadingModel": "Carregando Modelo", - "statusModelChanged": "Modelo Alterado", - "githubLabel": "Github", - "discordLabel": "Discord", - "training": "Treinando", - "statusGeneratingOutpainting": "Geração de Ampliação", - "statusGenerationComplete": "Geração Completa", - "statusMergingModels": "Mesclando Modelos", - "statusMergedModels": "Modelos Mesclados", - "loading": "A carregar", - "loadingInvokeAI": "A carregar Invoke AI", - "langPortuguese": "Português" - }, - "gallery": { - "galleryImageResetSize": "Resetar Imagem", - "gallerySettings": "Configurações de Galeria", - "maintainAspectRatio": "Mater Proporções", - "autoSwitchNewImages": "Trocar para Novas Imagens Automaticamente", - "singleColumnLayout": "Disposição em Coluna Única", - "allImagesLoaded": "Todas as Imagens Carregadas", - "loadMore": "Carregar Mais", - "noImagesInGallery": "Sem Imagens na Galeria", - "generations": "Gerações", - "showGenerations": "Mostrar Gerações", - "uploads": "Enviados", - "showUploads": "Mostrar Enviados", - "galleryImageSize": "Tamanho da Imagem" - }, - "hotkeys": { - "generalHotkeys": "Atalhos Gerais", - "galleryHotkeys": "Atalhos da Galeria", - "toggleViewer": { - "title": "Ativar Visualizador", - "desc": "Abrir e fechar o Visualizador de Imagens" - }, - "maximizeWorkSpace": { - "desc": "Fechar painéis e maximixar área de trabalho", - "title": "Maximizar a Área de Trabalho" - }, - "changeTabs": { - "title": "Mudar Guias", - "desc": "Trocar para outra área de trabalho" - }, - "consoleToggle": { - "desc": "Abrir e fechar console", - "title": "Ativar Console" - }, - "setPrompt": { - "title": "Definir Prompt", - "desc": "Usar o prompt da imagem atual" - }, - "sendToImageToImage": { - "desc": "Manda a imagem atual para Imagem Para Imagem", - "title": "Mandar para Imagem Para Imagem" - }, - "previousImage": { - "desc": "Mostra a imagem anterior na galeria", - "title": "Imagem Anterior" - }, - "nextImage": { - "title": "Próxima Imagem", - "desc": "Mostra a próxima imagem na galeria" - }, - "decreaseGalleryThumbSize": { - "desc": "Diminui o tamanho das thumbs na galeria", - "title": "Diminuir Tamanho da Galeria de Imagem" - }, - "selectBrush": { - "title": "Selecionar Pincel", - "desc": "Seleciona o pincel" - }, - "selectEraser": { - "title": "Selecionar Apagador", - "desc": "Seleciona o apagador" - }, - "decreaseBrushSize": { - "title": "Diminuir Tamanho do Pincel", - "desc": "Diminui o tamanho do pincel/apagador" - }, - "increaseBrushOpacity": { - "desc": "Aumenta a opacidade do pincel", - "title": "Aumentar Opacidade do Pincel" - }, - "moveTool": { - "title": "Ferramenta Mover", - "desc": "Permite navegar pela tela" - }, - "decreaseBrushOpacity": { - "desc": "Diminui a opacidade do pincel", - "title": "Diminuir Opacidade do Pincel" - }, - "toggleSnap": { - "title": "Ativar Encaixe", - "desc": "Ativa Encaixar na Grade" - }, - "quickToggleMove": { - "title": "Ativar Mover Rapidamente", - "desc": "Temporariamente ativa o modo Mover" - }, - "toggleLayer": { - "title": "Ativar Camada", - "desc": "Ativa a seleção de camada de máscara/base" - }, - "clearMask": { - "title": "Limpar Máscara", - "desc": "Limpa toda a máscara" - }, - "hideMask": { - "title": "Esconder Máscara", - "desc": "Esconde e Revela a máscara" - }, - "mergeVisible": { - "title": "Fundir Visível", - "desc": "Fundir todas as camadas visíveis das telas" - }, - "downloadImage": { - "desc": "Descarregar a tela atual", - "title": "Descarregar Imagem" - }, - "undoStroke": { - "title": "Desfazer Traço", - "desc": "Desfaz um traço de pincel" - }, - "redoStroke": { - "title": "Refazer Traço", - "desc": "Refaz o traço de pincel" - }, - "keyboardShortcuts": "Atalhos de Teclado", - "appHotkeys": "Atalhos do app", - "invoke": { - "title": "Invocar", - "desc": "Gerar uma imagem" - }, - "cancel": { - "title": "Cancelar", - "desc": "Cancelar geração de imagem" - }, - "focusPrompt": { - "title": "Foco do Prompt", - "desc": "Foco da área de texto do prompt" - }, - "toggleOptions": { - "title": "Ativar Opções", - "desc": "Abrir e fechar o painel de opções" - }, - "pinOptions": { - "title": "Fixar Opções", - "desc": "Fixar o painel de opções" - }, - "closePanels": { - "title": "Fechar Painéis", - "desc": "Fecha os painéis abertos" - }, - "unifiedCanvasHotkeys": "Atalhos da Tela Unificada", - "toggleGallery": { - "title": "Ativar Galeria", - "desc": "Abrir e fechar a gaveta da galeria" - }, - "setSeed": { - "title": "Definir Seed", - "desc": "Usar seed da imagem atual" - }, - "setParameters": { - "title": "Definir Parâmetros", - "desc": "Usar todos os parâmetros da imagem atual" - }, - "restoreFaces": { - "title": "Restaurar Rostos", - "desc": "Restaurar a imagem atual" - }, - "upscale": { - "title": "Redimensionar", - "desc": "Redimensionar a imagem atual" - }, - "showInfo": { - "title": "Mostrar Informações", - "desc": "Mostrar metadados de informações da imagem atual" - }, - "deleteImage": { - "title": "Apagar Imagem", - "desc": "Apaga a imagem atual" - }, - "toggleGalleryPin": { - "title": "Ativar Fixar Galeria", - "desc": "Fixa e desafixa a galeria na interface" - }, - "increaseGalleryThumbSize": { - "title": "Aumentar Tamanho da Galeria de Imagem", - "desc": "Aumenta o tamanho das thumbs na galeria" - }, - "increaseBrushSize": { - "title": "Aumentar Tamanho do Pincel", - "desc": "Aumenta o tamanho do pincel/apagador" - }, - "fillBoundingBox": { - "title": "Preencher Caixa Delimitadora", - "desc": "Preenche a caixa delimitadora com a cor do pincel" - }, - "eraseBoundingBox": { - "title": "Apagar Caixa Delimitadora", - "desc": "Apaga a área da caixa delimitadora" - }, - "colorPicker": { - "title": "Selecionar Seletor de Cor", - "desc": "Seleciona o seletor de cores" - }, - "showHideBoundingBox": { - "title": "Mostrar/Esconder Caixa Delimitadora", - "desc": "Ativa a visibilidade da caixa delimitadora" - }, - "saveToGallery": { - "title": "Gravara Na Galeria", - "desc": "Grava a tela atual na galeria" - }, - "copyToClipboard": { - "title": "Copiar para a Área de Transferência", - "desc": "Copia a tela atual para a área de transferência" - }, - "resetView": { - "title": "Resetar Visualização", - "desc": "Reseta Visualização da Tela" - }, - "previousStagingImage": { - "title": "Imagem de Preparação Anterior", - "desc": "Área de Imagem de Preparação Anterior" - }, - "nextStagingImage": { - "title": "Próxima Imagem de Preparação Anterior", - "desc": "Próxima Área de Imagem de Preparação Anterior" - }, - "acceptStagingImage": { - "title": "Aceitar Imagem de Preparação Anterior", - "desc": "Aceitar Área de Imagem de Preparação Anterior" - } - }, - "modelManager": { - "modelAdded": "Modelo Adicionado", - "modelUpdated": "Modelo Atualizado", - "modelEntryDeleted": "Entrada de modelo excluída", - "description": "Descrição", - "modelLocationValidationMsg": "Caminho para onde o seu modelo está localizado.", - "repo_id": "Repo ID", - "vaeRepoIDValidationMsg": "Repositório Online do seu VAE", - "width": "Largura", - "widthValidationMsg": "Largura padrão do seu modelo.", - "height": "Altura", - "heightValidationMsg": "Altura padrão do seu modelo.", - "findModels": "Encontrar Modelos", - "scanAgain": "Digitalize Novamente", - "deselectAll": "Deselecionar Tudo", - "showExisting": "Mostrar Existente", - "deleteConfig": "Apagar Config", - "convertToDiffusersHelpText6": "Deseja converter este modelo?", - "mergedModelName": "Nome do modelo mesclado", - "alpha": "Alpha", - "interpolationType": "Tipo de Interpolação", - "modelMergeHeaderHelp1": "Pode mesclar até três modelos diferentes para criar uma mistura que atenda às suas necessidades.", - "modelMergeHeaderHelp2": "Apenas Diffusers estão disponíveis para mesclagem. Se deseja mesclar um modelo de checkpoint, por favor, converta-o para Diffusers primeiro.", - "modelMergeInterpAddDifferenceHelp": "Neste modo, o Modelo 3 é primeiro subtraído do Modelo 2. A versão resultante é mesclada com o Modelo 1 com a taxa alpha definida acima.", - "nameValidationMsg": "Insira um nome para o seu modelo", - "descriptionValidationMsg": "Adicione uma descrição para o seu modelo", - "config": "Configuração", - "modelExists": "Modelo Existe", - "selectAndAdd": "Selecione e Adicione Modelos Listados Abaixo", - "noModelsFound": "Nenhum Modelo Encontrado", - "v2_768": "v2 (768px)", - "inpainting": "v1 Inpainting", - "customConfig": "Configuração personalizada", - "pathToCustomConfig": "Caminho para configuração personalizada", - "statusConverting": "A converter", - "modelConverted": "Modelo Convertido", - "ignoreMismatch": "Ignorar Divergências entre Modelos Selecionados", - "addDifference": "Adicionar diferença", - "pickModelType": "Escolha o tipo de modelo", - "safetensorModels": "SafeTensors", - "cannotUseSpaces": "Não pode usar espaços", - "addNew": "Adicionar Novo", - "addManually": "Adicionar Manualmente", - "manual": "Manual", - "name": "Nome", - "configValidationMsg": "Caminho para o ficheiro de configuração do seu modelo.", - "modelLocation": "Localização do modelo", - "repoIDValidationMsg": "Repositório Online do seu Modelo", - "updateModel": "Atualizar Modelo", - "availableModels": "Modelos Disponíveis", - "load": "Carregar", - "active": "Ativado", - "notLoaded": "Não carregado", - "deleteModel": "Apagar modelo", - "deleteMsg1": "Tem certeza de que deseja apagar esta entrada do modelo de InvokeAI?", - "deleteMsg2": "Isso não vai apagar o ficheiro de modelo checkpoint do seu disco. Pode lê-los, se desejar.", - "convertToDiffusers": "Converter para Diffusers", - "convertToDiffusersHelpText1": "Este modelo será convertido ao formato 🧨 Diffusers.", - "convertToDiffusersHelpText2": "Este processo irá substituir a sua entrada de Gestor de Modelos por uma versão Diffusers do mesmo modelo.", - "convertToDiffusersHelpText3": "O seu ficheiro de ponto de verificação no disco NÃO será excluído ou modificado de forma alguma. Pode adicionar o seu ponto de verificação ao Gestor de modelos novamente, se desejar.", - "convertToDiffusersSaveLocation": "Local para Gravar", - "v2_base": "v2 (512px)", - "mergeModels": "Mesclar modelos", - "modelOne": "Modelo 1", - "modelTwo": "Modelo 2", - "modelThree": "Modelo 3", - "mergedModelSaveLocation": "Local de Salvamento", - "merge": "Mesclar", - "modelsMerged": "Modelos mesclados", - "mergedModelCustomSaveLocation": "Caminho Personalizado", - "invokeAIFolder": "Pasta Invoke AI", - "inverseSigmoid": "Sigmóide Inversa", - "none": "nenhum", - "modelManager": "Gerente de Modelo", - "model": "Modelo", - "allModels": "Todos os Modelos", - "checkpointModels": "Checkpoints", - "diffusersModels": "Diffusers", - "addNewModel": "Adicionar Novo modelo", - "addCheckpointModel": "Adicionar Modelo de Checkpoint/Safetensor", - "addDiffuserModel": "Adicionar Diffusers", - "vaeLocation": "Localização VAE", - "vaeLocationValidationMsg": "Caminho para onde o seu VAE está localizado.", - "vaeRepoID": "VAE Repo ID", - "addModel": "Adicionar Modelo", - "search": "Procurar", - "cached": "Em cache", - "checkpointFolder": "Pasta de Checkpoint", - "clearCheckpointFolder": "Apagar Pasta de Checkpoint", - "modelsFound": "Modelos Encontrados", - "selectFolder": "Selecione a Pasta", - "selected": "Selecionada", - "selectAll": "Selecionar Tudo", - "addSelected": "Adicione Selecionado", - "delete": "Apagar", - "formMessageDiffusersModelLocation": "Localização dos Modelos Diffusers", - "formMessageDiffusersModelLocationDesc": "Por favor entre com ao menos um.", - "formMessageDiffusersVAELocation": "Localização do VAE", - "formMessageDiffusersVAELocationDesc": "Se não provido, InvokeAI irá procurar pelo ficheiro VAE dentro do local do modelo.", - "convert": "Converter", - "convertToDiffusersHelpText4": "Este é um processo único. Pode levar cerca de 30 a 60s, a depender das especificações do seu computador.", - "convertToDiffusersHelpText5": "Por favor, certifique-se de que tenha espaço suficiente no disco. Os modelos geralmente variam entre 4GB e 7GB de tamanho.", - "v1": "v1", - "sameFolder": "Mesma pasta", - "invokeRoot": "Pasta do InvokeAI", - "custom": "Personalizado", - "customSaveLocation": "Local de salvamento personalizado", - "modelMergeAlphaHelp": "Alpha controla a força da mistura dos modelos. Valores de alpha mais baixos resultam numa influência menor do segundo modelo.", - "sigmoid": "Sigmóide", - "weightedSum": "Soma Ponderada" - }, - "parameters": { - "width": "Largura", - "seed": "Seed", - "hiresStrength": "Força da Alta Resolução", - "general": "Geral", - "randomizeSeed": "Seed Aleatório", - "shuffle": "Embaralhar", - "noiseThreshold": "Limite de Ruído", - "perlinNoise": "Ruído de Perlin", - "variations": "Variatções", - "seedWeights": "Pesos da Seed", - "restoreFaces": "Restaurar Rostos", - "faceRestoration": "Restauração de Rosto", - "type": "Tipo", - "denoisingStrength": "A força de remoção de ruído", - "scale": "Escala", - "otherOptions": "Outras Opções", - "seamlessTiling": "Ladrilho Sem Fronteira", - "hiresOptim": "Otimização de Alta Res", - "imageFit": "Caber Imagem Inicial No Tamanho de Saída", - "codeformerFidelity": "Fidelidade", - "tileSize": "Tamanho do Ladrilho", - "boundingBoxHeader": "Caixa Delimitadora", - "seamCorrectionHeader": "Correção de Fronteira", - "infillScalingHeader": "Preencimento e Escala", - "img2imgStrength": "Força de Imagem Para Imagem", - "toggleLoopback": "Ativar Loopback", - "symmetry": "Simetria", - "sendTo": "Mandar para", - "openInViewer": "Abrir No Visualizador", - "closeViewer": "Fechar Visualizador", - "usePrompt": "Usar Prompt", - "initialImage": "Imagem inicial", - "showOptionsPanel": "Mostrar Painel de Opções", - "strength": "Força", - "upscaling": "Redimensionando", - "upscale": "Redimensionar", - "upscaleImage": "Redimensionar Imagem", - "scaleBeforeProcessing": "Escala Antes do Processamento", - "images": "Imagems", - "steps": "Passos", - "cfgScale": "Escala CFG", - "height": "Altura", - "imageToImage": "Imagem para Imagem", - "variationAmount": "Quntidade de Variatções", - "scaledWidth": "L Escalada", - "scaledHeight": "A Escalada", - "infillMethod": "Método de Preenchimento", - "hSymmetryStep": "H Passo de Simetria", - "vSymmetryStep": "V Passo de Simetria", - "cancel": { - "immediate": "Cancelar imediatamente", - "schedule": "Cancelar após a iteração atual", - "isScheduled": "A cancelar", - "setType": "Definir tipo de cancelamento" - }, - "sendToImg2Img": "Mandar para Imagem Para Imagem", - "sendToUnifiedCanvas": "Mandar para Tela Unificada", - "copyImage": "Copiar imagem", - "copyImageToLink": "Copiar Imagem Para a Ligação", - "downloadImage": "Descarregar Imagem", - "useSeed": "Usar Seed", - "useAll": "Usar Todos", - "useInitImg": "Usar Imagem Inicial", - "info": "Informações" - }, - "settings": { - "confirmOnDelete": "Confirmar Antes de Apagar", - "displayHelpIcons": "Mostrar Ícones de Ajuda", - "enableImageDebugging": "Ativar Depuração de Imagem", - "useSlidersForAll": "Usar deslizadores para todas as opções", - "resetWebUIDesc1": "Reiniciar a interface apenas reinicia o cache local do broswer para imagens e configurações lembradas. Não apaga nenhuma imagem do disco.", - "models": "Modelos", - "displayInProgress": "Mostrar Progresso de Imagens Em Andamento", - "saveSteps": "Gravar imagens a cada n passos", - "resetWebUI": "Reiniciar Interface", - "resetWebUIDesc2": "Se as imagens não estão a aparecer na galeria ou algo mais não está a funcionar, favor tentar reiniciar antes de postar um problema no GitHub.", - "resetComplete": "A interface foi reiniciada. Atualize a página para carregar." - }, - "toast": { - "uploadFailed": "Envio Falhou", - "uploadFailedUnableToLoadDesc": "Não foj possível carregar o ficheiro", - "downloadImageStarted": "Download de Imagem Começou", - "imageNotLoadedDesc": "Nenhuma imagem encontrada a enviar para o módulo de imagem para imagem", - "imageLinkCopied": "Ligação de Imagem Copiada", - "imageNotLoaded": "Nenhuma Imagem Carregada", - "parametersFailed": "Problema ao carregar parâmetros", - "parametersFailedDesc": "Não foi possível carregar imagem incial.", - "seedSet": "Seed Definida", - "upscalingFailed": "Redimensionamento Falhou", - "promptNotSet": "Prompt Não Definido", - "tempFoldersEmptied": "Pasta de Ficheiros Temporários Esvaziada", - "imageCopied": "Imagem Copiada", - "imageSavedToGallery": "Imagem Salva na Galeria", - "canvasMerged": "Tela Fundida", - "sentToImageToImage": "Mandar Para Imagem Para Imagem", - "sentToUnifiedCanvas": "Enviada para a Tela Unificada", - "parametersSet": "Parâmetros Definidos", - "parametersNotSet": "Parâmetros Não Definidos", - "parametersNotSetDesc": "Nenhum metadado foi encontrado para essa imagem.", - "seedNotSet": "Seed Não Definida", - "seedNotSetDesc": "Não foi possível achar a seed para a imagem.", - "promptSet": "Prompt Definido", - "promptNotSetDesc": "Não foi possível achar prompt para essa imagem.", - "faceRestoreFailed": "Restauração de Rosto Falhou", - "metadataLoadFailed": "Falha ao tentar carregar metadados", - "initialImageSet": "Imagem Inicial Definida", - "initialImageNotSet": "Imagem Inicial Não Definida", - "initialImageNotSetDesc": "Não foi possível carregar imagem incial" - }, - "tooltip": { - "feature": { - "prompt": "Este é o campo de prompt. O prompt inclui objetos de geração e termos estilísticos. Também pode adicionar peso (importância do token) no prompt, mas comandos e parâmetros de CLI não funcionarão.", - "other": "Essas opções ativam modos alternativos de processamento para o Invoke. 'Seamless tiling' criará padrões repetidos na saída. 'High resolution' é uma geração em duas etapas com img2img: use essa configuração quando desejar uma imagem maior e mais coerente sem artefatos. Levará mais tempo do que o txt2img usual.", - "seed": "O valor da semente afeta o ruído inicial a partir do qual a imagem é formada. Pode usar as sementes já existentes de imagens anteriores. 'Limiar de ruído' é usado para mitigar artefatos em valores CFG altos (experimente a faixa de 0-10) e o Perlin para adicionar ruído Perlin durante a geração: ambos servem para adicionar variação às suas saídas.", - "imageToImage": "Image to Image carrega qualquer imagem como inicial, que é então usada para gerar uma nova junto com o prompt. Quanto maior o valor, mais a imagem resultante mudará. Valores de 0.0 a 1.0 são possíveis, a faixa recomendada é de 0.25 a 0.75", - "faceCorrection": "Correção de rosto com GFPGAN ou Codeformer: o algoritmo detecta rostos na imagem e corrige quaisquer defeitos. Um valor alto mudará mais a imagem, a resultar em rostos mais atraentes. Codeformer com uma fidelidade maior preserva a imagem original às custas de uma correção de rosto mais forte.", - "seamCorrection": "Controla o tratamento das emendas visíveis que ocorrem entre as imagens geradas no canvas.", - "gallery": "A galeria exibe as gerações da pasta de saída conforme elas são criadas. As configurações são armazenadas em ficheiros e acessadas pelo menu de contexto.", - "variations": "Experimente uma variação com um valor entre 0,1 e 1,0 para mudar o resultado para uma determinada semente. Variações interessantes da semente estão entre 0,1 e 0,3.", - "upscale": "Use o ESRGAN para ampliar a imagem imediatamente após a geração.", - "boundingBox": "A caixa delimitadora é a mesma que as configurações de largura e altura para Texto para Imagem ou Imagem para Imagem. Apenas a área na caixa será processada.", - "infillAndScaling": "Gira os métodos de preenchimento (usados em áreas mascaradas ou apagadas do canvas) e a escala (útil para tamanhos de caixa delimitadora pequenos)." - } - }, - "unifiedCanvas": { - "emptyTempImagesFolderMessage": "Esvaziar a pasta de ficheiros de imagem temporários também reseta completamente a Tela Unificada. Isso inclui todo o histórico de desfazer/refazer, imagens na área de preparação e a camada base da tela.", - "scaledBoundingBox": "Caixa Delimitadora Escalada", - "boundingBoxPosition": "Posição da Caixa Delimitadora", - "next": "Próximo", - "accept": "Aceitar", - "showHide": "Mostrar/Esconder", - "discardAll": "Descartar Todos", - "betaClear": "Limpar", - "betaDarkenOutside": "Escurecer Externamente", - "base": "Base", - "brush": "Pincel", - "showIntermediates": "Mostrar Intermediários", - "showGrid": "Mostrar Grade", - "clearCanvasHistoryConfirm": "Tem certeza que quer limpar o histórico de tela?", - "boundingBox": "Caixa Delimitadora", - "canvasDimensions": "Dimensões da Tela", - "canvasPosition": "Posição da Tela", - "cursorPosition": "Posição do cursor", - "previous": "Anterior", - "betaLimitToBox": "Limitar á Caixa", - "layer": "Camada", - "mask": "Máscara", - "maskingOptions": "Opções de Mascaramento", - "enableMask": "Ativar Máscara", - "preserveMaskedArea": "Preservar Área da Máscara", - "clearMask": "Limpar Máscara", - "eraser": "Apagador", - "fillBoundingBox": "Preencher Caixa Delimitadora", - "eraseBoundingBox": "Apagar Caixa Delimitadora", - "colorPicker": "Seletor de Cor", - "brushOptions": "Opções de Pincel", - "brushSize": "Tamanho", - "move": "Mover", - "resetView": "Resetar Visualização", - "mergeVisible": "Fundir Visível", - "saveToGallery": "Gravar na Galeria", - "copyToClipboard": "Copiar para a Área de Transferência", - "downloadAsImage": "Descarregar Como Imagem", - "undo": "Desfazer", - "redo": "Refazer", - "clearCanvas": "Limpar Tela", - "canvasSettings": "Configurações de Tela", - "snapToGrid": "Encaixar na Grade", - "darkenOutsideSelection": "Escurecer Seleção Externa", - "autoSaveToGallery": "Gravar Automaticamente na Galeria", - "saveBoxRegionOnly": "Gravar Apenas a Região da Caixa", - "limitStrokesToBox": "Limitar Traços à Caixa", - "showCanvasDebugInfo": "Mostrar Informações de Depuração daTela", - "clearCanvasHistory": "Limpar o Histórico da Tela", - "clearHistory": "Limpar Históprico", - "clearCanvasHistoryMessage": "Limpar o histórico de tela deixa a sua tela atual intacta, mas limpa de forma irreversível o histórico de desfazer e refazer.", - "emptyTempImageFolder": "Esvaziar a Pasta de Ficheiros de Imagem Temporários", - "emptyFolder": "Esvaziar Pasta", - "emptyTempImagesFolderConfirm": "Tem certeza que quer esvaziar a pasta de ficheiros de imagem temporários?", - "activeLayer": "Camada Ativa", - "canvasScale": "Escala da Tela", - "betaPreserveMasked": "Preservar Máscarado" - }, - "accessibility": { - "invokeProgressBar": "Invocar barra de progresso", - "reset": "Repôr", - "nextImage": "Próxima imagem", - "useThisParameter": "Usar este parâmetro", - "copyMetadataJson": "Copiar metadados JSON", - "zoomIn": "Ampliar", - "zoomOut": "Reduzir", - "rotateCounterClockwise": "Girar no sentido anti-horário", - "rotateClockwise": "Girar no sentido horário", - "flipVertically": "Espelhar verticalmente", - "modifyConfig": "Modificar config", - "toggleAutoscroll": "Alternar rolagem automática", - "showOptionsPanel": "Mostrar painel de opções", - "uploadImage": "Enviar imagem", - "previousImage": "Imagem anterior", - "flipHorizontally": "Espelhar horizontalmente", - "toggleLogViewer": "Alternar visualizador de registo" - } -} diff --git a/invokeai/frontend/web/dist/locales/pt_BR.json b/invokeai/frontend/web/dist/locales/pt_BR.json deleted file mode 100644 index 3b45dbbbf3..0000000000 --- a/invokeai/frontend/web/dist/locales/pt_BR.json +++ /dev/null @@ -1,577 +0,0 @@ -{ - "common": { - "hotkeysLabel": "Teclas de atalho", - "languagePickerLabel": "Seletor de Idioma", - "reportBugLabel": "Relatar Bug", - "settingsLabel": "Configurações", - "img2img": "Imagem Para Imagem", - "unifiedCanvas": "Tela Unificada", - "nodes": "Nódulos", - "langBrPortuguese": "Português do Brasil", - "nodesDesc": "Um sistema baseado em nódulos para geração de imagens está em contrução. Fique ligado para atualizações sobre essa funcionalidade incrível.", - "postProcessing": "Pós-processamento", - "postProcessDesc1": "Invoke AI oferece uma variedade e funcionalidades de pós-processamento. Redimensionador de Imagem e Restauração Facial já estão disponíveis na interface. Você pode acessar elas no menu de Opções Avançadas na aba de Texto para Imagem e Imagem para Imagem. Você também pode processar imagens diretamente, usando os botões de ação de imagem acima da atual tela de imagens ou visualizador.", - "postProcessDesc2": "Uma interface dedicada será lançada em breve para facilitar fluxos de trabalho com opções mais avançadas de pós-processamento.", - "postProcessDesc3": "A interface do comando de linha da Invoke oferece várias funcionalidades incluindo Ampliação.", - "training": "Treinando", - "trainingDesc1": "Um fluxo de trabalho dedicado para treinar suas próprias incorporações e chockpoints usando Inversão Textual e Dreambooth na interface web.", - "trainingDesc2": "InvokeAI já suporta treinar incorporações personalizadas usando Inversão Textual com o script principal.", - "upload": "Enviar", - "close": "Fechar", - "load": "Carregar", - "statusConnected": "Conectado", - "statusDisconnected": "Disconectado", - "statusError": "Erro", - "statusPreparing": "Preparando", - "statusProcessingCanceled": "Processamento Canceledo", - "statusProcessingComplete": "Processamento Completo", - "statusGenerating": "Gerando", - "statusGeneratingTextToImage": "Gerando Texto Para Imagem", - "statusGeneratingImageToImage": "Gerando Imagem Para Imagem", - "statusGeneratingInpainting": "Gerando Inpainting", - "statusGeneratingOutpainting": "Gerando Outpainting", - "statusGenerationComplete": "Geração Completa", - "statusIterationComplete": "Iteração Completa", - "statusSavingImage": "Salvando Imagem", - "statusRestoringFaces": "Restaurando Rostos", - "statusRestoringFacesGFPGAN": "Restaurando Rostos (GFPGAN)", - "statusRestoringFacesCodeFormer": "Restaurando Rostos (CodeFormer)", - "statusUpscaling": "Redimensinando", - "statusUpscalingESRGAN": "Redimensinando (ESRGAN)", - "statusLoadingModel": "Carregando Modelo", - "statusModelChanged": "Modelo Alterado", - "githubLabel": "Github", - "discordLabel": "Discord", - "langArabic": "Árabe", - "langEnglish": "Inglês", - "langDutch": "Holandês", - "langFrench": "Francês", - "langGerman": "Alemão", - "langItalian": "Italiano", - "langJapanese": "Japonês", - "langPolish": "Polonês", - "langSimplifiedChinese": "Chinês", - "langUkranian": "Ucraniano", - "back": "Voltar", - "statusConvertingModel": "Convertendo Modelo", - "statusModelConverted": "Modelo Convertido", - "statusMergingModels": "Mesclando Modelos", - "statusMergedModels": "Modelos Mesclados", - "langRussian": "Russo", - "langSpanish": "Espanhol", - "loadingInvokeAI": "Carregando Invoke AI", - "loading": "Carregando" - }, - "gallery": { - "generations": "Gerações", - "showGenerations": "Mostrar Gerações", - "uploads": "Enviados", - "showUploads": "Mostrar Enviados", - "galleryImageSize": "Tamanho da Imagem", - "galleryImageResetSize": "Resetar Imagem", - "gallerySettings": "Configurações de Galeria", - "maintainAspectRatio": "Mater Proporções", - "autoSwitchNewImages": "Trocar para Novas Imagens Automaticamente", - "singleColumnLayout": "Disposição em Coluna Única", - "allImagesLoaded": "Todas as Imagens Carregadas", - "loadMore": "Carregar Mais", - "noImagesInGallery": "Sem Imagens na Galeria" - }, - "hotkeys": { - "keyboardShortcuts": "Atalhos de Teclado", - "appHotkeys": "Atalhos do app", - "generalHotkeys": "Atalhos Gerais", - "galleryHotkeys": "Atalhos da Galeria", - "unifiedCanvasHotkeys": "Atalhos da Tela Unificada", - "invoke": { - "title": "Invoke", - "desc": "Gerar uma imagem" - }, - "cancel": { - "title": "Cancelar", - "desc": "Cancelar geração de imagem" - }, - "focusPrompt": { - "title": "Foco do Prompt", - "desc": "Foco da área de texto do prompt" - }, - "toggleOptions": { - "title": "Ativar Opções", - "desc": "Abrir e fechar o painel de opções" - }, - "pinOptions": { - "title": "Fixar Opções", - "desc": "Fixar o painel de opções" - }, - "toggleViewer": { - "title": "Ativar Visualizador", - "desc": "Abrir e fechar o Visualizador de Imagens" - }, - "toggleGallery": { - "title": "Ativar Galeria", - "desc": "Abrir e fechar a gaveta da galeria" - }, - "maximizeWorkSpace": { - "title": "Maximizar a Área de Trabalho", - "desc": "Fechar painéis e maximixar área de trabalho" - }, - "changeTabs": { - "title": "Mudar Abas", - "desc": "Trocar para outra área de trabalho" - }, - "consoleToggle": { - "title": "Ativar Console", - "desc": "Abrir e fechar console" - }, - "setPrompt": { - "title": "Definir Prompt", - "desc": "Usar o prompt da imagem atual" - }, - "setSeed": { - "title": "Definir Seed", - "desc": "Usar seed da imagem atual" - }, - "setParameters": { - "title": "Definir Parâmetros", - "desc": "Usar todos os parâmetros da imagem atual" - }, - "restoreFaces": { - "title": "Restaurar Rostos", - "desc": "Restaurar a imagem atual" - }, - "upscale": { - "title": "Redimensionar", - "desc": "Redimensionar a imagem atual" - }, - "showInfo": { - "title": "Mostrar Informações", - "desc": "Mostrar metadados de informações da imagem atual" - }, - "sendToImageToImage": { - "title": "Mandar para Imagem Para Imagem", - "desc": "Manda a imagem atual para Imagem Para Imagem" - }, - "deleteImage": { - "title": "Apagar Imagem", - "desc": "Apaga a imagem atual" - }, - "closePanels": { - "title": "Fechar Painéis", - "desc": "Fecha os painéis abertos" - }, - "previousImage": { - "title": "Imagem Anterior", - "desc": "Mostra a imagem anterior na galeria" - }, - "nextImage": { - "title": "Próxima Imagem", - "desc": "Mostra a próxima imagem na galeria" - }, - "toggleGalleryPin": { - "title": "Ativar Fixar Galeria", - "desc": "Fixa e desafixa a galeria na interface" - }, - "increaseGalleryThumbSize": { - "title": "Aumentar Tamanho da Galeria de Imagem", - "desc": "Aumenta o tamanho das thumbs na galeria" - }, - "decreaseGalleryThumbSize": { - "title": "Diminuir Tamanho da Galeria de Imagem", - "desc": "Diminui o tamanho das thumbs na galeria" - }, - "selectBrush": { - "title": "Selecionar Pincel", - "desc": "Seleciona o pincel" - }, - "selectEraser": { - "title": "Selecionar Apagador", - "desc": "Seleciona o apagador" - }, - "decreaseBrushSize": { - "title": "Diminuir Tamanho do Pincel", - "desc": "Diminui o tamanho do pincel/apagador" - }, - "increaseBrushSize": { - "title": "Aumentar Tamanho do Pincel", - "desc": "Aumenta o tamanho do pincel/apagador" - }, - "decreaseBrushOpacity": { - "title": "Diminuir Opacidade do Pincel", - "desc": "Diminui a opacidade do pincel" - }, - "increaseBrushOpacity": { - "title": "Aumentar Opacidade do Pincel", - "desc": "Aumenta a opacidade do pincel" - }, - "moveTool": { - "title": "Ferramenta Mover", - "desc": "Permite navegar pela tela" - }, - "fillBoundingBox": { - "title": "Preencher Caixa Delimitadora", - "desc": "Preenche a caixa delimitadora com a cor do pincel" - }, - "eraseBoundingBox": { - "title": "Apagar Caixa Delimitadora", - "desc": "Apaga a área da caixa delimitadora" - }, - "colorPicker": { - "title": "Selecionar Seletor de Cor", - "desc": "Seleciona o seletor de cores" - }, - "toggleSnap": { - "title": "Ativar Encaixe", - "desc": "Ativa Encaixar na Grade" - }, - "quickToggleMove": { - "title": "Ativar Mover Rapidamente", - "desc": "Temporariamente ativa o modo Mover" - }, - "toggleLayer": { - "title": "Ativar Camada", - "desc": "Ativa a seleção de camada de máscara/base" - }, - "clearMask": { - "title": "Limpar Máscara", - "desc": "Limpa toda a máscara" - }, - "hideMask": { - "title": "Esconder Máscara", - "desc": "Esconde e Revela a máscara" - }, - "showHideBoundingBox": { - "title": "Mostrar/Esconder Caixa Delimitadora", - "desc": "Ativa a visibilidade da caixa delimitadora" - }, - "mergeVisible": { - "title": "Fundir Visível", - "desc": "Fundir todas as camadas visíveis em tela" - }, - "saveToGallery": { - "title": "Salvara Na Galeria", - "desc": "Salva a tela atual na galeria" - }, - "copyToClipboard": { - "title": "Copiar para a Área de Transferência", - "desc": "Copia a tela atual para a área de transferência" - }, - "downloadImage": { - "title": "Baixar Imagem", - "desc": "Baixa a tela atual" - }, - "undoStroke": { - "title": "Desfazer Traço", - "desc": "Desfaz um traço de pincel" - }, - "redoStroke": { - "title": "Refazer Traço", - "desc": "Refaz o traço de pincel" - }, - "resetView": { - "title": "Resetar Visualização", - "desc": "Reseta Visualização da Tela" - }, - "previousStagingImage": { - "title": "Imagem de Preparação Anterior", - "desc": "Área de Imagem de Preparação Anterior" - }, - "nextStagingImage": { - "title": "Próxima Imagem de Preparação Anterior", - "desc": "Próxima Área de Imagem de Preparação Anterior" - }, - "acceptStagingImage": { - "title": "Aceitar Imagem de Preparação Anterior", - "desc": "Aceitar Área de Imagem de Preparação Anterior" - } - }, - "modelManager": { - "modelManager": "Gerente de Modelo", - "model": "Modelo", - "modelAdded": "Modelo Adicionado", - "modelUpdated": "Modelo Atualizado", - "modelEntryDeleted": "Entrada de modelo excluída", - "cannotUseSpaces": "Não pode usar espaços", - "addNew": "Adicionar Novo", - "addNewModel": "Adicionar Novo modelo", - "addManually": "Adicionar Manualmente", - "manual": "Manual", - "name": "Nome", - "nameValidationMsg": "Insira um nome para o seu modelo", - "description": "Descrição", - "descriptionValidationMsg": "Adicione uma descrição para o seu modelo", - "config": "Configuração", - "configValidationMsg": "Caminho para o arquivo de configuração do seu modelo.", - "modelLocation": "Localização do modelo", - "modelLocationValidationMsg": "Caminho para onde seu modelo está localizado.", - "vaeLocation": "Localização VAE", - "vaeLocationValidationMsg": "Caminho para onde seu VAE está localizado.", - "width": "Largura", - "widthValidationMsg": "Largura padrão do seu modelo.", - "height": "Altura", - "heightValidationMsg": "Altura padrão do seu modelo.", - "addModel": "Adicionar Modelo", - "updateModel": "Atualizar Modelo", - "availableModels": "Modelos Disponíveis", - "search": "Procurar", - "load": "Carregar", - "active": "Ativado", - "notLoaded": "Não carregado", - "cached": "Em cache", - "checkpointFolder": "Pasta de Checkpoint", - "clearCheckpointFolder": "Apagar Pasta de Checkpoint", - "findModels": "Encontrar Modelos", - "modelsFound": "Modelos Encontrados", - "selectFolder": "Selecione a Pasta", - "selected": "Selecionada", - "selectAll": "Selecionar Tudo", - "deselectAll": "Deselecionar Tudo", - "showExisting": "Mostrar Existente", - "addSelected": "Adicione Selecionado", - "modelExists": "Modelo Existe", - "delete": "Excluir", - "deleteModel": "Excluir modelo", - "deleteConfig": "Excluir Config", - "deleteMsg1": "Tem certeza de que deseja excluir esta entrada do modelo de InvokeAI?", - "deleteMsg2": "Isso não vai excluir o arquivo de modelo checkpoint do seu disco. Você pode lê-los, se desejar.", - "checkpointModels": "Checkpoints", - "diffusersModels": "Diffusers", - "safetensorModels": "SafeTensors", - "addCheckpointModel": "Adicionar Modelo de Checkpoint/Safetensor", - "addDiffuserModel": "Adicionar Diffusers", - "repo_id": "Repo ID", - "vaeRepoID": "VAE Repo ID", - "vaeRepoIDValidationMsg": "Repositório Online do seu VAE", - "scanAgain": "Digitalize Novamente", - "selectAndAdd": "Selecione e Adicione Modelos Listados Abaixo", - "noModelsFound": "Nenhum Modelo Encontrado", - "formMessageDiffusersModelLocation": "Localização dos Modelos Diffusers", - "formMessageDiffusersModelLocationDesc": "Por favor entre com ao menos um.", - "formMessageDiffusersVAELocation": "Localização do VAE", - "formMessageDiffusersVAELocationDesc": "Se não provido, InvokeAI irá procurar pelo arquivo VAE dentro do local do modelo.", - "convertToDiffusers": "Converter para Diffusers", - "convertToDiffusersHelpText1": "Este modelo será convertido para o formato 🧨 Diffusers.", - "convertToDiffusersHelpText5": "Por favor, certifique-se de que você tenha espaço suficiente em disco. Os modelos geralmente variam entre 4GB e 7GB de tamanho.", - "convertToDiffusersHelpText6": "Você deseja converter este modelo?", - "convertToDiffusersSaveLocation": "Local para Salvar", - "v1": "v1", - "inpainting": "v1 Inpainting", - "customConfig": "Configuração personalizada", - "pathToCustomConfig": "Caminho para configuração personalizada", - "convertToDiffusersHelpText3": "Seu arquivo de ponto de verificação no disco NÃO será excluído ou modificado de forma alguma. Você pode adicionar seu ponto de verificação ao Gerenciador de modelos novamente, se desejar.", - "convertToDiffusersHelpText4": "Este é um processo único. Pode levar cerca de 30 a 60s, dependendo das especificações do seu computador.", - "merge": "Mesclar", - "modelsMerged": "Modelos mesclados", - "mergeModels": "Mesclar modelos", - "modelOne": "Modelo 1", - "modelTwo": "Modelo 2", - "modelThree": "Modelo 3", - "statusConverting": "Convertendo", - "modelConverted": "Modelo Convertido", - "sameFolder": "Mesma pasta", - "invokeRoot": "Pasta do InvokeAI", - "custom": "Personalizado", - "customSaveLocation": "Local de salvamento personalizado", - "mergedModelName": "Nome do modelo mesclado", - "alpha": "Alpha", - "allModels": "Todos os Modelos", - "repoIDValidationMsg": "Repositório Online do seu Modelo", - "convert": "Converter", - "convertToDiffusersHelpText2": "Este processo irá substituir sua entrada de Gerenciador de Modelos por uma versão Diffusers do mesmo modelo.", - "mergedModelCustomSaveLocation": "Caminho Personalizado", - "mergedModelSaveLocation": "Local de Salvamento", - "interpolationType": "Tipo de Interpolação", - "ignoreMismatch": "Ignorar Divergências entre Modelos Selecionados", - "invokeAIFolder": "Pasta Invoke AI", - "weightedSum": "Soma Ponderada", - "sigmoid": "Sigmóide", - "inverseSigmoid": "Sigmóide Inversa", - "modelMergeHeaderHelp1": "Você pode mesclar até três modelos diferentes para criar uma mistura que atenda às suas necessidades.", - "modelMergeInterpAddDifferenceHelp": "Neste modo, o Modelo 3 é primeiro subtraído do Modelo 2. A versão resultante é mesclada com o Modelo 1 com a taxa alpha definida acima.", - "modelMergeAlphaHelp": "Alpha controla a força da mistura dos modelos. Valores de alpha mais baixos resultam em uma influência menor do segundo modelo.", - "modelMergeHeaderHelp2": "Apenas Diffusers estão disponíveis para mesclagem. Se você deseja mesclar um modelo de checkpoint, por favor, converta-o para Diffusers primeiro." - }, - "parameters": { - "images": "Imagems", - "steps": "Passos", - "cfgScale": "Escala CFG", - "width": "Largura", - "height": "Altura", - "seed": "Seed", - "randomizeSeed": "Seed Aleatório", - "shuffle": "Embaralhar", - "noiseThreshold": "Limite de Ruído", - "perlinNoise": "Ruído de Perlin", - "variations": "Variatções", - "variationAmount": "Quntidade de Variatções", - "seedWeights": "Pesos da Seed", - "faceRestoration": "Restauração de Rosto", - "restoreFaces": "Restaurar Rostos", - "type": "Tipo", - "strength": "Força", - "upscaling": "Redimensionando", - "upscale": "Redimensionar", - "upscaleImage": "Redimensionar Imagem", - "scale": "Escala", - "otherOptions": "Outras Opções", - "seamlessTiling": "Ladrilho Sem Fronteira", - "hiresOptim": "Otimização de Alta Res", - "imageFit": "Caber Imagem Inicial No Tamanho de Saída", - "codeformerFidelity": "Fidelidade", - "scaleBeforeProcessing": "Escala Antes do Processamento", - "scaledWidth": "L Escalada", - "scaledHeight": "A Escalada", - "infillMethod": "Método de Preenchimento", - "tileSize": "Tamanho do Ladrilho", - "boundingBoxHeader": "Caixa Delimitadora", - "seamCorrectionHeader": "Correção de Fronteira", - "infillScalingHeader": "Preencimento e Escala", - "img2imgStrength": "Força de Imagem Para Imagem", - "toggleLoopback": "Ativar Loopback", - "sendTo": "Mandar para", - "sendToImg2Img": "Mandar para Imagem Para Imagem", - "sendToUnifiedCanvas": "Mandar para Tela Unificada", - "copyImageToLink": "Copiar Imagem Para Link", - "downloadImage": "Baixar Imagem", - "openInViewer": "Abrir No Visualizador", - "closeViewer": "Fechar Visualizador", - "usePrompt": "Usar Prompt", - "useSeed": "Usar Seed", - "useAll": "Usar Todos", - "useInitImg": "Usar Imagem Inicial", - "info": "Informações", - "initialImage": "Imagem inicial", - "showOptionsPanel": "Mostrar Painel de Opções", - "vSymmetryStep": "V Passo de Simetria", - "hSymmetryStep": "H Passo de Simetria", - "symmetry": "Simetria", - "copyImage": "Copiar imagem", - "hiresStrength": "Força da Alta Resolução", - "denoisingStrength": "A força de remoção de ruído", - "imageToImage": "Imagem para Imagem", - "cancel": { - "setType": "Definir tipo de cancelamento", - "isScheduled": "Cancelando", - "schedule": "Cancelar após a iteração atual", - "immediate": "Cancelar imediatamente" - }, - "general": "Geral" - }, - "settings": { - "models": "Modelos", - "displayInProgress": "Mostrar Progresso de Imagens Em Andamento", - "saveSteps": "Salvar imagens a cada n passos", - "confirmOnDelete": "Confirmar Antes de Apagar", - "displayHelpIcons": "Mostrar Ícones de Ajuda", - "enableImageDebugging": "Ativar Depuração de Imagem", - "resetWebUI": "Reiniciar Interface", - "resetWebUIDesc1": "Reiniciar a interface apenas reinicia o cache local do broswer para imagens e configurações lembradas. Não apaga nenhuma imagem do disco.", - "resetWebUIDesc2": "Se as imagens não estão aparecendo na galeria ou algo mais não está funcionando, favor tentar reiniciar antes de postar um problema no GitHub.", - "resetComplete": "A interface foi reiniciada. Atualize a página para carregar.", - "useSlidersForAll": "Usar deslizadores para todas as opções" - }, - "toast": { - "tempFoldersEmptied": "Pasta de Arquivos Temporários Esvaziada", - "uploadFailed": "Envio Falhou", - "uploadFailedUnableToLoadDesc": "Não foj possível carregar o arquivo", - "downloadImageStarted": "Download de Imagem Começou", - "imageCopied": "Imagem Copiada", - "imageLinkCopied": "Link de Imagem Copiada", - "imageNotLoaded": "Nenhuma Imagem Carregada", - "imageNotLoadedDesc": "Nenhuma imagem encontrar para mandar para o módulo de imagem para imagem", - "imageSavedToGallery": "Imagem Salva na Galeria", - "canvasMerged": "Tela Fundida", - "sentToImageToImage": "Mandar Para Imagem Para Imagem", - "sentToUnifiedCanvas": "Enviada para a Tela Unificada", - "parametersSet": "Parâmetros Definidos", - "parametersNotSet": "Parâmetros Não Definidos", - "parametersNotSetDesc": "Nenhum metadado foi encontrado para essa imagem.", - "parametersFailed": "Problema ao carregar parâmetros", - "parametersFailedDesc": "Não foi possível carregar imagem incial.", - "seedSet": "Seed Definida", - "seedNotSet": "Seed Não Definida", - "seedNotSetDesc": "Não foi possível achar a seed para a imagem.", - "promptSet": "Prompt Definido", - "promptNotSet": "Prompt Não Definido", - "promptNotSetDesc": "Não foi possível achar prompt para essa imagem.", - "upscalingFailed": "Redimensionamento Falhou", - "faceRestoreFailed": "Restauração de Rosto Falhou", - "metadataLoadFailed": "Falha ao tentar carregar metadados", - "initialImageSet": "Imagem Inicial Definida", - "initialImageNotSet": "Imagem Inicial Não Definida", - "initialImageNotSetDesc": "Não foi possível carregar imagem incial" - }, - "unifiedCanvas": { - "layer": "Camada", - "base": "Base", - "mask": "Máscara", - "maskingOptions": "Opções de Mascaramento", - "enableMask": "Ativar Máscara", - "preserveMaskedArea": "Preservar Área da Máscara", - "clearMask": "Limpar Máscara", - "brush": "Pincel", - "eraser": "Apagador", - "fillBoundingBox": "Preencher Caixa Delimitadora", - "eraseBoundingBox": "Apagar Caixa Delimitadora", - "colorPicker": "Seletor de Cor", - "brushOptions": "Opções de Pincel", - "brushSize": "Tamanho", - "move": "Mover", - "resetView": "Resetar Visualização", - "mergeVisible": "Fundir Visível", - "saveToGallery": "Salvar na Galeria", - "copyToClipboard": "Copiar para a Área de Transferência", - "downloadAsImage": "Baixar Como Imagem", - "undo": "Desfazer", - "redo": "Refazer", - "clearCanvas": "Limpar Tela", - "canvasSettings": "Configurações de Tela", - "showIntermediates": "Mostrar Intermediários", - "showGrid": "Mostrar Grade", - "snapToGrid": "Encaixar na Grade", - "darkenOutsideSelection": "Escurecer Seleção Externa", - "autoSaveToGallery": "Salvar Automaticamente na Galeria", - "saveBoxRegionOnly": "Salvar Apenas a Região da Caixa", - "limitStrokesToBox": "Limitar Traços para a Caixa", - "showCanvasDebugInfo": "Mostrar Informações de Depuração daTela", - "clearCanvasHistory": "Limpar o Histórico da Tela", - "clearHistory": "Limpar Históprico", - "clearCanvasHistoryMessage": "Limpar o histórico de tela deixa sua tela atual intacta, mas limpa de forma irreversível o histórico de desfazer e refazer.", - "clearCanvasHistoryConfirm": "Tem certeza que quer limpar o histórico de tela?", - "emptyTempImageFolder": "Esvaziar a Pasta de Arquivos de Imagem Temporários", - "emptyFolder": "Esvaziar Pasta", - "emptyTempImagesFolderMessage": "Esvaziar a pasta de arquivos de imagem temporários também reseta completamente a Tela Unificada. Isso inclui todo o histórico de desfazer/refazer, imagens na área de preparação e a camada base da tela.", - "emptyTempImagesFolderConfirm": "Tem certeza que quer esvaziar a pasta de arquivos de imagem temporários?", - "activeLayer": "Camada Ativa", - "canvasScale": "Escala da Tela", - "boundingBox": "Caixa Delimitadora", - "scaledBoundingBox": "Caixa Delimitadora Escalada", - "boundingBoxPosition": "Posição da Caixa Delimitadora", - "canvasDimensions": "Dimensões da Tela", - "canvasPosition": "Posição da Tela", - "cursorPosition": "Posição do cursor", - "previous": "Anterior", - "next": "Próximo", - "accept": "Aceitar", - "showHide": "Mostrar/Esconder", - "discardAll": "Descartar Todos", - "betaClear": "Limpar", - "betaDarkenOutside": "Escurecer Externamente", - "betaLimitToBox": "Limitar Para a Caixa", - "betaPreserveMasked": "Preservar Máscarado" - }, - "tooltip": { - "feature": { - "seed": "O valor da semente afeta o ruído inicial a partir do qual a imagem é formada. Você pode usar as sementes já existentes de imagens anteriores. 'Limiar de ruído' é usado para mitigar artefatos em valores CFG altos (experimente a faixa de 0-10), e o Perlin para adicionar ruído Perlin durante a geração: ambos servem para adicionar variação às suas saídas.", - "gallery": "A galeria exibe as gerações da pasta de saída conforme elas são criadas. As configurações são armazenadas em arquivos e acessadas pelo menu de contexto.", - "other": "Essas opções ativam modos alternativos de processamento para o Invoke. 'Seamless tiling' criará padrões repetidos na saída. 'High resolution' é uma geração em duas etapas com img2img: use essa configuração quando desejar uma imagem maior e mais coerente sem artefatos. Levará mais tempo do que o txt2img usual.", - "boundingBox": "A caixa delimitadora é a mesma que as configurações de largura e altura para Texto para Imagem ou Imagem para Imagem. Apenas a área na caixa será processada.", - "upscale": "Use o ESRGAN para ampliar a imagem imediatamente após a geração.", - "seamCorrection": "Controla o tratamento das emendas visíveis que ocorrem entre as imagens geradas no canvas.", - "faceCorrection": "Correção de rosto com GFPGAN ou Codeformer: o algoritmo detecta rostos na imagem e corrige quaisquer defeitos. Um valor alto mudará mais a imagem, resultando em rostos mais atraentes. Codeformer com uma fidelidade maior preserva a imagem original às custas de uma correção de rosto mais forte.", - "prompt": "Este é o campo de prompt. O prompt inclui objetos de geração e termos estilísticos. Você também pode adicionar peso (importância do token) no prompt, mas comandos e parâmetros de CLI não funcionarão.", - "infillAndScaling": "Gerencie os métodos de preenchimento (usados em áreas mascaradas ou apagadas do canvas) e a escala (útil para tamanhos de caixa delimitadora pequenos).", - "imageToImage": "Image to Image carrega qualquer imagem como inicial, que é então usada para gerar uma nova junto com o prompt. Quanto maior o valor, mais a imagem resultante mudará. Valores de 0.0 a 1.0 são possíveis, a faixa recomendada é de 0.25 a 0.75", - "variations": "Experimente uma variação com um valor entre 0,1 e 1,0 para mudar o resultado para uma determinada semente. Variações interessantes da semente estão entre 0,1 e 0,3." - } - } -} diff --git a/invokeai/frontend/web/dist/locales/ro.json b/invokeai/frontend/web/dist/locales/ro.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/invokeai/frontend/web/dist/locales/ro.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/invokeai/frontend/web/dist/locales/ru.json b/invokeai/frontend/web/dist/locales/ru.json deleted file mode 100644 index 808db9e803..0000000000 --- a/invokeai/frontend/web/dist/locales/ru.json +++ /dev/null @@ -1,779 +0,0 @@ -{ - "common": { - "hotkeysLabel": "Горячие клавиши", - "languagePickerLabel": "Язык", - "reportBugLabel": "Сообщить об ошибке", - "settingsLabel": "Настройки", - "img2img": "Изображение в изображение (img2img)", - "unifiedCanvas": "Единый холст", - "nodes": "Редактор рабочего процесса", - "langRussian": "Русский", - "nodesDesc": "Cистема генерации изображений на основе нодов (узлов) уже разрабатывается. Следите за новостями об этой замечательной функции.", - "postProcessing": "Постобработка", - "postProcessDesc1": "Invoke AI предлагает широкий спектр функций постобработки. Увеличение изображения (upscale) и восстановление лиц уже доступны в интерфейсе. Получите доступ к ним из меню 'Дополнительные параметры' на вкладках 'Текст в изображение' и 'Изображение в изображение'. Обрабатывайте изображения напрямую, используя кнопки действий с изображениями над текущим изображением или в режиме просмотра.", - "postProcessDesc2": "В ближайшее время будет выпущен специальный интерфейс для более продвинутых процессов постобработки.", - "postProcessDesc3": "Интерфейс командной строки Invoke AI предлагает различные другие функции, включая Embiggen.", - "training": "Обучение", - "trainingDesc1": "Специальный интерфейс для обучения собственных моделей с использованием Textual Inversion и Dreambooth.", - "trainingDesc2": "InvokeAI уже поддерживает обучение моделей с помощью TI, через интерфейс командной строки.", - "upload": "Загрузить", - "close": "Закрыть", - "load": "Загрузить", - "statusConnected": "Подключен", - "statusDisconnected": "Отключен", - "statusError": "Ошибка", - "statusPreparing": "Подготовка", - "statusProcessingCanceled": "Обработка прервана", - "statusProcessingComplete": "Обработка завершена", - "statusGenerating": "Генерация", - "statusGeneratingTextToImage": "Создаем изображение из текста", - "statusGeneratingImageToImage": "Создаем изображение из изображения", - "statusGeneratingInpainting": "Дополняем внутри", - "statusGeneratingOutpainting": "Дорисовываем снаружи", - "statusGenerationComplete": "Генерация завершена", - "statusIterationComplete": "Итерация завершена", - "statusSavingImage": "Сохранение изображения", - "statusRestoringFaces": "Восстановление лиц", - "statusRestoringFacesGFPGAN": "Восстановление лиц (GFPGAN)", - "statusRestoringFacesCodeFormer": "Восстановление лиц (CodeFormer)", - "statusUpscaling": "Увеличение", - "statusUpscalingESRGAN": "Увеличение (ESRGAN)", - "statusLoadingModel": "Загрузка модели", - "statusModelChanged": "Модель изменена", - "githubLabel": "Github", - "discordLabel": "Discord", - "statusMergingModels": "Слияние моделей", - "statusModelConverted": "Модель сконвертирована", - "statusMergedModels": "Модели объединены", - "loading": "Загрузка", - "loadingInvokeAI": "Загрузка Invoke AI", - "back": "Назад", - "statusConvertingModel": "Конвертация модели", - "cancel": "Отменить", - "accept": "Принять", - "langUkranian": "Украинский", - "langEnglish": "Английский", - "postprocessing": "Постобработка", - "langArabic": "Арабский", - "langSpanish": "Испанский", - "langSimplifiedChinese": "Китайский (упрощенный)", - "langDutch": "Нидерландский", - "langFrench": "Французский", - "langGerman": "Немецкий", - "langHebrew": "Иврит", - "langItalian": "Итальянский", - "langJapanese": "Японский", - "langKorean": "Корейский", - "langPolish": "Польский", - "langPortuguese": "Португальский", - "txt2img": "Текст в изображение (txt2img)", - "langBrPortuguese": "Португальский (Бразилия)", - "linear": "Линейная обработка", - "dontAskMeAgain": "Больше не спрашивать", - "areYouSure": "Вы уверены?", - "random": "Случайное", - "generate": "Сгенерировать", - "openInNewTab": "Открыть в новой вкладке", - "imagePrompt": "Запрос", - "communityLabel": "Сообщество", - "lightMode": "Светлая тема", - "batch": "Пакетный менеджер", - "modelManager": "Менеджер моделей", - "darkMode": "Темная тема", - "nodeEditor": "Редактор Нодов (Узлов)", - "controlNet": "Controlnet", - "advanced": "Расширенные" - }, - "gallery": { - "generations": "Генерации", - "showGenerations": "Показывать генерации", - "uploads": "Загрузки", - "showUploads": "Показывать загрузки", - "galleryImageSize": "Размер изображений", - "galleryImageResetSize": "Размер по умолчанию", - "gallerySettings": "Настройка галереи", - "maintainAspectRatio": "Сохранять пропорции", - "autoSwitchNewImages": "Автоматически выбирать новые", - "singleColumnLayout": "Одна колонка", - "allImagesLoaded": "Все изображения загружены", - "loadMore": "Показать больше", - "noImagesInGallery": "Изображений нет", - "deleteImagePermanent": "Удаленные изображения невозможно восстановить.", - "deleteImageBin": "Удаленные изображения будут отправлены в корзину вашей операционной системы.", - "deleteImage": "Удалить изображение", - "images": "Изображения", - "assets": "Ресурсы", - "autoAssignBoardOnClick": "Авто-назначение доски по клику" - }, - "hotkeys": { - "keyboardShortcuts": "Горячие клавиши", - "appHotkeys": "Горячие клавиши приложения", - "generalHotkeys": "Общие горячие клавиши", - "galleryHotkeys": "Горячие клавиши галереи", - "unifiedCanvasHotkeys": "Горячие клавиши Единого холста", - "invoke": { - "title": "Invoke", - "desc": "Сгенерировать изображение" - }, - "cancel": { - "title": "Отменить", - "desc": "Отменить генерацию изображения" - }, - "focusPrompt": { - "title": "Переключиться на ввод запроса", - "desc": "Переключение на область ввода запроса" - }, - "toggleOptions": { - "title": "Показать/скрыть параметры", - "desc": "Открывать и закрывать панель параметров" - }, - "pinOptions": { - "title": "Закрепить параметры", - "desc": "Закрепить панель параметров" - }, - "toggleViewer": { - "title": "Показать просмотр", - "desc": "Открывать и закрывать просмотрщик изображений" - }, - "toggleGallery": { - "title": "Показать галерею", - "desc": "Открывать и закрывать ящик галереи" - }, - "maximizeWorkSpace": { - "title": "Максимизировать рабочее пространство", - "desc": "Скрыть панели и максимизировать рабочую область" - }, - "changeTabs": { - "title": "Переключить вкладку", - "desc": "Переключиться на другую рабочую область" - }, - "consoleToggle": { - "title": "Показать консоль", - "desc": "Открывать и закрывать консоль" - }, - "setPrompt": { - "title": "Использовать запрос", - "desc": "Использовать запрос из текущего изображения" - }, - "setSeed": { - "title": "Использовать сид", - "desc": "Использовать сид текущего изображения" - }, - "setParameters": { - "title": "Использовать все параметры", - "desc": "Использовать все параметры текущего изображения" - }, - "restoreFaces": { - "title": "Восстановить лица", - "desc": "Восстановить лица на текущем изображении" - }, - "upscale": { - "title": "Увеличение", - "desc": "Увеличить текущеее изображение" - }, - "showInfo": { - "title": "Показать метаданные", - "desc": "Показать метаданные из текущего изображения" - }, - "sendToImageToImage": { - "title": "Отправить в img2img", - "desc": "Отправить текущее изображение в Image To Image" - }, - "deleteImage": { - "title": "Удалить изображение", - "desc": "Удалить текущее изображение" - }, - "closePanels": { - "title": "Закрыть панели", - "desc": "Закрывает открытые панели" - }, - "previousImage": { - "title": "Предыдущее изображение", - "desc": "Отображать предыдущее изображение в галерее" - }, - "nextImage": { - "title": "Следующее изображение", - "desc": "Отображение следующего изображения в галерее" - }, - "toggleGalleryPin": { - "title": "Закрепить галерею", - "desc": "Закрепляет и открепляет галерею" - }, - "increaseGalleryThumbSize": { - "title": "Увеличить размер миниатюр галереи", - "desc": "Увеличивает размер миниатюр галереи" - }, - "decreaseGalleryThumbSize": { - "title": "Уменьшает размер миниатюр галереи", - "desc": "Уменьшает размер миниатюр галереи" - }, - "selectBrush": { - "title": "Выбрать кисть", - "desc": "Выбирает кисть для холста" - }, - "selectEraser": { - "title": "Выбрать ластик", - "desc": "Выбирает ластик для холста" - }, - "decreaseBrushSize": { - "title": "Уменьшить размер кисти", - "desc": "Уменьшает размер кисти/ластика холста" - }, - "increaseBrushSize": { - "title": "Увеличить размер кисти", - "desc": "Увеличивает размер кисти/ластика холста" - }, - "decreaseBrushOpacity": { - "title": "Уменьшить непрозрачность кисти", - "desc": "Уменьшает непрозрачность кисти холста" - }, - "increaseBrushOpacity": { - "title": "Увеличить непрозрачность кисти", - "desc": "Увеличивает непрозрачность кисти холста" - }, - "moveTool": { - "title": "Инструмент перемещения", - "desc": "Позволяет перемещаться по холсту" - }, - "fillBoundingBox": { - "title": "Заполнить ограничивающую рамку", - "desc": "Заполняет ограничивающую рамку цветом кисти" - }, - "eraseBoundingBox": { - "title": "Стереть ограничивающую рамку", - "desc": "Стирает область ограничивающей рамки" - }, - "colorPicker": { - "title": "Выбрать цвет", - "desc": "Выбирает средство выбора цвета холста" - }, - "toggleSnap": { - "title": "Включить привязку", - "desc": "Включает/выключает привязку к сетке" - }, - "quickToggleMove": { - "title": "Быстрое переключение перемещения", - "desc": "Временно переключает режим перемещения" - }, - "toggleLayer": { - "title": "Переключить слой", - "desc": "Переключение маски/базового слоя" - }, - "clearMask": { - "title": "Очистить маску", - "desc": "Очистить всю маску" - }, - "hideMask": { - "title": "Скрыть маску", - "desc": "Скрывает/показывает маску" - }, - "showHideBoundingBox": { - "title": "Показать/скрыть ограничивающую рамку", - "desc": "Переключить видимость ограничивающей рамки" - }, - "mergeVisible": { - "title": "Объединить видимые", - "desc": "Объединить все видимые слои холста" - }, - "saveToGallery": { - "title": "Сохранить в галерею", - "desc": "Сохранить текущий холст в галерею" - }, - "copyToClipboard": { - "title": "Копировать в буфер обмена", - "desc": "Копировать текущий холст в буфер обмена" - }, - "downloadImage": { - "title": "Скачать изображение", - "desc": "Скачать содержимое холста" - }, - "undoStroke": { - "title": "Отменить кисть", - "desc": "Отменить мазок кисти" - }, - "redoStroke": { - "title": "Повторить кисть", - "desc": "Повторить мазок кисти" - }, - "resetView": { - "title": "Вид по умолчанию", - "desc": "Сбросить вид холста" - }, - "previousStagingImage": { - "title": "Предыдущее изображение", - "desc": "Предыдущая область изображения" - }, - "nextStagingImage": { - "title": "Следующее изображение", - "desc": "Следующая область изображения" - }, - "acceptStagingImage": { - "title": "Принять изображение", - "desc": "Принять текущее изображение" - }, - "addNodes": { - "desc": "Открывает меню добавления узла", - "title": "Добавление узлов" - }, - "nodesHotkeys": "Горячие клавиши узлов" - }, - "modelManager": { - "modelManager": "Менеджер моделей", - "model": "Модель", - "modelAdded": "Модель добавлена", - "modelUpdated": "Модель обновлена", - "modelEntryDeleted": "Запись о модели удалена", - "cannotUseSpaces": "Нельзя использовать пробелы", - "addNew": "Добавить новую", - "addNewModel": "Добавить новую модель", - "addManually": "Добавить вручную", - "manual": "Ручное", - "name": "Название", - "nameValidationMsg": "Введите название модели", - "description": "Описание", - "descriptionValidationMsg": "Введите описание модели", - "config": "Файл конфигурации", - "configValidationMsg": "Путь до файла конфигурации.", - "modelLocation": "Расположение модели", - "modelLocationValidationMsg": "Путь до файла с моделью.", - "vaeLocation": "Расположение VAE", - "vaeLocationValidationMsg": "Путь до файла VAE.", - "width": "Ширина", - "widthValidationMsg": "Исходная ширина изображений модели.", - "height": "Высота", - "heightValidationMsg": "Исходная высота изображений модели.", - "addModel": "Добавить модель", - "updateModel": "Обновить модель", - "availableModels": "Доступные модели", - "search": "Искать", - "load": "Загрузить", - "active": "активна", - "notLoaded": "не загружена", - "cached": "кэширована", - "checkpointFolder": "Папка с моделями", - "clearCheckpointFolder": "Очистить папку с моделями", - "findModels": "Найти модели", - "scanAgain": "Сканировать снова", - "modelsFound": "Найденные модели", - "selectFolder": "Выбрать папку", - "selected": "Выбраны", - "selectAll": "Выбрать все", - "deselectAll": "Снять выделение", - "showExisting": "Показывать добавленные", - "addSelected": "Добавить выбранные", - "modelExists": "Модель уже добавлена", - "selectAndAdd": "Выберите и добавьте модели из списка", - "noModelsFound": "Модели не найдены", - "delete": "Удалить", - "deleteModel": "Удалить модель", - "deleteConfig": "Удалить конфигурацию", - "deleteMsg1": "Вы точно хотите удалить модель из InvokeAI?", - "deleteMsg2": "Это приведет К УДАЛЕНИЮ модели С ДИСКА, если она находится в корневой папке Invoke. Если вы используете пользовательское расположение, то модель НЕ будет удалена с диска.", - "repoIDValidationMsg": "Онлайн-репозиторий модели", - "convertToDiffusersHelpText5": "Пожалуйста, убедитесь, что у вас достаточно места на диске. Модели обычно занимают 2–7 Гб.", - "invokeAIFolder": "Каталог InvokeAI", - "ignoreMismatch": "Игнорировать несоответствия между выбранными моделями", - "addCheckpointModel": "Добавить модель Checkpoint/Safetensor", - "formMessageDiffusersModelLocationDesc": "Укажите хотя бы одно.", - "convertToDiffusersHelpText3": "Ваш файл контрольной точки НА ДИСКЕ будет УДАЛЕН, если он находится в корневой папке InvokeAI. Если он находится в пользовательском расположении, то он НЕ будет удален.", - "vaeRepoID": "ID репозитория VAE", - "mergedModelName": "Название объединенной модели", - "checkpointModels": "Checkpoints", - "allModels": "Все модели", - "addDiffuserModel": "Добавить Diffusers", - "repo_id": "ID репозитория", - "formMessageDiffusersVAELocationDesc": "Если не указано, InvokeAI будет искать файл VAE рядом с моделью.", - "convert": "Преобразовать", - "convertToDiffusers": "Преобразовать в Diffusers", - "convertToDiffusersHelpText1": "Модель будет преобразована в формат 🧨 Diffusers.", - "convertToDiffusersHelpText4": "Это единоразовое действие. Оно может занять 30—60 секунд в зависимости от характеристик вашего компьютера.", - "convertToDiffusersHelpText6": "Вы хотите преобразовать эту модель?", - "statusConverting": "Преобразование", - "modelConverted": "Модель преобразована", - "invokeRoot": "Каталог InvokeAI", - "modelsMerged": "Модели объединены", - "mergeModels": "Объединить модели", - "scanForModels": "Просканировать модели", - "sigmoid": "Сигмоид", - "formMessageDiffusersModelLocation": "Расположение Diffusers-модели", - "modelThree": "Модель 3", - "modelMergeHeaderHelp2": "Только Diffusers-модели доступны для объединения. Если вы хотите объединить checkpoint-модели, сначала преобразуйте их в Diffusers.", - "pickModelType": "Выбрать тип модели", - "formMessageDiffusersVAELocation": "Расположение VAE", - "v1": "v1", - "convertToDiffusersSaveLocation": "Путь сохранения", - "customSaveLocation": "Пользовательский путь сохранения", - "alpha": "Альфа", - "diffusersModels": "Diffusers", - "customConfig": "Пользовательский конфиг", - "pathToCustomConfig": "Путь к пользовательскому конфигу", - "inpainting": "v1 Inpainting", - "sameFolder": "В ту же папку", - "modelOne": "Модель 1", - "mergedModelCustomSaveLocation": "Пользовательский путь", - "none": "пусто", - "addDifference": "Добавить разницу", - "vaeRepoIDValidationMsg": "Онлайн репозиторий VAE", - "convertToDiffusersHelpText2": "Этот процесс заменит вашу запись в Model Manager на версию той же модели в Diffusers.", - "custom": "Пользовательский", - "modelTwo": "Модель 2", - "mergedModelSaveLocation": "Путь сохранения", - "merge": "Объединить", - "interpolationType": "Тип интерполяции", - "modelMergeInterpAddDifferenceHelp": "В этом режиме Модель 3 сначала вычитается из Модели 2. Результирующая версия смешивается с Моделью 1 с установленным выше коэффициентом Альфа.", - "modelMergeHeaderHelp1": "Вы можете объединить до трех разных моделей, чтобы создать смешанную, соответствующую вашим потребностям.", - "modelMergeAlphaHelp": "Альфа влияет на силу смешивания моделей. Более низкие значения альфа приводят к меньшему влиянию второй модели.", - "inverseSigmoid": "Обратный Сигмоид", - "weightedSum": "Взвешенная сумма", - "safetensorModels": "SafeTensors", - "v2_768": "v2 (768px)", - "v2_base": "v2 (512px)", - "modelDeleted": "Модель удалена", - "importModels": "Импорт Моделей", - "variant": "Вариант", - "baseModel": "Базовая модель", - "modelsSynced": "Модели синхронизированы", - "modelSyncFailed": "Не удалось синхронизировать модели", - "vae": "VAE", - "modelDeleteFailed": "Не удалось удалить модель", - "noCustomLocationProvided": "Пользовательское местоположение не указано", - "convertingModelBegin": "Конвертация модели. Пожалуйста, подождите.", - "settings": "Настройки", - "selectModel": "Выберите модель", - "syncModels": "Синхронизация моделей", - "syncModelsDesc": "Если ваши модели не синхронизированы с серверной частью, вы можете обновить их, используя эту опцию. Обычно это удобно в тех случаях, когда вы вручную обновляете свой файл \"models.yaml\" или добавляете модели в корневую папку InvokeAI после загрузки приложения.", - "modelUpdateFailed": "Не удалось обновить модель", - "modelConversionFailed": "Не удалось сконвертировать модель", - "modelsMergeFailed": "Не удалось выполнить слияние моделей", - "loraModels": "LoRAs", - "onnxModels": "Onnx", - "oliveModels": "Olives" - }, - "parameters": { - "images": "Изображения", - "steps": "Шаги", - "cfgScale": "Уровень CFG", - "width": "Ширина", - "height": "Высота", - "seed": "Сид", - "randomizeSeed": "Случайный сид", - "shuffle": "Обновить сид", - "noiseThreshold": "Порог шума", - "perlinNoise": "Шум Перлина", - "variations": "Вариации", - "variationAmount": "Кол-во вариаций", - "seedWeights": "Вес сида", - "faceRestoration": "Восстановление лиц", - "restoreFaces": "Восстановить лица", - "type": "Тип", - "strength": "Сила", - "upscaling": "Увеличение", - "upscale": "Увеличить", - "upscaleImage": "Увеличить изображение", - "scale": "Масштаб", - "otherOptions": "Другие параметры", - "seamlessTiling": "Бесшовный узор", - "hiresOptim": "Оптимизация High Res", - "imageFit": "Уместить изображение", - "codeformerFidelity": "Точность", - "scaleBeforeProcessing": "Масштабировать", - "scaledWidth": "Масштаб Ш", - "scaledHeight": "Масштаб В", - "infillMethod": "Способ заполнения", - "tileSize": "Размер области", - "boundingBoxHeader": "Ограничивающая рамка", - "seamCorrectionHeader": "Настройка шва", - "infillScalingHeader": "Заполнение и масштабирование", - "img2imgStrength": "Сила обработки img2img", - "toggleLoopback": "Зациклить обработку", - "sendTo": "Отправить", - "sendToImg2Img": "Отправить в img2img", - "sendToUnifiedCanvas": "Отправить на Единый холст", - "copyImageToLink": "Скопировать ссылку", - "downloadImage": "Скачать", - "openInViewer": "Открыть в просмотрщике", - "closeViewer": "Закрыть просмотрщик", - "usePrompt": "Использовать запрос", - "useSeed": "Использовать сид", - "useAll": "Использовать все", - "useInitImg": "Использовать как исходное", - "info": "Метаданные", - "initialImage": "Исходное изображение", - "showOptionsPanel": "Показать панель настроек", - "vSymmetryStep": "Шаг верт. симметрии", - "cancel": { - "immediate": "Отменить немедленно", - "schedule": "Отменить после текущей итерации", - "isScheduled": "Отмена", - "setType": "Установить тип отмены" - }, - "general": "Основное", - "hiresStrength": "Сила High Res", - "symmetry": "Симметрия", - "hSymmetryStep": "Шаг гор. симметрии", - "hidePreview": "Скрыть предпросмотр", - "imageToImage": "Изображение в изображение", - "denoisingStrength": "Сила шумоподавления", - "copyImage": "Скопировать изображение", - "showPreview": "Показать предпросмотр", - "noiseSettings": "Шум", - "seamlessXAxis": "Ось X", - "seamlessYAxis": "Ось Y", - "scheduler": "Планировщик", - "boundingBoxWidth": "Ширина ограничивающей рамки", - "boundingBoxHeight": "Высота ограничивающей рамки", - "positivePromptPlaceholder": "Запрос", - "negativePromptPlaceholder": "Исключающий запрос", - "controlNetControlMode": "Режим управления", - "clipSkip": "CLIP Пропуск", - "aspectRatio": "Соотношение", - "maskAdjustmentsHeader": "Настройка маски", - "maskBlur": "Размытие", - "maskBlurMethod": "Метод размытия", - "seamLowThreshold": "Низкий", - "seamHighThreshold": "Высокий", - "coherenceSteps": "Шагов", - "coherencePassHeader": "Порог Coherence", - "coherenceStrength": "Сила", - "compositingSettingsHeader": "Настройки компоновки" - }, - "settings": { - "models": "Модели", - "displayInProgress": "Показывать процесс генерации", - "saveSteps": "Сохранять каждые n щагов", - "confirmOnDelete": "Подтверждать удаление", - "displayHelpIcons": "Показывать значки подсказок", - "enableImageDebugging": "Включить отладку", - "resetWebUI": "Сброс настроек Web UI", - "resetWebUIDesc1": "Сброс настроек веб-интерфейса удаляет только локальный кэш браузера с вашими изображениями и настройками. Он не удаляет изображения с диска.", - "resetWebUIDesc2": "Если изображения не отображаются в галерее или не работает что-то еще, пожалуйста, попробуйте сбросить настройки, прежде чем сообщать о проблеме на GitHub.", - "resetComplete": "Настройки веб-интерфейса были сброшены.", - "useSlidersForAll": "Использовать ползунки для всех параметров", - "consoleLogLevel": "Уровень логирования", - "shouldLogToConsole": "Логи в консоль", - "developer": "Разработчик", - "general": "Основное", - "showProgressInViewer": "Показывать процесс генерации в Просмотрщике", - "antialiasProgressImages": "Сглаживать предпоказ процесса генерации", - "generation": "Поколение", - "ui": "Пользовательский интерфейс", - "favoriteSchedulers": "Избранные планировщики", - "favoriteSchedulersPlaceholder": "Нет избранных планировщиков", - "enableNodesEditor": "Включить редактор узлов", - "experimental": "Экспериментальные", - "beta": "Бета", - "alternateCanvasLayout": "Альтернативный слой холста", - "showAdvancedOptions": "Показать доп. параметры", - "autoChangeDimensions": "Обновить Ш/В на стандартные для модели при изменении" - }, - "toast": { - "tempFoldersEmptied": "Временная папка очищена", - "uploadFailed": "Загрузка не удалась", - "uploadFailedUnableToLoadDesc": "Невозможно загрузить файл", - "downloadImageStarted": "Скачивание изображения началось", - "imageCopied": "Изображение скопировано", - "imageLinkCopied": "Ссылка на изображение скопирована", - "imageNotLoaded": "Изображение не загружено", - "imageNotLoadedDesc": "Не удалось найти изображение", - "imageSavedToGallery": "Изображение сохранено в галерею", - "canvasMerged": "Холст объединен", - "sentToImageToImage": "Отправить в img2img", - "sentToUnifiedCanvas": "Отправлено на Единый холст", - "parametersSet": "Параметры заданы", - "parametersNotSet": "Параметры не заданы", - "parametersNotSetDesc": "Не найдены метаданные изображения.", - "parametersFailed": "Проблема с загрузкой параметров", - "parametersFailedDesc": "Невозможно загрузить исходное изображение.", - "seedSet": "Сид задан", - "seedNotSet": "Сид не задан", - "seedNotSetDesc": "Не удалось найти сид для изображения.", - "promptSet": "Запрос задан", - "promptNotSet": "Запрос не задан", - "promptNotSetDesc": "Не удалось найти запрос для изображения.", - "upscalingFailed": "Увеличение не удалось", - "faceRestoreFailed": "Восстановление лиц не удалось", - "metadataLoadFailed": "Не удалось загрузить метаданные", - "initialImageSet": "Исходное изображение задано", - "initialImageNotSet": "Исходное изображение не задано", - "initialImageNotSetDesc": "Не получилось загрузить исходное изображение", - "serverError": "Ошибка сервера", - "disconnected": "Отключено от сервера", - "connected": "Подключено к серверу", - "canceled": "Обработка отменена", - "problemCopyingImageLink": "Не удалось скопировать ссылку на изображение", - "uploadFailedInvalidUploadDesc": "Должно быть одно изображение в формате PNG или JPEG", - "parameterNotSet": "Параметр не задан", - "parameterSet": "Параметр задан", - "nodesLoaded": "Узлы загружены", - "problemCopyingImage": "Не удается скопировать изображение", - "nodesLoadedFailed": "Не удалось загрузить Узлы", - "nodesCleared": "Узлы очищены", - "nodesBrokenConnections": "Не удается загрузить. Некоторые соединения повреждены.", - "nodesUnrecognizedTypes": "Не удается загрузить. Граф имеет нераспознанные типы", - "nodesNotValidJSON": "Недопустимый JSON", - "nodesCorruptedGraph": "Не удается загрузить. Граф, похоже, поврежден.", - "nodesSaved": "Узлы сохранены", - "nodesNotValidGraph": "Недопустимый граф узлов InvokeAI" - }, - "tooltip": { - "feature": { - "prompt": "Это поле для текста запроса, включая объекты генерации и стилистические термины. В запрос можно включить и коэффициенты веса (значимости токена), но консольные команды и параметры не будут работать.", - "gallery": "Здесь отображаются генерации из папки outputs по мере их появления.", - "other": "Эти опции включают альтернативные режимы обработки для Invoke. 'Бесшовный узор' создаст повторяющиеся узоры на выходе. 'Высокое разрешение' это генерация в два этапа с помощью img2img: используйте эту настройку, когда хотите получить цельное изображение большего размера без артефактов.", - "seed": "Значение сида влияет на начальный шум, из которого сформируется изображение. Можно использовать уже имеющийся сид из предыдущих изображений. 'Порог шума' используется для смягчения артефактов при высоких значениях CFG (попробуйте в диапазоне 0-10), а Перлин для добавления шума Перлина в процессе генерации: оба параметра служат для большей вариативности результатов.", - "variations": "Попробуйте вариацию со значением от 0.1 до 1.0, чтобы изменить результат для заданного сида. Интересные вариации сида находятся между 0.1 и 0.3.", - "upscale": "Используйте ESRGAN, чтобы увеличить изображение сразу после генерации.", - "faceCorrection": "Коррекция лиц с помощью GFPGAN или Codeformer: алгоритм определяет лица в готовом изображении и исправляет любые дефекты. Высокие значение силы меняет изображение сильнее, в результате лица будут выглядеть привлекательнее. У Codeformer более высокая точность сохранит исходное изображение в ущерб коррекции лица.", - "imageToImage": "'Изображение в изображение' загружает любое изображение, которое затем используется для генерации вместе с запросом. Чем больше значение, тем сильнее изменится изображение в результате. Возможны значения от 0 до 1, рекомендуется диапазон .25-.75", - "boundingBox": "'Ограничительная рамка' аналогична настройкам Ширина и Высота для 'Избражения из текста' или 'Изображения в изображение'. Будет обработана только область в рамке.", - "seamCorrection": "Управление обработкой видимых швов, возникающих между изображениями на холсте.", - "infillAndScaling": "Управление методами заполнения (используется для масок или стертых областей холста) и масштабирования (полезно для малых размеров ограничивающей рамки)." - } - }, - "unifiedCanvas": { - "layer": "Слой", - "base": "Базовый", - "mask": "Маска", - "maskingOptions": "Параметры маски", - "enableMask": "Включить маску", - "preserveMaskedArea": "Сохранять маскируемую область", - "clearMask": "Очистить маску", - "brush": "Кисть", - "eraser": "Ластик", - "fillBoundingBox": "Заполнить ограничивающую рамку", - "eraseBoundingBox": "Стереть ограничивающую рамку", - "colorPicker": "Пипетка", - "brushOptions": "Параметры кисти", - "brushSize": "Размер", - "move": "Переместить", - "resetView": "Сбросить вид", - "mergeVisible": "Объединить видимые", - "saveToGallery": "Сохранить в галерею", - "copyToClipboard": "Копировать в буфер обмена", - "downloadAsImage": "Скачать как изображение", - "undo": "Отменить", - "redo": "Повторить", - "clearCanvas": "Очистить холст", - "canvasSettings": "Настройки холста", - "showIntermediates": "Показывать процесс", - "showGrid": "Показать сетку", - "snapToGrid": "Привязать к сетке", - "darkenOutsideSelection": "Затемнить холст снаружи", - "autoSaveToGallery": "Автосохранение в галерее", - "saveBoxRegionOnly": "Сохранять только выделение", - "limitStrokesToBox": "Ограничить штрихи выделением", - "showCanvasDebugInfo": "Показать доп. информацию о холсте", - "clearCanvasHistory": "Очистить историю холста", - "clearHistory": "Очистить историю", - "clearCanvasHistoryMessage": "Очистка истории холста оставляет текущий холст нетронутым, но удаляет историю отмен и повторов.", - "clearCanvasHistoryConfirm": "Вы уверены, что хотите очистить историю холста?", - "emptyTempImageFolder": "Очистить временную папку", - "emptyFolder": "Очистить папку", - "emptyTempImagesFolderMessage": "Очищение папки временных изображений также полностью сбрасывает холст, включая всю историю отмены/повтора, размещаемые изображения и базовый слой холста.", - "emptyTempImagesFolderConfirm": "Вы уверены, что хотите очистить временную папку?", - "activeLayer": "Активный слой", - "canvasScale": "Масштаб холста", - "boundingBox": "Ограничивающая рамка", - "scaledBoundingBox": "Масштабирование рамки", - "boundingBoxPosition": "Позиция ограничивающей рамки", - "canvasDimensions": "Размеры холста", - "canvasPosition": "Положение холста", - "cursorPosition": "Положение курсора", - "previous": "Предыдущее", - "next": "Следующее", - "accept": "Принять", - "showHide": "Показать/Скрыть", - "discardAll": "Отменить все", - "betaClear": "Очистить", - "betaDarkenOutside": "Затемнить снаружи", - "betaLimitToBox": "Ограничить выделением", - "betaPreserveMasked": "Сохранять маскируемую область", - "antialiasing": "Не удалось скопировать ссылку на изображение" - }, - "accessibility": { - "modelSelect": "Выбор модели", - "uploadImage": "Загрузить изображение", - "nextImage": "Следующее изображение", - "previousImage": "Предыдущее изображение", - "zoomIn": "Приблизить", - "zoomOut": "Отдалить", - "rotateClockwise": "Повернуть по часовой стрелке", - "rotateCounterClockwise": "Повернуть против часовой стрелки", - "flipVertically": "Перевернуть вертикально", - "flipHorizontally": "Отразить горизонтально", - "toggleAutoscroll": "Включить автопрокрутку", - "toggleLogViewer": "Показать или скрыть просмотрщик логов", - "showOptionsPanel": "Показать боковую панель", - "invokeProgressBar": "Индикатор выполнения", - "reset": "Сброс", - "modifyConfig": "Изменить конфиг", - "useThisParameter": "Использовать этот параметр", - "copyMetadataJson": "Скопировать метаданные JSON", - "exitViewer": "Закрыть просмотрщик", - "menu": "Меню" - }, - "ui": { - "showProgressImages": "Показывать промежуточный итог", - "hideProgressImages": "Не показывать промежуточный итог", - "swapSizes": "Поменять местами размеры", - "lockRatio": "Зафиксировать пропорции" - }, - "nodes": { - "zoomInNodes": "Увеличьте масштаб", - "zoomOutNodes": "Уменьшите масштаб", - "fitViewportNodes": "Уместить вид", - "hideGraphNodes": "Скрыть оверлей графа", - "showGraphNodes": "Показать оверлей графа", - "showLegendNodes": "Показать тип поля", - "hideMinimapnodes": "Скрыть миникарту", - "hideLegendNodes": "Скрыть тип поля", - "showMinimapnodes": "Показать миникарту", - "loadWorkflow": "Загрузить рабочий процесс", - "resetWorkflowDesc2": "Сброс рабочего процесса очистит все узлы, ребра и детали рабочего процесса.", - "resetWorkflow": "Сбросить рабочий процесс", - "resetWorkflowDesc": "Вы уверены, что хотите сбросить этот рабочий процесс?", - "reloadNodeTemplates": "Перезагрузить шаблоны узлов", - "downloadWorkflow": "Скачать JSON рабочего процесса" - }, - "controlnet": { - "amult": "a_mult", - "contentShuffleDescription": "Перетасовывает содержимое изображения", - "bgth": "bg_th", - "contentShuffle": "Перетасовка содержимого", - "beginEndStepPercent": "Процент начала/конца шага", - "duplicate": "Дублировать", - "balanced": "Сбалансированный", - "f": "F", - "depthMidasDescription": "Генерация карты глубины с использованием Midas", - "control": "Контроль", - "coarse": "Грубость обработки", - "crop": "Обрезка", - "depthMidas": "Глубина (Midas)", - "enableControlnet": "Включить ControlNet", - "detectResolution": "Определить разрешение", - "controlMode": "Режим контроля", - "cannyDescription": "Детектор границ Canny", - "depthZoe": "Глубина (Zoe)", - "autoConfigure": "Автонастройка процессора", - "delete": "Удалить", - "canny": "Canny", - "depthZoeDescription": "Генерация карты глубины с использованием Zoe" - }, - "boards": { - "autoAddBoard": "Авто добавление Доски", - "topMessage": "Эта доска содержит изображения, используемые в следующих функциях:", - "move": "Перемещение", - "menuItemAutoAdd": "Авто добавление на эту доску", - "myBoard": "Моя Доска", - "searchBoard": "Поиск Доски...", - "noMatching": "Нет подходящих Досок", - "selectBoard": "Выбрать Доску", - "cancel": "Отменить", - "addBoard": "Добавить Доску", - "bottomMessage": "Удаление этой доски и ее изображений приведет к сбросу всех функций, использующихся их в данный момент.", - "uncategorized": "Без категории", - "changeBoard": "Изменить Доску", - "loading": "Загрузка...", - "clearSearch": "Очистить поиск" - } -} diff --git a/invokeai/frontend/web/dist/locales/sv.json b/invokeai/frontend/web/dist/locales/sv.json deleted file mode 100644 index eef46c4513..0000000000 --- a/invokeai/frontend/web/dist/locales/sv.json +++ /dev/null @@ -1,246 +0,0 @@ -{ - "accessibility": { - "copyMetadataJson": "Kopiera metadata JSON", - "zoomIn": "Zooma in", - "exitViewer": "Avslutningsvisare", - "modelSelect": "Välj modell", - "uploadImage": "Ladda upp bild", - "invokeProgressBar": "Invoke förloppsmätare", - "nextImage": "Nästa bild", - "toggleAutoscroll": "Växla automatisk rullning", - "flipHorizontally": "Vänd vågrätt", - "flipVertically": "Vänd lodrätt", - "zoomOut": "Zooma ut", - "toggleLogViewer": "Växla logvisare", - "reset": "Starta om", - "previousImage": "Föregående bild", - "useThisParameter": "Använd denna parametern", - "rotateCounterClockwise": "Rotera moturs", - "rotateClockwise": "Rotera medurs", - "modifyConfig": "Ändra konfiguration", - "showOptionsPanel": "Visa inställningspanelen" - }, - "common": { - "hotkeysLabel": "Snabbtangenter", - "reportBugLabel": "Rapportera bugg", - "githubLabel": "Github", - "discordLabel": "Discord", - "settingsLabel": "Inställningar", - "langEnglish": "Engelska", - "langDutch": "Nederländska", - "langFrench": "Franska", - "langGerman": "Tyska", - "langItalian": "Italienska", - "langArabic": "العربية", - "langHebrew": "עברית", - "langPolish": "Polski", - "langPortuguese": "Português", - "langBrPortuguese": "Português do Brasil", - "langSimplifiedChinese": "简体中文", - "langJapanese": "日本語", - "langKorean": "한국어", - "langRussian": "Русский", - "unifiedCanvas": "Förenad kanvas", - "nodesDesc": "Ett nodbaserat system för bildgenerering är under utveckling. Håll utkik för uppdateringar om denna fantastiska funktion.", - "langUkranian": "Украї́нська", - "langSpanish": "Español", - "postProcessDesc2": "Ett dedikerat användargränssnitt kommer snart att släppas för att underlätta mer avancerade arbetsflöden av efterbehandling.", - "trainingDesc1": "Ett dedikerat arbetsflöde för träning av dina egna inbäddningar och kontrollpunkter genom Textual Inversion eller Dreambooth från webbgränssnittet.", - "trainingDesc2": "InvokeAI stöder redan träning av anpassade inbäddningar med hjälp av Textual Inversion genom huvudscriptet.", - "upload": "Ladda upp", - "close": "Stäng", - "cancel": "Avbryt", - "accept": "Acceptera", - "statusDisconnected": "Frånkopplad", - "statusGeneratingTextToImage": "Genererar text till bild", - "statusGeneratingImageToImage": "Genererar Bild till bild", - "statusGeneratingInpainting": "Genererar Måla i", - "statusGenerationComplete": "Generering klar", - "statusModelConverted": "Modell konverterad", - "statusMergingModels": "Sammanfogar modeller", - "loading": "Laddar", - "loadingInvokeAI": "Laddar Invoke AI", - "statusRestoringFaces": "Återskapar ansikten", - "languagePickerLabel": "Språkväljare", - "txt2img": "Text till bild", - "nodes": "Noder", - "img2img": "Bild till bild", - "postprocessing": "Efterbehandling", - "postProcessing": "Efterbehandling", - "load": "Ladda", - "training": "Träning", - "postProcessDesc1": "Invoke AI erbjuder ett brett utbud av efterbehandlingsfunktioner. Uppskalning och ansiktsåterställning finns redan tillgängligt i webbgränssnittet. Du kommer åt dem ifrån Avancerade inställningar-menyn under Bild till bild-fliken. Du kan också behandla bilder direkt genom att använda knappen bildåtgärder ovanför nuvarande bild eller i bildvisaren.", - "postProcessDesc3": "Invoke AI's kommandotolk erbjuder många olika funktioner, bland annat \"Förstora\".", - "statusGenerating": "Genererar", - "statusError": "Fel", - "back": "Bakåt", - "statusConnected": "Ansluten", - "statusPreparing": "Förbereder", - "statusProcessingCanceled": "Bearbetning avbruten", - "statusProcessingComplete": "Bearbetning färdig", - "statusGeneratingOutpainting": "Genererar Fyll ut", - "statusIterationComplete": "Itterering klar", - "statusSavingImage": "Sparar bild", - "statusRestoringFacesGFPGAN": "Återskapar ansikten (GFPGAN)", - "statusRestoringFacesCodeFormer": "Återskapar ansikten (CodeFormer)", - "statusUpscaling": "Skala upp", - "statusUpscalingESRGAN": "Uppskalning (ESRGAN)", - "statusModelChanged": "Modell ändrad", - "statusLoadingModel": "Laddar modell", - "statusConvertingModel": "Konverterar modell", - "statusMergedModels": "Modeller sammanfogade" - }, - "gallery": { - "generations": "Generationer", - "showGenerations": "Visa generationer", - "uploads": "Uppladdningar", - "showUploads": "Visa uppladdningar", - "galleryImageSize": "Bildstorlek", - "allImagesLoaded": "Alla bilder laddade", - "loadMore": "Ladda mer", - "galleryImageResetSize": "Återställ storlek", - "gallerySettings": "Galleriinställningar", - "maintainAspectRatio": "Behåll bildförhållande", - "noImagesInGallery": "Inga bilder i galleriet", - "autoSwitchNewImages": "Ändra automatiskt till nya bilder", - "singleColumnLayout": "Enkolumnslayout" - }, - "hotkeys": { - "generalHotkeys": "Allmänna snabbtangenter", - "galleryHotkeys": "Gallerisnabbtangenter", - "unifiedCanvasHotkeys": "Snabbtangenter för sammanslagskanvas", - "invoke": { - "title": "Anropa", - "desc": "Genererar en bild" - }, - "cancel": { - "title": "Avbryt", - "desc": "Avbryt bildgenerering" - }, - "focusPrompt": { - "desc": "Fokusera området för promptinmatning", - "title": "Fokusprompt" - }, - "pinOptions": { - "desc": "Nåla fast alternativpanelen", - "title": "Nåla fast alternativ" - }, - "toggleOptions": { - "title": "Växla inställningar", - "desc": "Öppna och stäng alternativpanelen" - }, - "toggleViewer": { - "title": "Växla visaren", - "desc": "Öppna och stäng bildvisaren" - }, - "toggleGallery": { - "title": "Växla galleri", - "desc": "Öppna eller stäng galleribyrån" - }, - "maximizeWorkSpace": { - "title": "Maximera arbetsyta", - "desc": "Stäng paneler och maximera arbetsyta" - }, - "changeTabs": { - "title": "Växla flik", - "desc": "Byt till en annan arbetsyta" - }, - "consoleToggle": { - "title": "Växla konsol", - "desc": "Öppna och stäng konsol" - }, - "setSeed": { - "desc": "Använd seed för nuvarande bild", - "title": "välj seed" - }, - "setParameters": { - "title": "Välj parametrar", - "desc": "Använd alla parametrar från nuvarande bild" - }, - "setPrompt": { - "desc": "Använd prompt för nuvarande bild", - "title": "Välj prompt" - }, - "restoreFaces": { - "title": "Återskapa ansikten", - "desc": "Återskapa nuvarande bild" - }, - "upscale": { - "title": "Skala upp", - "desc": "Skala upp nuvarande bild" - }, - "showInfo": { - "title": "Visa info", - "desc": "Visa metadata för nuvarande bild" - }, - "sendToImageToImage": { - "title": "Skicka till Bild till bild", - "desc": "Skicka nuvarande bild till Bild till bild" - }, - "deleteImage": { - "title": "Radera bild", - "desc": "Radera nuvarande bild" - }, - "closePanels": { - "title": "Stäng paneler", - "desc": "Stäng öppna paneler" - }, - "previousImage": { - "title": "Föregående bild", - "desc": "Visa föregående bild" - }, - "nextImage": { - "title": "Nästa bild", - "desc": "Visa nästa bild" - }, - "toggleGalleryPin": { - "title": "Växla gallerinål", - "desc": "Nålar fast eller nålar av galleriet i gränssnittet" - }, - "increaseGalleryThumbSize": { - "title": "Förstora galleriets bildstorlek", - "desc": "Förstora miniatyrbildernas storlek" - }, - "decreaseGalleryThumbSize": { - "title": "Minska gelleriets bildstorlek", - "desc": "Minska miniatyrbildernas storlek i galleriet" - }, - "decreaseBrushSize": { - "desc": "Förminska storleken på kanvas- pensel eller suddgummi", - "title": "Minska penselstorlek" - }, - "increaseBrushSize": { - "title": "Öka penselstorlek", - "desc": "Öka stoleken på kanvas- pensel eller suddgummi" - }, - "increaseBrushOpacity": { - "title": "Öka penselns opacitet", - "desc": "Öka opaciteten för kanvaspensel" - }, - "decreaseBrushOpacity": { - "desc": "Minska kanvaspenselns opacitet", - "title": "Minska penselns opacitet" - }, - "moveTool": { - "title": "Flytta", - "desc": "Tillåt kanvasnavigation" - }, - "fillBoundingBox": { - "title": "Fyll ram", - "desc": "Fyller ramen med pensels färg" - }, - "keyboardShortcuts": "Snabbtangenter", - "appHotkeys": "Appsnabbtangenter", - "selectBrush": { - "desc": "Välj kanvaspensel", - "title": "Välj pensel" - }, - "selectEraser": { - "desc": "Välj kanvassuddgummi", - "title": "Välj suddgummi" - }, - "eraseBoundingBox": { - "title": "Ta bort ram" - } - } -} diff --git a/invokeai/frontend/web/dist/locales/tr.json b/invokeai/frontend/web/dist/locales/tr.json deleted file mode 100644 index 0c222eecf7..0000000000 --- a/invokeai/frontend/web/dist/locales/tr.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "accessibility": { - "invokeProgressBar": "Invoke ilerleme durumu", - "nextImage": "Sonraki Resim", - "useThisParameter": "Kullanıcı parametreleri", - "copyMetadataJson": "Metadata verilerini kopyala (JSON)", - "exitViewer": "Görüntüleme Modundan Çık", - "zoomIn": "Yakınlaştır", - "zoomOut": "Uzaklaştır", - "rotateCounterClockwise": "Döndür (Saat yönünün tersine)", - "rotateClockwise": "Döndür (Saat yönünde)", - "flipHorizontally": "Yatay Çevir", - "flipVertically": "Dikey Çevir", - "modifyConfig": "Ayarları Değiştir", - "toggleAutoscroll": "Otomatik kaydırmayı aç/kapat", - "toggleLogViewer": "Günlük Görüntüleyici Aç/Kapa", - "showOptionsPanel": "Ayarlar Panelini Göster", - "modelSelect": "Model Seçin", - "reset": "Sıfırla", - "uploadImage": "Resim Yükle", - "previousImage": "Önceki Resim", - "menu": "Menü" - }, - "common": { - "hotkeysLabel": "Kısayol Tuşları", - "languagePickerLabel": "Dil Seçimi", - "reportBugLabel": "Hata Bildir", - "githubLabel": "Github", - "discordLabel": "Discord", - "settingsLabel": "Ayarlar", - "langArabic": "Arapça", - "langEnglish": "İngilizce", - "langDutch": "Hollandaca", - "langFrench": "Fransızca", - "langGerman": "Almanca", - "langItalian": "İtalyanca", - "langJapanese": "Japonca", - "langPolish": "Lehçe", - "langPortuguese": "Portekizce", - "langBrPortuguese": "Portekizcr (Brezilya)", - "langRussian": "Rusça", - "langSimplifiedChinese": "Çince (Basit)", - "langUkranian": "Ukraynaca", - "langSpanish": "İspanyolca", - "txt2img": "Metinden Resime", - "img2img": "Resimden Metine", - "linear": "Çizgisel", - "nodes": "Düğümler", - "postprocessing": "İşlem Sonrası", - "postProcessing": "İşlem Sonrası", - "postProcessDesc2": "Daha gelişmiş özellikler için ve iş akışını kolaylaştırmak için özel bir kullanıcı arayüzü çok yakında yayınlanacaktır.", - "postProcessDesc3": "Invoke AI komut satırı arayüzü, bir çok yeni özellik sunmaktadır.", - "langKorean": "Korece", - "unifiedCanvas": "Akıllı Tuval", - "nodesDesc": "Görüntülerin oluşturulmasında hazırladığımız yeni bir sistem geliştirme aşamasındadır. Bu harika özellikler ve çok daha fazlası için bizi takip etmeye devam edin.", - "postProcessDesc1": "Invoke AI son kullanıcıya yönelik bir çok özellik sunar. Görüntü kalitesi yükseltme, yüz restorasyonu WebUI üzerinden kullanılabilir. Metinden resime ve resimden metne araçlarına gelişmiş seçenekler menüsünden ulaşabilirsiniz. İsterseniz mevcut görüntü ekranının üzerindeki veya görüntüleyicideki görüntüyü doğrudan düzenleyebilirsiniz." - } -} diff --git a/invokeai/frontend/web/dist/locales/uk.json b/invokeai/frontend/web/dist/locales/uk.json deleted file mode 100644 index a85faee727..0000000000 --- a/invokeai/frontend/web/dist/locales/uk.json +++ /dev/null @@ -1,619 +0,0 @@ -{ - "common": { - "hotkeysLabel": "Гарячi клавіші", - "languagePickerLabel": "Мова", - "reportBugLabel": "Повідомити про помилку", - "settingsLabel": "Налаштування", - "img2img": "Зображення із зображення (img2img)", - "unifiedCanvas": "Універсальне полотно", - "nodes": "Вузли", - "langUkranian": "Украї́нська", - "nodesDesc": "Система генерації зображень на основі нодів (вузлів) вже розробляється. Слідкуйте за новинами про цю чудову функцію.", - "postProcessing": "Постобробка", - "postProcessDesc1": "Invoke AI пропонує широкий спектр функцій постобробки. Збільшення зображення (upscale) та відновлення облич вже доступні в інтерфейсі. Отримайте доступ до них з меню 'Додаткові параметри' на вкладках 'Зображення із тексту' та 'Зображення із зображення'. Обробляйте зображення безпосередньо, використовуючи кнопки дій із зображеннями над поточним зображенням або в режимі перегляду.", - "postProcessDesc2": "Найближчим часом буде випущено спеціальний інтерфейс для більш сучасних процесів постобробки.", - "postProcessDesc3": "Інтерфейс командного рядка Invoke AI пропонує різні інші функції, включаючи збільшення Embiggen.", - "training": "Навчання", - "trainingDesc1": "Спеціальний інтерфейс для навчання власних моделей з використанням Textual Inversion та Dreambooth.", - "trainingDesc2": "InvokeAI вже підтримує навчання моделей за допомогою TI, через інтерфейс командного рядка.", - "upload": "Завантажити", - "close": "Закрити", - "load": "Завантажити", - "statusConnected": "Підключено", - "statusDisconnected": "Відключено", - "statusError": "Помилка", - "statusPreparing": "Підготування", - "statusProcessingCanceled": "Обробка перервана", - "statusProcessingComplete": "Обробка завершена", - "statusGenerating": "Генерація", - "statusGeneratingTextToImage": "Генерація зображення із тексту", - "statusGeneratingImageToImage": "Генерація зображення із зображення", - "statusGeneratingInpainting": "Домальовка всередині", - "statusGeneratingOutpainting": "Домальовка зовні", - "statusGenerationComplete": "Генерація завершена", - "statusIterationComplete": "Iтерація завершена", - "statusSavingImage": "Збереження зображення", - "statusRestoringFaces": "Відновлення облич", - "statusRestoringFacesGFPGAN": "Відновлення облич (GFPGAN)", - "statusRestoringFacesCodeFormer": "Відновлення облич (CodeFormer)", - "statusUpscaling": "Збільшення", - "statusUpscalingESRGAN": "Збільшення (ESRGAN)", - "statusLoadingModel": "Завантаження моделі", - "statusModelChanged": "Модель змінено", - "cancel": "Скасувати", - "accept": "Підтвердити", - "back": "Назад", - "postprocessing": "Постобробка", - "statusModelConverted": "Модель сконвертована", - "statusMergingModels": "Злиття моделей", - "loading": "Завантаження", - "loadingInvokeAI": "Завантаження Invoke AI", - "langHebrew": "Іврит", - "langKorean": "Корейська", - "langPortuguese": "Португальська", - "langArabic": "Арабська", - "langSimplifiedChinese": "Китайська (спрощена)", - "langSpanish": "Іспанська", - "langEnglish": "Англійська", - "langGerman": "Німецька", - "langItalian": "Італійська", - "langJapanese": "Японська", - "langPolish": "Польська", - "langBrPortuguese": "Португальська (Бразилія)", - "langRussian": "Російська", - "githubLabel": "Github", - "txt2img": "Текст в зображення (txt2img)", - "discordLabel": "Discord", - "langDutch": "Голландська", - "langFrench": "Французька", - "statusMergedModels": "Моделі об'єднані", - "statusConvertingModel": "Конвертація моделі", - "linear": "Лінійна обробка" - }, - "gallery": { - "generations": "Генерації", - "showGenerations": "Показувати генерації", - "uploads": "Завантаження", - "showUploads": "Показувати завантаження", - "galleryImageSize": "Розмір зображень", - "galleryImageResetSize": "Аатоматичний розмір", - "gallerySettings": "Налаштування галереї", - "maintainAspectRatio": "Зберігати пропорції", - "autoSwitchNewImages": "Автоматично вибирати нові", - "singleColumnLayout": "Одна колонка", - "allImagesLoaded": "Всі зображення завантажені", - "loadMore": "Завантажити більше", - "noImagesInGallery": "Зображень немає" - }, - "hotkeys": { - "keyboardShortcuts": "Клавіатурні скорочення", - "appHotkeys": "Гарячі клавіші програми", - "generalHotkeys": "Загальні гарячі клавіші", - "galleryHotkeys": "Гарячі клавіші галереї", - "unifiedCanvasHotkeys": "Гарячі клавіші універсального полотна", - "invoke": { - "title": "Invoke", - "desc": "Згенерувати зображення" - }, - "cancel": { - "title": "Скасувати", - "desc": "Скасувати генерацію зображення" - }, - "focusPrompt": { - "title": "Переключитися на введення запиту", - "desc": "Перемикання на область введення запиту" - }, - "toggleOptions": { - "title": "Показати/приховати параметри", - "desc": "Відкривати і закривати панель параметрів" - }, - "pinOptions": { - "title": "Закріпити параметри", - "desc": "Закріпити панель параметрів" - }, - "toggleViewer": { - "title": "Показати перегляд", - "desc": "Відкривати і закривати переглядач зображень" - }, - "toggleGallery": { - "title": "Показати галерею", - "desc": "Відкривати і закривати скриньку галереї" - }, - "maximizeWorkSpace": { - "title": "Максимізувати робочий простір", - "desc": "Приховати панелі і максимізувати робочу область" - }, - "changeTabs": { - "title": "Переключити вкладку", - "desc": "Переключитися на іншу робочу область" - }, - "consoleToggle": { - "title": "Показати консоль", - "desc": "Відкривати і закривати консоль" - }, - "setPrompt": { - "title": "Використовувати запит", - "desc": "Використати запит із поточного зображення" - }, - "setSeed": { - "title": "Використовувати сід", - "desc": "Використовувати сід поточного зображення" - }, - "setParameters": { - "title": "Використовувати всі параметри", - "desc": "Використовувати всі параметри поточного зображення" - }, - "restoreFaces": { - "title": "Відновити обличчя", - "desc": "Відновити обличчя на поточному зображенні" - }, - "upscale": { - "title": "Збільшення", - "desc": "Збільшити поточне зображення" - }, - "showInfo": { - "title": "Показати метадані", - "desc": "Показати метадані з поточного зображення" - }, - "sendToImageToImage": { - "title": "Відправити в img2img", - "desc": "Надіслати поточне зображення в Image To Image" - }, - "deleteImage": { - "title": "Видалити зображення", - "desc": "Видалити поточне зображення" - }, - "closePanels": { - "title": "Закрити панелі", - "desc": "Закриває відкриті панелі" - }, - "previousImage": { - "title": "Попереднє зображення", - "desc": "Відображати попереднє зображення в галереї" - }, - "nextImage": { - "title": "Наступне зображення", - "desc": "Відображення наступного зображення в галереї" - }, - "toggleGalleryPin": { - "title": "Закріпити галерею", - "desc": "Закріплює і відкріплює галерею" - }, - "increaseGalleryThumbSize": { - "title": "Збільшити розмір мініатюр галереї", - "desc": "Збільшує розмір мініатюр галереї" - }, - "decreaseGalleryThumbSize": { - "title": "Зменшує розмір мініатюр галереї", - "desc": "Зменшує розмір мініатюр галереї" - }, - "selectBrush": { - "title": "Вибрати пензель", - "desc": "Вибирає пензель для полотна" - }, - "selectEraser": { - "title": "Вибрати ластик", - "desc": "Вибирає ластик для полотна" - }, - "decreaseBrushSize": { - "title": "Зменшити розмір пензля", - "desc": "Зменшує розмір пензля/ластика полотна" - }, - "increaseBrushSize": { - "title": "Збільшити розмір пензля", - "desc": "Збільшує розмір пензля/ластика полотна" - }, - "decreaseBrushOpacity": { - "title": "Зменшити непрозорість пензля", - "desc": "Зменшує непрозорість пензля полотна" - }, - "increaseBrushOpacity": { - "title": "Збільшити непрозорість пензля", - "desc": "Збільшує непрозорість пензля полотна" - }, - "moveTool": { - "title": "Інструмент переміщення", - "desc": "Дозволяє переміщатися по полотну" - }, - "fillBoundingBox": { - "title": "Заповнити обмежувальну рамку", - "desc": "Заповнює обмежувальну рамку кольором пензля" - }, - "eraseBoundingBox": { - "title": "Стерти обмежувальну рамку", - "desc": "Стирає область обмежувальної рамки" - }, - "colorPicker": { - "title": "Вибрати колір", - "desc": "Вибирає засіб вибору кольору полотна" - }, - "toggleSnap": { - "title": "Увімкнути прив'язку", - "desc": "Вмикає/вимикає прив'язку до сітки" - }, - "quickToggleMove": { - "title": "Швидке перемикання переміщення", - "desc": "Тимчасово перемикає режим переміщення" - }, - "toggleLayer": { - "title": "Переключити шар", - "desc": "Перемикання маски/базового шару" - }, - "clearMask": { - "title": "Очистити маску", - "desc": "Очистити всю маску" - }, - "hideMask": { - "title": "Приховати маску", - "desc": "Приховує/показує маску" - }, - "showHideBoundingBox": { - "title": "Показати/приховати обмежувальну рамку", - "desc": "Переключити видимість обмежувальної рамки" - }, - "mergeVisible": { - "title": "Об'єднати видимі", - "desc": "Об'єднати всі видимі шари полотна" - }, - "saveToGallery": { - "title": "Зберегти в галерею", - "desc": "Зберегти поточне полотно в галерею" - }, - "copyToClipboard": { - "title": "Копіювати в буфер обміну", - "desc": "Копіювати поточне полотно в буфер обміну" - }, - "downloadImage": { - "title": "Завантажити зображення", - "desc": "Завантажити вміст полотна" - }, - "undoStroke": { - "title": "Скасувати пензель", - "desc": "Скасувати мазок пензля" - }, - "redoStroke": { - "title": "Повторити мазок пензля", - "desc": "Повторити мазок пензля" - }, - "resetView": { - "title": "Вид за замовчуванням", - "desc": "Скинути вид полотна" - }, - "previousStagingImage": { - "title": "Попереднє зображення", - "desc": "Попереднє зображення" - }, - "nextStagingImage": { - "title": "Наступне зображення", - "desc": "Наступне зображення" - }, - "acceptStagingImage": { - "title": "Прийняти зображення", - "desc": "Прийняти поточне зображення" - } - }, - "modelManager": { - "modelManager": "Менеджер моделей", - "model": "Модель", - "modelAdded": "Модель додана", - "modelUpdated": "Модель оновлена", - "modelEntryDeleted": "Запис про модель видалено", - "cannotUseSpaces": "Не можна використовувати пробіли", - "addNew": "Додати нову", - "addNewModel": "Додати нову модель", - "addManually": "Додати вручну", - "manual": "Ручне", - "name": "Назва", - "nameValidationMsg": "Введіть назву моделі", - "description": "Опис", - "descriptionValidationMsg": "Введіть опис моделі", - "config": "Файл конфігурації", - "configValidationMsg": "Шлях до файлу конфігурації.", - "modelLocation": "Розташування моделі", - "modelLocationValidationMsg": "Шлях до файлу з моделлю.", - "vaeLocation": "Розтышування VAE", - "vaeLocationValidationMsg": "Шлях до VAE.", - "width": "Ширина", - "widthValidationMsg": "Початкова ширина зображень.", - "height": "Висота", - "heightValidationMsg": "Початкова висота зображень.", - "addModel": "Додати модель", - "updateModel": "Оновити модель", - "availableModels": "Доступні моделі", - "search": "Шукати", - "load": "Завантажити", - "active": "активна", - "notLoaded": "не завантажена", - "cached": "кешована", - "checkpointFolder": "Папка з моделями", - "clearCheckpointFolder": "Очистити папку з моделями", - "findModels": "Знайти моделі", - "scanAgain": "Сканувати знову", - "modelsFound": "Знайдені моделі", - "selectFolder": "Обрати папку", - "selected": "Обрані", - "selectAll": "Обрати всі", - "deselectAll": "Зняти выділення", - "showExisting": "Показувати додані", - "addSelected": "Додати обрані", - "modelExists": "Модель вже додана", - "selectAndAdd": "Оберіть і додайте моделі із списку", - "noModelsFound": "Моделі не знайдені", - "delete": "Видалити", - "deleteModel": "Видалити модель", - "deleteConfig": "Видалити конфігурацію", - "deleteMsg1": "Ви точно хочете видалити модель із InvokeAI?", - "deleteMsg2": "Це не призведе до видалення файлу моделі з диску. Позніше ви можете додати його знову.", - "allModels": "Усі моделі", - "diffusersModels": "Diffusers", - "scanForModels": "Сканувати моделі", - "convert": "Конвертувати", - "convertToDiffusers": "Конвертувати в Diffusers", - "formMessageDiffusersVAELocationDesc": "Якщо не надано, InvokeAI буде шукати файл VAE в розташуванні моделі, вказаній вище.", - "convertToDiffusersHelpText3": "Файл моделі на диску НЕ буде видалено або змінено. Ви можете знову додати його в Model Manager, якщо потрібно.", - "customConfig": "Користувальницький конфіг", - "invokeRoot": "Каталог InvokeAI", - "custom": "Користувальницький", - "modelTwo": "Модель 2", - "modelThree": "Модель 3", - "mergedModelName": "Назва об'єднаної моделі", - "alpha": "Альфа", - "interpolationType": "Тип інтерполяції", - "mergedModelSaveLocation": "Шлях збереження", - "mergedModelCustomSaveLocation": "Користувальницький шлях", - "invokeAIFolder": "Каталог InvokeAI", - "ignoreMismatch": "Ігнорувати невідповідності між вибраними моделями", - "modelMergeHeaderHelp2": "Тільки Diffusers-моделі доступні для об'єднання. Якщо ви хочете об'єднати checkpoint-моделі, спочатку перетворіть їх на Diffusers.", - "checkpointModels": "Checkpoints", - "repo_id": "ID репозиторію", - "v2_base": "v2 (512px)", - "repoIDValidationMsg": "Онлайн-репозиторій моделі", - "formMessageDiffusersModelLocationDesc": "Вкажіть хоча б одне.", - "formMessageDiffusersModelLocation": "Шлях до Diffusers-моделі", - "v2_768": "v2 (768px)", - "formMessageDiffusersVAELocation": "Шлях до VAE", - "convertToDiffusersHelpText5": "Переконайтеся, що у вас достатньо місця на диску. Моделі зазвичай займають від 4 до 7 Гб.", - "convertToDiffusersSaveLocation": "Шлях збереження", - "v1": "v1", - "convertToDiffusersHelpText6": "Ви хочете перетворити цю модель?", - "inpainting": "v1 Inpainting", - "modelConverted": "Модель перетворено", - "sameFolder": "У ту ж папку", - "statusConverting": "Перетворення", - "merge": "Об'єднати", - "mergeModels": "Об'єднати моделі", - "modelOne": "Модель 1", - "sigmoid": "Сігмоїд", - "weightedSum": "Зважена сума", - "none": "пусто", - "addDifference": "Додати різницю", - "pickModelType": "Вибрати тип моделі", - "convertToDiffusersHelpText4": "Це одноразова дія. Вона може зайняти від 30 до 60 секунд в залежності від характеристик вашого комп'ютера.", - "pathToCustomConfig": "Шлях до конфігу користувача", - "safetensorModels": "SafeTensors", - "addCheckpointModel": "Додати модель Checkpoint/Safetensor", - "addDiffuserModel": "Додати Diffusers", - "vaeRepoID": "ID репозиторію VAE", - "vaeRepoIDValidationMsg": "Онлайн-репозиторій VAE", - "modelMergeInterpAddDifferenceHelp": "У цьому режимі Модель 3 спочатку віднімається з Моделі 2. Результуюча версія змішується з Моделью 1 із встановленим вище коефіцієнтом Альфа.", - "customSaveLocation": "Користувальницький шлях збереження", - "modelMergeAlphaHelp": "Альфа впливає силу змішування моделей. Нижчі значення альфа призводять до меншого впливу другої моделі.", - "convertToDiffusersHelpText1": "Ця модель буде конвертована в формат 🧨 Diffusers.", - "convertToDiffusersHelpText2": "Цей процес замінить ваш запис в Model Manager на версію тієї ж моделі в Diffusers.", - "modelsMerged": "Моделі об'єднані", - "modelMergeHeaderHelp1": "Ви можете об'єднати до трьох різних моделей, щоб створити змішану, що відповідає вашим потребам.", - "inverseSigmoid": "Зворотній Сігмоїд" - }, - "parameters": { - "images": "Зображення", - "steps": "Кроки", - "cfgScale": "Рівень CFG", - "width": "Ширина", - "height": "Висота", - "seed": "Сід", - "randomizeSeed": "Випадковий сид", - "shuffle": "Оновити", - "noiseThreshold": "Поріг шуму", - "perlinNoise": "Шум Перліна", - "variations": "Варіації", - "variationAmount": "Кількість варіацій", - "seedWeights": "Вага сіду", - "faceRestoration": "Відновлення облич", - "restoreFaces": "Відновити обличчя", - "type": "Тип", - "strength": "Сила", - "upscaling": "Збільшення", - "upscale": "Збільшити", - "upscaleImage": "Збільшити зображення", - "scale": "Масштаб", - "otherOptions": "інші параметри", - "seamlessTiling": "Безшовний узор", - "hiresOptim": "Оптимізація High Res", - "imageFit": "Вмістити зображення", - "codeformerFidelity": "Точність", - "scaleBeforeProcessing": "Масштабувати", - "scaledWidth": "Масштаб Ш", - "scaledHeight": "Масштаб В", - "infillMethod": "Засіб заповнення", - "tileSize": "Розмір області", - "boundingBoxHeader": "Обмежуюча рамка", - "seamCorrectionHeader": "Налаштування шву", - "infillScalingHeader": "Заповнення і масштабування", - "img2imgStrength": "Сила обробки img2img", - "toggleLoopback": "Зациклити обробку", - "sendTo": "Надіслати", - "sendToImg2Img": "Надіслати у img2img", - "sendToUnifiedCanvas": "Надіслати на полотно", - "copyImageToLink": "Скопіювати посилання", - "downloadImage": "Завантажити", - "openInViewer": "Відкрити у переглядачі", - "closeViewer": "Закрити переглядач", - "usePrompt": "Використати запит", - "useSeed": "Використати сід", - "useAll": "Використати все", - "useInitImg": "Використати як початкове", - "info": "Метадані", - "initialImage": "Початкове зображення", - "showOptionsPanel": "Показати панель налаштувань", - "general": "Основне", - "cancel": { - "immediate": "Скасувати негайно", - "schedule": "Скасувати після поточної ітерації", - "isScheduled": "Відміна", - "setType": "Встановити тип скасування" - }, - "vSymmetryStep": "Крок верт. симетрії", - "hiresStrength": "Сила High Res", - "hidePreview": "Сховати попередній перегляд", - "showPreview": "Показати попередній перегляд", - "imageToImage": "Зображення до зображення", - "denoisingStrength": "Сила шумоподавлення", - "copyImage": "Копіювати зображення", - "symmetry": "Симетрія", - "hSymmetryStep": "Крок гор. симетрії" - }, - "settings": { - "models": "Моделі", - "displayInProgress": "Показувати процес генерації", - "saveSteps": "Зберігати кожні n кроків", - "confirmOnDelete": "Підтверджувати видалення", - "displayHelpIcons": "Показувати значки підказок", - "enableImageDebugging": "Увімкнути налагодження", - "resetWebUI": "Повернути початкові", - "resetWebUIDesc1": "Скидання настройок веб-інтерфейсу видаляє лише локальний кеш браузера з вашими зображеннями та налаштуваннями. Це не призводить до видалення зображень з диску.", - "resetWebUIDesc2": "Якщо зображення не відображаються в галереї або не працює ще щось, спробуйте скинути налаштування, перш ніж повідомляти про проблему на GitHub.", - "resetComplete": "Інтерфейс скинуто. Оновіть цю сторінку.", - "useSlidersForAll": "Використовувати повзунки для всіх параметрів" - }, - "toast": { - "tempFoldersEmptied": "Тимчасова папка очищена", - "uploadFailed": "Не вдалося завантажити", - "uploadFailedUnableToLoadDesc": "Неможливо завантажити файл", - "downloadImageStarted": "Завантаження зображення почалося", - "imageCopied": "Зображення скопійоване", - "imageLinkCopied": "Посилання на зображення скопійовано", - "imageNotLoaded": "Зображення не завантажено", - "imageNotLoadedDesc": "Не знайдено зображення для надсилання до img2img", - "imageSavedToGallery": "Зображення збережено в галерею", - "canvasMerged": "Полотно об'єднане", - "sentToImageToImage": "Надіслати до img2img", - "sentToUnifiedCanvas": "Надіслати на полотно", - "parametersSet": "Параметри задані", - "parametersNotSet": "Параметри не задані", - "parametersNotSetDesc": "Не знайдені метадані цього зображення.", - "parametersFailed": "Проблема із завантаженням параметрів", - "parametersFailedDesc": "Неможливо завантажити початкове зображення.", - "seedSet": "Сід заданий", - "seedNotSet": "Сід не заданий", - "seedNotSetDesc": "Не вдалося знайти сід для зображення.", - "promptSet": "Запит заданий", - "promptNotSet": "Запит не заданий", - "promptNotSetDesc": "Не вдалося знайти запит для зображення.", - "upscalingFailed": "Збільшення не вдалося", - "faceRestoreFailed": "Відновлення облич не вдалося", - "metadataLoadFailed": "Не вдалося завантажити метадані", - "initialImageSet": "Початкове зображення задане", - "initialImageNotSet": "Початкове зображення не задане", - "initialImageNotSetDesc": "Не вдалося завантажити початкове зображення", - "serverError": "Помилка сервера", - "disconnected": "Відключено від сервера", - "connected": "Підключено до сервера", - "canceled": "Обробку скасовано" - }, - "tooltip": { - "feature": { - "prompt": "Це поле для тексту запиту, включаючи об'єкти генерації та стилістичні терміни. У запит можна включити і коефіцієнти ваги (значущості токена), але консольні команди та параметри не працюватимуть.", - "gallery": "Тут відображаються генерації з папки outputs у міру їх появи.", - "other": "Ці опції включають альтернативні режими обробки для Invoke. 'Безшовний узор' створить на виході узори, що повторюються. 'Висока роздільна здатність' - це генерація у два етапи за допомогою img2img: використовуйте це налаштування, коли хочете отримати цільне зображення більшого розміру без артефактів.", - "seed": "Значення сіду впливає на початковий шум, з якого сформується зображення. Можна використовувати вже наявний сід із попередніх зображень. 'Поріг шуму' використовується для пом'якшення артефактів при високих значеннях CFG (спробуйте в діапазоні 0-10), а 'Перлін' - для додавання шуму Перліна в процесі генерації: обидва параметри служать для більшої варіативності результатів.", - "variations": "Спробуйте варіацію зі значенням від 0.1 до 1.0, щоб змінити результат для заданого сиду. Цікаві варіації сиду знаходяться між 0.1 і 0.3.", - "upscale": "Використовуйте ESRGAN, щоб збільшити зображення відразу після генерації.", - "faceCorrection": "Корекція облич за допомогою GFPGAN або Codeformer: алгоритм визначає обличчя у готовому зображенні та виправляє будь-які дефекти. Високі значення сили змінюють зображення сильніше, в результаті обличчя будуть виглядати привабливіше. У Codeformer більш висока точність збереже вихідне зображення на шкоду корекції обличчя.", - "imageToImage": "'Зображення до зображення' завантажує будь-яке зображення, яке потім використовується для генерації разом із запитом. Чим більше значення, тим сильніше зміниться зображення в результаті. Можливі значення від 0 до 1, рекомендується діапазон 0.25-0.75", - "boundingBox": "'Обмежуюча рамка' аналогічна налаштуванням 'Ширина' і 'Висота' для 'Зображення з тексту' або 'Зображення до зображення'. Буде оброблена тільки область у рамці.", - "seamCorrection": "Керування обробкою видимих швів, що виникають між зображеннями на полотні.", - "infillAndScaling": "Керування методами заповнення (використовується для масок або стертих частин полотна) та масштабування (корисно для малих розмірів обмежуючої рамки)." - } - }, - "unifiedCanvas": { - "layer": "Шар", - "base": "Базовий", - "mask": "Маска", - "maskingOptions": "Параметри маски", - "enableMask": "Увiмкнути маску", - "preserveMaskedArea": "Зберiгати замасковану область", - "clearMask": "Очистити маску", - "brush": "Пензель", - "eraser": "Гумка", - "fillBoundingBox": "Заповнити обмежуючу рамку", - "eraseBoundingBox": "Стерти обмежуючу рамку", - "colorPicker": "Пiпетка", - "brushOptions": "Параметри пензля", - "brushSize": "Розмiр", - "move": "Перемiстити", - "resetView": "Скинути вигляд", - "mergeVisible": "Об'єднати видимi", - "saveToGallery": "Зберегти до галереї", - "copyToClipboard": "Копiювати до буферу обмiну", - "downloadAsImage": "Завантажити як зображення", - "undo": "Вiдмiнити", - "redo": "Повторити", - "clearCanvas": "Очистити полотно", - "canvasSettings": "Налаштування полотна", - "showIntermediates": "Показувати процес", - "showGrid": "Показувати сiтку", - "snapToGrid": "Прив'язати до сітки", - "darkenOutsideSelection": "Затемнити полотно зовні", - "autoSaveToGallery": "Автозбереження до галереї", - "saveBoxRegionOnly": "Зберiгати тiльки видiлення", - "limitStrokesToBox": "Обмежити штрихи виділенням", - "showCanvasDebugInfo": "Показати дод. інформацію про полотно", - "clearCanvasHistory": "Очистити iсторiю полотна", - "clearHistory": "Очистити iсторiю", - "clearCanvasHistoryMessage": "Очищення історії полотна залишає поточне полотно незайманим, але видаляє історію скасування та повтору.", - "clearCanvasHistoryConfirm": "Ви впевнені, що хочете очистити історію полотна?", - "emptyTempImageFolder": "Очистити тимчасову папку", - "emptyFolder": "Очистити папку", - "emptyTempImagesFolderMessage": "Очищення папки тимчасових зображень також повністю скидає полотно, включаючи всю історію скасування/повтору, зображення та базовий шар полотна, що розміщуються.", - "emptyTempImagesFolderConfirm": "Ви впевнені, що хочете очистити тимчасову папку?", - "activeLayer": "Активний шар", - "canvasScale": "Масштаб полотна", - "boundingBox": "Обмежуюча рамка", - "scaledBoundingBox": "Масштабування рамки", - "boundingBoxPosition": "Позиція обмежуючої рамки", - "canvasDimensions": "Разміри полотна", - "canvasPosition": "Розташування полотна", - "cursorPosition": "Розташування курсора", - "previous": "Попереднє", - "next": "Наступне", - "accept": "Приняти", - "showHide": "Показати/Сховати", - "discardAll": "Відмінити все", - "betaClear": "Очистити", - "betaDarkenOutside": "Затемнити зовні", - "betaLimitToBox": "Обмежити виділенням", - "betaPreserveMasked": "Зберiгати замасковану область" - }, - "accessibility": { - "nextImage": "Наступне зображення", - "modelSelect": "Вибір моделі", - "invokeProgressBar": "Індикатор виконання", - "reset": "Скинути", - "uploadImage": "Завантажити зображення", - "useThisParameter": "Використовувати цей параметр", - "exitViewer": "Вийти з переглядача", - "zoomIn": "Збільшити", - "zoomOut": "Зменшити", - "rotateCounterClockwise": "Обертати проти годинникової стрілки", - "rotateClockwise": "Обертати за годинниковою стрілкою", - "toggleAutoscroll": "Увімкнути автопрокручування", - "toggleLogViewer": "Показати або приховати переглядач журналів", - "previousImage": "Попереднє зображення", - "copyMetadataJson": "Скопіювати метадані JSON", - "flipVertically": "Перевернути по вертикалі", - "flipHorizontally": "Відобразити по горизонталі", - "showOptionsPanel": "Показати опції", - "modifyConfig": "Змінити конфігурацію", - "menu": "Меню" - } -} diff --git a/invokeai/frontend/web/dist/locales/vi.json b/invokeai/frontend/web/dist/locales/vi.json deleted file mode 100644 index 0967ef424b..0000000000 --- a/invokeai/frontend/web/dist/locales/vi.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/invokeai/frontend/web/dist/locales/zh_CN.json b/invokeai/frontend/web/dist/locales/zh_CN.json deleted file mode 100644 index 130fdfb182..0000000000 --- a/invokeai/frontend/web/dist/locales/zh_CN.json +++ /dev/null @@ -1,1519 +0,0 @@ -{ - "common": { - "hotkeysLabel": "快捷键", - "languagePickerLabel": "语言", - "reportBugLabel": "反馈错误", - "settingsLabel": "设置", - "img2img": "图生图", - "unifiedCanvas": "统一画布", - "nodes": "工作流编辑器", - "langSimplifiedChinese": "简体中文", - "nodesDesc": "一个基于节点的图像生成系统目前正在开发中。请持续关注关于这一功能的更新。", - "postProcessing": "后期处理", - "postProcessDesc1": "Invoke AI 提供各种各样的后期处理功能。图像放大和面部修复在网页界面中已经可用。你可以从文生图和图生图页面的高级选项菜单中访问它们。你也可以直接使用图像显示上方或查看器中的图像操作按钮处理图像。", - "postProcessDesc2": "一个专门的界面将很快发布,新的界面能够处理更复杂的后期处理流程。", - "postProcessDesc3": "Invoke AI 命令行界面提供例如 Embiggen 的各种其他功能。", - "training": "训练", - "trainingDesc1": "一个专门用于从 Web UI 使用 Textual Inversion 和 Dreambooth 训练自己的 Embedding 和 checkpoint 的工作流。", - "trainingDesc2": "InvokeAI 已经支持使用主脚本中的 Textual Inversion 来训练自定义 embeddouring。", - "upload": "上传", - "close": "关闭", - "load": "加载", - "statusConnected": "已连接", - "statusDisconnected": "未连接", - "statusError": "错误", - "statusPreparing": "准备中", - "statusProcessingCanceled": "处理已取消", - "statusProcessingComplete": "处理完成", - "statusGenerating": "生成中", - "statusGeneratingTextToImage": "文生图生成中", - "statusGeneratingImageToImage": "图生图生成中", - "statusGeneratingInpainting": "(Inpainting) 内补生成中", - "statusGeneratingOutpainting": "(Outpainting) 外扩生成中", - "statusGenerationComplete": "生成完成", - "statusIterationComplete": "迭代完成", - "statusSavingImage": "图像保存中", - "statusRestoringFaces": "面部修复中", - "statusRestoringFacesGFPGAN": "面部修复中 (GFPGAN)", - "statusRestoringFacesCodeFormer": "面部修复中 (CodeFormer)", - "statusUpscaling": "放大中", - "statusUpscalingESRGAN": "放大中 (ESRGAN)", - "statusLoadingModel": "模型加载中", - "statusModelChanged": "模型已切换", - "accept": "同意", - "cancel": "取消", - "dontAskMeAgain": "不要再次询问", - "areYouSure": "你确认吗?", - "imagePrompt": "图片提示词", - "langKorean": "朝鲜语", - "langPortuguese": "葡萄牙语", - "random": "随机", - "generate": "生成", - "openInNewTab": "在新的标签页打开", - "langUkranian": "乌克兰语", - "back": "返回", - "statusMergedModels": "模型已合并", - "statusConvertingModel": "转换模型中", - "statusModelConverted": "模型转换完成", - "statusMergingModels": "合并模型", - "githubLabel": "GitHub", - "discordLabel": "Discord", - "langPolish": "波兰语", - "langBrPortuguese": "葡萄牙语(巴西)", - "langDutch": "荷兰语", - "langFrench": "法语", - "langRussian": "俄语", - "langGerman": "德语", - "langHebrew": "希伯来语", - "langItalian": "意大利语", - "langJapanese": "日语", - "langSpanish": "西班牙语", - "langEnglish": "英语", - "langArabic": "阿拉伯语", - "txt2img": "文生图", - "postprocessing": "后期处理", - "loading": "加载中", - "loadingInvokeAI": "Invoke AI 加载中", - "linear": "线性的", - "batch": "批次管理器", - "communityLabel": "社区", - "modelManager": "模型管理器", - "nodeEditor": "节点编辑器", - "statusProcessing": "处理中", - "imageFailedToLoad": "无法加载图像", - "lightMode": "浅色模式", - "learnMore": "了解更多", - "darkMode": "深色模式", - "advanced": "高级", - "t2iAdapter": "T2I Adapter", - "ipAdapter": "IP Adapter", - "controlAdapter": "Control Adapter", - "controlNet": "ControlNet", - "on": "开", - "auto": "自动" - }, - "gallery": { - "generations": "生成的图像", - "showGenerations": "显示生成的图像", - "uploads": "上传的图像", - "showUploads": "显示上传的图像", - "galleryImageSize": "预览大小", - "galleryImageResetSize": "重置预览大小", - "gallerySettings": "预览设置", - "maintainAspectRatio": "保持纵横比", - "autoSwitchNewImages": "自动切换到新图像", - "singleColumnLayout": "单列布局", - "allImagesLoaded": "所有图像已加载", - "loadMore": "加载更多", - "noImagesInGallery": "无图像可用于显示", - "deleteImage": "删除图片", - "deleteImageBin": "被删除的图片会发送到你操作系统的回收站。", - "deleteImagePermanent": "删除的图片无法被恢复。", - "images": "图片", - "assets": "素材", - "autoAssignBoardOnClick": "点击后自动分配面板", - "featuresWillReset": "如果您删除该图像,这些功能会立即被重置。", - "loading": "加载中", - "unableToLoad": "无法加载图库", - "currentlyInUse": "该图像目前在以下功能中使用:", - "copy": "复制", - "download": "下载", - "setCurrentImage": "设为当前图像", - "preparingDownload": "准备下载", - "preparingDownloadFailed": "准备下载时出现问题", - "downloadSelection": "下载所选内容" - }, - "hotkeys": { - "keyboardShortcuts": "键盘快捷键", - "appHotkeys": "应用快捷键", - "generalHotkeys": "一般快捷键", - "galleryHotkeys": "图库快捷键", - "unifiedCanvasHotkeys": "统一画布快捷键", - "invoke": { - "title": "Invoke", - "desc": "生成图像" - }, - "cancel": { - "title": "取消", - "desc": "取消图像生成" - }, - "focusPrompt": { - "title": "打开提示词框", - "desc": "打开提示词文本框" - }, - "toggleOptions": { - "title": "切换选项卡", - "desc": "打开或关闭选项浮窗" - }, - "pinOptions": { - "title": "常开选项卡", - "desc": "保持选项浮窗常开" - }, - "toggleViewer": { - "title": "切换图像查看器", - "desc": "打开或关闭图像查看器" - }, - "toggleGallery": { - "title": "切换图库", - "desc": "打开或关闭图库" - }, - "maximizeWorkSpace": { - "title": "工作区最大化", - "desc": "关闭所有浮窗,将工作区域最大化" - }, - "changeTabs": { - "title": "切换选项卡", - "desc": "切换到另一个工作区" - }, - "consoleToggle": { - "title": "切换命令行", - "desc": "打开或关闭命令行" - }, - "setPrompt": { - "title": "使用当前提示词", - "desc": "使用当前图像的提示词" - }, - "setSeed": { - "title": "使用种子", - "desc": "使用当前图像的种子" - }, - "setParameters": { - "title": "使用当前参数", - "desc": "使用当前图像的所有参数" - }, - "restoreFaces": { - "title": "面部修复", - "desc": "对当前图像进行面部修复" - }, - "upscale": { - "title": "放大", - "desc": "对当前图像进行放大" - }, - "showInfo": { - "title": "显示信息", - "desc": "显示当前图像的元数据" - }, - "sendToImageToImage": { - "title": "发送到图生图", - "desc": "发送当前图像到图生图" - }, - "deleteImage": { - "title": "删除图像", - "desc": "删除当前图像" - }, - "closePanels": { - "title": "关闭浮窗", - "desc": "关闭目前打开的浮窗" - }, - "previousImage": { - "title": "上一张图像", - "desc": "显示图库中的上一张图像" - }, - "nextImage": { - "title": "下一张图像", - "desc": "显示图库中的下一张图像" - }, - "toggleGalleryPin": { - "title": "切换图库常开", - "desc": "开关图库在界面中的常开模式" - }, - "increaseGalleryThumbSize": { - "title": "增大预览尺寸", - "desc": "增大图库中预览的尺寸" - }, - "decreaseGalleryThumbSize": { - "title": "缩小预览尺寸", - "desc": "缩小图库中预览的尺寸" - }, - "selectBrush": { - "title": "选择刷子", - "desc": "选择统一画布上的刷子" - }, - "selectEraser": { - "title": "选择橡皮擦", - "desc": "选择统一画布上的橡皮擦" - }, - "decreaseBrushSize": { - "title": "减小刷子大小", - "desc": "减小统一画布上的刷子或橡皮擦的大小" - }, - "increaseBrushSize": { - "title": "增大刷子大小", - "desc": "增大统一画布上的刷子或橡皮擦的大小" - }, - "decreaseBrushOpacity": { - "title": "减小刷子不透明度", - "desc": "减小统一画布上的刷子的不透明度" - }, - "increaseBrushOpacity": { - "title": "增大刷子不透明度", - "desc": "增大统一画布上的刷子的不透明度" - }, - "moveTool": { - "title": "移动工具", - "desc": "画布允许导航" - }, - "fillBoundingBox": { - "title": "填充选择区域", - "desc": "在选择区域中填充刷子颜色" - }, - "eraseBoundingBox": { - "title": "擦除选择框", - "desc": "将选择区域擦除" - }, - "colorPicker": { - "title": "选择颜色拾取工具", - "desc": "选择画布颜色拾取工具" - }, - "toggleSnap": { - "title": "切换网格对齐", - "desc": "打开或关闭网格对齐" - }, - "quickToggleMove": { - "title": "快速切换移动模式", - "desc": "临时性地切换移动模式" - }, - "toggleLayer": { - "title": "切换图层", - "desc": "切换遮罩/基础层的选择" - }, - "clearMask": { - "title": "清除遮罩", - "desc": "清除整个遮罩" - }, - "hideMask": { - "title": "隐藏遮罩", - "desc": "隐藏或显示遮罩" - }, - "showHideBoundingBox": { - "title": "显示/隐藏框选区", - "desc": "切换框选区的的显示状态" - }, - "mergeVisible": { - "title": "合并可见层", - "desc": "将画板上可见层合并" - }, - "saveToGallery": { - "title": "保存至图库", - "desc": "将画布当前内容保存至图库" - }, - "copyToClipboard": { - "title": "复制到剪贴板", - "desc": "将画板当前内容复制到剪贴板" - }, - "downloadImage": { - "title": "下载图像", - "desc": "下载画板当前内容" - }, - "undoStroke": { - "title": "撤销画笔", - "desc": "撤销上一笔刷子的动作" - }, - "redoStroke": { - "title": "重做画笔", - "desc": "重做上一笔刷子的动作" - }, - "resetView": { - "title": "重置视图", - "desc": "重置画布视图" - }, - "previousStagingImage": { - "title": "上一张暂存图像", - "desc": "上一张暂存区中的图像" - }, - "nextStagingImage": { - "title": "下一张暂存图像", - "desc": "下一张暂存区中的图像" - }, - "acceptStagingImage": { - "title": "接受暂存图像", - "desc": "接受当前暂存区中的图像" - }, - "nodesHotkeys": "节点快捷键", - "addNodes": { - "title": "添加节点", - "desc": "打开添加节点菜单" - } - }, - "modelManager": { - "modelManager": "模型管理器", - "model": "模型", - "modelAdded": "已添加模型", - "modelUpdated": "模型已更新", - "modelEntryDeleted": "模型已删除", - "cannotUseSpaces": "不能使用空格", - "addNew": "添加", - "addNewModel": "添加新模型", - "addManually": "手动添加", - "manual": "手动", - "name": "名称", - "nameValidationMsg": "输入模型的名称", - "description": "描述", - "descriptionValidationMsg": "添加模型的描述", - "config": "配置", - "configValidationMsg": "模型配置文件的路径。", - "modelLocation": "模型位置", - "modelLocationValidationMsg": "提供 Diffusers 模型文件的本地存储路径", - "vaeLocation": "VAE 位置", - "vaeLocationValidationMsg": "VAE 文件的路径。", - "width": "宽度", - "widthValidationMsg": "模型的默认宽度。", - "height": "高度", - "heightValidationMsg": "模型的默认高度。", - "addModel": "添加模型", - "updateModel": "更新模型", - "availableModels": "可用模型", - "search": "检索", - "load": "加载", - "active": "活跃", - "notLoaded": "未加载", - "cached": "缓存", - "checkpointFolder": "模型检查点文件夹", - "clearCheckpointFolder": "清除 Checkpoint 模型文件夹", - "findModels": "寻找模型", - "modelsFound": "找到的模型", - "selectFolder": "选择文件夹", - "selected": "已选择", - "selectAll": "全选", - "deselectAll": "取消选择所有", - "showExisting": "显示已存在", - "addSelected": "添加选择", - "modelExists": "模型已存在", - "delete": "删除", - "deleteModel": "删除模型", - "deleteConfig": "删除配置", - "deleteMsg1": "您确定要将该模型从 InvokeAI 删除吗?", - "deleteMsg2": "磁盘中放置在 InvokeAI 根文件夹的 checkpoint 文件会被删除。若你正在使用自定义目录,则不会从磁盘中删除他们。", - "convertToDiffusersHelpText1": "模型会被转换成 🧨 Diffusers 格式。", - "convertToDiffusersHelpText2": "这个过程会替换你的模型管理器的入口中相同 Diffusers 版本的模型。", - "mergedModelSaveLocation": "保存路径", - "mergedModelCustomSaveLocation": "自定义路径", - "checkpointModels": "Checkpoints", - "formMessageDiffusersVAELocation": "VAE 路径", - "convertToDiffusersHelpText4": "这是一次性的处理过程。根据你电脑的配置不同耗时 30 - 60 秒。", - "convertToDiffusersHelpText6": "你希望转换这个模型吗?", - "interpolationType": "插值类型", - "modelTwo": "模型 2", - "modelThree": "模型 3", - "v2_768": "v2 (768px)", - "mergedModelName": "合并的模型名称", - "allModels": "全部模型", - "convertToDiffusers": "转换为 Diffusers", - "formMessageDiffusersModelLocation": "Diffusers 模型路径", - "custom": "自定义", - "formMessageDiffusersVAELocationDesc": "如果没有特别指定,InvokeAI 会从上面指定的模型路径中寻找 VAE 文件。", - "safetensorModels": "SafeTensors", - "modelsMerged": "模型合并完成", - "mergeModels": "合并模型", - "modelOne": "模型 1", - "diffusersModels": "Diffusers", - "scanForModels": "扫描模型", - "repo_id": "项目 ID", - "repoIDValidationMsg": "你的模型的在线项目地址", - "v1": "v1", - "invokeRoot": "InvokeAI 文件夹", - "inpainting": "v1 Inpainting", - "customSaveLocation": "自定义保存路径", - "scanAgain": "重新扫描", - "customConfig": "个性化配置", - "pathToCustomConfig": "个性化配置路径", - "modelConverted": "模型已转换", - "statusConverting": "转换中", - "sameFolder": "相同文件夹", - "invokeAIFolder": "Invoke AI 文件夹", - "ignoreMismatch": "忽略所选模型之间的不匹配", - "modelMergeHeaderHelp1": "您可以合并最多三种不同的模型,以创建符合您需求的混合模型。", - "modelMergeHeaderHelp2": "只有扩散器(Diffusers)可以用于模型合并。如果您想要合并一个检查点模型,请先将其转换为扩散器。", - "addCheckpointModel": "添加 Checkpoint / Safetensor 模型", - "addDiffuserModel": "添加 Diffusers 模型", - "vaeRepoID": "VAE 项目 ID", - "vaeRepoIDValidationMsg": "VAE 模型在线仓库地址", - "selectAndAdd": "选择下表中的模型并添加", - "noModelsFound": "未有找到模型", - "formMessageDiffusersModelLocationDesc": "请至少输入一个。", - "convertToDiffusersSaveLocation": "保存路径", - "convertToDiffusersHelpText3": "磁盘中放置在 InvokeAI 根文件夹的 checkpoint 文件会被删除. 若位于自定义目录, 则不会受影响.", - "v2_base": "v2 (512px)", - "convertToDiffusersHelpText5": "请确认你有足够的磁盘空间,模型大小通常在 2 GB - 7 GB 之间。", - "convert": "转换", - "merge": "合并", - "pickModelType": "选择模型类型", - "addDifference": "增加差异", - "none": "无", - "inverseSigmoid": "反 Sigmoid 函数", - "weightedSum": "加权求和", - "modelMergeAlphaHelp": "Alpha 参数控制模型的混合强度。较低的 Alpha 值会导致第二个模型的影响减弱。", - "sigmoid": "Sigmoid 函数", - "modelMergeInterpAddDifferenceHelp": "在这种模式下,首先从模型 2 中减去模型 3,得到的版本再用上述的 Alpha 值与模型1进行混合。", - "modelsSynced": "模型已同步", - "modelSyncFailed": "模型同步失败", - "modelDeleteFailed": "模型删除失败", - "syncModelsDesc": "如果您的模型与后端不同步,您可以使用此选项刷新它们。便于您在应用程序启动的情况下手动更新 models.yaml 文件或将模型添加到 InvokeAI 根文件夹。", - "selectModel": "选择模型", - "importModels": "导入模型", - "settings": "设置", - "syncModels": "同步模型", - "noCustomLocationProvided": "未提供自定义路径", - "modelDeleted": "模型已删除", - "modelUpdateFailed": "模型更新失败", - "modelConversionFailed": "模型转换失败", - "modelsMergeFailed": "模型融合失败", - "baseModel": "基底模型", - "convertingModelBegin": "模型转换中. 请稍候.", - "noModels": "未找到模型", - "predictionType": "预测类型(适用于 Stable Diffusion 2.x 模型和部分 Stable Diffusion 1.x 模型)", - "quickAdd": "快速添加", - "simpleModelDesc": "提供一个指向本地 Diffusers 模型的路径,本地 checkpoint / safetensors 模型或一个HuggingFace 项目 ID,又或者一个 checkpoint/diffusers 模型链接。", - "advanced": "高级", - "useCustomConfig": "使用自定义配置", - "closeAdvanced": "关闭高级", - "modelType": "模型类别", - "customConfigFileLocation": "自定义配置文件目录", - "variant": "变体", - "onnxModels": "Onnx", - "vae": "VAE", - "oliveModels": "Olive", - "loraModels": "LoRA", - "alpha": "Alpha", - "vaePrecision": "VAE 精度" - }, - "parameters": { - "images": "图像", - "steps": "步数", - "cfgScale": "CFG 等级", - "width": "宽度", - "height": "高度", - "seed": "种子", - "randomizeSeed": "随机化种子", - "shuffle": "随机生成种子", - "noiseThreshold": "噪声阈值", - "perlinNoise": "Perlin 噪声", - "variations": "变种", - "variationAmount": "变种数量", - "seedWeights": "种子权重", - "faceRestoration": "面部修复", - "restoreFaces": "修复面部", - "type": "种类", - "strength": "强度", - "upscaling": "放大", - "upscale": "放大 (Shift + U)", - "upscaleImage": "放大图像", - "scale": "等级", - "otherOptions": "其他选项", - "seamlessTiling": "无缝拼贴", - "hiresOptim": "高分辨率优化", - "imageFit": "使生成图像长宽适配初始图像", - "codeformerFidelity": "保真度", - "scaleBeforeProcessing": "处理前缩放", - "scaledWidth": "缩放宽度", - "scaledHeight": "缩放长度", - "infillMethod": "填充方法", - "tileSize": "方格尺寸", - "boundingBoxHeader": "选择区域", - "seamCorrectionHeader": "接缝修正", - "infillScalingHeader": "内填充和缩放", - "img2imgStrength": "图生图强度", - "toggleLoopback": "切换环回", - "sendTo": "发送到", - "sendToImg2Img": "发送到图生图", - "sendToUnifiedCanvas": "发送到统一画布", - "copyImageToLink": "复制图像链接", - "downloadImage": "下载图像", - "openInViewer": "在查看器中打开", - "closeViewer": "关闭查看器", - "usePrompt": "使用提示", - "useSeed": "使用种子", - "useAll": "使用所有参数", - "useInitImg": "使用初始图像", - "info": "信息", - "initialImage": "初始图像", - "showOptionsPanel": "显示侧栏浮窗 (O 或 T)", - "seamlessYAxis": "Y 轴", - "seamlessXAxis": "X 轴", - "boundingBoxWidth": "边界框宽度", - "boundingBoxHeight": "边界框高度", - "denoisingStrength": "去噪强度", - "vSymmetryStep": "纵向对称步数", - "cancel": { - "immediate": "立即取消", - "isScheduled": "取消中", - "schedule": "当前迭代后取消", - "setType": "设定取消类型", - "cancel": "取消" - }, - "copyImage": "复制图片", - "showPreview": "显示预览", - "symmetry": "对称性", - "positivePromptPlaceholder": "正向提示词", - "negativePromptPlaceholder": "负向提示词", - "scheduler": "调度器", - "general": "通用", - "hiresStrength": "高分辨强度", - "hidePreview": "隐藏预览", - "hSymmetryStep": "横向对称步数", - "imageToImage": "图生图", - "noiseSettings": "噪音", - "controlNetControlMode": "控制模式", - "maskAdjustmentsHeader": "遮罩调整", - "maskBlur": "模糊", - "maskBlurMethod": "模糊方式", - "aspectRatio": "纵横比", - "seamLowThreshold": "降低", - "seamHighThreshold": "提升", - "invoke": { - "noNodesInGraph": "节点图中无节点", - "noModelSelected": "无已选中的模型", - "invoke": "调用", - "systemBusy": "系统繁忙", - "noInitialImageSelected": "无选中的初始图像", - "missingInputForField": "{{nodeLabel}} -> {{fieldLabel}} 缺失输入", - "unableToInvoke": "无法调用", - "systemDisconnected": "系统已断开连接", - "missingNodeTemplate": "缺失节点模板", - "missingFieldTemplate": "缺失模板", - "addingImagesTo": "添加图像到", - "noPrompts": "没有已生成的提示词", - "readyToInvoke": "准备调用", - "noControlImageForControlAdapter": "有 #{{number}} 个 Control Adapter 缺失控制图像", - "noModelForControlAdapter": "有 #{{number}} 个 Control Adapter 没有选择模型。", - "incompatibleBaseModelForControlAdapter": "有 #{{number}} 个 Control Adapter 模型与主模型不匹配。" - }, - "patchmatchDownScaleSize": "缩小", - "coherenceSteps": "步数", - "clipSkip": "CLIP 跳过层", - "compositingSettingsHeader": "合成设置", - "useCpuNoise": "使用 CPU 噪声", - "coherenceStrength": "强度", - "enableNoiseSettings": "启用噪声设置", - "coherenceMode": "模式", - "cpuNoise": "CPU 噪声", - "gpuNoise": "GPU 噪声", - "clipSkipWithLayerCount": "CLIP 跳过 {{layerCount}} 层", - "coherencePassHeader": "一致性层", - "manualSeed": "手动设定种子", - "imageActions": "图像操作", - "randomSeed": "随机种子", - "iterations": "迭代数", - "isAllowedToUpscale": { - "useX2Model": "图像太大,无法使用 x4 模型,使用 x2 模型作为替代", - "tooLarge": "图像太大无法进行放大,请选择更小的图像" - }, - "iterationsWithCount_other": "{{count}} 次迭代生成", - "seamlessX&Y": "无缝 X & Y", - "aspectRatioFree": "自由", - "seamlessX": "无缝 X", - "seamlessY": "无缝 Y" - }, - "settings": { - "models": "模型", - "displayInProgress": "显示处理中的图像", - "saveSteps": "每n步保存图像", - "confirmOnDelete": "删除时确认", - "displayHelpIcons": "显示帮助按钮", - "enableImageDebugging": "开启图像调试", - "resetWebUI": "重置网页界面", - "resetWebUIDesc1": "重置网页只会重置浏览器中缓存的图像和设置,不会删除任何图像。", - "resetWebUIDesc2": "如果图像没有显示在图库中,或者其他东西不工作,请在GitHub上提交问题之前尝试重置。", - "resetComplete": "网页界面已重置。", - "showProgressInViewer": "在查看器中展示过程图片", - "antialiasProgressImages": "对过程图像应用抗锯齿", - "generation": "生成", - "ui": "用户界面", - "useSlidersForAll": "对所有参数使用滑动条设置", - "general": "通用", - "consoleLogLevel": "日志等级", - "shouldLogToConsole": "终端日志", - "developer": "开发者", - "alternateCanvasLayout": "切换统一画布布局", - "enableNodesEditor": "启用节点编辑器", - "favoriteSchedulersPlaceholder": "没有偏好的采样算法", - "showAdvancedOptions": "显示进阶选项", - "favoriteSchedulers": "采样算法偏好", - "autoChangeDimensions": "更改时将宽/高更新为模型默认值", - "experimental": "实验性", - "beta": "Beta", - "clearIntermediates": "清除中间产物", - "clearIntermediatesDesc3": "您图库中的图像不会被删除。", - "clearIntermediatesDesc2": "中间产物图像是生成过程中产生的副产品,与图库中的结果图像不同。清除中间产物可释放磁盘空间。", - "intermediatesCleared_other": "已清除 {{count}} 个中间产物", - "clearIntermediatesDesc1": "清除中间产物会重置您的画布和 ControlNet 状态。", - "intermediatesClearedFailed": "清除中间产物时出现问题", - "clearIntermediatesWithCount_other": "清除 {{count}} 个中间产物", - "clearIntermediatesDisabled": "队列为空才能清理中间产物" - }, - "toast": { - "tempFoldersEmptied": "临时文件夹已清空", - "uploadFailed": "上传失败", - "uploadFailedUnableToLoadDesc": "无法加载文件", - "downloadImageStarted": "图像已开始下载", - "imageCopied": "图像已复制", - "imageLinkCopied": "图像链接已复制", - "imageNotLoaded": "没有加载图像", - "imageNotLoadedDesc": "找不到图片", - "imageSavedToGallery": "图像已保存到图库", - "canvasMerged": "画布已合并", - "sentToImageToImage": "已发送到图生图", - "sentToUnifiedCanvas": "已发送到统一画布", - "parametersSet": "参数已设定", - "parametersNotSet": "参数未设定", - "parametersNotSetDesc": "此图像不存在元数据。", - "parametersFailed": "加载参数失败", - "parametersFailedDesc": "加载初始图像失败。", - "seedSet": "种子已设定", - "seedNotSet": "种子未设定", - "seedNotSetDesc": "无法找到该图像的种子。", - "promptSet": "提示词已设定", - "promptNotSet": "提示词未设定", - "promptNotSetDesc": "无法找到该图像的提示词。", - "upscalingFailed": "放大失败", - "faceRestoreFailed": "面部修复失败", - "metadataLoadFailed": "加载元数据失败", - "initialImageSet": "初始图像已设定", - "initialImageNotSet": "初始图像未设定", - "initialImageNotSetDesc": "无法加载初始图像", - "problemCopyingImageLink": "无法复制图片链接", - "uploadFailedInvalidUploadDesc": "必须是单张的 PNG 或 JPEG 图片", - "disconnected": "服务器断开", - "connected": "服务器连接", - "parameterSet": "参数已设定", - "parameterNotSet": "参数未设定", - "serverError": "服务器错误", - "canceled": "处理取消", - "nodesLoaded": "节点已加载", - "nodesSaved": "节点已保存", - "problemCopyingImage": "无法复制图像", - "nodesCorruptedGraph": "无法加载。节点图似乎已损坏。", - "nodesBrokenConnections": "无法加载。部分连接已断开。", - "nodesUnrecognizedTypes": "无法加载。节点图有无法识别的节点类型", - "nodesNotValidJSON": "无效的 JSON", - "nodesNotValidGraph": "无效的 InvokeAi 节点图", - "nodesCleared": "节点已清空", - "nodesLoadedFailed": "节点图加载失败", - "modelAddedSimple": "已添加模型", - "modelAdded": "已添加模型: {{modelName}}", - "imageSavingFailed": "图像保存失败", - "canvasSentControlnetAssets": "画布已发送到 ControlNet & 素材", - "problemCopyingCanvasDesc": "无法导出基础层", - "loadedWithWarnings": "已加载带有警告的工作流", - "setInitialImage": "设为初始图像", - "canvasCopiedClipboard": "画布已复制到剪贴板", - "setControlImage": "设为控制图像", - "setNodeField": "设为节点字段", - "problemSavingMask": "保存遮罩时出现问题", - "problemSavingCanvasDesc": "无法导出基础层", - "maskSavedAssets": "遮罩已保存到素材", - "modelAddFailed": "模型添加失败", - "problemDownloadingCanvas": "下载画布时出现问题", - "problemMergingCanvas": "合并画布时出现问题", - "setCanvasInitialImage": "设为画布初始图像", - "imageUploaded": "图像已上传", - "addedToBoard": "已添加到面板", - "workflowLoaded": "工作流已加载", - "problemImportingMaskDesc": "无法导出遮罩", - "problemCopyingCanvas": "复制画布时出现问题", - "problemSavingCanvas": "保存画布时出现问题", - "canvasDownloaded": "画布已下载", - "setIPAdapterImage": "设为 IP Adapter 图像", - "problemMergingCanvasDesc": "无法导出基础层", - "problemDownloadingCanvasDesc": "无法导出基础层", - "problemSavingMaskDesc": "无法导出遮罩", - "imageSaved": "图像已保存", - "maskSentControlnetAssets": "遮罩已发送到 ControlNet & 素材", - "canvasSavedGallery": "画布已保存到图库", - "imageUploadFailed": "图像上传失败", - "problemImportingMask": "导入遮罩时出现问题", - "baseModelChangedCleared_other": "基础模型已更改, 已清除或禁用 {{count}} 个不兼容的子模型" - }, - "unifiedCanvas": { - "layer": "图层", - "base": "基础层", - "mask": "遮罩", - "maskingOptions": "遮罩选项", - "enableMask": "启用遮罩", - "preserveMaskedArea": "保留遮罩区域", - "clearMask": "清除遮罩", - "brush": "刷子", - "eraser": "橡皮擦", - "fillBoundingBox": "填充选择区域", - "eraseBoundingBox": "取消选择区域", - "colorPicker": "颜色提取", - "brushOptions": "刷子选项", - "brushSize": "大小", - "move": "移动", - "resetView": "重置视图", - "mergeVisible": "合并可见层", - "saveToGallery": "保存至图库", - "copyToClipboard": "复制到剪贴板", - "downloadAsImage": "下载图像", - "undo": "撤销", - "redo": "重做", - "clearCanvas": "清除画布", - "canvasSettings": "画布设置", - "showIntermediates": "显示中间产物", - "showGrid": "显示网格", - "snapToGrid": "切换网格对齐", - "darkenOutsideSelection": "暗化外部区域", - "autoSaveToGallery": "自动保存至图库", - "saveBoxRegionOnly": "只保存框内区域", - "limitStrokesToBox": "限制画笔在框内", - "showCanvasDebugInfo": "显示附加画布信息", - "clearCanvasHistory": "清除画布历史", - "clearHistory": "清除历史", - "clearCanvasHistoryMessage": "清除画布历史不会影响当前画布,但会不可撤销地清除所有撤销/重做历史。", - "clearCanvasHistoryConfirm": "确认清除所有画布历史?", - "emptyTempImageFolder": "清除临时文件夹", - "emptyFolder": "清除文件夹", - "emptyTempImagesFolderMessage": "清空临时图像文件夹会完全重置统一画布。这包括所有的撤销/重做历史、暂存区的图像和画布基础层。", - "emptyTempImagesFolderConfirm": "确认清除临时文件夹?", - "activeLayer": "活跃图层", - "canvasScale": "画布缩放", - "boundingBox": "选择区域", - "scaledBoundingBox": "缩放选择区域", - "boundingBoxPosition": "选择区域位置", - "canvasDimensions": "画布长宽", - "canvasPosition": "画布位置", - "cursorPosition": "光标位置", - "previous": "上一张", - "next": "下一张", - "accept": "接受", - "showHide": "显示 / 隐藏", - "discardAll": "放弃所有", - "betaClear": "清除", - "betaDarkenOutside": "暗化外部区域", - "betaLimitToBox": "限制在框内", - "betaPreserveMasked": "保留遮罩层", - "antialiasing": "抗锯齿", - "showResultsOn": "显示结果 (开)", - "showResultsOff": "显示结果 (关)" - }, - "accessibility": { - "modelSelect": "模型选择", - "invokeProgressBar": "Invoke 进度条", - "reset": "重置", - "nextImage": "下一张图片", - "useThisParameter": "使用此参数", - "uploadImage": "上传图片", - "previousImage": "上一张图片", - "copyMetadataJson": "复制 JSON 元数据", - "exitViewer": "退出查看器", - "zoomIn": "放大", - "zoomOut": "缩小", - "rotateCounterClockwise": "逆时针旋转", - "rotateClockwise": "顺时针旋转", - "flipHorizontally": "水平翻转", - "flipVertically": "垂直翻转", - "showOptionsPanel": "显示侧栏浮窗", - "toggleLogViewer": "切换日志查看器", - "modifyConfig": "修改配置", - "toggleAutoscroll": "切换自动缩放", - "menu": "菜单", - "showGalleryPanel": "显示图库浮窗", - "loadMore": "加载更多" - }, - "ui": { - "showProgressImages": "显示处理中的图片", - "hideProgressImages": "隐藏处理中的图片", - "swapSizes": "XY 尺寸互换", - "lockRatio": "锁定纵横比" - }, - "tooltip": { - "feature": { - "prompt": "这是提示词区域。提示词包括生成对象和风格术语。您也可以在提示词中添加权重(Token 的重要性),但命令行命令和参数不起作用。", - "imageToImage": "图生图模式加载任何图像作为初始图像,然后与提示词一起用于生成新图像。值越高,结果图像的变化就越大。可能的值为 0.0 到 1.0,建议的范围是 0.25 到 0.75", - "upscale": "使用 ESRGAN 可以在图片生成后立即放大图片。", - "variations": "尝试将变化值设置在 0.1 到 1.0 之间,以更改给定种子的结果。种子的变化在 0.1 到 0.3 之间会很有趣。", - "boundingBox": "边界框的高和宽的设定对文生图和图生图模式是一样的,只有边界框中的区域会被处理。", - "other": "这些选项将为 Invoke 启用替代处理模式。 \"无缝拼贴\" 将在输出中创建重复图案。\"高分辨率\" 是通过图生图进行两步生成:当您想要更大、更连贯且不带伪影的图像时,请使用此设置。这将比通常的文生图需要更长的时间。", - "faceCorrection": "使用 GFPGAN 或 Codeformer 进行人脸校正:该算法会检测图像中的人脸并纠正任何缺陷。较高的值将更改图像,并产生更有吸引力的人脸。在保留较高保真度的情况下使用 Codeformer 将导致更强的人脸校正,同时也会保留原始图像。", - "gallery": "图片库展示输出文件夹中的图片,设置和文件一起储存,可以通过内容菜单访问。", - "seed": "种子值影响形成图像的初始噪声。您可以使用以前图像中已存在的种子。 “噪声阈值”用于减轻在高 CFG 等级(尝试 0 - 10 范围)下的伪像,并使用 Perlin 在生成过程中添加 Perlin 噪声:这两者都可以为您的输出添加变化。", - "seamCorrection": "控制在画布上生成的图像之间出现的可见接缝的处理方式。", - "infillAndScaling": "管理填充方法(用于画布的遮罩或擦除区域)和缩放(对于较小的边界框大小非常有用)。" - } - }, - "nodes": { - "zoomInNodes": "放大", - "resetWorkflowDesc": "是否确定要清空节点图?", - "resetWorkflow": "清空节点图", - "loadWorkflow": "读取节点图", - "zoomOutNodes": "缩小", - "resetWorkflowDesc2": "重置节点图将清除所有节点、边际和节点图详情.", - "reloadNodeTemplates": "重载节点模板", - "hideGraphNodes": "隐藏节点图信息", - "fitViewportNodes": "自适应视图", - "showMinimapnodes": "显示缩略图", - "hideMinimapnodes": "隐藏缩略图", - "showLegendNodes": "显示字段类型图例", - "hideLegendNodes": "隐藏字段类型图例", - "showGraphNodes": "显示节点图信息", - "downloadWorkflow": "下载节点图 JSON", - "workflowDescription": "简述", - "versionUnknown": " 未知版本", - "noNodeSelected": "无选中的节点", - "addNode": "添加节点", - "unableToValidateWorkflow": "无法验证工作流", - "noOutputRecorded": "无已记录输出", - "updateApp": "升级 App", - "colorCodeEdgesHelp": "根据连接区域对边缘编码颜色", - "workflowContact": "联系", - "animatedEdges": "边缘动效", - "nodeTemplate": "节点模板", - "pickOne": "选择一个", - "unableToLoadWorkflow": "无法验证工作流", - "snapToGrid": "对齐网格", - "noFieldsLinearview": "线性视图中未添加任何字段", - "nodeSearch": "检索节点", - "version": "版本", - "validateConnections": "验证连接和节点图", - "inputMayOnlyHaveOneConnection": "输入仅能有一个连接", - "notes": "注释", - "nodeOutputs": "节点输出", - "currentImageDescription": "在节点编辑器中显示当前图像", - "validateConnectionsHelp": "防止建立无效连接和调用无效节点图", - "problemSettingTitle": "设定标题时出现问题", - "noConnectionInProgress": "没有正在进行的连接", - "workflowVersion": "版本", - "noConnectionData": "无连接数据", - "fieldTypesMustMatch": "类型必须匹配", - "workflow": "工作流", - "unkownInvocation": "未知调用类型", - "animatedEdgesHelp": "为选中边缘和其连接的选中节点的边缘添加动画", - "unknownTemplate": "未知模板", - "removeLinearView": "从线性视图中移除", - "workflowTags": "标签", - "fullyContainNodesHelp": "节点必须完全位于选择框中才能被选中", - "workflowValidation": "工作流验证错误", - "noMatchingNodes": "无相匹配的节点", - "executionStateInProgress": "处理中", - "noFieldType": "无字段类型", - "executionStateError": "错误", - "executionStateCompleted": "已完成", - "workflowAuthor": "作者", - "currentImage": "当前图像", - "workflowName": "名称", - "cannotConnectInputToInput": "无法将输入连接到输入", - "workflowNotes": "注释", - "cannotConnectOutputToOutput": "无法将输出连接到输出", - "connectionWouldCreateCycle": "连接将创建一个循环", - "cannotConnectToSelf": "无法连接自己", - "notesDescription": "添加有关您的工作流的注释", - "unknownField": "未知", - "colorCodeEdges": "边缘颜色编码", - "unknownNode": "未知节点", - "addNodeToolTip": "添加节点 (Shift+A, Space)", - "loadingNodes": "加载节点中...", - "snapToGridHelp": "移动时将节点与网格对齐", - "workflowSettings": "工作流编辑器设置", - "booleanPolymorphicDescription": "一个布尔值合集。", - "scheduler": "调度器", - "inputField": "输入", - "controlFieldDescription": "节点间传递的控制信息。", - "skippingUnknownOutputType": "跳过未知类型的输出", - "latentsFieldDescription": "Latents 可以在节点间传递。", - "denoiseMaskFieldDescription": "去噪遮罩可以在节点间传递", - "missingTemplate": "缺失模板", - "outputSchemaNotFound": "未找到输出模式", - "latentsPolymorphicDescription": "Latents 可以在节点间传递。", - "colorFieldDescription": "一种 RGBA 颜色。", - "mainModelField": "模型", - "unhandledInputProperty": "未处理的输入属性", - "maybeIncompatible": "可能与已安装的不兼容", - "collectionDescription": "待办事项", - "skippingReservedFieldType": "跳过保留类型", - "booleanCollectionDescription": "一个布尔值合集。", - "sDXLMainModelFieldDescription": "SDXL 模型。", - "boardField": "面板", - "problemReadingWorkflow": "从图像读取工作流时出现问题", - "sourceNode": "源节点", - "nodeOpacity": "节点不透明度", - "collectionItemDescription": "待办事项", - "integerDescription": "整数是没有与小数点的数字。", - "outputField": "输出", - "skipped": "跳过", - "updateNode": "更新节点", - "sDXLRefinerModelFieldDescription": "待办事项", - "imagePolymorphicDescription": "一个图像合集。", - "doesNotExist": "不存在", - "unableToParseNode": "无法解析节点", - "controlCollection": "控制合集", - "collectionItem": "项目合集", - "controlCollectionDescription": "节点间传递的控制信息。", - "skippedReservedInput": "跳过保留的输入", - "outputFields": "输出", - "edge": "边缘", - "inputNode": "输入节点", - "enumDescription": "枚举 (Enums) 可能是多个选项的一个数值。", - "loRAModelFieldDescription": "待办事项", - "imageField": "图像", - "skippedReservedOutput": "跳过保留的输出", - "noWorkflow": "无工作流", - "colorCollectionDescription": "待办事项", - "colorPolymorphicDescription": "一个颜色合集。", - "sDXLMainModelField": "SDXL 模型", - "denoiseMaskField": "去噪遮罩", - "schedulerDescription": "待办事项", - "missingCanvaInitImage": "缺失画布初始图像", - "clipFieldDescription": "词元分析器和文本编码器的子模型。", - "noImageFoundState": "状态中未发现初始图像", - "nodeType": "节点类型", - "fullyContainNodes": "完全包含节点来进行选择", - "noOutputSchemaName": "在 ref 对象中找不到输出模式名称", - "vaeModelFieldDescription": "待办事项", - "skippingInputNoTemplate": "跳过无模板的输入", - "missingCanvaInitMaskImages": "缺失初始化画布和遮罩图像", - "problemReadingMetadata": "从图像读取元数据时出现问题", - "oNNXModelField": "ONNX 模型", - "node": "节点", - "skippingUnknownInputType": "跳过未知类型的输入", - "booleanDescription": "布尔值为真或为假。", - "collection": "合集", - "invalidOutputSchema": "无效的输出模式", - "boardFieldDescription": "图库面板", - "floatDescription": "浮点数是带小数点的数字。", - "unhandledOutputProperty": "未处理的输出属性", - "string": "字符串", - "inputFields": "输入", - "uNetFieldDescription": "UNet 子模型。", - "mismatchedVersion": "不匹配的版本", - "vaeFieldDescription": "Vae 子模型。", - "imageFieldDescription": "图像可以在节点间传递。", - "outputNode": "输出节点", - "mainModelFieldDescription": "待办事项", - "sDXLRefinerModelField": "Refiner 模型", - "unableToParseEdge": "无法解析边缘", - "latentsCollectionDescription": "Latents 可以在节点间传递。", - "oNNXModelFieldDescription": "ONNX 模型。", - "cannotDuplicateConnection": "无法创建重复的连接", - "ipAdapterModel": "IP-Adapter 模型", - "ipAdapterDescription": "图像提示词自适应 (IP-Adapter)。", - "ipAdapterModelDescription": "IP-Adapter 模型", - "floatCollectionDescription": "一个浮点数合集。", - "enum": "Enum (枚举)", - "integerPolymorphicDescription": "一个整数值合集。", - "float": "浮点", - "integer": "整数", - "colorField": "颜色", - "stringCollectionDescription": "一个字符串合集。", - "stringCollection": "字符串合集", - "uNetField": "UNet", - "integerCollection": "整数合集", - "vaeModelField": "VAE", - "integerCollectionDescription": "一个整数值合集。", - "clipField": "Clip", - "stringDescription": "字符串是指文本。", - "colorCollection": "一个颜色合集。", - "boolean": "布尔值", - "stringPolymorphicDescription": "一个字符串合集。", - "controlField": "控制信息", - "floatPolymorphicDescription": "一个浮点数合集。", - "vaeField": "Vae", - "floatCollection": "浮点合集", - "booleanCollection": "布尔值合集", - "imageCollectionDescription": "一个图像合集。", - "loRAModelField": "LoRA", - "imageCollection": "图像合集", - "ipAdapterPolymorphicDescription": "一个 IP-Adapters Collection 合集。", - "ipAdapterCollection": "IP-Adapters 合集", - "conditioningCollection": "条件合集", - "ipAdapterPolymorphic": "IP-Adapters 多态", - "conditioningCollectionDescription": "条件可以在节点间传递。", - "colorPolymorphic": "颜色多态", - "conditioningPolymorphic": "条件多态", - "latentsCollection": "Latents 合集", - "stringPolymorphic": "字符多态", - "conditioningPolymorphicDescription": "条件可以在节点间传递。", - "imagePolymorphic": "图像多态", - "floatPolymorphic": "浮点多态", - "ipAdapterCollectionDescription": "一个 IP-Adapters Collection 合集。", - "ipAdapter": "IP-Adapter", - "booleanPolymorphic": "布尔多态", - "conditioningFieldDescription": "条件可以在节点间传递。", - "integerPolymorphic": "整数多态", - "latentsPolymorphic": "Latents 多态", - "conditioningField": "条件", - "latentsField": "Latents" - }, - "controlnet": { - "resize": "直接缩放", - "showAdvanced": "显示高级", - "contentShuffleDescription": "随机打乱图像内容", - "importImageFromCanvas": "从画布导入图像", - "lineartDescription": "将图像转换为线稿", - "importMaskFromCanvas": "从画布导入遮罩", - "hideAdvanced": "隐藏高级", - "ipAdapterModel": "Adapter 模型", - "resetControlImage": "重置控制图像", - "beginEndStepPercent": "开始 / 结束步数百分比", - "mlsdDescription": "简洁的分割线段(直线)检测器", - "duplicate": "复制", - "balanced": "平衡", - "prompt": "Prompt (提示词控制)", - "depthMidasDescription": "使用 Midas 生成深度图", - "openPoseDescription": "使用 Openpose 进行人体姿态估计", - "resizeMode": "缩放模式", - "weight": "权重", - "selectModel": "选择一个模型", - "crop": "裁剪", - "processor": "处理器", - "none": "无", - "incompatibleBaseModel": "不兼容的基础模型:", - "enableControlnet": "启用 ControlNet", - "detectResolution": "检测分辨率", - "pidiDescription": "像素差分 (PIDI) 图像处理", - "controlMode": "控制模式", - "fill": "填充", - "cannyDescription": "Canny 边缘检测", - "colorMapDescription": "从图像生成一张颜色图", - "imageResolution": "图像分辨率", - "autoConfigure": "自动配置处理器", - "normalBaeDescription": "法线 BAE 处理", - "noneDescription": "不应用任何处理", - "saveControlImage": "保存控制图像", - "toggleControlNet": "开关此 ControlNet", - "delete": "删除", - "colorMapTileSize": "分块大小", - "ipAdapterImageFallback": "无已选择的 IP Adapter 图像", - "mediapipeFaceDescription": "使用 Mediapipe 检测面部", - "depthZoeDescription": "使用 Zoe 生成深度图", - "hedDescription": "整体嵌套边缘检测", - "setControlImageDimensions": "设定控制图像尺寸宽/高为", - "resetIPAdapterImage": "重置 IP Adapter 图像", - "handAndFace": "手部和面部", - "enableIPAdapter": "启用 IP Adapter", - "amult": "角度倍率 (a_mult)", - "bgth": "背景移除阈值 (bg_th)", - "lineartAnimeDescription": "动漫风格线稿处理", - "minConfidence": "最小置信度", - "lowThreshold": "弱判断阈值", - "highThreshold": "强判断阈值", - "addT2IAdapter": "添加 $t(common.t2iAdapter)", - "controlNetEnabledT2IDisabled": "$t(common.controlNet) 已启用, $t(common.t2iAdapter) 已禁用", - "t2iEnabledControlNetDisabled": "$t(common.t2iAdapter) 已启用, $t(common.controlNet) 已禁用", - "addControlNet": "添加 $t(common.controlNet)", - "controlNetT2IMutexDesc": "$t(common.controlNet) 和 $t(common.t2iAdapter) 目前不支持同时启用。", - "addIPAdapter": "添加 $t(common.ipAdapter)", - "safe": "保守模式", - "scribble": "草绘 (scribble)", - "maxFaces": "最大面部数", - "pidi": "PIDI", - "normalBae": "Normal BAE", - "hed": "HED", - "contentShuffle": "Content Shuffle", - "f": "F", - "h": "H", - "controlnet": "$t(controlnet.controlAdapter_one) #{{number}} ($t(common.controlNet))", - "control": "Control (普通控制)", - "coarse": "Coarse", - "depthMidas": "Depth (Midas)", - "w": "W", - "ip_adapter": "$t(controlnet.controlAdapter_one) #{{number}} ($t(common.ipAdapter))", - "mediapipeFace": "Mediapipe Face", - "mlsd": "M-LSD", - "lineart": "Lineart", - "t2i_adapter": "$t(controlnet.controlAdapter_one) #{{number}} ($t(common.t2iAdapter))", - "megaControl": "Mega Control (超级控制)", - "depthZoe": "Depth (Zoe)", - "colorMap": "Color", - "openPose": "Openpose", - "controlAdapter_other": "Control Adapters", - "lineartAnime": "Lineart Anime", - "canny": "Canny" - }, - "queue": { - "status": "状态", - "cancelTooltip": "取消当前项目", - "queueEmpty": "队列为空", - "pauseSucceeded": "处理器已暂停", - "in_progress": "处理中", - "queueFront": "添加到队列前", - "completed": "已完成", - "queueBack": "添加到队列", - "cancelFailed": "取消项目时出现问题", - "pauseFailed": "暂停处理器时出现问题", - "clearFailed": "清除队列时出现问题", - "clearSucceeded": "队列已清除", - "pause": "暂停", - "cancelSucceeded": "项目已取消", - "queue": "队列", - "batch": "批处理", - "clearQueueAlertDialog": "清除队列时会立即取消所有处理中的项目并且会完全清除队列。", - "pending": "待定", - "completedIn": "完成于", - "resumeFailed": "恢复处理器时出现问题", - "clear": "清除", - "prune": "修剪", - "total": "总计", - "canceled": "已取消", - "pruneFailed": "修剪队列时出现问题", - "cancelBatchSucceeded": "批处理已取消", - "clearTooltip": "取消并清除所有项目", - "current": "当前", - "pauseTooltip": "暂停处理器", - "failed": "已失败", - "cancelItem": "取消项目", - "next": "下一个", - "cancelBatch": "取消批处理", - "cancel": "取消", - "resumeSucceeded": "处理器已恢复", - "resumeTooltip": "恢复处理器", - "resume": "恢复", - "cancelBatchFailed": "取消批处理时出现问题", - "clearQueueAlertDialog2": "您确定要清除队列吗?", - "item": "项目", - "pruneSucceeded": "从队列修剪 {{item_count}} 个已完成的项目", - "notReady": "无法排队", - "batchFailedToQueue": "批次加入队列失败", - "batchValues": "批次数", - "queueCountPrediction": "添加 {{predicted}} 到队列", - "batchQueued": "加入队列的批次", - "queuedCount": "{{pending}} 待处理", - "front": "前", - "pruneTooltip": "修剪 {{item_count}} 个已完成的项目", - "batchQueuedDesc_other": "在队列的 {{direction}} 中添加了 {{count}} 个会话", - "graphQueued": "节点图已加入队列", - "back": "后", - "session": "会话", - "queueTotal": "总计 {{total}}", - "enqueueing": "队列中的批次", - "queueMaxExceeded": "超出最大值 {{max_queue_size}},将跳过 {{skip}}", - "graphFailedToQueue": "节点图加入队列失败" - }, - "sdxl": { - "refinerStart": "Refiner 开始作用时机", - "selectAModel": "选择一个模型", - "scheduler": "调度器", - "cfgScale": "CFG 等级", - "negStylePrompt": "负向样式提示词", - "noModelsAvailable": "无可用模型", - "negAestheticScore": "负向美学评分", - "useRefiner": "启用 Refiner", - "denoisingStrength": "去噪强度", - "refinermodel": "Refiner 模型", - "posAestheticScore": "正向美学评分", - "concatPromptStyle": "连接提示词 & 样式", - "loading": "加载中...", - "steps": "步数", - "posStylePrompt": "正向样式提示词", - "refiner": "Refiner" - }, - "metadata": { - "positivePrompt": "正向提示词", - "negativePrompt": "负向提示词", - "generationMode": "生成模式", - "Threshold": "噪声阈值", - "metadata": "元数据", - "strength": "图生图强度", - "seed": "种子", - "imageDetails": "图像详细信息", - "perlin": "Perlin 噪声", - "model": "模型", - "noImageDetails": "未找到图像详细信息", - "hiresFix": "高分辨率优化", - "cfgScale": "CFG 等级", - "initImage": "初始图像", - "height": "高度", - "variations": "(成对/第二)种子权重", - "noMetaData": "未找到元数据", - "width": "宽度", - "createdBy": "创建者是", - "workflow": "工作流", - "steps": "步数", - "scheduler": "调度器", - "seamless": "无缝", - "fit": "图生图匹配", - "recallParameters": "召回参数", - "noRecallParameters": "未找到要召回的参数", - "vae": "VAE" - }, - "models": { - "noMatchingModels": "无相匹配的模型", - "loading": "加载中", - "noMatchingLoRAs": "无相匹配的 LoRA", - "noLoRAsAvailable": "无可用 LoRA", - "noModelsAvailable": "无可用模型", - "selectModel": "选择一个模型", - "selectLoRA": "选择一个 LoRA", - "noRefinerModelsInstalled": "无已安装的 SDXL Refiner 模型", - "noLoRAsInstalled": "无已安装的 LoRA" - }, - "boards": { - "autoAddBoard": "自动添加面板", - "topMessage": "该面板包含的图像正使用以下功能:", - "move": "移动", - "menuItemAutoAdd": "自动添加到该面板", - "myBoard": "我的面板", - "searchBoard": "检索面板...", - "noMatching": "没有相匹配的面板", - "selectBoard": "选择一个面板", - "cancel": "取消", - "addBoard": "添加面板", - "bottomMessage": "删除该面板并且将其对应的图像将重置当前使用该面板的所有功能。", - "uncategorized": "未分类", - "changeBoard": "更改面板", - "loading": "加载中...", - "clearSearch": "清除检索", - "downloadBoard": "下载面板" - }, - "embedding": { - "noMatchingEmbedding": "不匹配的 Embedding", - "addEmbedding": "添加 Embedding", - "incompatibleModel": "不兼容的基础模型:" - }, - "dynamicPrompts": { - "seedBehaviour": { - "perPromptDesc": "每次生成图像使用不同的种子", - "perIterationLabel": "每次迭代的种子", - "perIterationDesc": "每次迭代使用不同的种子", - "perPromptLabel": "每张图像的种子", - "label": "种子行为" - }, - "enableDynamicPrompts": "启用动态提示词", - "combinatorial": "组合生成", - "maxPrompts": "最大提示词数", - "dynamicPrompts": "动态提示词", - "promptsWithCount_other": "{{count}} 个提示词" - }, - "popovers": { - "compositingMaskAdjustments": { - "heading": "遮罩调整", - "paragraphs": [ - "调整遮罩。" - ] - }, - "paramRatio": { - "heading": "纵横比", - "paragraphs": [ - "生成图像的尺寸纵横比。", - "图像尺寸(单位:像素)建议 SD 1.5 模型使用等效 512x512 的尺寸,SDXL 模型使用等效 1024x1024 的尺寸。" - ] - }, - "compositingCoherenceSteps": { - "heading": "步数", - "paragraphs": [ - "一致性层中使用的去噪步数。", - "与主参数中的步数相同。" - ] - }, - "compositingBlur": { - "heading": "模糊", - "paragraphs": [ - "遮罩模糊半径。" - ] - }, - "noiseUseCPU": { - "heading": "使用 CPU 噪声", - "paragraphs": [ - "选择由 CPU 或 GPU 生成噪声。", - "启用 CPU 噪声后,特定的种子将会在不同的设备上产生下相同的图像。", - "启用 CPU 噪声不会对性能造成影响。" - ] - }, - "paramVAEPrecision": { - "heading": "VAE 精度", - "paragraphs": [ - "VAE 编解码过程种使用的精度。FP16/半精度以微小的图像变化为代价提高效率。" - ] - }, - "compositingCoherenceMode": { - "heading": "模式", - "paragraphs": [ - "一致性层模式。" - ] - }, - "controlNetResizeMode": { - "heading": "缩放模式", - "paragraphs": [ - "ControlNet 输入图像适应输出图像大小的方法。" - ] - }, - "clipSkip": { - "paragraphs": [ - "选择要跳过 CLIP 模型多少层。", - "部分模型跳过特定数值的层时效果会更好。", - "较高的数值通常会导致图像细节更少。" - ], - "heading": "CLIP 跳过层" - }, - "paramModel": { - "heading": "模型", - "paragraphs": [ - "用于去噪过程的模型。", - "不同的模型一般会通过接受训练来专门产生特定的美学内容和结果。" - ] - }, - "paramIterations": { - "heading": "迭代数", - "paragraphs": [ - "生成图像的数量。", - "若启用动态提示词,每种提示词都会生成这么多次。" - ] - }, - "compositingCoherencePass": { - "heading": "一致性层", - "paragraphs": [ - "第二轮去噪有助于合成内补/外扩图像。" - ] - }, - "compositingStrength": { - "heading": "强度", - "paragraphs": [ - "一致性层使用的去噪强度。", - "去噪强度与图生图的参数相同。" - ] - }, - "paramNegativeConditioning": { - "paragraphs": [ - "生成过程会避免生成负向提示词中的概念。使用此选项来使输出排除部分质量或对象。", - "支持 Compel 语法 和 embeddings。" - ], - "heading": "负向提示词" - }, - "compositingBlurMethod": { - "heading": "模糊方式", - "paragraphs": [ - "应用于遮罩区域的模糊方法。" - ] - }, - "paramScheduler": { - "heading": "调度器", - "paragraphs": [ - "调度器 (采样器) 定义如何在图像迭代过程中添加噪声,或者定义如何根据一个模型的输出来更新采样。" - ] - }, - "controlNetWeight": { - "heading": "权重", - "paragraphs": [ - "ControlNet 对生成图像的影响强度。" - ] - }, - "paramCFGScale": { - "heading": "CFG 等级", - "paragraphs": [ - "控制提示词对生成过程的影响程度。" - ] - }, - "paramSteps": { - "heading": "步数", - "paragraphs": [ - "每次生成迭代执行的步数。", - "通常情况下步数越多结果越好,但需要更多生成时间。" - ] - }, - "paramPositiveConditioning": { - "heading": "正向提示词", - "paragraphs": [ - "引导生成过程。您可以使用任何单词或短语。", - "Compel 语法、动态提示词语法和 embeddings。" - ] - }, - "lora": { - "heading": "LoRA 权重", - "paragraphs": [ - "更高的 LoRA 权重会对最终图像产生更大的影响。" - ] - }, - "infillMethod": { - "heading": "填充方法", - "paragraphs": [ - "填充选定区域的方式。" - ] - }, - "controlNetBeginEnd": { - "heading": "开始 / 结束步数百分比", - "paragraphs": [ - "去噪过程中在哪部分步数应用 ControlNet。", - "在组合处理开始阶段应用 ControlNet,且在引导细节生成的结束阶段应用 ControlNet。" - ] - }, - "scaleBeforeProcessing": { - "heading": "处理前缩放", - "paragraphs": [ - "生成图像前将所选区域缩放为最适合模型的大小。" - ] - }, - "paramDenoisingStrength": { - "heading": "去噪强度", - "paragraphs": [ - "为输入图像添加的噪声量。", - "输入 0 会导致结果图像和输入完全相同,输入 1 则会生成全新的图像。" - ] - }, - "paramSeed": { - "heading": "种子", - "paragraphs": [ - "控制用于生成的起始噪声。", - "禁用 “随机种子” 来以相同设置生成相同的结果。" - ] - }, - "controlNetControlMode": { - "heading": "控制模式", - "paragraphs": [ - "给提示词或 ControlNet 增加更大的权重。" - ] - }, - "dynamicPrompts": { - "paragraphs": [ - "动态提示词可将单个提示词解析为多个。", - "基本语法示例:\"a {red|green|blue} ball\"。这会产生三种提示词:\"a red ball\", \"a green ball\" 和 \"a blue ball\"。", - "可以在单个提示词中多次使用该语法,但务必请使用最大提示词设置来控制生成的提示词数量。" - ], - "heading": "动态提示词" - }, - "paramVAE": { - "paragraphs": [ - "用于将 AI 输出转换成最终图像的模型。" - ], - "heading": "VAE" - }, - "dynamicPromptsSeedBehaviour": { - "paragraphs": [ - "控制生成提示词时种子的使用方式。", - "每次迭代过程都会使用一个唯一的种子。使用本选项来探索单个种子的提示词变化。", - "例如,如果你有 5 种提示词,则生成的每个图像都会使用相同种子。", - "为每张图像使用独立的唯一种子。这可以提供更多变化。" - ], - "heading": "种子行为" - }, - "dynamicPromptsMaxPrompts": { - "heading": "最大提示词数量", - "paragraphs": [ - "限制动态提示词可生成的提示词数量。" - ] - }, - "controlNet": { - "paragraphs": [ - "ControlNet 为生成过程提供引导,为生成具有受控构图、结构、样式的图像提供帮助,具体的功能由所选的模型决定。" - ], - "heading": "ControlNet" - } - }, - "invocationCache": { - "disable": "禁用", - "misses": "缓存未中", - "enableFailed": "启用调用缓存时出现问题", - "invocationCache": "调用缓存", - "clearSucceeded": "调用缓存已清除", - "enableSucceeded": "调用缓存已启用", - "clearFailed": "清除调用缓存时出现问题", - "hits": "缓存命中", - "disableSucceeded": "调用缓存已禁用", - "disableFailed": "禁用调用缓存时出现问题", - "enable": "启用", - "clear": "清除", - "maxCacheSize": "最大缓存大小", - "cacheSize": "缓存大小" - }, - "hrf": { - "enableHrf": "启用高分辨率修复", - "upscaleMethod": "放大方法", - "enableHrfTooltip": "使用较低的分辨率进行初始生成,放大到基础分辨率后进行图生图。", - "metadata": { - "strength": "高分辨率修复强度", - "enabled": "高分辨率修复已启用", - "method": "高分辨率修复方法" - }, - "hrf": "高分辨率修复", - "hrfStrength": "高分辨率修复强度", - "strengthTooltip": "值越低细节越少,但可以减少部分潜在的伪影。" - } -} diff --git a/invokeai/frontend/web/dist/locales/zh_Hant.json b/invokeai/frontend/web/dist/locales/zh_Hant.json deleted file mode 100644 index fe51856117..0000000000 --- a/invokeai/frontend/web/dist/locales/zh_Hant.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "common": { - "nodes": "節點", - "img2img": "圖片轉圖片", - "langSimplifiedChinese": "簡體中文", - "statusError": "錯誤", - "statusDisconnected": "已中斷連線", - "statusConnected": "已連線", - "back": "返回", - "load": "載入", - "close": "關閉", - "langEnglish": "英語", - "settingsLabel": "設定", - "upload": "上傳", - "langArabic": "阿拉伯語", - "discordLabel": "Discord", - "nodesDesc": "使用Node生成圖像的系統正在開發中。敬請期待有關於這項功能的更新。", - "reportBugLabel": "回報錯誤", - "githubLabel": "GitHub", - "langKorean": "韓語", - "langPortuguese": "葡萄牙語", - "hotkeysLabel": "快捷鍵", - "languagePickerLabel": "切換語言", - "langDutch": "荷蘭語", - "langFrench": "法語", - "langGerman": "德語", - "langItalian": "義大利語", - "langJapanese": "日語", - "langPolish": "波蘭語", - "langBrPortuguese": "巴西葡萄牙語", - "langRussian": "俄語", - "langSpanish": "西班牙語", - "unifiedCanvas": "統一畫布", - "cancel": "取消", - "langHebrew": "希伯來語", - "txt2img": "文字轉圖片" - }, - "accessibility": { - "modelSelect": "選擇模型", - "invokeProgressBar": "Invoke 進度條", - "uploadImage": "上傳圖片", - "reset": "重設", - "nextImage": "下一張圖片", - "previousImage": "上一張圖片", - "flipHorizontally": "水平翻轉", - "useThisParameter": "使用此參數", - "zoomIn": "放大", - "zoomOut": "縮小", - "flipVertically": "垂直翻轉", - "modifyConfig": "修改配置", - "menu": "選單" - } -} diff --git a/invokeai/frontend/web/docs/README.md b/invokeai/frontend/web/docs/README.md index 2545206c6a..a8f8b7e7b0 100644 --- a/invokeai/frontend/web/docs/README.md +++ b/invokeai/frontend/web/docs/README.md @@ -85,14 +85,14 @@ The server must be started and available at . # from the repo root, start the server python scripts/invokeai-web.py # from invokeai/frontend/web/, run the script -yarn typegen +pnpm typegen ``` ## Package Scripts See `package.json` for all scripts. -Run with `yarn - - + + + + + + + Invoke - Community Edition + + + + + +
+ + + + \ No newline at end of file diff --git a/invokeai/frontend/web/package.json b/invokeai/frontend/web/package.json index 44b0ceeac0..3231f4a2ab 100644 --- a/invokeai/frontend/web/package.json +++ b/invokeai/frontend/web/package.json @@ -19,23 +19,29 @@ "dist" ], "scripts": { - "dev": "concurrently \"vite dev\" \"yarn run theme:watch\"", - "dev:host": "concurrently \"vite dev --host\" \"yarn run theme:watch\"", - "build": "yarn run lint && vite build", + "dev": "concurrently \"vite dev\" \"pnpm run theme:watch\"", + "dev:host": "concurrently \"vite dev --host\" \"pnpm run theme:watch\"", + "build": "pnpm run lint && vite build", "typegen": "node scripts/typegen.js", "preview": "vite preview", "lint:madge": "madge --circular src/main.tsx", "lint:eslint": "eslint --max-warnings=0 .", "lint:prettier": "prettier --check .", "lint:tsc": "tsc --noEmit", - "lint": "concurrently -g -n eslint,prettier,tsc,madge -c cyan,green,magenta,yellow \"yarn run lint:eslint\" \"yarn run lint:prettier\" \"yarn run lint:tsc\" \"yarn run lint:madge\"", + "lint": "concurrently -g -n eslint,prettier,tsc,madge -c cyan,green,magenta,yellow \"pnpm run lint:eslint\" \"pnpm run lint:prettier\" \"pnpm run lint:tsc\" \"pnpm run lint:madge\"", "fix": "eslint --fix . && prettier --log-level warn --write .", - "postinstall": "patch-package && yarn run theme", + "preinstall": "npx only-allow pnpm", + "postinstall": "pnpm run theme", "theme": "chakra-cli tokens src/theme/theme.ts", "theme:watch": "chakra-cli tokens src/theme/theme.ts --watch", - "up": "yarn upgrade-interactive --latest" + "storybook": "storybook dev -p 6006", + "build-storybook": "storybook build", + "unimported": "npx unimported" }, "madge": { + "excludeRegExp": [ + "^index.ts$" + ], "detectiveOptions": { "ts": { "skipTypeImports": true @@ -48,55 +54,60 @@ "dependencies": { "@chakra-ui/anatomy": "^2.2.2", "@chakra-ui/icons": "^2.1.1", + "@chakra-ui/layout": "^2.3.1", + "@chakra-ui/portal": "^2.1.0", "@chakra-ui/react": "^2.8.2", + "@chakra-ui/react-use-size": "^2.1.0", "@chakra-ui/styled-system": "^2.9.2", "@chakra-ui/theme-tools": "^2.1.2", "@dagrejs/graphlib": "^2.1.13", "@dnd-kit/core": "^6.1.0", "@dnd-kit/utilities": "^3.2.2", - "@emotion/react": "^11.11.1", + "@emotion/react": "^11.11.3", "@emotion/styled": "^11.11.0", - "@fontsource-variable/inter": "^5.0.15", - "@mantine/core": "^6.0.19", - "@mantine/form": "^6.0.19", - "@mantine/hooks": "^6.0.19", + "@fontsource-variable/inter": "^5.0.16", + "@mantine/form": "6.0.21", "@nanostores/react": "^0.7.1", - "@reduxjs/toolkit": "^1.9.7", + "@reduxjs/toolkit": "2.0.1", "@roarr/browser-log-writer": "^1.3.0", + "chakra-react-select": "^4.7.6", "compare-versions": "^6.1.0", "dateformat": "^5.0.3", - "framer-motion": "^10.16.4", - "i18next": "^23.6.0", - "i18next-http-backend": "^2.3.1", + "framer-motion": "^10.17.9", + "i18next": "^23.7.16", + "i18next-http-backend": "^2.4.2", "idb-keyval": "^6.2.1", - "konva": "^9.2.3", + "jsondiffpatch": "^0.6.0", + "konva": "^9.3.0", "lodash-es": "^4.17.21", - "nanostores": "^0.9.4", + "nanostores": "^0.9.5", "new-github-issue-url": "^1.0.0", - "overlayscrollbars": "^2.4.4", + "overlayscrollbars": "^2.4.6", "overlayscrollbars-react": "^0.5.3", - "patch-package": "^8.0.0", "query-string": "^8.1.0", "react": "^18.2.0", "react-colorful": "^5.6.1", "react-dom": "^18.2.0", "react-dropzone": "^14.2.3", - "react-error-boundary": "^4.0.11", - "react-hotkeys-hook": "4.4.1", - "react-i18next": "^13.3.1", - "react-icons": "^4.11.0", + "react-error-boundary": "^4.0.12", + "react-hook-form": "^7.49.2", + "react-hotkeys-hook": "4.4.3", + "react-i18next": "^14.0.0", + "react-icons": "^4.12.0", "react-konva": "^18.2.10", - "react-redux": "^8.1.3", - "react-resizable-panels": "^0.0.55", - "react-use": "^17.4.0", + "react-redux": "9.0.4", + "react-resizable-panels": "^1.0.9", + "react-select": "5.8.0", + "react-textarea-autosize": "^8.5.3", + "react-use": "^17.4.2", "react-virtuoso": "^4.6.2", - "reactflow": "^11.9.4", + "reactflow": "^11.10.1", "redux-dynamic-middlewares": "^2.2.0", - "redux-remember": "^4.0.4", - "roarr": "^7.18.3", - "serialize-error": "^11.0.2", - "socket.io-client": "^4.7.2", - "type-fest": "^4.7.1", + "redux-remember": "^5.1.0", + "roarr": "^7.21.0", + "serialize-error": "^11.0.3", + "socket.io-client": "^4.7.3", + "type-fest": "^4.9.0", "use-debounce": "^10.0.0", "use-image": "^1.1.1", "uuid": "^9.0.1", @@ -104,43 +115,63 @@ "zod-validation-error": "^2.1.0" }, "peerDependencies": { - "@chakra-ui/cli": "^2.4.0", - "@chakra-ui/react": "^2.8.0", + "@chakra-ui/cli": "^2.4.1", + "@chakra-ui/react": "^2.8.2", "react": "^18.2.0", "react-dom": "^18.2.0", "ts-toolbelt": "^9.6.0" }, "devDependencies": { + "@arthurgeron/eslint-plugin-react-usememo": "^2.2.3", "@chakra-ui/cli": "^2.4.1", + "@storybook/addon-docs": "^7.6.7", + "@storybook/addon-essentials": "^7.6.7", + "@storybook/addon-interactions": "^7.6.7", + "@storybook/addon-links": "^7.6.7", + "@storybook/addon-storysource": "^7.6.7", + "@storybook/blocks": "^7.6.7", + "@storybook/manager-api": "^7.6.7", + "@storybook/react": "^7.6.7", + "@storybook/react-vite": "^7.6.7", + "@storybook/test": "^7.6.7", + "@storybook/theming": "^7.6.7", "@types/dateformat": "^5.0.2", - "@types/lodash-es": "^4.17.11", - "@types/node": "^20.9.0", - "@types/react": "^18.2.37", - "@types/react-dom": "^18.2.15", - "@types/react-redux": "^7.1.30", + "@types/lodash-es": "^4.17.12", + "@types/node": "^20.10.7", + "@types/react": "^18.2.47", + "@types/react-dom": "^18.2.18", "@types/uuid": "^9.0.7", - "@typescript-eslint/eslint-plugin": "^6.10.0", - "@typescript-eslint/parser": "^6.10.0", - "@vitejs/plugin-react-swc": "^3.4.1", + "@typescript-eslint/eslint-plugin": "^6.18.0", + "@typescript-eslint/parser": "^6.18.0", + "@vitejs/plugin-react-swc": "^3.5.0", "concurrently": "^8.2.2", - "eslint": "^8.53.0", - "eslint-config-prettier": "^9.0.0", + "eslint": "^8.56.0", + "eslint-config-prettier": "^9.1.0", "eslint-plugin-i18next": "^6.0.3", - "eslint-plugin-path": "^1.2.2", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-path": "^1.2.3", "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-simple-import-sort": "^10.0.0", + "eslint-plugin-storybook": "^0.6.15", + "eslint-plugin-unused-imports": "^3.0.0", "madge": "^6.1.0", "openapi-types": "^12.1.3", - "openapi-typescript": "^6.7.0", - "prettier": "^3.0.3", - "rollup-plugin-visualizer": "^5.9.2", + "openapi-typescript": "^6.7.3", + "prettier": "^3.1.1", + "rollup-plugin-visualizer": "^5.12.0", + "storybook": "^7.6.7", "ts-toolbelt": "^9.6.0", - "typescript": "^5.2.2", - "vite": "^4.5.1", - "vite-plugin-css-injected-by-js": "^3.3.0", - "vite-plugin-dts": "^3.6.3", + "typescript": "^5.3.3", + "vite": "^5.0.11", + "vite-plugin-css-injected-by-js": "^3.3.1", + "vite-plugin-dts": "^3.7.0", "vite-plugin-eslint": "^1.8.1", - "vite-tsconfig-paths": "^4.2.1", - "yarn": "^1.22.19" + "vite-tsconfig-paths": "^4.2.3" + }, + "pnpm": { + "patchedDependencies": { + "reselect@5.0.1": "patches/reselect@5.0.1.patch" + } } } diff --git a/invokeai/frontend/web/patches/reselect@5.0.1.patch b/invokeai/frontend/web/patches/reselect@5.0.1.patch new file mode 100644 index 0000000000..75d25308b9 --- /dev/null +++ b/invokeai/frontend/web/patches/reselect@5.0.1.patch @@ -0,0 +1,241 @@ +diff --git a/dist/cjs/reselect.cjs b/dist/cjs/reselect.cjs +index 0ef3a648e253af4ada8f0a2086d6db9302b8ced9..2614db8c901c5a3be4a80d3ffed3be2cf175bf50 100644 +--- a/dist/cjs/reselect.cjs ++++ b/dist/cjs/reselect.cjs +@@ -639,6 +639,8 @@ function weakMapMemoize(func, options = {}) { + return memoized; + } + ++weakMapMemoize = lruMemoize ++ + // src/createSelectorCreator.ts + function createSelectorCreator(memoizeOrOptions, ...memoizeOptionsFromArgs) { + const createSelectorCreatorOptions = typeof memoizeOrOptions === "function" ? { +diff --git a/dist/reselect.browser.mjs b/dist/reselect.browser.mjs +index e8da6c11a333ef9ddf4cca51adbc405fe8f6265d..8bc64f0c19082c0015155d60c59869a46c9f180e 100644 +--- a/dist/reselect.browser.mjs ++++ b/dist/reselect.browser.mjs +@@ -1,2 +1,2 @@ +-var oe={inputStabilityCheck:"once",identityFunctionCheck:"once"},re=e=>{Object.assign(oe,e)};var M="NOT_FOUND";function w(e,t=`expected a function, instead received ${typeof e}`){if(typeof e!="function")throw new TypeError(t)}function V(e,t=`expected an object, instead received ${typeof e}`){if(typeof e!="object")throw new TypeError(t)}function ie(e,t="expected all items to be functions, instead received the following types: "){if(!e.every(n=>typeof n=="function")){let n=e.map(c=>typeof c=="function"?`function ${c.name||"unnamed"}()`:typeof c).join(", ");throw new TypeError(`${t}[${n}]`)}}var O=e=>Array.isArray(e)?e:[e];function K(e){let t=Array.isArray(e[0])?e[0]:e;return ie(t,"createSelector expects all input-selectors to be functions, but received the following types: "),t}function W(e,t){let n=[],{length:c}=e;for(let s=0;sthis._cachedRevision){let{fn:t}=this,n=new Set,c=S;S=n,this._cachedValue=t(),S=c,this.hits++,this._deps=Array.from(n),this._cachedRevision=this.revision}return S?.add(this),this._cachedValue}get revision(){return Math.max(...this._deps.map(t=>t.revision),0)}};function g(e){return e instanceof F||console.warn("Not a valid cell! ",e),e.value}function L(e,t){if(!(e instanceof F))throw new TypeError("setValue must be passed a tracked store created with `createStorage`.");e.value=e._lastValue=t}function $(e,t=v){return new F(e,t)}function Y(e){return w(e,"the first parameter to `createCache` must be a function"),new b(e)}var ce=(e,t)=>!1;function z(){return $(null,ce)}function k(e,t){L(e,t)}var A=e=>{let t=e.collectionTag;t===null&&(t=e.collectionTag=z()),g(t)},h=e=>{let t=e.collectionTag;t!==null&&k(t,null)};var Re=Symbol(),H=0,se=Object.getPrototypeOf({}),I=class{constructor(t){this.value=t;this.value=t,this.tag.value=t}proxy=new Proxy(this,C);tag=z();tags={};children={};collectionTag=null;id=H++},C={get(e,t){function n(){let{value:s}=e,o=Reflect.get(s,t);if(typeof t=="symbol"||t in se)return o;if(typeof o=="object"&&o!==null){let i=e.children[t];return i===void 0&&(i=e.children[t]=E(o)),i.tag&&g(i.tag),i.proxy}else{let i=e.tags[t];return i===void 0&&(i=e.tags[t]=z(),i.value=o),g(i),o}}return n()},ownKeys(e){return A(e),Reflect.ownKeys(e.value)},getOwnPropertyDescriptor(e,t){return Reflect.getOwnPropertyDescriptor(e.value,t)},has(e,t){return Reflect.has(e.value,t)}},N=class{constructor(t){this.value=t;this.value=t,this.tag.value=t}proxy=new Proxy([this],ue);tag=z();tags={};children={};collectionTag=null;id=H++},ue={get([e],t){return t==="length"&&A(e),C.get(e,t)},ownKeys([e]){return C.ownKeys(e)},getOwnPropertyDescriptor([e],t){return C.getOwnPropertyDescriptor(e,t)},has([e],t){return C.has(e,t)}};function E(e){return Array.isArray(e)?new N(e):new I(e)}function D(e,t){let{value:n,tags:c,children:s}=e;if(e.value=t,Array.isArray(n)&&Array.isArray(t)&&n.length!==t.length)h(e);else if(n!==t){let o=0,i=0,r=!1;for(let u in n)o++;for(let u in t)if(i++,!(u in n)){r=!0;break}(r||o!==i)&&h(e)}for(let o in c){let i=n[o],r=t[o];i!==r&&(h(e),k(c[o],r)),typeof r=="object"&&r!==null&&delete c[o]}for(let o in s){let i=s[o],r=t[o];i.value!==r&&(typeof r=="object"&&r!==null?D(i,r):(X(i),delete s[o]))}}function X(e){e.tag&&k(e.tag,null),h(e);for(let t in e.tags)k(e.tags[t],null);for(let t in e.children)X(e.children[t])}function le(e){let t;return{get(n){return t&&e(t.key,n)?t.value:M},put(n,c){t={key:n,value:c}},getEntries(){return t?[t]:[]},clear(){t=void 0}}}function ae(e,t){let n=[];function c(r){let l=n.findIndex(u=>t(r,u.key));if(l>-1){let u=n[l];return l>0&&(n.splice(l,1),n.unshift(u)),u.value}return M}function s(r,l){c(r)===M&&(n.unshift({key:r,value:l}),n.length>e&&n.pop())}function o(){return n}function i(){n=[]}return{get:c,put:s,getEntries:o,clear:i}}var x=(e,t)=>e===t;function j(e){return function(n,c){if(n===null||c===null||n.length!==c.length)return!1;let{length:s}=n;for(let o=0;oo(p.value,a));f&&(a=f.value,r!==0&&r--)}l.put(arguments,a)}return a}return u.clearCache=()=>{l.clear(),u.resetResultsCount()},u.resultsCount=()=>r,u.resetResultsCount=()=>{r=0},u}function me(e){let t=E([]),n=null,c=j(x),s=Y(()=>e.apply(null,t.proxy));function o(){return c(n,arguments)||(D(t,arguments),n=arguments),s.value}return o.clearCache=()=>s.clear(),o}var _=class{constructor(t){this.value=t}deref(){return this.value}},de=typeof WeakRef<"u"?WeakRef:_,fe=0,B=1;function T(){return{s:fe,v:void 0,o:null,p:null}}function R(e,t={}){let n=T(),{resultEqualityCheck:c}=t,s,o=0;function i(){let r=n,{length:l}=arguments;for(let m=0,f=l;m{n=T(),i.resetResultsCount()},i.resultsCount=()=>o,i.resetResultsCount=()=>{o=0},i}function J(e,...t){let n=typeof e=="function"?{memoize:e,memoizeOptions:t}:e;return(...s)=>{let o=0,i=0,r,l={},u=s.pop();typeof u=="object"&&(l=u,u=s.pop()),w(u,`createSelector expects an output function after the inputs, but received: [${typeof u}]`);let a={...n,...l},{memoize:m,memoizeOptions:f=[],argsMemoize:p=R,argsMemoizeOptions:d=[],devModeChecks:y={}}=a,Q=O(f),Z=O(d),q=K(s),P=m(function(){return o++,u.apply(null,arguments)},...Q),Me=!0,ee=p(function(){i++;let ne=W(q,arguments);return r=P.apply(null,ne),r},...Z);return Object.assign(ee,{resultFunc:u,memoizedResultFunc:P,dependencies:q,dependencyRecomputations:()=>i,resetDependencyRecomputations:()=>{i=0},lastResult:()=>r,recomputations:()=>o,resetRecomputations:()=>{o=0},memoize:m,argsMemoize:p})}}var U=J(R);var ye=(e,t=U)=>{V(e,`createStructuredSelector expects first argument to be an object where each property is a selector, instead received a ${typeof e}`);let n=Object.keys(e),c=n.map(o=>e[o]);return t(c,(...o)=>o.reduce((i,r,l)=>(i[n[l]]=r,i),{}))};export{U as createSelector,J as createSelectorCreator,ye as createStructuredSelector,pe as lruMemoize,x as referenceEqualityCheck,re as setGlobalDevModeChecks,me as unstable_autotrackMemoize,R as weakMapMemoize}; ++var oe={inputStabilityCheck:"once",identityFunctionCheck:"once"},re=e=>{Object.assign(oe,e)};var M="NOT_FOUND";function w(e,t=`expected a function, instead received ${typeof e}`){if(typeof e!="function")throw new TypeError(t)}function V(e,t=`expected an object, instead received ${typeof e}`){if(typeof e!="object")throw new TypeError(t)}function ie(e,t="expected all items to be functions, instead received the following types: "){if(!e.every(n=>typeof n=="function")){let n=e.map(c=>typeof c=="function"?`function ${c.name||"unnamed"}()`:typeof c).join(", ");throw new TypeError(`${t}[${n}]`)}}var O=e=>Array.isArray(e)?e:[e];function K(e){let t=Array.isArray(e[0])?e[0]:e;return ie(t,"createSelector expects all input-selectors to be functions, but received the following types: "),t}function W(e,t){let n=[],{length:c}=e;for(let s=0;sthis._cachedRevision){let{fn:t}=this,n=new Set,c=S;S=n,this._cachedValue=t(),S=c,this.hits++,this._deps=Array.from(n),this._cachedRevision=this.revision}return S?.add(this),this._cachedValue}get revision(){return Math.max(...this._deps.map(t=>t.revision),0)}};function g(e){return e instanceof F||console.warn("Not a valid cell! ",e),e.value}function L(e,t){if(!(e instanceof F))throw new TypeError("setValue must be passed a tracked store created with `createStorage`.");e.value=e._lastValue=t}function $(e,t=v){return new F(e,t)}function Y(e){return w(e,"the first parameter to `createCache` must be a function"),new b(e)}var ce=(e,t)=>!1;function z(){return $(null,ce)}function k(e,t){L(e,t)}var A=e=>{let t=e.collectionTag;t===null&&(t=e.collectionTag=z()),g(t)},h=e=>{let t=e.collectionTag;t!==null&&k(t,null)};var Re=Symbol(),H=0,se=Object.getPrototypeOf({}),I=class{constructor(t){this.value=t;this.value=t,this.tag.value=t}proxy=new Proxy(this,C);tag=z();tags={};children={};collectionTag=null;id=H++},C={get(e,t){function n(){let{value:s}=e,o=Reflect.get(s,t);if(typeof t=="symbol"||t in se)return o;if(typeof o=="object"&&o!==null){let i=e.children[t];return i===void 0&&(i=e.children[t]=E(o)),i.tag&&g(i.tag),i.proxy}else{let i=e.tags[t];return i===void 0&&(i=e.tags[t]=z(),i.value=o),g(i),o}}return n()},ownKeys(e){return A(e),Reflect.ownKeys(e.value)},getOwnPropertyDescriptor(e,t){return Reflect.getOwnPropertyDescriptor(e.value,t)},has(e,t){return Reflect.has(e.value,t)}},N=class{constructor(t){this.value=t;this.value=t,this.tag.value=t}proxy=new Proxy([this],ue);tag=z();tags={};children={};collectionTag=null;id=H++},ue={get([e],t){return t==="length"&&A(e),C.get(e,t)},ownKeys([e]){return C.ownKeys(e)},getOwnPropertyDescriptor([e],t){return C.getOwnPropertyDescriptor(e,t)},has([e],t){return C.has(e,t)}};function E(e){return Array.isArray(e)?new N(e):new I(e)}function D(e,t){let{value:n,tags:c,children:s}=e;if(e.value=t,Array.isArray(n)&&Array.isArray(t)&&n.length!==t.length)h(e);else if(n!==t){let o=0,i=0,r=!1;for(let u in n)o++;for(let u in t)if(i++,!(u in n)){r=!0;break}(r||o!==i)&&h(e)}for(let o in c){let i=n[o],r=t[o];i!==r&&(h(e),k(c[o],r)),typeof r=="object"&&r!==null&&delete c[o]}for(let o in s){let i=s[o],r=t[o];i.value!==r&&(typeof r=="object"&&r!==null?D(i,r):(X(i),delete s[o]))}}function X(e){e.tag&&k(e.tag,null),h(e);for(let t in e.tags)k(e.tags[t],null);for(let t in e.children)X(e.children[t])}function le(e){let t;return{get(n){return t&&e(t.key,n)?t.value:M},put(n,c){t={key:n,value:c}},getEntries(){return t?[t]:[]},clear(){t=void 0}}}function ae(e,t){let n=[];function c(r){let l=n.findIndex(u=>t(r,u.key));if(l>-1){let u=n[l];return l>0&&(n.splice(l,1),n.unshift(u)),u.value}return M}function s(r,l){c(r)===M&&(n.unshift({key:r,value:l}),n.length>e&&n.pop())}function o(){return n}function i(){n=[]}return{get:c,put:s,getEntries:o,clear:i}}var x=(e,t)=>e===t;function j(e){return function(n,c){if(n===null||c===null||n.length!==c.length)return!1;let{length:s}=n;for(let o=0;oo(p.value,a));f&&(a=f.value,r!==0&&r--)}l.put(arguments,a)}return a}return u.clearCache=()=>{l.clear(),u.resetResultsCount()},u.resultsCount=()=>r,u.resetResultsCount=()=>{r=0},u}function me(e){let t=E([]),n=null,c=j(x),s=Y(()=>e.apply(null,t.proxy));function o(){return c(n,arguments)||(D(t,arguments),n=arguments),s.value}return o.clearCache=()=>s.clear(),o}var _=class{constructor(t){this.value=t}deref(){return this.value}},de=typeof WeakRef<"u"?WeakRef:_,fe=0,B=1;function T(){return{s:fe,v:void 0,o:null,p:null}}function R(e,t={}){let n=T(),{resultEqualityCheck:c}=t,s,o=0;function i(){let r=n,{length:l}=arguments;for(let m=0,f=l;m{n=T(),i.resetResultsCount()},i.resultsCount=()=>o,i.resetResultsCount=()=>{o=0},i}function J(e,...t){let n=typeof e=="function"?{memoize:e,memoizeOptions:t}:e;return(...s)=>{let o=0,i=0,r,l={},u=s.pop();typeof u=="object"&&(l=u,u=s.pop()),w(u,`createSelector expects an output function after the inputs, but received: [${typeof u}]`);let a={...n,...l},{memoize:m,memoizeOptions:f=[],argsMemoize:p=R,argsMemoizeOptions:d=[],devModeChecks:y={}}=a,Q=O(f),Z=O(d),q=K(s),P=m(function(){return o++,u.apply(null,arguments)},...Q),Me=!0,ee=p(function(){i++;let ne=W(q,arguments);return r=P.apply(null,ne),r},...Z);return Object.assign(ee,{resultFunc:u,memoizedResultFunc:P,dependencies:q,dependencyRecomputations:()=>i,resetDependencyRecomputations:()=>{i=0},lastResult:()=>r,recomputations:()=>o,resetRecomputations:()=>{o=0},memoize:m,argsMemoize:p})}}var U=J(R);var ye=(e,t=U)=>{V(e,`createStructuredSelector expects first argument to be an object where each property is a selector, instead received a ${typeof e}`);let n=Object.keys(e),c=n.map(o=>e[o]);return t(c,(...o)=>o.reduce((i,r,l)=>(i[n[l]]=r,i),{}))};export{U as createSelector,J as createSelectorCreator,ye as createStructuredSelector,pe as lruMemoize,pe as weakMapMemoize,x as referenceEqualityCheck,re as setGlobalDevModeChecks,me as unstable_autotrackMemoize}; + //# sourceMappingURL=reselect.browser.mjs.map +\ No newline at end of file +diff --git a/dist/reselect.legacy-esm.js b/dist/reselect.legacy-esm.js +index 9c18982dd0756ccc240f23383b50b893415ba7b3..041426d1db1d1e78cfe35c4e55e38724b2db35dc 100644 +--- a/dist/reselect.legacy-esm.js ++++ b/dist/reselect.legacy-esm.js +@@ -625,6 +625,8 @@ function weakMapMemoize(func, options = {}) { + return memoized; + } + ++weakMapMemoize = lruMemoize ++ + // src/createSelectorCreator.ts + function createSelectorCreator(memoizeOrOptions, ...memoizeOptionsFromArgs) { + const createSelectorCreatorOptions = typeof memoizeOrOptions === "function" ? { +diff --git a/dist/reselect.mjs b/dist/reselect.mjs +index 531dfe6fc16e83dd27dbe90086b5aafea76adb9e..c27aca00d581919325cc595cfa3021cd53c1fa68 100644 +--- a/dist/reselect.mjs ++++ b/dist/reselect.mjs +@@ -606,6 +606,8 @@ function weakMapMemoize(func, options = {}) { + return memoized; + } + ++weakMapMemoize = lruMemoize ++ + // src/createSelectorCreator.ts + function createSelectorCreator(memoizeOrOptions, ...memoizeOptionsFromArgs) { + const createSelectorCreatorOptions = typeof memoizeOrOptions === "function" ? { +diff --git a/src/weakMapMemoize.ts b/src/weakMapMemoize.ts +index f723071db3a8a17f94431bc77cde2dbee026f57f..ddfeb0d7720e5463041d1474f54e58fdbc18fe6d 100644 +--- a/src/weakMapMemoize.ts ++++ b/src/weakMapMemoize.ts +@@ -1,6 +1,7 @@ + // Original source: + // - https://github.com/facebook/react/blob/0b974418c9a56f6c560298560265dcf4b65784bc/packages/react/src/ReactCache.js + ++import { lruMemoize } from '../dist/reselect.mjs' + import type { + AnyFunction, + DefaultMemoizeFields, +@@ -169,97 +170,99 @@ export interface WeakMapMemoizeOptions { + * @public + * @experimental + */ +-export function weakMapMemoize( +- func: Func, +- options: WeakMapMemoizeOptions> = {} +-) { +- let fnNode = createCacheNode() +- const { resultEqualityCheck } = options ++// export function weakMapMemoize( ++// func: Func, ++// options: WeakMapMemoizeOptions> = {} ++// ) { ++// let fnNode = createCacheNode() ++// const { resultEqualityCheck } = options + +- let lastResult: WeakRef | undefined ++// let lastResult: WeakRef | undefined + +- let resultsCount = 0 ++// let resultsCount = 0 + +- function memoized() { +- let cacheNode = fnNode +- const { length } = arguments +- for (let i = 0, l = length; i < l; i++) { +- const arg = arguments[i] +- if ( +- typeof arg === 'function' || +- (typeof arg === 'object' && arg !== null) +- ) { +- // Objects go into a WeakMap +- let objectCache = cacheNode.o +- if (objectCache === null) { +- cacheNode.o = objectCache = new WeakMap() +- } +- const objectNode = objectCache.get(arg) +- if (objectNode === undefined) { +- cacheNode = createCacheNode() +- objectCache.set(arg, cacheNode) +- } else { +- cacheNode = objectNode +- } +- } else { +- // Primitives go into a regular Map +- let primitiveCache = cacheNode.p +- if (primitiveCache === null) { +- cacheNode.p = primitiveCache = new Map() +- } +- const primitiveNode = primitiveCache.get(arg) +- if (primitiveNode === undefined) { +- cacheNode = createCacheNode() +- primitiveCache.set(arg, cacheNode) +- } else { +- cacheNode = primitiveNode +- } +- } +- } ++// function memoized() { ++// let cacheNode = fnNode ++// const { length } = arguments ++// for (let i = 0, l = length; i < l; i++) { ++// const arg = arguments[i] ++// if ( ++// typeof arg === 'function' || ++// (typeof arg === 'object' && arg !== null) ++// ) { ++// // Objects go into a WeakMap ++// let objectCache = cacheNode.o ++// if (objectCache === null) { ++// cacheNode.o = objectCache = new WeakMap() ++// } ++// const objectNode = objectCache.get(arg) ++// if (objectNode === undefined) { ++// cacheNode = createCacheNode() ++// objectCache.set(arg, cacheNode) ++// } else { ++// cacheNode = objectNode ++// } ++// } else { ++// // Primitives go into a regular Map ++// let primitiveCache = cacheNode.p ++// if (primitiveCache === null) { ++// cacheNode.p = primitiveCache = new Map() ++// } ++// const primitiveNode = primitiveCache.get(arg) ++// if (primitiveNode === undefined) { ++// cacheNode = createCacheNode() ++// primitiveCache.set(arg, cacheNode) ++// } else { ++// cacheNode = primitiveNode ++// } ++// } ++// } + +- const terminatedNode = cacheNode as unknown as TerminatedCacheNode ++// const terminatedNode = cacheNode as unknown as TerminatedCacheNode + +- let result ++// let result + +- if (cacheNode.s === TERMINATED) { +- result = cacheNode.v +- } else { +- // Allow errors to propagate +- result = func.apply(null, arguments as unknown as any[]) +- resultsCount++ +- } ++// if (cacheNode.s === TERMINATED) { ++// result = cacheNode.v ++// } else { ++// // Allow errors to propagate ++// result = func.apply(null, arguments as unknown as any[]) ++// resultsCount++ ++// } + +- terminatedNode.s = TERMINATED ++// terminatedNode.s = TERMINATED + +- if (resultEqualityCheck) { +- const lastResultValue = lastResult?.deref() ?? lastResult +- if ( +- lastResultValue != null && +- resultEqualityCheck(lastResultValue as ReturnType, result) +- ) { +- result = lastResultValue +- resultsCount !== 0 && resultsCount-- +- } ++// if (resultEqualityCheck) { ++// const lastResultValue = lastResult?.deref() ?? lastResult ++// if ( ++// lastResultValue != null && ++// resultEqualityCheck(lastResultValue as ReturnType, result) ++// ) { ++// result = lastResultValue ++// resultsCount !== 0 && resultsCount-- ++// } + +- const needsWeakRef = +- (typeof result === 'object' && result !== null) || +- typeof result === 'function' +- lastResult = needsWeakRef ? new Ref(result) : result +- } +- terminatedNode.v = result +- return result +- } ++// const needsWeakRef = ++// (typeof result === 'object' && result !== null) || ++// typeof result === 'function' ++// lastResult = needsWeakRef ? new Ref(result) : result ++// } ++// terminatedNode.v = result ++// return result ++// } + +- memoized.clearCache = () => { +- fnNode = createCacheNode() +- memoized.resetResultsCount() +- } ++// memoized.clearCache = () => { ++// fnNode = createCacheNode() ++// memoized.resetResultsCount() ++// } + +- memoized.resultsCount = () => resultsCount ++// memoized.resultsCount = () => resultsCount + +- memoized.resetResultsCount = () => { +- resultsCount = 0 +- } ++// memoized.resetResultsCount = () => { ++// resultsCount = 0 ++// } + +- return memoized as Func & Simplify +-} ++// return memoized as Func & Simplify ++// } ++ ++export const weakMapMemoize = lruMemoize diff --git a/invokeai/frontend/web/pnpm-lock.yaml b/invokeai/frontend/web/pnpm-lock.yaml new file mode 100644 index 0000000000..2e5dba41c8 --- /dev/null +++ b/invokeai/frontend/web/pnpm-lock.yaml @@ -0,0 +1,13731 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +patchedDependencies: + reselect@5.0.1: + hash: kvbgwzjyy4x4fnh7znyocvb75q + path: patches/reselect@5.0.1.patch + +dependencies: + '@chakra-ui/anatomy': + specifier: ^2.2.2 + version: 2.2.2 + '@chakra-ui/icons': + specifier: ^2.1.1 + version: 2.1.1(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/layout': + specifier: ^2.3.1 + version: 2.3.1(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/portal': + specifier: ^2.1.0 + version: 2.1.0(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/react': + specifier: ^2.8.2 + version: 2.8.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.47)(framer-motion@10.17.9)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/react-use-size': + specifier: ^2.1.0 + version: 2.1.0(react@18.2.0) + '@chakra-ui/styled-system': + specifier: ^2.9.2 + version: 2.9.2 + '@chakra-ui/theme-tools': + specifier: ^2.1.2 + version: 2.1.2(@chakra-ui/styled-system@2.9.2) + '@dagrejs/graphlib': + specifier: ^2.1.13 + version: 2.1.13 + '@dnd-kit/core': + specifier: ^6.1.0 + version: 6.1.0(react-dom@18.2.0)(react@18.2.0) + '@dnd-kit/utilities': + specifier: ^3.2.2 + version: 3.2.2(react@18.2.0) + '@emotion/react': + specifier: ^11.11.3 + version: 11.11.3(@types/react@18.2.47)(react@18.2.0) + '@emotion/styled': + specifier: ^11.11.0 + version: 11.11.0(@emotion/react@11.11.3)(@types/react@18.2.47)(react@18.2.0) + '@fontsource-variable/inter': + specifier: ^5.0.16 + version: 5.0.16 + '@mantine/form': + specifier: 6.0.21 + version: 6.0.21(react@18.2.0) + '@nanostores/react': + specifier: ^0.7.1 + version: 0.7.1(nanostores@0.9.5)(react@18.2.0) + '@reduxjs/toolkit': + specifier: 2.0.1 + version: 2.0.1(react-redux@9.0.4)(react@18.2.0) + '@roarr/browser-log-writer': + specifier: ^1.3.0 + version: 1.3.0 + chakra-react-select: + specifier: ^4.7.6 + version: 4.7.6(@chakra-ui/form-control@2.2.0)(@chakra-ui/icon@3.2.0)(@chakra-ui/layout@2.3.1)(@chakra-ui/media-query@3.3.0)(@chakra-ui/menu@2.2.1)(@chakra-ui/spinner@2.1.0)(@chakra-ui/system@2.6.2)(@emotion/react@11.11.3)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + compare-versions: + specifier: ^6.1.0 + version: 6.1.0 + dateformat: + specifier: ^5.0.3 + version: 5.0.3 + framer-motion: + specifier: ^10.17.9 + version: 10.17.9(react-dom@18.2.0)(react@18.2.0) + i18next: + specifier: ^23.7.16 + version: 23.7.16 + i18next-http-backend: + specifier: ^2.4.2 + version: 2.4.2 + idb-keyval: + specifier: ^6.2.1 + version: 6.2.1 + jsondiffpatch: + specifier: ^0.6.0 + version: 0.6.0 + konva: + specifier: ^9.3.0 + version: 9.3.0 + lodash-es: + specifier: ^4.17.21 + version: 4.17.21 + nanostores: + specifier: ^0.9.5 + version: 0.9.5 + new-github-issue-url: + specifier: ^1.0.0 + version: 1.0.0 + overlayscrollbars: + specifier: ^2.4.6 + version: 2.4.6 + overlayscrollbars-react: + specifier: ^0.5.3 + version: 0.5.3(overlayscrollbars@2.4.6)(react@18.2.0) + query-string: + specifier: ^8.1.0 + version: 8.1.0 + react: + specifier: ^18.2.0 + version: 18.2.0 + react-colorful: + specifier: ^5.6.1 + version: 5.6.1(react-dom@18.2.0)(react@18.2.0) + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + react-dropzone: + specifier: ^14.2.3 + version: 14.2.3(react@18.2.0) + react-error-boundary: + specifier: ^4.0.12 + version: 4.0.12(react@18.2.0) + react-hook-form: + specifier: ^7.49.2 + version: 7.49.2(react@18.2.0) + react-hotkeys-hook: + specifier: 4.4.3 + version: 4.4.3(react-dom@18.2.0)(react@18.2.0) + react-i18next: + specifier: ^14.0.0 + version: 14.0.0(i18next@23.7.16)(react-dom@18.2.0)(react@18.2.0) + react-icons: + specifier: ^4.12.0 + version: 4.12.0(react@18.2.0) + react-konva: + specifier: ^18.2.10 + version: 18.2.10(konva@9.3.0)(react-dom@18.2.0)(react@18.2.0) + react-redux: + specifier: 9.0.4 + version: 9.0.4(@types/react@18.2.47)(react@18.2.0)(redux@5.0.1) + react-resizable-panels: + specifier: ^1.0.9 + version: 1.0.9(react-dom@18.2.0)(react@18.2.0) + react-select: + specifier: 5.8.0 + version: 5.8.0(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + react-textarea-autosize: + specifier: ^8.5.3 + version: 8.5.3(@types/react@18.2.47)(react@18.2.0) + react-use: + specifier: ^17.4.2 + version: 17.4.2(react-dom@18.2.0)(react@18.2.0) + react-virtuoso: + specifier: ^4.6.2 + version: 4.6.2(react-dom@18.2.0)(react@18.2.0) + reactflow: + specifier: ^11.10.1 + version: 11.10.1(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + redux-dynamic-middlewares: + specifier: ^2.2.0 + version: 2.2.0 + redux-remember: + specifier: ^5.1.0 + version: 5.1.0(redux@5.0.1) + roarr: + specifier: ^7.21.0 + version: 7.21.0 + serialize-error: + specifier: ^11.0.3 + version: 11.0.3 + socket.io-client: + specifier: ^4.7.3 + version: 4.7.3 + type-fest: + specifier: ^4.9.0 + version: 4.9.0 + use-debounce: + specifier: ^10.0.0 + version: 10.0.0(react@18.2.0) + use-image: + specifier: ^1.1.1 + version: 1.1.1(react-dom@18.2.0)(react@18.2.0) + uuid: + specifier: ^9.0.1 + version: 9.0.1 + zod: + specifier: ^3.22.4 + version: 3.22.4 + zod-validation-error: + specifier: ^2.1.0 + version: 2.1.0(zod@3.22.4) + +devDependencies: + '@arthurgeron/eslint-plugin-react-usememo': + specifier: ^2.2.3 + version: 2.2.3 + '@chakra-ui/cli': + specifier: ^2.4.1 + version: 2.4.1 + '@storybook/addon-docs': + specifier: ^7.6.7 + version: 7.6.7(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-essentials': + specifier: ^7.6.7 + version: 7.6.7(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-interactions': + specifier: ^7.6.7 + version: 7.6.7 + '@storybook/addon-links': + specifier: ^7.6.7 + version: 7.6.7(react@18.2.0) + '@storybook/addon-storysource': + specifier: ^7.6.7 + version: 7.6.7 + '@storybook/blocks': + specifier: ^7.6.7 + version: 7.6.7(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@storybook/manager-api': + specifier: ^7.6.7 + version: 7.6.7(react-dom@18.2.0)(react@18.2.0) + '@storybook/react': + specifier: ^7.6.7 + version: 7.6.7(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3) + '@storybook/react-vite': + specifier: ^7.6.7 + version: 7.6.7(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3)(vite@5.0.11) + '@storybook/test': + specifier: ^7.6.7 + version: 7.6.7 + '@storybook/theming': + specifier: ^7.6.7 + version: 7.6.7(react-dom@18.2.0)(react@18.2.0) + '@types/dateformat': + specifier: ^5.0.2 + version: 5.0.2 + '@types/lodash-es': + specifier: ^4.17.12 + version: 4.17.12 + '@types/node': + specifier: ^20.10.7 + version: 20.10.7 + '@types/react': + specifier: ^18.2.47 + version: 18.2.47 + '@types/react-dom': + specifier: ^18.2.18 + version: 18.2.18 + '@types/uuid': + specifier: ^9.0.7 + version: 9.0.7 + '@typescript-eslint/eslint-plugin': + specifier: ^6.18.0 + version: 6.18.0(@typescript-eslint/parser@6.18.0)(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/parser': + specifier: ^6.18.0 + version: 6.18.0(eslint@8.56.0)(typescript@5.3.3) + '@vitejs/plugin-react-swc': + specifier: ^3.5.0 + version: 3.5.0(vite@5.0.11) + concurrently: + specifier: ^8.2.2 + version: 8.2.2 + eslint: + specifier: ^8.56.0 + version: 8.56.0 + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@8.56.0) + eslint-plugin-i18next: + specifier: ^6.0.3 + version: 6.0.3 + eslint-plugin-import: + specifier: ^2.29.1 + version: 2.29.1(@typescript-eslint/parser@6.18.0)(eslint@8.56.0) + eslint-plugin-path: + specifier: ^1.2.3 + version: 1.2.3(eslint@8.56.0) + eslint-plugin-react: + specifier: ^7.33.2 + version: 7.33.2(eslint@8.56.0) + eslint-plugin-react-hooks: + specifier: ^4.6.0 + version: 4.6.0(eslint@8.56.0) + eslint-plugin-simple-import-sort: + specifier: ^10.0.0 + version: 10.0.0(eslint@8.56.0) + eslint-plugin-storybook: + specifier: ^0.6.15 + version: 0.6.15(eslint@8.56.0)(typescript@5.3.3) + eslint-plugin-unused-imports: + specifier: ^3.0.0 + version: 3.0.0(@typescript-eslint/eslint-plugin@6.18.0)(eslint@8.56.0) + madge: + specifier: ^6.1.0 + version: 6.1.0(typescript@5.3.3) + openapi-types: + specifier: ^12.1.3 + version: 12.1.3 + openapi-typescript: + specifier: ^6.7.3 + version: 6.7.3 + prettier: + specifier: ^3.1.1 + version: 3.1.1 + rollup-plugin-visualizer: + specifier: ^5.12.0 + version: 5.12.0 + storybook: + specifier: ^7.6.7 + version: 7.6.7 + ts-toolbelt: + specifier: ^9.6.0 + version: 9.6.0 + typescript: + specifier: ^5.3.3 + version: 5.3.3 + vite: + specifier: ^5.0.11 + version: 5.0.11(@types/node@20.10.7) + vite-plugin-css-injected-by-js: + specifier: ^3.3.1 + version: 3.3.1(vite@5.0.11) + vite-plugin-dts: + specifier: ^3.7.0 + version: 3.7.0(@types/node@20.10.7)(typescript@5.3.3)(vite@5.0.11) + vite-plugin-eslint: + specifier: ^1.8.1 + version: 1.8.1(eslint@8.56.0)(vite@5.0.11) + vite-tsconfig-paths: + specifier: ^4.2.3 + version: 4.2.3(typescript@5.3.3)(vite@5.0.11) + +packages: + + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + + /@adobe/css-tools@4.3.2: + resolution: {integrity: sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw==} + dev: true + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + dev: true + + /@arthurgeron/eslint-plugin-react-usememo@2.2.3: + resolution: {integrity: sha512-YJG+8hULmhHAxztaANswpa9hWNqEOSvbZcbd6R/JQzyNlEZ49Xh97kqZGuJGZ74rrmULckEO1m3Jh5ctqrGA2A==} + dependencies: + minimatch: 9.0.3 + uuid: 9.0.1 + dev: true + + /@aw-web-design/x-default-browser@1.4.126: + resolution: {integrity: sha512-Xk1sIhyNC/esHGGVjL/niHLowM0csl/kFO5uawBy4IrWwy0o1G8LGt3jP6nmWGz+USxeeqbihAmp/oVZju6wug==} + hasBin: true + dependencies: + default-browser-id: 3.0.0 + dev: true + + /@babel/code-frame@7.23.5: + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 + + /@babel/compat-data@7.23.5: + resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core@7.23.7: + resolution: {integrity: sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) + '@babel/helpers': 7.23.7 + '@babel/parser': 7.23.6 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.7 + '@babel/types': 7.23.6 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.23.6: + resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + jsesc: 2.5.2 + dev: true + + /@babel/helper-annotate-as-pure@7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: + resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-compilation-targets@7.23.6: + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.22.2 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-create-class-features-plugin@7.23.7(@babel/core@7.23.7): + resolution: {integrity: sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.7) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + dev: true + + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.7): + resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-annotate-as-pure': 7.22.5 + regexpu-core: 5.3.2 + semver: 6.3.1 + dev: true + + /@babel/helper-define-polyfill-provider@0.4.4(@babel/core@7.23.7): + resolution: {integrity: sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-member-expression-to-functions@7.23.0: + resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/helper-optimise-call-expression@7.22.5: + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.7): + resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-wrap-function': 7.22.20 + dev: true + + /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.7): + resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + dev: true + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-skip-transparent-expression-wrappers@7.22.5: + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/helper-string-parser@7.23.4: + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option@7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-wrap-function@7.22.20: + resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-function-name': 7.23.0 + '@babel/template': 7.22.15 + '@babel/types': 7.23.6 + dev: true + + /@babel/helpers@7.23.7: + resolution: {integrity: sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.7 + '@babel/types': 7.23.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight@7.23.4: + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + + /@babel/parser@7.23.6: + resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.7) + dev: true + + /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.7(@babel/core@7.23.7): + resolution: {integrity: sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.7): + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + dev: true + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.7): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.7): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.7): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.7): + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.7): + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-flow@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.7): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.7): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.7): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.7): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.7): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.7): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.7): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.7): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.7): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.7): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.7): + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-async-generator-functions@7.23.7(@babel/core@7.23.7): + resolution: {integrity: sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.7) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.23.7): + resolution: {integrity: sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.23.7): + resolution: {integrity: sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-classes@7.23.5(@babel/core@7.23.7): + resolution: {integrity: sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.7) + '@babel/helper-split-export-declaration': 7.22.6 + globals: 11.12.0 + dev: true + + /@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/template': 7.22.15 + dev: true + + /@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.23.7): + resolution: {integrity: sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.23.7): + resolution: {integrity: sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-flow-strip-types@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-flow': 7.23.3(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-for-of@7.23.6(@babel/core@7.23.7): + resolution: {integrity: sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + dev: true + + /@babel/plugin-transform-function-name@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.23.7): + resolution: {integrity: sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-literals@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.23.7): + resolution: {integrity: sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-systemjs@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.7): + resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-new-target@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.23.7): + resolution: {integrity: sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.23.7): + resolution: {integrity: sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.23.7): + resolution: {integrity: sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/core': 7.23.7 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-object-super@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.23.7): + resolution: {integrity: sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.23.7): + resolution: {integrity: sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-parameters@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.23.7): + resolution: {integrity: sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + regenerator-transform: 0.15.2 + dev: true + + /@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-spread@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + dev: true + + /@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-typescript@7.23.6(@babel/core@7.23.7): + resolution: {integrity: sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.7) + dev: true + + /@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.7) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/preset-env@7.23.7(@babel/core@7.23.7): + resolution: {integrity: sha512-SY27X/GtTz/L4UryMNJ6p4fH4nsgWbz84y9FE0bQeWJP6O5BhgVCt53CotQKHCOeXJel8VyhlhujhlltKms/CA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/core': 7.23.7 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.23.7(@babel/core@7.23.7) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.7) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.7) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.7) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.7) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-syntax-import-attributes': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.7) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.7) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.7) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.7) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.7) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.7) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.7) + '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-async-generator-functions': 7.23.7(@babel/core@7.23.7) + '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-class-static-block': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-classes': 7.23.5(@babel/core@7.23.7) + '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-dotall-regex': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-duplicate-keys': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-dynamic-import': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-exponentiation-operator': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-export-namespace-from': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-for-of': 7.23.6(@babel/core@7.23.7) + '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-json-strings': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-logical-assignment-operators': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-modules-amd': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-modules-systemjs': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-modules-umd': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.7) + '@babel/plugin-transform-new-target': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-nullish-coalescing-operator': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-numeric-separator': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-object-rest-spread': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-optional-catch-binding': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-regenerator': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-reserved-words': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-typeof-symbol': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-unicode-escapes': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-unicode-property-regex': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-unicode-sets-regex': 7.23.3(@babel/core@7.23.7) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.7) + babel-plugin-polyfill-corejs2: 0.4.7(@babel/core@7.23.7) + babel-plugin-polyfill-corejs3: 0.8.7(@babel/core@7.23.7) + babel-plugin-polyfill-regenerator: 0.5.4(@babel/core@7.23.7) + core-js-compat: 3.35.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/preset-flow@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-7yn6hl8RIv+KNk6iIrGZ+D06VhVY35wLVf23Cz/mMu1zOr7u4MMP4j0nZ9tLf8+4ZFpnib8cFYgB/oYg9hfswA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-transform-flow-strip-types': 7.23.3(@babel/core@7.23.7) + dev: true + + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.7): + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/types': 7.23.6 + esutils: 2.0.3 + dev: true + + /@babel/preset-typescript@7.23.3(@babel/core@7.23.7): + resolution: {integrity: sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.23.7) + dev: true + + /@babel/register@7.23.7(@babel/core@7.23.7): + resolution: {integrity: sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + clone-deep: 4.0.1 + find-cache-dir: 2.1.0 + make-dir: 2.1.0 + pirates: 4.0.6 + source-map-support: 0.5.21 + dev: true + + /@babel/regjsgen@0.8.0: + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + dev: true + + /@babel/runtime@7.23.6: + resolution: {integrity: sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + + /@babel/runtime@7.23.7: + resolution: {integrity: sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + dev: true + + /@babel/traverse@7.23.7: + resolution: {integrity: sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@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.6 + '@babel/types': 7.23.6 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.23.6: + resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + + /@base2/pretty-print-object@1.0.1: + resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} + dev: true + + /@chakra-ui/accordion@2.3.1(@chakra-ui/system@2.6.2)(framer-motion@10.17.9)(react@18.2.0): + resolution: {integrity: sha512-FSXRm8iClFyU+gVaXisOSEw0/4Q+qZbFRiuhIAkVU6Boj0FxAMrlo9a8AV5TuF77rgaHytCdHk0Ng+cyUijrag==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + framer-motion: '>=4.0.0' + react: '>=18' + dependencies: + '@chakra-ui/descendant': 3.1.0(react@18.2.0) + '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/transition': 2.1.0(framer-motion@10.17.9)(react@18.2.0) + framer-motion: 10.17.9(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/alert@2.2.2(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-jHg4LYMRNOJH830ViLuicjb3F+v6iriE/2G5T+Sd0Hna04nukNJ1MxUmBPE+vI22me2dIflfelu2v9wdB6Pojw==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/spinner': 2.1.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/anatomy@2.2.2: + resolution: {integrity: sha512-MV6D4VLRIHr4PkW4zMyqfrNS1mPlCTiCXwvYGtDFQYr+xHFfonhAuf9WjsSc0nyp2m0OdkSLnzmVKkZFLo25Tg==} + dev: false + + /@chakra-ui/avatar@2.3.0(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-8gKSyLfygnaotbJbDMHDiJoF38OHXUYVme4gGxZ1fLnQEdPVEaIWfH+NndIjOM0z8S+YEFnT9KyGMUtvPrBk3g==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/image': 2.1.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/breadcrumb@2.2.0(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-4cWCG24flYBxjruRi4RJREWTGF74L/KzI2CognAW/d/zWR0CjiScuJhf37Am3LFbCySP6WSoyBOtTIoTA4yLEA==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/breakpoint-utils@2.0.8: + resolution: {integrity: sha512-Pq32MlEX9fwb5j5xx8s18zJMARNHlQZH2VH1RZgfgRDpp7DcEgtRW5AInfN5CfqdHLO1dGxA7I3MqEuL5JnIsA==} + dependencies: + '@chakra-ui/shared-utils': 2.0.5 + dev: false + + /@chakra-ui/button@2.1.0(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-95CplwlRKmmUXkdEp/21VkEWgnwcx2TOBG6NfYlsuLBDHSLlo5FKIiE2oSi4zXc4TLcopGcWPNcm/NDaSC5pvA==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/spinner': 2.1.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/card@2.2.0(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-xUB/k5MURj4CtPAhdSoXZidUbm8j3hci9vnc+eZJVDqhDOShNlD6QeniQNRPRys4lWAQLCbFcrwL29C8naDi6g==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/checkbox@2.3.2(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-85g38JIXMEv6M+AcyIGLh7igNtfpAN6KGQFYxY9tBj0eWvWk4NKQxvqqyVta0bSAyIl1rixNIIezNpNWk2iO4g==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/form-control': 2.2.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/react-types': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-update-effect': 2.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/visually-hidden': 2.2.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@zag-js/focus-visible': 0.16.0 + react: 18.2.0 + dev: false + + /@chakra-ui/cli@2.4.1: + resolution: {integrity: sha512-GZZuHUA1cXJWpmYNiVTLPihvY4VhIssRl+AXgw/0IbeodTMop3jWlIioPKLAQeXu5CwvRA6iESyGjnu1V8Zykg==} + hasBin: 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.5.0 + esbuild: 0.17.19 + prettier: 2.8.8 + dev: true + + /@chakra-ui/clickable@2.1.0(react@18.2.0): + resolution: {integrity: sha512-flRA/ClPUGPYabu+/GLREZVZr9j2uyyazCAUHAdrTUEdDYCr31SVGhgh7dgKdtq23bOvAQJpIJjw/0Bs0WvbXw==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + react: 18.2.0 + dev: false + + /@chakra-ui/close-button@2.1.1(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-gnpENKOanKexswSVpVz7ojZEALl2x5qjLYNqSQGbxz+aP9sOXPfUS56ebyBrre7T7exuWGiFeRwnM0oVeGPaiw==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/color-mode@2.2.0(react@18.2.0): + resolution: {integrity: sha512-niTEA8PALtMWRI9wJ4LL0CSBDo8NBfLNp4GD6/0hstcm3IlbBHTVKxN6HwSaoNYfphDQLxCjT4yG+0BJA5tFpg==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/control-box@2.1.0(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-gVrRDyXFdMd8E7rulL0SKeoljkLQiPITFnsyMO8EFHNZ+AHt5wK4LIguYVEq88APqAGZGfHFWXr79RYrNiE3Mg==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/counter@2.1.0(react@18.2.0): + resolution: {integrity: sha512-s6hZAEcWT5zzjNz2JIWUBzRubo9la/oof1W7EKZVVfPYHERnl5e16FmBC79Yfq8p09LQ+aqFKm/etYoJMMgghw==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/number-utils': 2.0.7 + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + react: 18.2.0 + dev: false + + /@chakra-ui/css-reset@2.3.0(@emotion/react@11.11.3)(react@18.2.0): + resolution: {integrity: sha512-cQwwBy5O0jzvl0K7PLTLgp8ijqLPKyuEMiDXwYzl95seD3AoeuoCLyzZcJtVqaUZ573PiBdAbY/IlZcwDOItWg==} + peerDependencies: + '@emotion/react': '>=10.0.35' + react: '>=18' + dependencies: + '@emotion/react': 11.11.3(@types/react@18.2.47)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/descendant@3.1.0(react@18.2.0): + resolution: {integrity: sha512-VxCIAir08g5w27klLyi7PVo8BxhW4tgU/lxQyujkmi4zx7hT9ZdrcQLAted/dAa+aSIZ14S1oV0Q9lGjsAdxUQ==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/dom-utils@2.1.0: + resolution: {integrity: sha512-ZmF2qRa1QZ0CMLU8M1zCfmw29DmPNtfjR9iTo74U5FPr3i1aoAh7fbJ4qAlZ197Xw9eAW28tvzQuoVWeL5C7fQ==} + dev: false + + /@chakra-ui/editable@3.1.0(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-j2JLrUL9wgg4YA6jLlbU88370eCRyor7DZQD9lzpY95tSOXpTljeg3uF9eOmDnCs6fxp3zDWIfkgMm/ExhcGTg==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/react-types': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-focus-on-pointer-down': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-update-effect': 2.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/event-utils@2.0.8: + resolution: {integrity: sha512-IGM/yGUHS+8TOQrZGpAKOJl/xGBrmRYJrmbHfUE7zrG3PpQyXvbLDP1M+RggkCFVgHlJi2wpYIf0QtQlU0XZfw==} + dev: false + + /@chakra-ui/focus-lock@2.1.0(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-EmGx4PhWGjm4dpjRqM4Aa+rCWBxP+Rq8Uc/nAVnD4YVqkEhBkrPTpui2lnjsuxqNaZ24fIAZ10cF1hlpemte/w==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/dom-utils': 2.1.0 + react: 18.2.0 + react-focus-lock: 2.9.6(@types/react@18.2.47)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + + /@chakra-ui/form-control@2.2.0(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-wehLC1t4fafCVJ2RvJQT2jyqsAwX7KymmiGqBu7nQoQz8ApTkGABWpo/QwDh3F/dBLrouHDoOvGmYTqft3Mirw==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/react-types': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/hooks@2.2.1(react@18.2.0): + resolution: {integrity: sha512-RQbTnzl6b1tBjbDPf9zGRo9rf/pQMholsOudTxjy4i9GfTfz6kgp5ValGjQm2z7ng6Z31N1cnjZ1AlSzQ//ZfQ==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/react-utils': 2.0.12(react@18.2.0) + '@chakra-ui/utils': 2.0.15 + compute-scroll-into-view: 3.0.3 + copy-to-clipboard: 3.3.3 + react: 18.2.0 + dev: false + + /@chakra-ui/icon@3.2.0(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-xxjGLvlX2Ys4H0iHrI16t74rG9EBcpFvJ3Y3B7KMQTrnW34Kf7Da/UC8J67Gtx85mTHW020ml85SVPKORWNNKQ==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/icons@2.1.1(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-3p30hdo4LlRZTT5CwoAJq3G9fHI0wDc0pBaMHj4SUn0yomO+RcDRlzhdXqdr5cVnzax44sqXJVnf3oQG0eI+4g==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/image@2.1.0(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-bskumBYKLiLMySIWDGcz0+D9Th0jPvmX6xnRMs4o92tT3Od/bW26lahmV2a2Op2ItXeCmRMY+XxJH5Gy1i46VA==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/input@2.1.2(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-GiBbb3EqAA8Ph43yGa6Mc+kUPjh4Spmxp1Pkelr8qtudpc3p2PJOOebLpd90mcqw8UePPa+l6YhhPtp6o0irhw==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/form-control': 2.2.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/object-utils': 2.1.0 + '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/layout@2.3.1(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-nXuZ6WRbq0WdgnRgLw+QuxWAHuhDtVX8ElWqcTK+cSMFg/52eVP47czYBE5F35YhnoW2XBwfNoNgZ7+e8Z01Rg==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/breakpoint-utils': 2.0.8 + '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/object-utils': 2.1.0 + '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/lazy-utils@2.0.5: + resolution: {integrity: sha512-UULqw7FBvcckQk2n3iPO56TMJvDsNv0FKZI6PlUNJVaGsPbsYxK/8IQ60vZgaTVPtVcjY6BE+y6zg8u9HOqpyg==} + dev: false + + /@chakra-ui/live-region@2.1.0(react@18.2.0): + resolution: {integrity: sha512-ZOxFXwtaLIsXjqnszYYrVuswBhnIHHP+XIgK1vC6DePKtyK590Wg+0J0slDwThUAd4MSSIUa/nNX84x1GMphWw==} + peerDependencies: + react: '>=18' + dependencies: + react: 18.2.0 + dev: false + + /@chakra-ui/media-query@3.3.0(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-IsTGgFLoICVoPRp9ykOgqmdMotJG0CnPsKvGQeSFOB/dZfIujdVb14TYxDU4+MURXry1MhJ7LzZhv+Ml7cr8/g==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/breakpoint-utils': 2.0.8 + '@chakra-ui/react-env': 3.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/menu@2.2.1(@chakra-ui/system@2.6.2)(framer-motion@10.17.9)(react@18.2.0): + resolution: {integrity: sha512-lJS7XEObzJxsOwWQh7yfG4H8FzFPRP5hVPN/CL+JzytEINCSBvsCDHrYPQGp7jzpCi8vnTqQQGQe0f8dwnXd2g==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + framer-motion: '>=4.0.0' + react: '>=18' + dependencies: + '@chakra-ui/clickable': 2.1.0(react@18.2.0) + '@chakra-ui/descendant': 3.1.0(react@18.2.0) + '@chakra-ui/lazy-utils': 2.0.5 + '@chakra-ui/popper': 3.1.0(react@18.2.0) + '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-animation-state': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-disclosure': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-focus-effect': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-outside-click': 2.2.0(react@18.2.0) + '@chakra-ui/react-use-update-effect': 2.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/transition': 2.1.0(framer-motion@10.17.9)(react@18.2.0) + framer-motion: 10.17.9(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/modal@2.3.1(@chakra-ui/system@2.6.2)(@types/react@18.2.47)(framer-motion@10.17.9)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-TQv1ZaiJMZN+rR9DK0snx/OPwmtaGH1HbZtlYt4W4s6CzyK541fxLRTjIXfEzIGpvNW+b6VFuFjbcR78p4DEoQ==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + framer-motion: '>=4.0.0' + react: '>=18' + react-dom: '>=18' + dependencies: + '@chakra-ui/close-button': 2.1.1(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/focus-lock': 2.1.0(@types/react@18.2.47)(react@18.2.0) + '@chakra-ui/portal': 2.1.0(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/react-types': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/transition': 2.1.0(framer-motion@10.17.9)(react@18.2.0) + aria-hidden: 1.2.3 + framer-motion: 10.17.9(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.7(@types/react@18.2.47)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + + /@chakra-ui/number-input@2.1.2(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-pfOdX02sqUN0qC2ysuvgVDiws7xZ20XDIlcNhva55Jgm095xjm8eVdIBfNm3SFbSUNxyXvLTW/YQanX74tKmuA==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/counter': 2.1.0(react@18.2.0) + '@chakra-ui/form-control': 2.2.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/react-types': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-event-listener': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-interval': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-update-effect': 2.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/number-utils@2.0.7: + resolution: {integrity: sha512-yOGxBjXNvLTBvQyhMDqGU0Oj26s91mbAlqKHiuw737AXHt0aPllOthVUqQMeaYLwLCjGMg0jtI7JReRzyi94Dg==} + dev: false + + /@chakra-ui/object-utils@2.1.0: + resolution: {integrity: sha512-tgIZOgLHaoti5PYGPTwK3t/cqtcycW0owaiOXoZOcpwwX/vlVb+H1jFsQyWiiwQVPt9RkoSLtxzXamx+aHH+bQ==} + dev: false + + /@chakra-ui/pin-input@2.1.0(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-x4vBqLStDxJFMt+jdAHHS8jbh294O53CPQJoL4g228P513rHylV/uPscYUHrVJXRxsHfRztQO9k45jjTYaPRMw==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/descendant': 3.1.0(react@18.2.0) + '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/popover@2.2.1(@chakra-ui/system@2.6.2)(framer-motion@10.17.9)(react@18.2.0): + resolution: {integrity: sha512-K+2ai2dD0ljvJnlrzesCDT9mNzLifE3noGKZ3QwLqd/K34Ym1W/0aL1ERSynrcG78NKoXS54SdEzkhCZ4Gn/Zg==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + framer-motion: '>=4.0.0' + react: '>=18' + dependencies: + '@chakra-ui/close-button': 2.1.1(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/lazy-utils': 2.0.5 + '@chakra-ui/popper': 3.1.0(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/react-types': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-animation-state': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-disclosure': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-focus-effect': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-focus-on-pointer-down': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + framer-motion: 10.17.9(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/popper@3.1.0(react@18.2.0): + resolution: {integrity: sha512-ciDdpdYbeFG7og6/6J8lkTFxsSvwTdMLFkpVylAF6VNC22jssiWfquj2eyD4rJnzkRFPvIWJq8hvbfhsm+AjSg==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/react-types': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + '@popperjs/core': 2.11.8 + react: 18.2.0 + dev: false + + /@chakra-ui/portal@2.1.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-9q9KWf6SArEcIq1gGofNcFPSWEyl+MfJjEUg/un1SMlQjaROOh3zYr+6JAwvcORiX7tyHosnmWC3d3wI2aPSQg==} + peerDependencies: + react: '>=18' + react-dom: '>=18' + dependencies: + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@chakra-ui/progress@2.2.0(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-qUXuKbuhN60EzDD9mHR7B67D7p/ZqNS2Aze4Pbl1qGGZfulPW0PY8Rof32qDtttDQBkzQIzFGE8d9QpAemToIQ==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/provider@2.4.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-w0Tef5ZCJK1mlJorcSjItCSbyvVuqpvyWdxZiVQmE6fvSJR83wZof42ux0+sfWD+I7rHSfj+f9nzhNaEWClysw==} + peerDependencies: + '@emotion/react': ^11.0.0 + '@emotion/styled': ^11.0.0 + react: '>=18' + react-dom: '>=18' + dependencies: + '@chakra-ui/css-reset': 2.3.0(@emotion/react@11.11.3)(react@18.2.0) + '@chakra-ui/portal': 2.1.0(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/react-env': 3.1.0(react@18.2.0) + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/utils': 2.0.15 + '@emotion/react': 11.11.3(@types/react@18.2.47)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.3)(@types/react@18.2.47)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@chakra-ui/radio@2.1.2(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-n10M46wJrMGbonaghvSRnZ9ToTv/q76Szz284gv4QUWvyljQACcGrXIONUnQ3BIwbOfkRqSk7Xl/JgZtVfll+w==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/form-control': 2.2.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/react-types': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + '@zag-js/focus-visible': 0.16.0 + react: 18.2.0 + dev: false + + /@chakra-ui/react-children-utils@2.0.6(react@18.2.0): + resolution: {integrity: sha512-QVR2RC7QsOsbWwEnq9YduhpqSFnZGvjjGREV8ygKi8ADhXh93C8azLECCUVgRJF2Wc+So1fgxmjLcbZfY2VmBA==} + peerDependencies: + react: '>=18' + dependencies: + react: 18.2.0 + dev: false + + /@chakra-ui/react-context@2.1.0(react@18.2.0): + resolution: {integrity: sha512-iahyStvzQ4AOwKwdPReLGfDesGG+vWJfEsn0X/NoGph/SkN+HXtv2sCfYFFR9k7bb+Kvc6YfpLlSuLvKMHi2+w==} + peerDependencies: + react: '>=18' + dependencies: + react: 18.2.0 + dev: false + + /@chakra-ui/react-env@3.1.0(react@18.2.0): + resolution: {integrity: sha512-Vr96GV2LNBth3+IKzr/rq1IcnkXv+MLmwjQH6C8BRtn3sNskgDFD5vLkVXcEhagzZMCh8FR3V/bzZPojBOyNhw==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/react-types@2.0.7(react@18.2.0): + resolution: {integrity: sha512-12zv2qIZ8EHwiytggtGvo4iLT0APris7T0qaAWqzpUGS0cdUtR8W+V1BJ5Ocq+7tA6dzQ/7+w5hmXih61TuhWQ==} + peerDependencies: + react: '>=18' + dependencies: + react: 18.2.0 + dev: false + + /@chakra-ui/react-use-animation-state@2.1.0(react@18.2.0): + resolution: {integrity: sha512-CFZkQU3gmDBwhqy0vC1ryf90BVHxVN8cTLpSyCpdmExUEtSEInSCGMydj2fvn7QXsz/za8JNdO2xxgJwxpLMtg==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/dom-utils': 2.1.0 + '@chakra-ui/react-use-event-listener': 2.1.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/react-use-callback-ref@2.1.0(react@18.2.0): + resolution: {integrity: sha512-efnJrBtGDa4YaxDzDE90EnKD3Vkh5a1t3w7PhnRQmsphLy3g2UieasoKTlT2Hn118TwDjIv5ZjHJW6HbzXA9wQ==} + peerDependencies: + react: '>=18' + dependencies: + react: 18.2.0 + dev: false + + /@chakra-ui/react-use-controllable-state@2.1.0(react@18.2.0): + resolution: {integrity: sha512-QR/8fKNokxZUs4PfxjXuwl0fj/d71WPrmLJvEpCTkHjnzu7LnYvzoe2wB867IdooQJL0G1zBxl0Dq+6W1P3jpg==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/react-use-disclosure@2.1.0(react@18.2.0): + resolution: {integrity: sha512-Ax4pmxA9LBGMyEZJhhUZobg9C0t3qFE4jVF1tGBsrLDcdBeLR9fwOogIPY9Hf0/wqSlAryAimICbr5hkpa5GSw==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/react-use-event-listener@2.1.0(react@18.2.0): + resolution: {integrity: sha512-U5greryDLS8ISP69DKDsYcsXRtAdnTQT+jjIlRYZ49K/XhUR/AqVZCK5BkR1spTDmO9H8SPhgeNKI70ODuDU/Q==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/react-use-focus-effect@2.1.0(react@18.2.0): + resolution: {integrity: sha512-xzVboNy7J64xveLcxTIJ3jv+lUJKDwRM7Szwn9tNzUIPD94O3qwjV7DDCUzN2490nSYDF4OBMt/wuDBtaR3kUQ==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/dom-utils': 2.1.0 + '@chakra-ui/react-use-event-listener': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-update-effect': 2.1.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/react-use-focus-on-pointer-down@2.1.0(react@18.2.0): + resolution: {integrity: sha512-2jzrUZ+aiCG/cfanrolsnSMDykCAbv9EK/4iUyZno6BYb3vziucmvgKuoXbMPAzWNtwUwtuMhkby8rc61Ue+Lg==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/react-use-event-listener': 2.1.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/react-use-interval@2.1.0(react@18.2.0): + resolution: {integrity: sha512-8iWj+I/+A0J08pgEXP1J1flcvhLBHkk0ln7ZvGIyXiEyM6XagOTJpwNhiu+Bmk59t3HoV/VyvyJTa+44sEApuw==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/react-use-latest-ref@2.1.0(react@18.2.0): + resolution: {integrity: sha512-m0kxuIYqoYB0va9Z2aW4xP/5b7BzlDeWwyXCH6QpT2PpW3/281L3hLCm1G0eOUcdVlayqrQqOeD6Mglq+5/xoQ==} + peerDependencies: + react: '>=18' + dependencies: + react: 18.2.0 + dev: false + + /@chakra-ui/react-use-merge-refs@2.1.0(react@18.2.0): + resolution: {integrity: sha512-lERa6AWF1cjEtWSGjxWTaSMvneccnAVH4V4ozh8SYiN9fSPZLlSG3kNxfNzdFvMEhM7dnP60vynF7WjGdTgQbQ==} + peerDependencies: + react: '>=18' + dependencies: + react: 18.2.0 + dev: false + + /@chakra-ui/react-use-outside-click@2.2.0(react@18.2.0): + resolution: {integrity: sha512-PNX+s/JEaMneijbgAM4iFL+f3m1ga9+6QK0E5Yh4s8KZJQ/bLwZzdhMz8J/+mL+XEXQ5J0N8ivZN28B82N1kNw==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/react-use-pan-event@2.1.0(react@18.2.0): + resolution: {integrity: sha512-xmL2qOHiXqfcj0q7ZK5s9UjTh4Gz0/gL9jcWPA6GVf+A0Od5imEDa/Vz+533yQKWiNSm1QGrIj0eJAokc7O4fg==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/event-utils': 2.0.8 + '@chakra-ui/react-use-latest-ref': 2.1.0(react@18.2.0) + framesync: 6.1.2 + react: 18.2.0 + dev: false + + /@chakra-ui/react-use-previous@2.1.0(react@18.2.0): + resolution: {integrity: sha512-pjxGwue1hX8AFcmjZ2XfrQtIJgqbTF3Qs1Dy3d1krC77dEsiCUbQ9GzOBfDc8pfd60DrB5N2tg5JyHbypqh0Sg==} + peerDependencies: + react: '>=18' + dependencies: + react: 18.2.0 + dev: false + + /@chakra-ui/react-use-safe-layout-effect@2.1.0(react@18.2.0): + resolution: {integrity: sha512-Knbrrx/bcPwVS1TorFdzrK/zWA8yuU/eaXDkNj24IrKoRlQrSBFarcgAEzlCHtzuhufP3OULPkELTzz91b0tCw==} + peerDependencies: + react: '>=18' + dependencies: + react: 18.2.0 + dev: false + + /@chakra-ui/react-use-size@2.1.0(react@18.2.0): + resolution: {integrity: sha512-tbLqrQhbnqOjzTaMlYytp7wY8BW1JpL78iG7Ru1DlV4EWGiAmXFGvtnEt9HftU0NJ0aJyjgymkxfVGI55/1Z4A==} + peerDependencies: + react: '>=18' + dependencies: + '@zag-js/element-size': 0.10.5 + react: 18.2.0 + dev: false + + /@chakra-ui/react-use-timeout@2.1.0(react@18.2.0): + resolution: {integrity: sha512-cFN0sobKMM9hXUhyCofx3/Mjlzah6ADaEl/AXl5Y+GawB5rgedgAcu2ErAgarEkwvsKdP6c68CKjQ9dmTQlJxQ==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/react-use-update-effect@2.1.0(react@18.2.0): + resolution: {integrity: sha512-ND4Q23tETaR2Qd3zwCKYOOS1dfssojPLJMLvUtUbW5M9uW1ejYWgGUobeAiOVfSplownG8QYMmHTP86p/v0lbA==} + peerDependencies: + react: '>=18' + dependencies: + react: 18.2.0 + dev: false + + /@chakra-ui/react-utils@2.0.12(react@18.2.0): + resolution: {integrity: sha512-GbSfVb283+YA3kA8w8xWmzbjNWk14uhNpntnipHCftBibl0lxtQ9YqMFQLwuFOO0U2gYVocszqqDWX+XNKq9hw==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/utils': 2.0.15 + react: 18.2.0 + dev: false + + /@chakra-ui/react@2.8.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(@types/react@18.2.47)(framer-motion@10.17.9)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Hn0moyxxyCDKuR9ywYpqgX8dvjqwu9ArwpIb9wHNYjnODETjLwazgNIliCVBRcJvysGRiV51U2/JtJVrpeCjUQ==} + peerDependencies: + '@emotion/react': ^11.0.0 + '@emotion/styled': ^11.0.0 + framer-motion: '>=4.0.0' + react: '>=18' + react-dom: '>=18' + dependencies: + '@chakra-ui/accordion': 2.3.1(@chakra-ui/system@2.6.2)(framer-motion@10.17.9)(react@18.2.0) + '@chakra-ui/alert': 2.2.2(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/avatar': 2.3.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/breadcrumb': 2.2.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/button': 2.1.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/card': 2.2.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/checkbox': 2.3.2(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/close-button': 2.1.1(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/control-box': 2.1.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/counter': 2.1.0(react@18.2.0) + '@chakra-ui/css-reset': 2.3.0(@emotion/react@11.11.3)(react@18.2.0) + '@chakra-ui/editable': 3.1.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/focus-lock': 2.1.0(@types/react@18.2.47)(react@18.2.0) + '@chakra-ui/form-control': 2.2.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/hooks': 2.2.1(react@18.2.0) + '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/image': 2.1.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/input': 2.1.2(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/layout': 2.3.1(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/live-region': 2.1.0(react@18.2.0) + '@chakra-ui/media-query': 3.3.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/menu': 2.2.1(@chakra-ui/system@2.6.2)(framer-motion@10.17.9)(react@18.2.0) + '@chakra-ui/modal': 2.3.1(@chakra-ui/system@2.6.2)(@types/react@18.2.47)(framer-motion@10.17.9)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/number-input': 2.1.2(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/pin-input': 2.1.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/popover': 2.2.1(@chakra-ui/system@2.6.2)(framer-motion@10.17.9)(react@18.2.0) + '@chakra-ui/popper': 3.1.0(react@18.2.0) + '@chakra-ui/portal': 2.1.0(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/progress': 2.2.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/provider': 2.4.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/radio': 2.1.2(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/react-env': 3.1.0(react@18.2.0) + '@chakra-ui/select': 2.1.2(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/skeleton': 2.1.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/skip-nav': 2.1.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/slider': 2.1.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/spinner': 2.1.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/stat': 2.1.1(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/stepper': 2.3.1(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/styled-system': 2.9.2 + '@chakra-ui/switch': 2.1.2(@chakra-ui/system@2.6.2)(framer-motion@10.17.9)(react@18.2.0) + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/table': 2.1.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/tabs': 3.0.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/tag': 3.1.1(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/textarea': 2.1.2(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/theme': 3.3.1(@chakra-ui/styled-system@2.9.2) + '@chakra-ui/theme-utils': 2.0.21 + '@chakra-ui/toast': 7.0.2(@chakra-ui/system@2.6.2)(framer-motion@10.17.9)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/tooltip': 2.3.1(@chakra-ui/system@2.6.2)(framer-motion@10.17.9)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/transition': 2.1.0(framer-motion@10.17.9)(react@18.2.0) + '@chakra-ui/utils': 2.0.15 + '@chakra-ui/visually-hidden': 2.2.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@emotion/react': 11.11.3(@types/react@18.2.47)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.3)(@types/react@18.2.47)(react@18.2.0) + framer-motion: 10.17.9(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + + /@chakra-ui/select@2.1.2(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-ZwCb7LqKCVLJhru3DXvKXpZ7Pbu1TDZ7N0PdQ0Zj1oyVLJyrpef1u9HR5u0amOpqcH++Ugt0f5JSmirjNlctjA==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/form-control': 2.2.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/shared-utils@2.0.5: + resolution: {integrity: sha512-4/Wur0FqDov7Y0nCXl7HbHzCg4aq86h+SXdoUeuCMD3dSj7dpsVnStLYhng1vxvlbUnLpdF4oz5Myt3i/a7N3Q==} + dev: false + + /@chakra-ui/skeleton@2.1.0(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-JNRuMPpdZGd6zFVKjVQ0iusu3tXAdI29n4ZENYwAJEMf/fN0l12sVeirOxkJ7oEL0yOx2AgEYFSKdbcAgfUsAQ==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/media-query': 3.3.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/react-use-previous': 2.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/skip-nav@2.1.0(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-Hk+FG+vadBSH0/7hwp9LJnLjkO0RPGnx7gBJWI4/SpoJf3e4tZlWYtwGj0toYY4aGKl93jVghuwGbDBEMoHDug==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/slider@2.1.0(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-lUOBcLMCnFZiA/s2NONXhELJh6sY5WtbRykPtclGfynqqOo47lwWJx+VP7xaeuhDOPcWSSecWc9Y1BfPOCz9cQ==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/number-utils': 2.0.7 + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/react-types': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-callback-ref': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-latest-ref': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-pan-event': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-size': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-update-effect': 2.1.0(react@18.2.0) + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/spinner@2.1.0(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-hczbnoXt+MMv/d3gE+hjQhmkzLiKuoTo42YhUG7Bs9OSv2lg1fZHW1fGNRFP3wTi6OIbD044U1P9HK+AOgFH3g==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/stat@2.1.1(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-LDn0d/LXQNbAn2KaR3F1zivsZCewY4Jsy1qShmfBMKwn6rI8yVlbvu6SiA3OpHS0FhxbsZxQI6HefEoIgtqY6Q==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/stepper@2.3.1(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-ky77lZbW60zYkSXhYz7kbItUpAQfEdycT0Q4bkHLxfqbuiGMf8OmgZOQkOB9uM4v0zPwy2HXhe0vq4Dd0xa55Q==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/styled-system@2.9.2: + resolution: {integrity: sha512-To/Z92oHpIE+4nk11uVMWqo2GGRS86coeMmjxtpnErmWRdLcp1WVCVRAvn+ZwpLiNR+reWFr2FFqJRsREuZdAg==} + dependencies: + '@chakra-ui/shared-utils': 2.0.5 + csstype: 3.1.3 + lodash.mergewith: 4.6.2 + dev: false + + /@chakra-ui/switch@2.1.2(@chakra-ui/system@2.6.2)(framer-motion@10.17.9)(react@18.2.0): + resolution: {integrity: sha512-pgmi/CC+E1v31FcnQhsSGjJnOE2OcND4cKPyTE+0F+bmGm48Q/b5UmKD9Y+CmZsrt/7V3h8KNczowupfuBfIHA==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + framer-motion: '>=4.0.0' + react: '>=18' + dependencies: + '@chakra-ui/checkbox': 2.3.2(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + framer-motion: 10.17.9(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/system@2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0): + resolution: {integrity: sha512-EGtpoEjLrUu4W1fHD+a62XR+hzC5YfsWm+6lO0Kybcga3yYEij9beegO0jZgug27V+Rf7vns95VPVP6mFd/DEQ==} + peerDependencies: + '@emotion/react': ^11.0.0 + '@emotion/styled': ^11.0.0 + react: '>=18' + dependencies: + '@chakra-ui/color-mode': 2.2.0(react@18.2.0) + '@chakra-ui/object-utils': 2.1.0 + '@chakra-ui/react-utils': 2.0.12(react@18.2.0) + '@chakra-ui/styled-system': 2.9.2 + '@chakra-ui/theme-utils': 2.0.21 + '@chakra-ui/utils': 2.0.15 + '@emotion/react': 11.11.3(@types/react@18.2.47)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.3)(@types/react@18.2.47)(react@18.2.0) + react: 18.2.0 + react-fast-compare: 3.2.2 + dev: false + + /@chakra-ui/table@2.1.0(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-o5OrjoHCh5uCLdiUb0Oc0vq9rIAeHSIRScc2ExTC9Qg/uVZl2ygLrjToCaKfaaKl1oQexIeAcZDKvPG8tVkHyQ==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/tabs@3.0.0(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-6Mlclp8L9lqXmsGWF5q5gmemZXOiOYuh0SGT/7PgJVNPz3LXREXlXg2an4MBUD8W5oTkduCX+3KTMCwRrVrDYw==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/clickable': 2.1.0(react@18.2.0) + '@chakra-ui/descendant': 3.1.0(react@18.2.0) + '@chakra-ui/lazy-utils': 2.0.5 + '@chakra-ui/react-children-utils': 2.0.6(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-controllable-state': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-safe-layout-effect': 2.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/tag@3.1.1(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-Bdel79Dv86Hnge2PKOU+t8H28nm/7Y3cKd4Kfk9k3lOpUh4+nkSGe58dhRzht59lEqa4N9waCgQiBdkydjvBXQ==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/textarea@2.1.2(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-ip7tvklVCZUb2fOHDb23qPy/Fr2mzDOGdkrpbNi50hDCiV4hFX02jdQJdi3ydHZUyVgZVBKPOJ+lT9i7sKA2wA==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/form-control': 2.2.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/theme-tools@2.1.2(@chakra-ui/styled-system@2.9.2): + resolution: {integrity: sha512-Qdj8ajF9kxY4gLrq7gA+Azp8CtFHGO9tWMN2wfF9aQNgG9AuMhPrUzMq9AMQ0MXiYcgNq/FD3eegB43nHVmXVA==} + peerDependencies: + '@chakra-ui/styled-system': '>=2.0.0' + dependencies: + '@chakra-ui/anatomy': 2.2.2 + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/styled-system': 2.9.2 + color2k: 2.0.3 + dev: false + + /@chakra-ui/theme-utils@2.0.21: + resolution: {integrity: sha512-FjH5LJbT794r0+VSCXB3lT4aubI24bLLRWB+CuRKHijRvsOg717bRdUN/N1fEmEpFnRVrbewttWh/OQs0EWpWw==} + dependencies: + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/styled-system': 2.9.2 + '@chakra-ui/theme': 3.3.1(@chakra-ui/styled-system@2.9.2) + lodash.mergewith: 4.6.2 + dev: false + + /@chakra-ui/theme@3.3.1(@chakra-ui/styled-system@2.9.2): + resolution: {integrity: sha512-Hft/VaT8GYnItGCBbgWd75ICrIrIFrR7lVOhV/dQnqtfGqsVDlrztbSErvMkoPKt0UgAkd9/o44jmZ6X4U2nZQ==} + peerDependencies: + '@chakra-ui/styled-system': '>=2.8.0' + dependencies: + '@chakra-ui/anatomy': 2.2.2 + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/styled-system': 2.9.2 + '@chakra-ui/theme-tools': 2.1.2(@chakra-ui/styled-system@2.9.2) + dev: false + + /@chakra-ui/toast@7.0.2(@chakra-ui/system@2.6.2)(framer-motion@10.17.9)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-yvRP8jFKRs/YnkuE41BVTq9nB2v/KDRmje9u6dgDmE5+1bFt3bwjdf9gVbif4u5Ve7F7BGk5E093ARRVtvLvXA==} + peerDependencies: + '@chakra-ui/system': 2.6.2 + framer-motion: '>=4.0.0' + react: '>=18' + react-dom: '>=18' + dependencies: + '@chakra-ui/alert': 2.2.2(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/close-button': 2.1.1(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/portal': 2.1.0(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-timeout': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-update-effect': 2.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/styled-system': 2.9.2 + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + '@chakra-ui/theme': 3.3.1(@chakra-ui/styled-system@2.9.2) + framer-motion: 10.17.9(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@chakra-ui/tooltip@2.3.1(@chakra-ui/system@2.6.2)(framer-motion@10.17.9)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Rh39GBn/bL4kZpuEMPPRwYNnccRCL+w9OqamWHIB3Qboxs6h8cOyXfIdGxjo72lvhu1QI/a4KFqkM3St+WfC0A==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + framer-motion: '>=4.0.0' + react: '>=18' + react-dom: '>=18' + dependencies: + '@chakra-ui/dom-utils': 2.1.0 + '@chakra-ui/popper': 3.1.0(react@18.2.0) + '@chakra-ui/portal': 2.1.0(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/react-types': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-disclosure': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-event-listener': 2.1.0(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + framer-motion: 10.17.9(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@chakra-ui/transition@2.1.0(framer-motion@10.17.9)(react@18.2.0): + resolution: {integrity: sha512-orkT6T/Dt+/+kVwJNy7zwJ+U2xAZ3EU7M3XCs45RBvUnZDr/u9vdmaM/3D/rOpmQJWgQBwKPJleUXrYWUagEDQ==} + peerDependencies: + framer-motion: '>=4.0.0' + react: '>=18' + dependencies: + '@chakra-ui/shared-utils': 2.0.5 + framer-motion: 10.17.9(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@chakra-ui/utils@2.0.15: + resolution: {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 + dev: false + + /@chakra-ui/visually-hidden@2.2.0(@chakra-ui/system@2.6.2)(react@18.2.0): + resolution: {integrity: sha512-KmKDg01SrQ7VbTD3+cPWf/UfpF5MSwm3v7MWi0n5t8HnnadT13MF0MJCDSXbBWnzLv1ZKJ6zlyAOeARWX+DpjQ==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + react: '>=18' + dependencies: + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + react: 18.2.0 + dev: false + + /@colors/colors@1.5.0: + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + requiresBuild: true + dev: true + optional: true + + /@dagrejs/graphlib@2.1.13: + resolution: {integrity: sha512-calbMa7Gcyo+/t23XBaqQqon8LlgE9regey4UVoikoenKBXvUnCUL3s9RP6USCxttfr0XWVICtYUuKMdehKqMw==} + engines: {node: '>17.0.0'} + dev: false + + /@dependents/detective-less@3.0.2: + resolution: {integrity: sha512-1YUvQ+e0eeTWAHoN8Uz2x2U37jZs6IGutiIE5LXId7cxfUGhtZjzxE06FdUiuiRrW+UE0vNCdSNPH2lY4dQCOQ==} + engines: {node: '>=12'} + dependencies: + gonzales-pe: 4.3.0 + node-source-walk: 5.0.2 + dev: true + + /@discoveryjs/json-ext@0.5.7: + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + dev: true + + /@dnd-kit/accessibility@3.1.0(react@18.2.0): + resolution: {integrity: sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + tslib: 2.6.2 + dev: false + + /@dnd-kit/core@6.1.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@dnd-kit/accessibility': 3.1.0(react@18.2.0) + '@dnd-kit/utilities': 3.2.2(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + dev: false + + /@dnd-kit/utilities@3.2.2(react@18.2.0): + resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + tslib: 2.6.2 + dev: false + + /@emotion/babel-plugin@11.11.0: + resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} + dependencies: + '@babel/helper-module-imports': 7.22.15 + '@babel/runtime': 7.23.6 + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/serialize': 1.1.3 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + dev: false + + /@emotion/cache@11.11.0: + resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} + dependencies: + '@emotion/memoize': 0.8.1 + '@emotion/sheet': 1.2.2 + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + stylis: 4.2.0 + dev: false + + /@emotion/hash@0.9.1: + resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} + dev: false + + /@emotion/is-prop-valid@0.8.8: + resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} + requiresBuild: true + dependencies: + '@emotion/memoize': 0.7.4 + dev: false + optional: true + + /@emotion/is-prop-valid@1.2.1: + resolution: {integrity: sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==} + dependencies: + '@emotion/memoize': 0.8.1 + dev: false + + /@emotion/memoize@0.7.4: + resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} + requiresBuild: true + dev: false + optional: true + + /@emotion/memoize@0.8.1: + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + dev: false + + /@emotion/react@11.11.3(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.6 + '@emotion/babel-plugin': 11.11.0 + '@emotion/cache': 11.11.0 + '@emotion/serialize': 1.1.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) + '@emotion/utils': 1.2.1 + '@emotion/weak-memoize': 0.3.1 + '@types/react': 18.2.47 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + dev: false + + /@emotion/serialize@1.1.3: + resolution: {integrity: sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==} + dependencies: + '@emotion/hash': 0.9.1 + '@emotion/memoize': 0.8.1 + '@emotion/unitless': 0.8.1 + '@emotion/utils': 1.2.1 + csstype: 3.1.3 + dev: false + + /@emotion/sheet@1.2.2: + resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} + dev: false + + /@emotion/styled@11.11.0(@emotion/react@11.11.3)(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==} + peerDependencies: + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.6 + '@emotion/babel-plugin': 11.11.0 + '@emotion/is-prop-valid': 1.2.1 + '@emotion/react': 11.11.3(@types/react@18.2.47)(react@18.2.0) + '@emotion/serialize': 1.1.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) + '@emotion/utils': 1.2.1 + '@types/react': 18.2.47 + react: 18.2.0 + dev: false + + /@emotion/unitless@0.8.1: + resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + dev: false + + /@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0): + resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + + /@emotion/utils@1.2.1: + resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} + dev: false + + /@emotion/weak-memoize@0.3.1: + resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} + dev: false + + /@esbuild/aix-ppc64@0.19.11: + resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.17.19: + resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.19.11: + resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.17.19: + resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.19.11: + resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.17.19: + resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.19.11: + resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.17.19: + resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.19.11: + resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.17.19: + resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.19.11: + resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.17.19: + resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.19.11: + resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.17.19: + resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.19.11: + resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.17.19: + resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.19.11: + resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.17.19: + resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.19.11: + resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.17.19: + resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.19.11: + resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.17.19: + resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.19.11: + resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.17.19: + resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.19.11: + resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.17.19: + resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.19.11: + resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.17.19: + resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.19.11: + resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.17.19: + resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.19.11: + resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.17.19: + resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.19.11: + resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.17.19: + resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.19.11: + resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.17.19: + resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.19.11: + resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.17.19: + resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.19.11: + resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.17.19: + resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.19.11: + resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.17.19: + resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.19.11: + resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.17.19: + resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.19.11: + resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.56.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.56.0: + resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@fal-works/esbuild-plugin-global-externals@2.1.2: + resolution: {integrity: sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==} + dev: true + + /@fastify/busboy@2.1.0: + resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==} + engines: {node: '>=14'} + dev: true + + /@floating-ui/core@1.5.2: + resolution: {integrity: sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==} + dependencies: + '@floating-ui/utils': 0.1.6 + dev: false + + /@floating-ui/core@1.5.3: + resolution: {integrity: sha512-O0WKDOo0yhJuugCx6trZQj5jVJ9yR0ystG2JaNAemYUWce+pmM6WUEFIibnWyEJKdrDxhm75NoSRME35FNaM/Q==} + dependencies: + '@floating-ui/utils': 0.2.1 + dev: true + + /@floating-ui/dom@1.5.3: + resolution: {integrity: sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==} + dependencies: + '@floating-ui/core': 1.5.2 + '@floating-ui/utils': 0.1.6 + dev: false + + /@floating-ui/dom@1.5.4: + resolution: {integrity: sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ==} + dependencies: + '@floating-ui/core': 1.5.3 + '@floating-ui/utils': 0.2.1 + dev: true + + /@floating-ui/react-dom@2.0.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-UsBK30Bg+s6+nsgblXtZmwHhgS2vmbuQK22qgt2pTQM6M3X6H1+cQcLXqgRY3ihVLcZJE6IvqDQozhsnIVqK/Q==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@floating-ui/dom': 1.5.4 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /@floating-ui/utils@0.1.6: + resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==} + dev: false + + /@floating-ui/utils@0.2.1: + resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} + dev: true + + /@fontsource-variable/inter@5.0.16: + resolution: {integrity: sha512-k+BUNqksTL+AN+o+OV7ILeiE9B5M5X+/jA7LWvCwjbV9ovXTqZyKRhA/x7uYv/ml8WQ0XNLBM7cRFIx4jW0/hg==} + dev: false + + /@humanwhocodes/config-array@0.11.13: + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@2.0.1: + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + dev: true + + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: true + + /@istanbuljs/load-nyc-config@1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + dev: true + + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + dev: true + + /@jest/transform@29.7.0: + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.23.7 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.20 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.5 + pirates: 4.0.6 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/types@27.5.1: + resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.10.7 + '@types/yargs': 16.0.9 + chalk: 4.1.2 + dev: true + + /@jest/types@29.6.3: + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.10.7 + '@types/yargs': 17.0.32 + chalk: 4.1.2 + dev: true + + /@joshwooding/vite-plugin-react-docgen-typescript@0.3.0(typescript@5.3.3)(vite@5.0.11): + resolution: {integrity: sha512-2D6y7fNvFmsLmRt6UCOFJPvFoPMJGT0Uh1Wg0RaigUp7kdQPs6yYn8Dmx6GZkOH/NW0yMTwRz/p0SRMMRo50vA==} + peerDependencies: + typescript: '>= 4.3.x' + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + glob: 7.2.3 + glob-promise: 4.2.2(glob@7.2.3) + magic-string: 0.27.0 + react-docgen-typescript: 2.2.2(typescript@5.3.3) + typescript: 5.3.3 + vite: 5.0.11(@types/node@20.10.7) + dev: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.20 + dev: true + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.20: + resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@juggle/resize-observer@3.4.0: + resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} + dev: true + + /@mantine/form@6.0.21(react@18.2.0): + resolution: {integrity: sha512-d4tlxyZic7MSDnaPx/WliCX1sRFDkUd2nxx4MxxO2T4OSek0YDqTlSBCxeoveu60P+vrQQN5rbbsVsaOJBe4SQ==} + peerDependencies: + react: '>=16.8.0' + dependencies: + fast-deep-equal: 3.1.3 + klona: 2.0.6 + react: 18.2.0 + dev: false + + /@mdx-js/react@2.3.0(react@18.2.0): + resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} + peerDependencies: + react: '>=16' + dependencies: + '@types/mdx': 2.0.10 + '@types/react': 18.2.47 + react: 18.2.0 + dev: true + + /@microsoft/api-extractor-model@7.28.3(@types/node@20.10.7): + resolution: {integrity: sha512-wT/kB2oDbdZXITyDh2SQLzaWwTOFbV326fP0pUwNW00WeliARs0qjmXBWmGWardEzp2U3/axkO3Lboqun6vrig==} + dependencies: + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.62.0(@types/node@20.10.7) + transitivePeerDependencies: + - '@types/node' + dev: true + + /@microsoft/api-extractor@7.39.0(@types/node@20.10.7): + resolution: {integrity: sha512-PuXxzadgnvp+wdeZFPonssRAj/EW4Gm4s75TXzPk09h3wJ8RS3x7typf95B4vwZRrPTQBGopdUl+/vHvlPdAcg==} + hasBin: true + dependencies: + '@microsoft/api-extractor-model': 7.28.3(@types/node@20.10.7) + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.62.0(@types/node@20.10.7) + '@rushstack/rig-package': 0.5.1 + '@rushstack/ts-command-line': 4.17.1 + colors: 1.2.5 + lodash: 4.17.21 + resolve: 1.22.8 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.3.3 + transitivePeerDependencies: + - '@types/node' + dev: true + + /@microsoft/tsdoc-config@0.16.2: + resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} + dependencies: + '@microsoft/tsdoc': 0.14.2 + ajv: 6.12.6 + jju: 1.4.0 + resolve: 1.19.0 + dev: true + + /@microsoft/tsdoc@0.14.2: + resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + dev: true + + /@nanostores/react@0.7.1(nanostores@0.9.5)(react@18.2.0): + resolution: {integrity: sha512-EXQg9N4MdI4eJQz/AZLIx3hxQ6BuBmV4Q55bCd5YCSgEOAW7tGTsIZxpRXxvxLXzflNvHTBvfrDNY38TlSVBkQ==} + engines: {node: ^16.0.0 || ^18.0.0 || >=20.0.0} + peerDependencies: + nanostores: ^0.9.0 + react: '>=18.0.0' + dependencies: + nanostores: 0.9.5 + react: 18.2.0 + dev: false + + /@ndelangen/get-tarball@3.0.9: + resolution: {integrity: sha512-9JKTEik4vq+yGosHYhZ1tiH/3WpUS0Nh0kej4Agndhox8pAdWhEx5knFVRcb/ya9knCRCs1rPxNrSXTDdfVqpA==} + dependencies: + gunzip-maybe: 1.4.2 + pump: 3.0.0 + tar-fs: 2.1.1 + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.16.0 + dev: true + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: true + optional: true + + /@popperjs/core@2.11.8: + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + dev: false + + /@radix-ui/number@1.0.1: + resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} + dependencies: + '@babel/runtime': 7.23.7 + dev: true + + /@radix-ui/primitive@1.0.1: + resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} + dependencies: + '@babel/runtime': 7.23.7 + dev: true + + /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@types/react': 18.2.47 + react: 18.2.0 + dev: true + + /@radix-ui/react-context@1.0.1(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@types/react': 18.2.47 + react: 18.2.0 + dev: true + + /@radix-ui/react-direction@1.0.1(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@types/react': 18.2.47 + react: 18.2.0 + dev: true + + /@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@types/react': 18.2.47 + react: 18.2.0 + dev: true + + /@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /@radix-ui/react-id@1.0.1(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + react: 18.2.0 + dev: true + + /@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@floating-ui/react-dom': 2.0.5(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/rect': 1.0.1 + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /@radix-ui/react-select@1.2.2(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/number': 1.0.1 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + aria-hidden: 1.2.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.47)(react@18.2.0) + dev: true + + /@radix-ui/react-separator@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /@radix-ui/react-slot@1.0.2(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + react: 18.2.0 + dev: true + + /@radix-ui/react-toggle-group@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Uaj/M/cMyiyT9Bx6fOZO0SAG4Cls0GptBWiBmBxofmDbNVnYYoyRWj/2M/6VCi/7qcXFWnHhRUfdfZFvvkuu8A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-toggle': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /@radix-ui/react-toggle@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /@radix-ui/react-toolbar@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-tBgmM/O7a07xbaEkYJWYTXkIdU/1pW4/KZORR43toC/4XWyBCURK0ei9kMUdp+gTPPKBgYLxXmRSH1EVcIDp8Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-separator': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-toggle-group': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@types/react': 18.2.47 + react: 18.2.0 + dev: true + + /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + react: 18.2.0 + dev: true + + /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + react: 18.2.0 + dev: true + + /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@types/react': 18.2.47 + react: 18.2.0 + dev: true + + /@radix-ui/react-use-previous@1.0.1(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@types/react': 18.2.47 + react: 18.2.0 + dev: true + + /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/rect': 1.0.1 + '@types/react': 18.2.47 + react: 18.2.0 + dev: true + + /@radix-ui/react-use-size@1.0.1(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.47)(react@18.2.0) + '@types/react': 18.2.47 + react: 18.2.0 + dev: true + + /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.23.7 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.47 + '@types/react-dom': 18.2.18 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /@radix-ui/rect@1.0.1: + resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} + dependencies: + '@babel/runtime': 7.23.7 + dev: true + + /@reactflow/background@11.3.6(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-06FPlSUOOMALEEs+2PqPAbpqmL7WDjrkbG2UsDr2d6mbcDDhHiV4tu9FYoz44SQvXo7ma9VRotlsaR4OiRcYsg==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + dependencies: + '@reactflow/core': 11.10.1(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + classcat: 5.0.4 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + zustand: 4.4.7(@types/react@18.2.47)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - immer + dev: false + + /@reactflow/controls@11.2.6(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-4QHT92/ACVlZkvV+Hq44bAPV8WbMhkJl+/J0EbXcqQ1+an7cWJsF84eeelJw7R5J76RoaSSpKdsWsL2v7HAVlw==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + dependencies: + '@reactflow/core': 11.10.1(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + classcat: 5.0.4 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + zustand: 4.4.7(@types/react@18.2.47)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - immer + dev: false + + /@reactflow/core@11.10.1(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-GIh3usY1W3eVobx//OO9+Cwm+5evQBBdPGxDaeXwm25UqPMWRI240nXQA5F/5gL5Mwpf0DUC7DR2EmrKNQy+Rw==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + dependencies: + '@types/d3': 7.4.3 + '@types/d3-drag': 3.0.7 + '@types/d3-selection': 3.0.10 + '@types/d3-zoom': 3.0.8 + classcat: 5.0.4 + d3-drag: 3.0.0 + d3-selection: 3.0.0 + d3-zoom: 3.0.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + zustand: 4.4.7(@types/react@18.2.47)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - immer + dev: false + + /@reactflow/minimap@11.7.6(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-kJEtyeQkTZYViLGebVWHVUJROMAGcvejvT+iX4DqKnFb5yK8E8LWlXQpRx2FrL9gDy80mJJaciy7IxnnQKE1bg==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + dependencies: + '@reactflow/core': 11.10.1(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@types/d3-selection': 3.0.10 + '@types/d3-zoom': 3.0.8 + classcat: 5.0.4 + d3-selection: 3.0.0 + d3-zoom: 3.0.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + zustand: 4.4.7(@types/react@18.2.47)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - immer + dev: false + + /@reactflow/node-resizer@2.2.6(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-1Xb6q97uP7hRBLpog9sRCNfnsHdDgFRGEiU+lQqGgPEAeYwl4nRjWa/sXwH6ajniKxBhGEvrdzOgEFn6CRMcpQ==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + dependencies: + '@reactflow/core': 11.10.1(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + classcat: 5.0.4 + d3-drag: 3.0.0 + d3-selection: 3.0.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + zustand: 4.4.7(@types/react@18.2.47)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - immer + dev: false + + /@reactflow/node-toolbar@1.3.6(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-JXDEuZ0wKjZ8z7qK2bIst0eZPzNyVEsiHL0e93EyuqT4fA9icoyE0fLq2ryNOOp7MXgId1h7LusnH6ta45F0yQ==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + dependencies: + '@reactflow/core': 11.10.1(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + classcat: 5.0.4 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + zustand: 4.4.7(@types/react@18.2.47)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - immer + dev: false + + /@reduxjs/toolkit@2.0.1(react-redux@9.0.4)(react@18.2.0): + resolution: {integrity: sha512-fxIjrR9934cmS8YXIGd9e7s1XRsEU++aFc9DVNMFMRTM5Vtsg2DCRMj21eslGtDt43IUf9bJL3h5bwUlZleibA==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18 + react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0 + peerDependenciesMeta: + react: + optional: true + react-redux: + optional: true + dependencies: + immer: 10.0.3 + react: 18.2.0 + react-redux: 9.0.4(@types/react@18.2.47)(react@18.2.0)(redux@5.0.1) + redux: 5.0.1 + redux-thunk: 3.1.0(redux@5.0.1) + reselect: 5.0.1(patch_hash=kvbgwzjyy4x4fnh7znyocvb75q) + dev: false + + /@roarr/browser-log-writer@1.3.0: + resolution: {integrity: sha512-RTzjxrm0CpTSoESmsO6104VymAksDS/yJEkaZrL/OLfbM6q+J+jLRBLtJxhJHSY03pBWOEE3wRh+pVwfKtBPqg==} + engines: {node: '>=12.0'} + dependencies: + boolean: 3.2.0 + globalthis: 1.0.3 + liqe: 3.8.0 + dev: false + + /@rollup/pluginutils@4.2.1: + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: true + + /@rollup/pluginutils@5.1.0: + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: true + + /@rollup/rollup-android-arm-eabi@4.9.4: + resolution: {integrity: sha512-ub/SN3yWqIv5CWiAZPHVS1DloyZsJbtXmX4HxUTIpS0BHm9pW5iYBo2mIZi+hE3AeiTzHz33blwSnhdUo+9NpA==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm64@4.9.4: + resolution: {integrity: sha512-ehcBrOR5XTl0W0t2WxfTyHCR/3Cq2jfb+I4W+Ch8Y9b5G+vbAecVv0Fx/J1QKktOrgUYsIKxWAKgIpvw56IFNA==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.9.4: + resolution: {integrity: sha512-1fzh1lWExwSTWy8vJPnNbNM02WZDS8AW3McEOb7wW+nPChLKf3WG2aG7fhaUmfX5FKw9zhsF5+MBwArGyNM7NA==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.9.4: + resolution: {integrity: sha512-Gc6cukkF38RcYQ6uPdiXi70JB0f29CwcQ7+r4QpfNpQFVHXRd0DfWFidoGxjSx1DwOETM97JPz1RXL5ISSB0pA==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.9.4: + resolution: {integrity: sha512-g21RTeFzoTl8GxosHbnQZ0/JkuFIB13C3T7Y0HtKzOXmoHhewLbVTFBQZu+z5m9STH6FZ7L/oPgU4Nm5ErN2fw==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.9.4: + resolution: {integrity: sha512-TVYVWD/SYwWzGGnbfTkrNpdE4HON46orgMNHCivlXmlsSGQOx/OHHYiQcMIOx38/GWgwr/po2LBn7wypkWw/Mg==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.9.4: + resolution: {integrity: sha512-XcKvuendwizYYhFxpvQ3xVpzje2HHImzg33wL9zvxtj77HvPStbSGI9czrdbfrf8DGMcNNReH9pVZv8qejAQ5A==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.9.4: + resolution: {integrity: sha512-LFHS/8Q+I9YA0yVETyjonMJ3UA+DczeBd/MqNEzsGSTdNvSJa1OJZcSH8GiXLvcizgp9AlHs2walqRcqzjOi3A==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.9.4: + resolution: {integrity: sha512-dIYgo+j1+yfy81i0YVU5KnQrIJZE8ERomx17ReU4GREjGtDW4X+nvkBak2xAUpyqLs4eleDSj3RrV72fQos7zw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.9.4: + resolution: {integrity: sha512-RoaYxjdHQ5TPjaPrLsfKqR3pakMr3JGqZ+jZM0zP2IkDtsGa4CqYaWSfQmZVgFUCgLrTnzX+cnHS3nfl+kB6ZQ==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.9.4: + resolution: {integrity: sha512-T8Q3XHV+Jjf5e49B4EAaLKV74BbX7/qYBRQ8Wop/+TyyU0k+vSjiLVSHNWdVd1goMjZcbhDmYZUYW5RFqkBNHQ==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.9.4: + resolution: {integrity: sha512-z+JQ7JirDUHAsMecVydnBPWLwJjbppU+7LZjffGf+Jvrxq+dVjIE7By163Sc9DKc3ADSU50qPVw0KonBS+a+HQ==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.9.4: + resolution: {integrity: sha512-LfdGXCV9rdEify1oxlN9eamvDSjv9md9ZVMAbNHA87xqIfFCxImxan9qZ8+Un54iK2nnqPlbnSi4R54ONtbWBw==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rushstack/node-core-library@3.62.0(@types/node@20.10.7): + resolution: {integrity: sha512-88aJn2h8UpSvdwuDXBv1/v1heM6GnBf3RjEy6ZPP7UnzHNCqOHA2Ut+ScYUbXcqIdfew9JlTAe3g+cnX9xQ/Aw==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + dependencies: + '@types/node': 20.10.7 + colors: 1.2.5 + fs-extra: 7.0.1 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.8 + semver: 7.5.4 + z-schema: 5.0.5 + dev: true + + /@rushstack/rig-package@0.5.1: + resolution: {integrity: sha512-pXRYSe29TjRw7rqxD4WS3HN/sRSbfr+tJs4a9uuaSIBAITbUggygdhuG0VrO0EO+QqH91GhYMN4S6KRtOEmGVA==} + dependencies: + resolve: 1.22.8 + strip-json-comments: 3.1.1 + dev: true + + /@rushstack/ts-command-line@4.17.1: + resolution: {integrity: sha512-2jweO1O57BYP5qdBGl6apJLB+aRIn5ccIRTPDyULh0KMwVzFqWtw6IZWt1qtUoZD/pD2RNkIOosH6Cq45rIYeg==} + dependencies: + '@types/argparse': 1.0.38 + argparse: 1.0.10 + colors: 1.2.5 + string-argv: 0.3.2 + dev: true + + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true + + /@socket.io/component-emitter@3.1.0: + resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} + dev: false + + /@storybook/addon-actions@7.6.7: + resolution: {integrity: sha512-+6EZvhIeKEqG/RNsU3R5DxOrd60BL5GEvmzE2w60s2eKaNNxtyilDjiO1g4z2s2zDNyr7JL/Ft03pJ0Jgo0lew==} + dependencies: + '@storybook/core-events': 7.6.7 + '@storybook/global': 5.0.0 + '@types/uuid': 9.0.7 + dequal: 2.0.3 + polished: 4.2.2 + uuid: 9.0.1 + dev: true + + /@storybook/addon-backgrounds@7.6.7: + resolution: {integrity: sha512-55sBy1YUqponAVe+qL16qtWxdf63vHEnIoqFyHEwGpk7K9IhFA1BmdSpFr5VnWEwXeJXKj30db78frh2LUdk3Q==} + dependencies: + '@storybook/global': 5.0.0 + memoizerific: 1.11.3 + ts-dedent: 2.2.0 + dev: true + + /@storybook/addon-controls@7.6.7(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-DJ3gfvcdCgqi7AQxu83vx0AEUKiuJrNcSATfWV3Jqi8dH6fYO2yqpemHEeWOEy+DAHxIOaqLKwb1QjIBj+vSRQ==} + dependencies: + '@storybook/blocks': 7.6.7(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + lodash: 4.17.21 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - encoding + - react + - react-dom + - supports-color + dev: true + + /@storybook/addon-docs@7.6.7(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-2dfajNhweofJ3LxjGO83UE5sBMvKtJB0Agj7q8mMtK/9PUCUcbvsFSyZnO/s6X1zAjSn5ZrirbSoTXU4IqxwSA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@jest/transform': 29.7.0 + '@mdx-js/react': 2.3.0(react@18.2.0) + '@storybook/blocks': 7.6.7(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@storybook/client-logger': 7.6.7 + '@storybook/components': 7.6.7(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@storybook/csf-plugin': 7.6.7 + '@storybook/csf-tools': 7.6.7 + '@storybook/global': 5.0.0 + '@storybook/mdx2-csf': 1.1.0 + '@storybook/node-logger': 7.6.7 + '@storybook/postinstall': 7.6.7 + '@storybook/preview-api': 7.6.7 + '@storybook/react-dom-shim': 7.6.7(react-dom@18.2.0)(react@18.2.0) + '@storybook/theming': 7.6.7(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.6.7 + fs-extra: 11.2.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + remark-external-links: 8.0.0 + remark-slug: 6.1.0 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - encoding + - supports-color + dev: true + + /@storybook/addon-essentials@7.6.7(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-nNLMrpIvc04z4XCA+kval/44eKAFJlUJeeL2pxwP7F/PSzjWe5BXv1bQHOiw8inRO5II0PzqwWnVCI9jsj7K5A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@storybook/addon-actions': 7.6.7 + '@storybook/addon-backgrounds': 7.6.7 + '@storybook/addon-controls': 7.6.7(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-docs': 7.6.7(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@storybook/addon-highlight': 7.6.7 + '@storybook/addon-measure': 7.6.7 + '@storybook/addon-outline': 7.6.7 + '@storybook/addon-toolbars': 7.6.7 + '@storybook/addon-viewport': 7.6.7 + '@storybook/core-common': 7.6.7 + '@storybook/manager-api': 7.6.7(react-dom@18.2.0)(react@18.2.0) + '@storybook/node-logger': 7.6.7 + '@storybook/preview-api': 7.6.7 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - encoding + - supports-color + dev: true + + /@storybook/addon-highlight@7.6.7: + resolution: {integrity: sha512-2F/tJdn45d4zrvf/cmE1vsczl99wK8+I+kkj0G7jLsrJR0w1zTgbgjy6T9j86HBTBvWcnysNFNIRWPAOh5Wdbw==} + dependencies: + '@storybook/global': 5.0.0 + dev: true + + /@storybook/addon-interactions@7.6.7: + resolution: {integrity: sha512-iXE2m9i/1D2baYkRgoYe9zwcAjtBOxBfW4o2AS0pzBNPN7elpP9C6mIa0ScpSltawBfIjfe6iQRXAMXOsIIh3Q==} + dependencies: + '@storybook/global': 5.0.0 + '@storybook/types': 7.6.7 + jest-mock: 27.5.1 + polished: 4.2.2 + ts-dedent: 2.2.0 + dev: true + + /@storybook/addon-links@7.6.7(react@18.2.0): + resolution: {integrity: sha512-O5LekPslkAIDtXC/TCIyg/3c0htBxDYwb/s+NrZUPTNWJsngxvTAwp6aIk6aVSeSCFUMWvBFcVsuV3hv+ndK6w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + react: + optional: true + dependencies: + '@storybook/csf': 0.1.2 + '@storybook/global': 5.0.0 + react: 18.2.0 + ts-dedent: 2.2.0 + dev: true + + /@storybook/addon-measure@7.6.7: + resolution: {integrity: sha512-t1RnnNO4Xzgnsxu63FlZwsCTF0+9jKxr44NiJAUOxW9ppbCvs/JfSDOOvcDRtPWyjgnyzexNUUctMfxvLrU01A==} + dependencies: + '@storybook/global': 5.0.0 + tiny-invariant: 1.3.1 + dev: true + + /@storybook/addon-outline@7.6.7: + resolution: {integrity: sha512-gu2y46ijjMkXlxy1f8Cctgjw5b5y8vSIqNAYlrs5/Qy+hJAWyU6lj2PFGOCCUG4L+F45fAjwWAin6qz43+WnRQ==} + dependencies: + '@storybook/global': 5.0.0 + ts-dedent: 2.2.0 + dev: true + + /@storybook/addon-storysource@7.6.7: + resolution: {integrity: sha512-YFC6rgbyXzlxifKDhhDyuJhu2I8HDW2Wc9IltFBhKdbu6LwlWCvYX6+OnIbRebwNH7vjbvHa8XopSDHroV4yIw==} + dependencies: + '@storybook/source-loader': 7.6.7 + estraverse: 5.3.0 + tiny-invariant: 1.3.1 + dev: true + + /@storybook/addon-toolbars@7.6.7: + resolution: {integrity: sha512-vT+YMzw8yVwndhJglI0XtELfXWq1M0HEy5ST3XPzbjmsJ54LgTf1b29UMkh0E/05qBQNFCcbT9B/tLxqWezxlg==} + dev: true + + /@storybook/addon-viewport@7.6.7: + resolution: {integrity: sha512-Q/BKjJaKzl4RWxH45K2iIXwkicj4ReVAUIpIyd7dPBb/Bx+hEDYZxR5dDg82AMkZdA71x5ttMnuDSuVpmWAE6g==} + dependencies: + memoizerific: 1.11.3 + dev: true + + /@storybook/blocks@7.6.7(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-+QEvGQ0he/YvFS3lsZORJWxhQIyqcCDWsxbJxJiByePd+Z4my3q8xwtPhHW0TKRL0xUgNE/GnTfMMqJfevTuSw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@storybook/channels': 7.6.7 + '@storybook/client-logger': 7.6.7 + '@storybook/components': 7.6.7(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@storybook/core-events': 7.6.7 + '@storybook/csf': 0.1.2 + '@storybook/docs-tools': 7.6.7 + '@storybook/global': 5.0.0 + '@storybook/manager-api': 7.6.7(react-dom@18.2.0)(react@18.2.0) + '@storybook/preview-api': 7.6.7 + '@storybook/theming': 7.6.7(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.6.7 + '@types/lodash': 4.14.202 + color-convert: 2.0.1 + dequal: 2.0.3 + lodash: 4.17.21 + markdown-to-jsx: 7.4.0(react@18.2.0) + memoizerific: 1.11.3 + polished: 4.2.2 + react: 18.2.0 + react-colorful: 5.6.1(react-dom@18.2.0)(react@18.2.0) + react-dom: 18.2.0(react@18.2.0) + telejson: 7.2.0 + tocbot: 4.25.0 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - encoding + - supports-color + dev: true + + /@storybook/builder-manager@7.6.7: + resolution: {integrity: sha512-6HYpj6+g/qbDMvImVz/G/aANbkhppyBa1ozfHxLK7tRD79YvozCWmj2Z9umRekPv9VIeMxnI5EEzJXOsoMX5DQ==} + dependencies: + '@fal-works/esbuild-plugin-global-externals': 2.1.2 + '@storybook/core-common': 7.6.7 + '@storybook/manager': 7.6.7 + '@storybook/node-logger': 7.6.7 + '@types/ejs': 3.1.5 + '@types/find-cache-dir': 3.2.1 + '@yarnpkg/esbuild-plugin-pnp': 3.0.0-rc.15(esbuild@0.18.20) + browser-assert: 1.2.1 + ejs: 3.1.9 + esbuild: 0.18.20 + esbuild-plugin-alias: 0.2.1 + express: 4.18.2 + find-cache-dir: 3.3.2 + fs-extra: 11.2.0 + process: 0.11.10 + util: 0.12.5 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@storybook/builder-vite@7.6.7(typescript@5.3.3)(vite@5.0.11): + resolution: {integrity: sha512-Sv+0ROFU9k+mkvIPsPHC0lkKDzBeMpvfO9uFRl1RDSsXBfcPPZKNo5YK7U7fOhesH0BILzurGA+U/aaITMSZ9g==} + peerDependencies: + '@preact/preset-vite': '*' + typescript: '>= 4.3.x' + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + vite-plugin-glimmerx: '*' + peerDependenciesMeta: + '@preact/preset-vite': + optional: true + typescript: + optional: true + vite-plugin-glimmerx: + optional: true + dependencies: + '@storybook/channels': 7.6.7 + '@storybook/client-logger': 7.6.7 + '@storybook/core-common': 7.6.7 + '@storybook/csf-plugin': 7.6.7 + '@storybook/node-logger': 7.6.7 + '@storybook/preview': 7.6.7 + '@storybook/preview-api': 7.6.7 + '@storybook/types': 7.6.7 + '@types/find-cache-dir': 3.2.1 + browser-assert: 1.2.1 + es-module-lexer: 0.9.3 + express: 4.18.2 + find-cache-dir: 3.3.2 + fs-extra: 11.2.0 + magic-string: 0.30.5 + rollup: 3.29.4 + typescript: 5.3.3 + vite: 5.0.11(@types/node@20.10.7) + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@storybook/channels@7.6.7: + resolution: {integrity: sha512-u1hURhfQHHtZyRIDUENRCp+CRRm7IQfcjQaoWI06XCevQPuhVEtFUfXHjG+J74aA/JuuTLFUtqwNm1zGqbXTAQ==} + dependencies: + '@storybook/client-logger': 7.6.7 + '@storybook/core-events': 7.6.7 + '@storybook/global': 5.0.0 + qs: 6.11.2 + telejson: 7.2.0 + tiny-invariant: 1.3.1 + dev: true + + /@storybook/cli@7.6.7: + resolution: {integrity: sha512-DwDWzkifBH17ry+n+d+u52Sv69dZQ+04ETJdDDzghcyAcKnFzrRNukj4tJ21cm+ZAU/r0fKR9d4Qpbogca9fAg==} + hasBin: true + dependencies: + '@babel/core': 7.23.7 + '@babel/preset-env': 7.23.7(@babel/core@7.23.7) + '@babel/types': 7.23.6 + '@ndelangen/get-tarball': 3.0.9 + '@storybook/codemod': 7.6.7 + '@storybook/core-common': 7.6.7 + '@storybook/core-events': 7.6.7 + '@storybook/core-server': 7.6.7 + '@storybook/csf-tools': 7.6.7 + '@storybook/node-logger': 7.6.7 + '@storybook/telemetry': 7.6.7 + '@storybook/types': 7.6.7 + '@types/semver': 7.5.6 + '@yarnpkg/fslib': 2.10.3 + '@yarnpkg/libzip': 2.3.0 + chalk: 4.1.2 + commander: 6.2.1 + cross-spawn: 7.0.3 + detect-indent: 6.1.0 + envinfo: 7.11.0 + execa: 5.1.1 + express: 4.18.2 + find-up: 5.0.0 + fs-extra: 11.2.0 + get-npm-tarball-url: 2.1.0 + get-port: 5.1.1 + giget: 1.2.1 + globby: 11.1.0 + jscodeshift: 0.15.1(@babel/preset-env@7.23.7) + leven: 3.1.0 + ora: 5.4.1 + prettier: 2.8.8 + prompts: 2.4.2 + puppeteer-core: 2.1.1 + read-pkg-up: 7.0.1 + semver: 7.5.4 + simple-update-notifier: 2.0.0 + strip-json-comments: 3.1.1 + tempy: 1.0.1 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + + /@storybook/client-logger@7.6.7: + resolution: {integrity: sha512-A16zpWgsa0gSdXMR9P3bWVdC9u/1B1oG4H7Z1+JhNzgnL3CdyOYO0qFSiAtNBso4nOjIAJVb6/AoBzdRhmSVQg==} + dependencies: + '@storybook/global': 5.0.0 + dev: true + + /@storybook/codemod@7.6.7: + resolution: {integrity: sha512-an2pD5OHqO7CE8Wb7JxjrDnpQgeoxB22MyOs8PPJ9Rvclhpjg+Ku9RogoObYm//zR4g406l7Ec8mTltUkVCEOA==} + dependencies: + '@babel/core': 7.23.7 + '@babel/preset-env': 7.23.7(@babel/core@7.23.7) + '@babel/types': 7.23.6 + '@storybook/csf': 0.1.2 + '@storybook/csf-tools': 7.6.7 + '@storybook/node-logger': 7.6.7 + '@storybook/types': 7.6.7 + '@types/cross-spawn': 6.0.6 + cross-spawn: 7.0.3 + globby: 11.1.0 + jscodeshift: 0.15.1(@babel/preset-env@7.23.7) + lodash: 4.17.21 + prettier: 2.8.8 + recast: 0.23.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@storybook/components@7.6.7(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-1HN4p+MCI4Tx9VGZayZyqbW7SB7mXQLnS5fUbTE1gXaMYHpzFvcrRNROeV1LZPClJX6qx1jgE5ngZojhxGuxMA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@radix-ui/react-select': 1.2.2(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-toolbar': 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@storybook/client-logger': 7.6.7 + '@storybook/csf': 0.1.2 + '@storybook/global': 5.0.0 + '@storybook/theming': 7.6.7(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.6.7 + memoizerific: 1.11.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + use-resize-observer: 9.1.0(react-dom@18.2.0)(react@18.2.0) + util-deprecate: 1.0.2 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + dev: true + + /@storybook/core-client@7.6.7: + resolution: {integrity: sha512-ZQivyEzYsZok8vRj5Qan7LbiMUnO89rueWzTnZs4IS6JIaQtjoPI1rGVq+h6qOCM6tki478hic8FS+zwGQ6q+w==} + dependencies: + '@storybook/client-logger': 7.6.7 + '@storybook/preview-api': 7.6.7 + dev: true + + /@storybook/core-common@7.6.7: + resolution: {integrity: sha512-F1fJnauVSPQtAlpicbN/O4XW38Ai8kf/IoU0Hgm9gEwurIk6MF5hiVLsaTI/5GUbrepMl9d9J+iIL4lHAT8IyA==} + dependencies: + '@storybook/core-events': 7.6.7 + '@storybook/node-logger': 7.6.7 + '@storybook/types': 7.6.7 + '@types/find-cache-dir': 3.2.1 + '@types/node': 18.19.5 + '@types/node-fetch': 2.6.10 + '@types/pretty-hrtime': 1.0.3 + chalk: 4.1.2 + esbuild: 0.18.20 + esbuild-register: 3.5.0(esbuild@0.18.20) + file-system-cache: 2.3.0 + find-cache-dir: 3.3.2 + find-up: 5.0.0 + fs-extra: 11.2.0 + glob: 10.3.10 + handlebars: 4.7.8 + lazy-universal-dotenv: 4.0.0 + node-fetch: 2.7.0 + picomatch: 2.3.1 + pkg-dir: 5.0.0 + pretty-hrtime: 1.0.3 + resolve-from: 5.0.0 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@storybook/core-events@7.6.7: + resolution: {integrity: sha512-KZ5d03c47pnr5/kY26pJtWq7WpmCPXLbgyjJZDSc+TTY153BdZksvlBXRHtqM1yj2UM6QsSyIuiJaADJNAbP2w==} + dependencies: + ts-dedent: 2.2.0 + dev: true + + /@storybook/core-server@7.6.7: + resolution: {integrity: sha512-elKRv/DNahNNkGcQY/FdOBrLPmZF0T0fwmAmbc4qqeAisjl+to9TO77zdo2ieaEHKyRwE3B3dOB4EXomdF4N/g==} + dependencies: + '@aw-web-design/x-default-browser': 1.4.126 + '@discoveryjs/json-ext': 0.5.7 + '@storybook/builder-manager': 7.6.7 + '@storybook/channels': 7.6.7 + '@storybook/core-common': 7.6.7 + '@storybook/core-events': 7.6.7 + '@storybook/csf': 0.1.2 + '@storybook/csf-tools': 7.6.7 + '@storybook/docs-mdx': 0.1.0 + '@storybook/global': 5.0.0 + '@storybook/manager': 7.6.7 + '@storybook/node-logger': 7.6.7 + '@storybook/preview-api': 7.6.7 + '@storybook/telemetry': 7.6.7 + '@storybook/types': 7.6.7 + '@types/detect-port': 1.3.5 + '@types/node': 18.19.5 + '@types/pretty-hrtime': 1.0.3 + '@types/semver': 7.5.6 + better-opn: 3.0.2 + chalk: 4.1.2 + cli-table3: 0.6.3 + compression: 1.7.4 + detect-port: 1.5.1 + express: 4.18.2 + fs-extra: 11.2.0 + globby: 11.1.0 + ip: 2.0.0 + lodash: 4.17.21 + open: 8.4.2 + pretty-hrtime: 1.0.3 + prompts: 2.4.2 + read-pkg-up: 7.0.1 + semver: 7.5.4 + telejson: 7.2.0 + tiny-invariant: 1.3.1 + ts-dedent: 2.2.0 + util: 0.12.5 + util-deprecate: 1.0.2 + watchpack: 2.4.0 + ws: 8.16.0 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + + /@storybook/csf-plugin@7.6.7: + resolution: {integrity: sha512-YL7e6H4iVcsDI0UpgpdQX2IiGDrlbgaQMHQgDLWXmZyKxBcy0ONROAX5zoT1ml44EHkL60TMaG4f7SinviJCog==} + dependencies: + '@storybook/csf-tools': 7.6.7 + unplugin: 1.6.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@storybook/csf-tools@7.6.7: + resolution: {integrity: sha512-hyRbUGa2Uxvz3U09BjcOfMNf/5IYgRum1L6XszqK2O8tK9DGte1r6hArCIAcqiEmFMC40d0kalPzqu6WMNn7sg==} + dependencies: + '@babel/generator': 7.23.6 + '@babel/parser': 7.23.6 + '@babel/traverse': 7.23.7 + '@babel/types': 7.23.6 + '@storybook/csf': 0.1.2 + '@storybook/types': 7.6.7 + fs-extra: 11.2.0 + recast: 0.23.4 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@storybook/csf@0.0.1: + resolution: {integrity: sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw==} + dependencies: + lodash: 4.17.21 + dev: true + + /@storybook/csf@0.1.2: + resolution: {integrity: sha512-ePrvE/pS1vsKR9Xr+o+YwdqNgHUyXvg+1Xjx0h9LrVx7Zq4zNe06pd63F5EvzTbCbJsHj7GHr9tkiaqm7U8WRA==} + dependencies: + type-fest: 2.19.0 + dev: true + + /@storybook/docs-mdx@0.1.0: + resolution: {integrity: sha512-JDaBR9lwVY4eSH5W8EGHrhODjygPd6QImRbwjAuJNEnY0Vw4ie3bPkeGfnacB3OBW6u/agqPv2aRlR46JcAQLg==} + dev: true + + /@storybook/docs-tools@7.6.7: + resolution: {integrity: sha512-enTO/xVjBqwUraGCYTwdyjMvug3OSAM7TPPUEJ3KPieJNwAzcYkww/qNDMIAR4S39zPMrkAmtS3STvVadlJz7g==} + dependencies: + '@storybook/core-common': 7.6.7 + '@storybook/preview-api': 7.6.7 + '@storybook/types': 7.6.7 + '@types/doctrine': 0.0.3 + assert: 2.1.0 + doctrine: 3.0.0 + lodash: 4.17.21 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@storybook/global@5.0.0: + resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} + dev: true + + /@storybook/instrumenter@7.6.7: + resolution: {integrity: sha512-Q4NstXZKCk62MkP7jgpg5CRFmhszg9QdoN8CwffuUGtjQRADhmeRHgP4usB87Sg6Tq9MLSopAEqUZxlKKYeeag==} + dependencies: + '@storybook/channels': 7.6.7 + '@storybook/client-logger': 7.6.7 + '@storybook/core-events': 7.6.7 + '@storybook/global': 5.0.0 + '@storybook/preview-api': 7.6.7 + '@vitest/utils': 0.34.7 + util: 0.12.5 + dev: true + + /@storybook/manager-api@7.6.7(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-3Wk/BvuGUlw/X05s57zZO7gJbzfUeE9Xe+CSIvuH7RY5jx9PYnNwqNlTXPXhJ5LPvwMthae7WJVn3SuBpbptoQ==} + dependencies: + '@storybook/channels': 7.6.7 + '@storybook/client-logger': 7.6.7 + '@storybook/core-events': 7.6.7 + '@storybook/csf': 0.1.2 + '@storybook/global': 5.0.0 + '@storybook/router': 7.6.7 + '@storybook/theming': 7.6.7(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.6.7 + dequal: 2.0.3 + lodash: 4.17.21 + memoizerific: 1.11.3 + store2: 2.14.2 + telejson: 7.2.0 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - react + - react-dom + dev: true + + /@storybook/manager@7.6.7: + resolution: {integrity: sha512-ZCrkB2zEXogzdOcVzD242ZVm4tlHqrayotnI6iOn9uiun0Pgny0m2d7s9Zge6K2dTOO1vZiOHuA/Mr6nnIDjsA==} + dev: true + + /@storybook/mdx2-csf@1.1.0: + resolution: {integrity: sha512-TXJJd5RAKakWx4BtpwvSNdgTDkKM6RkXU8GK34S/LhidQ5Pjz3wcnqb0TxEkfhK/ztbP8nKHqXFwLfa2CYkvQw==} + dev: true + + /@storybook/node-logger@7.6.7: + resolution: {integrity: sha512-XLih8MxylkpZG9+8tgp8sPGc2tldlWF+DpuAkUv6J3Mc81mPyc3cQKQWZ7Hb+m1LpRGqKV4wyOQj1rC+leVMoQ==} + dev: true + + /@storybook/postinstall@7.6.7: + resolution: {integrity: sha512-mrpRmcwFd9FcvtHPXA9x6vOrHLVCKScZX/Xx2QPWgAvB3W6uzP8G+8QNb1u834iToxrWeuszUMB9UXZK4Qj5yg==} + dev: true + + /@storybook/preview-api@7.6.7: + resolution: {integrity: sha512-ja85ItrT6q2TeBQ6n0CNoRi1R6L8yF2kkis9hVeTQHpwLdZyHUTRqqR5WmhtLqqQXcofyasBPOeJV06wuOhgRQ==} + dependencies: + '@storybook/channels': 7.6.7 + '@storybook/client-logger': 7.6.7 + '@storybook/core-events': 7.6.7 + '@storybook/csf': 0.1.2 + '@storybook/global': 5.0.0 + '@storybook/types': 7.6.7 + '@types/qs': 6.9.11 + dequal: 2.0.3 + lodash: 4.17.21 + memoizerific: 1.11.3 + qs: 6.11.2 + synchronous-promise: 2.0.17 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + dev: true + + /@storybook/preview@7.6.7: + resolution: {integrity: sha512-/ddKIyT+6b8CKGJAma1wood4nwCAoi/E1olCqgpCmviMeUtAiMzgK0xzPwvq5Mxkz/cPeXVi8CQgaQZCa4yvNA==} + dev: true + + /@storybook/react-dom-shim@7.6.7(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-b/rmy/YzVrwP+ifyZG4yXVIdeFVdTbmziodHUlbrWiUNsqtTZZur9kqkKRUH/7ofji9MFe81nd0MRlcTNFomqg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /@storybook/react-vite@7.6.7(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3)(vite@5.0.11): + resolution: {integrity: sha512-1cBpxVZ4vLO5rGbhTBNR2SjL+ZePCUAEY+I31tbORYFAoOKmlsNef4fRLnXJ9NYUAyjwZpUmbW0cIxxOFk7nGA==} + engines: {node: '>=16'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + dependencies: + '@joshwooding/vite-plugin-react-docgen-typescript': 0.3.0(typescript@5.3.3)(vite@5.0.11) + '@rollup/pluginutils': 5.1.0 + '@storybook/builder-vite': 7.6.7(typescript@5.3.3)(vite@5.0.11) + '@storybook/react': 7.6.7(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3) + '@vitejs/plugin-react': 3.1.0(vite@5.0.11) + magic-string: 0.30.5 + react: 18.2.0 + react-docgen: 7.0.1 + react-dom: 18.2.0(react@18.2.0) + vite: 5.0.11(@types/node@20.10.7) + transitivePeerDependencies: + - '@preact/preset-vite' + - encoding + - rollup + - supports-color + - typescript + - vite-plugin-glimmerx + dev: true + + /@storybook/react@7.6.7(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3): + resolution: {integrity: sha512-uT9IBPDM1SQg6FglWqb7IemOJ1Z8kYB5rehIDEDToi0u5INihSY8rHd003TxG4Wx4REp6J+rfbDJO2aVui/gxA==} + engines: {node: '>=16.0.0'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@storybook/client-logger': 7.6.7 + '@storybook/core-client': 7.6.7 + '@storybook/docs-tools': 7.6.7 + '@storybook/global': 5.0.0 + '@storybook/preview-api': 7.6.7 + '@storybook/react-dom-shim': 7.6.7(react-dom@18.2.0)(react@18.2.0) + '@storybook/types': 7.6.7 + '@types/escodegen': 0.0.6 + '@types/estree': 0.0.51 + '@types/node': 18.19.5 + acorn: 7.4.1 + acorn-jsx: 5.3.2(acorn@7.4.1) + acorn-walk: 7.2.0 + escodegen: 2.1.0 + html-tags: 3.3.1 + lodash: 4.17.21 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-element-to-jsx-string: 15.0.0(react-dom@18.2.0)(react@18.2.0) + ts-dedent: 2.2.0 + type-fest: 2.19.0 + typescript: 5.3.3 + util-deprecate: 1.0.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@storybook/router@7.6.7: + resolution: {integrity: sha512-kkhNSdC3fXaQxILg8a26RKk4/ZbF/AUVrepUEyO8lwvbJ6LItTyWSE/4I9Ih4qV2Mjx33ncc8vLqM9p8r5qnMA==} + dependencies: + '@storybook/client-logger': 7.6.7 + memoizerific: 1.11.3 + qs: 6.11.2 + dev: true + + /@storybook/source-loader@7.6.7: + resolution: {integrity: sha512-11uWYZwHyOMtC1vTh9AHDTh1ab1uUTeg1ZuqWJVSNSIfKNzDzeiWeqoWluzv6v3nQ5zNoMLqy8QOxbKeLiBDVw==} + dependencies: + '@storybook/csf': 0.1.2 + '@storybook/types': 7.6.7 + estraverse: 5.3.0 + lodash: 4.17.21 + prettier: 2.8.8 + dev: true + + /@storybook/telemetry@7.6.7: + resolution: {integrity: sha512-NHGzC/LGLXpK4AFbVj8ln5ab86ZiiNFvORQMn3+LNGwUt3ZdsHBzExN+WPZdw7OPtfk4ubUY89FXH2GedhTALw==} + dependencies: + '@storybook/client-logger': 7.6.7 + '@storybook/core-common': 7.6.7 + '@storybook/csf-tools': 7.6.7 + chalk: 4.1.2 + detect-package-manager: 2.0.1 + fetch-retry: 5.0.6 + fs-extra: 11.2.0 + read-pkg-up: 7.0.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@storybook/test@7.6.7: + resolution: {integrity: sha512-6gyRIvtOSq/ODYjpUO8LgY1YlWoYINhhKtLKwZasbp8hQ0zkd2vRSWlVCwzsw28cZXo2UL92UNSgEVD1sf73Qg==} + dependencies: + '@storybook/client-logger': 7.6.7 + '@storybook/core-events': 7.6.7 + '@storybook/instrumenter': 7.6.7 + '@storybook/preview-api': 7.6.7 + '@testing-library/dom': 9.3.3 + '@testing-library/jest-dom': 6.2.0 + '@testing-library/user-event': 14.3.0(@testing-library/dom@9.3.3) + '@types/chai': 4.3.11 + '@vitest/expect': 0.34.7 + '@vitest/spy': 0.34.7 + chai: 4.4.0 + util: 0.12.5 + transitivePeerDependencies: + - '@jest/globals' + - '@types/jest' + - jest + - vitest + dev: true + + /@storybook/theming@7.6.7(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-+42rfC4rZtWVAXJ7JBUQKnQ6vWBXJVHZ9HtNUWzQLPR9sJSMmHnnSMV6y5tizGgZqmBnAIkuoYk+Tt6NfwUmSA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.2.0) + '@storybook/client-logger': 7.6.7 + '@storybook/global': 5.0.0 + memoizerific: 1.11.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /@storybook/types@7.6.7: + resolution: {integrity: sha512-VcGwrI4AkBENxkoAUJ+Z7SyMK73hpoY0TTtw2J7tc05/xdiXhkQTX15Qa12IBWIkoXCyNrtaU+q7KR8Tjzi+uw==} + dependencies: + '@storybook/channels': 7.6.7 + '@types/babel__core': 7.20.5 + '@types/express': 4.17.21 + file-system-cache: 2.3.0 + dev: true + + /@swc/core-darwin-arm64@1.3.101: + resolution: {integrity: sha512-mNFK+uHNPRXSnfTOG34zJOeMl2waM4hF4a2NY7dkMXrPqw9CoJn4MwTXJcyMiSz1/BnNjjTCHF3Yhj0jPxmkzQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@swc/core-darwin-x64@1.3.101: + resolution: {integrity: sha512-B085j8XOx73Fg15KsHvzYWG262bRweGr3JooO1aW5ec5pYbz5Ew9VS5JKYS03w2UBSxf2maWdbPz2UFAxg0whw==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm-gnueabihf@1.3.101: + resolution: {integrity: sha512-9xLKRb6zSzRGPqdz52Hy5GuB1lSjmLqa0lST6MTFads3apmx4Vgs8Y5NuGhx/h2I8QM4jXdLbpqQlifpzTlSSw==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm64-gnu@1.3.101: + resolution: {integrity: sha512-oE+r1lo7g/vs96Weh2R5l971dt+ZLuhaUX+n3BfDdPxNHfObXgKMjO7E+QS5RbGjv/AwiPCxQmbdCp/xN5ICJA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm64-musl@1.3.101: + resolution: {integrity: sha512-OGjYG3H4BMOTnJWJyBIovCez6KiHF30zMIu4+lGJTCrxRI2fAjGLml3PEXj8tC3FMcud7U2WUn6TdG0/te2k6g==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-x64-gnu@1.3.101: + resolution: {integrity: sha512-/kBMcoF12PRO/lwa8Z7w4YyiKDcXQEiLvM+S3G9EvkoKYGgkkz4Q6PSNhF5rwg/E3+Hq5/9D2R+6nrkF287ihg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-x64-musl@1.3.101: + resolution: {integrity: sha512-kDN8lm4Eew0u1p+h1l3JzoeGgZPQ05qDE0czngnjmfpsH2sOZxVj1hdiCwS5lArpy7ktaLu5JdRnx70MkUzhXw==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-arm64-msvc@1.3.101: + resolution: {integrity: sha512-9Wn8TTLWwJKw63K/S+jjrZb9yoJfJwCE2RV5vPCCWmlMf3U1AXj5XuWOLUX+Rp2sGKau7wZKsvywhheWm+qndQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-ia32-msvc@1.3.101: + resolution: {integrity: sha512-onO5KvICRVlu2xmr4//V2je9O2XgS1SGKpbX206KmmjcJhXN5EYLSxW9qgg+kgV5mip+sKTHTAu7IkzkAtElYA==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-x64-msvc@1.3.101: + resolution: {integrity: sha512-T3GeJtNQV00YmiVw/88/nxJ/H43CJvFnpvBHCVn17xbahiVUOPOduh3rc9LgAkKiNt/aV8vU3OJR+6PhfMR7UQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core@1.3.101: + resolution: {integrity: sha512-w5aQ9qYsd/IYmXADAnkXPGDMTqkQalIi+kfFf/MHRKTpaOL7DHjMXwPp/n8hJ0qNjRvchzmPtOqtPBiER50d8A==} + engines: {node: '>=10'} + requiresBuild: true + peerDependencies: + '@swc/helpers': ^0.5.0 + peerDependenciesMeta: + '@swc/helpers': + optional: true + dependencies: + '@swc/counter': 0.1.2 + '@swc/types': 0.1.5 + optionalDependencies: + '@swc/core-darwin-arm64': 1.3.101 + '@swc/core-darwin-x64': 1.3.101 + '@swc/core-linux-arm-gnueabihf': 1.3.101 + '@swc/core-linux-arm64-gnu': 1.3.101 + '@swc/core-linux-arm64-musl': 1.3.101 + '@swc/core-linux-x64-gnu': 1.3.101 + '@swc/core-linux-x64-musl': 1.3.101 + '@swc/core-win32-arm64-msvc': 1.3.101 + '@swc/core-win32-ia32-msvc': 1.3.101 + '@swc/core-win32-x64-msvc': 1.3.101 + dev: true + + /@swc/counter@0.1.2: + resolution: {integrity: sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==} + dev: true + + /@swc/types@0.1.5: + resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==} + dev: true + + /@testing-library/dom@9.3.3: + resolution: {integrity: sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==} + engines: {node: '>=14'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/runtime': 7.23.7 + '@types/aria-query': 5.0.4 + aria-query: 5.1.3 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 + dev: true + + /@testing-library/jest-dom@6.2.0: + resolution: {integrity: sha512-+BVQlJ9cmEn5RDMUS8c2+TU6giLvzaHZ8sU/x0Jj7fk+6/46wPdwlgOPcpxS17CjcanBi/3VmGMqVr2rmbUmNw==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + peerDependencies: + '@jest/globals': '>= 28' + '@types/jest': '>= 28' + jest: '>= 28' + vitest: '>= 0.32' + peerDependenciesMeta: + '@jest/globals': + optional: true + '@types/jest': + optional: true + jest: + optional: true + vitest: + optional: true + dependencies: + '@adobe/css-tools': 4.3.2 + '@babel/runtime': 7.23.7 + aria-query: 5.3.0 + chalk: 3.0.0 + css.escape: 1.5.1 + dom-accessibility-api: 0.6.3 + lodash: 4.17.21 + redent: 3.0.0 + dev: true + + /@testing-library/user-event@14.3.0(@testing-library/dom@9.3.3): + resolution: {integrity: sha512-P02xtBBa8yMaLhK8CzJCIns8rqwnF6FxhR9zs810flHOBXUYCFjLd8Io1rQrAkQRWEmW2PGdZIEdMxf/KLsqFA==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' + dependencies: + '@testing-library/dom': 9.3.3 + dev: true + + /@types/argparse@1.0.38: + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + dev: true + + /@types/aria-query@5.0.4: + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + dev: true + + /@types/babel__core@7.20.5: + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + dependencies: + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.5 + dev: true + + /@types/babel__generator@7.6.8: + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + dependencies: + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + dev: true + + /@types/babel__traverse@7.20.5: + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + dependencies: + '@babel/types': 7.23.6 + dev: true + + /@types/body-parser@1.19.5: + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + dependencies: + '@types/connect': 3.4.38 + '@types/node': 20.10.7 + dev: true + + /@types/chai@4.3.11: + resolution: {integrity: sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==} + dev: true + + /@types/connect@3.4.38: + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + dependencies: + '@types/node': 20.10.7 + dev: true + + /@types/cross-spawn@6.0.6: + resolution: {integrity: sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==} + dependencies: + '@types/node': 20.10.7 + dev: true + + /@types/d3-array@3.2.1: + resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} + dev: false + + /@types/d3-axis@3.0.6: + resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} + dependencies: + '@types/d3-selection': 3.0.10 + dev: false + + /@types/d3-brush@3.0.6: + resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} + dependencies: + '@types/d3-selection': 3.0.10 + dev: false + + /@types/d3-chord@3.0.6: + resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} + dev: false + + /@types/d3-color@3.1.3: + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + dev: false + + /@types/d3-contour@3.0.6: + resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} + dependencies: + '@types/d3-array': 3.2.1 + '@types/geojson': 7946.0.13 + dev: false + + /@types/d3-delaunay@6.0.4: + resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} + dev: false + + /@types/d3-dispatch@3.0.6: + resolution: {integrity: sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==} + dev: false + + /@types/d3-drag@3.0.7: + resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} + dependencies: + '@types/d3-selection': 3.0.10 + dev: false + + /@types/d3-dsv@3.0.7: + resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} + dev: false + + /@types/d3-ease@3.0.2: + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + dev: false + + /@types/d3-fetch@3.0.7: + resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} + dependencies: + '@types/d3-dsv': 3.0.7 + dev: false + + /@types/d3-force@3.0.9: + resolution: {integrity: sha512-IKtvyFdb4Q0LWna6ymywQsEYjK/94SGhPrMfEr1TIc5OBeziTi+1jcCvttts8e0UWZIxpasjnQk9MNk/3iS+kA==} + dev: false + + /@types/d3-format@3.0.4: + resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} + dev: false + + /@types/d3-geo@3.1.0: + resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} + dependencies: + '@types/geojson': 7946.0.13 + dev: false + + /@types/d3-hierarchy@3.1.6: + resolution: {integrity: sha512-qlmD/8aMk5xGorUvTUWHCiumvgaUXYldYjNVOWtYoTYY/L+WwIEAmJxUmTgr9LoGNG0PPAOmqMDJVDPc7DOpPw==} + dev: false + + /@types/d3-interpolate@3.0.4: + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + dependencies: + '@types/d3-color': 3.1.3 + dev: false + + /@types/d3-path@3.0.2: + resolution: {integrity: sha512-WAIEVlOCdd/NKRYTsqCpOMHQHemKBEINf8YXMYOtXH0GA7SY0dqMB78P3Uhgfy+4X+/Mlw2wDtlETkN6kQUCMA==} + dev: false + + /@types/d3-polygon@3.0.2: + resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} + dev: false + + /@types/d3-quadtree@3.0.6: + resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} + dev: false + + /@types/d3-random@3.0.3: + resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==} + dev: false + + /@types/d3-scale-chromatic@3.0.3: + resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==} + dev: false + + /@types/d3-scale@4.0.8: + resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} + dependencies: + '@types/d3-time': 3.0.3 + dev: false + + /@types/d3-selection@3.0.10: + resolution: {integrity: sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==} + dev: false + + /@types/d3-shape@3.1.6: + resolution: {integrity: sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==} + dependencies: + '@types/d3-path': 3.0.2 + dev: false + + /@types/d3-time-format@4.0.3: + resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} + dev: false + + /@types/d3-time@3.0.3: + resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} + dev: false + + /@types/d3-timer@3.0.2: + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + dev: false + + /@types/d3-transition@3.0.8: + resolution: {integrity: sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==} + dependencies: + '@types/d3-selection': 3.0.10 + dev: false + + /@types/d3-zoom@3.0.8: + resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} + dependencies: + '@types/d3-interpolate': 3.0.4 + '@types/d3-selection': 3.0.10 + dev: false + + /@types/d3@7.4.3: + resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} + dependencies: + '@types/d3-array': 3.2.1 + '@types/d3-axis': 3.0.6 + '@types/d3-brush': 3.0.6 + '@types/d3-chord': 3.0.6 + '@types/d3-color': 3.1.3 + '@types/d3-contour': 3.0.6 + '@types/d3-delaunay': 6.0.4 + '@types/d3-dispatch': 3.0.6 + '@types/d3-drag': 3.0.7 + '@types/d3-dsv': 3.0.7 + '@types/d3-ease': 3.0.2 + '@types/d3-fetch': 3.0.7 + '@types/d3-force': 3.0.9 + '@types/d3-format': 3.0.4 + '@types/d3-geo': 3.1.0 + '@types/d3-hierarchy': 3.1.6 + '@types/d3-interpolate': 3.0.4 + '@types/d3-path': 3.0.2 + '@types/d3-polygon': 3.0.2 + '@types/d3-quadtree': 3.0.6 + '@types/d3-random': 3.0.3 + '@types/d3-scale': 4.0.8 + '@types/d3-scale-chromatic': 3.0.3 + '@types/d3-selection': 3.0.10 + '@types/d3-shape': 3.1.6 + '@types/d3-time': 3.0.3 + '@types/d3-time-format': 4.0.3 + '@types/d3-timer': 3.0.2 + '@types/d3-transition': 3.0.8 + '@types/d3-zoom': 3.0.8 + dev: false + + /@types/dateformat@5.0.2: + resolution: {integrity: sha512-M95hNBMa/hnwErH+a+VOD/sYgTmo15OTYTM2Hr52/e0OdOuY+Crag+kd3/ioZrhg0WGbl9Sm3hR7UU+MH6rfOw==} + dev: true + + /@types/detect-port@1.3.5: + resolution: {integrity: sha512-Rf3/lB9WkDfIL9eEKaSYKc+1L/rNVYBjThk22JTqQw0YozXarX8YljFAz+HCoC6h4B4KwCMsBPZHaFezwT4BNA==} + dev: true + + /@types/diff-match-patch@1.0.36: + resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==} + dev: false + + /@types/doctrine@0.0.3: + resolution: {integrity: sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA==} + dev: true + + /@types/doctrine@0.0.9: + resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} + dev: true + + /@types/ejs@3.1.5: + resolution: {integrity: sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==} + dev: true + + /@types/emscripten@1.39.10: + resolution: {integrity: sha512-TB/6hBkYQJxsZHSqyeuO1Jt0AB/bW6G7rHt9g7lML7SOF6lbgcHvw/Lr+69iqN0qxgXLhWKScAon73JNnptuDw==} + dev: true + + /@types/escodegen@0.0.6: + resolution: {integrity: sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig==} + dev: true + + /@types/eslint@8.56.0: + resolution: {integrity: sha512-FlsN0p4FhuYRjIxpbdXovvHQhtlG05O1GG/RNWvdAxTboR438IOTwmrY/vLA+Xfgg06BTkP045M3vpFwTMv1dg==} + dependencies: + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 + dev: true + + /@types/estree@0.0.51: + resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} + dev: true + + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: true + + /@types/express-serve-static-core@4.17.41: + resolution: {integrity: sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==} + dependencies: + '@types/node': 20.10.7 + '@types/qs': 6.9.11 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + dev: true + + /@types/express@4.17.21: + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.17.41 + '@types/qs': 6.9.11 + '@types/serve-static': 1.15.5 + dev: true + + /@types/find-cache-dir@3.2.1: + resolution: {integrity: sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw==} + dev: true + + /@types/geojson@7946.0.13: + resolution: {integrity: sha512-bmrNrgKMOhM3WsafmbGmC+6dsF2Z308vLFsQ3a/bT8X8Sv5clVYpPars/UPq+sAaJP+5OoLAYgwbkS5QEJdLUQ==} + dev: false + + /@types/glob@7.2.0: + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 20.10.7 + dev: true + + /@types/graceful-fs@4.1.9: + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + dependencies: + '@types/node': 20.10.7 + dev: true + + /@types/http-errors@2.0.4: + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + dev: true + + /@types/istanbul-lib-coverage@2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + dev: true + + /@types/istanbul-lib-report@3.0.3: + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + dev: true + + /@types/istanbul-reports@3.0.4: + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + dependencies: + '@types/istanbul-lib-report': 3.0.3 + dev: true + + /@types/js-cookie@2.2.7: + resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} + dev: false + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: true + + /@types/json5@0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true + + /@types/lodash-es@4.17.12: + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + dependencies: + '@types/lodash': 4.14.202 + dev: true + + /@types/lodash.mergewith@4.6.7: + resolution: {integrity: sha512-3m+lkO5CLRRYU0fhGRp7zbsGi6+BZj0uTVSwvcKU+nSlhjA9/QRNfuSGnD2mX6hQA7ZbmcCkzk5h4ZYGOtk14A==} + dependencies: + '@types/lodash': 4.14.202 + dev: false + + /@types/lodash@4.14.202: + resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} + + /@types/mdx@2.0.10: + resolution: {integrity: sha512-Rllzc5KHk0Al5/WANwgSPl1/CwjqCy+AZrGd78zuK+jO9aDM6ffblZ+zIjgPNAaEBmlO0RYDvLNh7wD0zKVgEg==} + dev: true + + /@types/mime-types@2.1.4: + resolution: {integrity: sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==} + dev: true + + /@types/mime@1.3.5: + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + dev: true + + /@types/mime@3.0.4: + resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} + dev: true + + /@types/minimatch@5.1.2: + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + dev: true + + /@types/node-fetch@2.6.10: + resolution: {integrity: sha512-PPpPK6F9ALFTn59Ka3BaL+qGuipRfxNE8qVgkp0bVixeiR2c2/L+IVOiBdu9JhhT22sWnQEp6YyHGI2b2+CMcA==} + dependencies: + '@types/node': 20.10.7 + form-data: 4.0.0 + dev: true + + /@types/node@18.19.5: + resolution: {integrity: sha512-22MG6T02Hos2JWfa1o5jsIByn+bc5iOt1IS4xyg6OG68Bu+wMonVZzdrgCw693++rpLE9RUT/Bx15BeDzO0j+g==} + dependencies: + undici-types: 5.26.5 + dev: true + + /@types/node@20.10.7: + resolution: {integrity: sha512-fRbIKb8C/Y2lXxB5eVMj4IU7xpdox0Lh8bUPEdtLysaylsml1hOOx1+STloRs/B9nf7C6kPRmmg/V7aQW7usNg==} + dependencies: + undici-types: 5.26.5 + dev: true + + /@types/normalize-package-data@2.4.4: + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + dev: true + + /@types/parse-json@4.0.2: + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + dev: false + + /@types/pretty-hrtime@1.0.3: + resolution: {integrity: sha512-nj39q0wAIdhwn7DGUyT9irmsKK1tV0bd5WFEhgpqNTMFZ8cE+jieuTphCW0tfdm47S2zVT5mr09B28b1chmQMA==} + dev: true + + /@types/prop-types@15.7.11: + resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} + + /@types/qs@6.9.11: + resolution: {integrity: sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==} + dev: true + + /@types/range-parser@1.2.7: + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + dev: true + + /@types/react-dom@18.2.18: + resolution: {integrity: sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==} + dependencies: + '@types/react': 18.2.47 + dev: true + + /@types/react-reconciler@0.28.8: + resolution: {integrity: sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==} + dependencies: + '@types/react': 18.2.47 + dev: false + + /@types/react-transition-group@4.4.10: + resolution: {integrity: sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==} + dependencies: + '@types/react': 18.2.47 + dev: false + + /@types/react@18.2.47: + resolution: {integrity: sha512-xquNkkOirwyCgoClNk85BjP+aqnIS+ckAJ8i37gAbDs14jfW/J23f2GItAf33oiUPQnqNMALiFeoM9Y5mbjpVQ==} + dependencies: + '@types/prop-types': 15.7.11 + '@types/scheduler': 0.16.8 + csstype: 3.1.3 + + /@types/resolve@1.20.6: + resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} + dev: true + + /@types/scheduler@0.16.8: + resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} + + /@types/semver@7.5.6: + resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} + dev: true + + /@types/send@0.17.4: + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + dependencies: + '@types/mime': 1.3.5 + '@types/node': 20.10.7 + dev: true + + /@types/serve-static@1.15.5: + resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} + dependencies: + '@types/http-errors': 2.0.4 + '@types/mime': 3.0.4 + '@types/node': 20.10.7 + dev: true + + /@types/unist@2.0.10: + resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + dev: true + + /@types/use-sync-external-store@0.0.3: + resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} + dev: false + + /@types/uuid@9.0.7: + resolution: {integrity: sha512-WUtIVRUZ9i5dYXefDEAI7sh9/O7jGvHg7Df/5O/gtH3Yabe5odI3UWopVR1qbPXQtvOxWu3mM4XxlYeZtMWF4g==} + dev: true + + /@types/yargs-parser@21.0.3: + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + dev: true + + /@types/yargs@16.0.9: + resolution: {integrity: sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==} + dependencies: + '@types/yargs-parser': 21.0.3 + dev: true + + /@types/yargs@17.0.32: + resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + dependencies: + '@types/yargs-parser': 21.0.3 + dev: true + + /@typescript-eslint/eslint-plugin@6.18.0(@typescript-eslint/parser@6.18.0)(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-3lqEvQUdCozi6d1mddWqd+kf8KxmGq2Plzx36BlkjuQe3rSTm/O98cLf0A4uDO+a5N1KD2SeEEl6fW97YHY+6w==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 6.18.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/scope-manager': 6.18.0 + '@typescript-eslint/type-utils': 6.18.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/utils': 6.18.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.18.0 + debug: 4.3.4 + eslint: 8.56.0 + graphemer: 1.4.0 + ignore: 5.3.0 + natural-compare: 1.4.0 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@6.18.0(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-v6uR68SFvqhNQT41frCMCQpsP+5vySy6IdgjlzUWoo7ALCnpaWYcz/Ij2k4L8cEsL0wkvOviCMpjmtRtHNOKzA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 6.18.0 + '@typescript-eslint/types': 6.18.0 + '@typescript-eslint/typescript-estree': 6.18.0(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.18.0 + debug: 4.3.4 + eslint: 8.56.0 + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@5.62.0: + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + dev: true + + /@typescript-eslint/scope-manager@6.18.0: + resolution: {integrity: sha512-o/UoDT2NgOJ2VfHpfr+KBY2ErWvCySNUIX/X7O9g8Zzt/tXdpfEU43qbNk8LVuWUT2E0ptzTWXh79i74PP0twA==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.18.0 + '@typescript-eslint/visitor-keys': 6.18.0 + dev: true + + /@typescript-eslint/type-utils@6.18.0(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-ZeMtrXnGmTcHciJN1+u2CigWEEXgy1ufoxtWcHORt5kGvpjjIlK9MUhzHm4RM8iVy6dqSaZA/6PVkX6+r+ChjQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 6.18.0(typescript@5.3.3) + '@typescript-eslint/utils': 6.18.0(eslint@8.56.0)(typescript@5.3.3) + debug: 4.3.4 + eslint: 8.56.0 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@4.33.0: + resolution: {integrity: sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + dev: true + + /@typescript-eslint/types@5.62.0: + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/types@6.18.0: + resolution: {integrity: sha512-/RFVIccwkwSdW/1zeMx3hADShWbgBxBnV/qSrex6607isYjj05t36P6LyONgqdUrNLl5TYU8NIKdHUYpFvExkA==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: true + + /@typescript-eslint/typescript-estree@4.33.0(typescript@3.9.10): + resolution: {integrity: sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 4.33.0 + '@typescript-eslint/visitor-keys': 4.33.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + tsutils: 3.21.0(typescript@3.9.10) + typescript: 3.9.10 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5): + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + tsutils: 3.21.0(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.3.3): + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + tsutils: 3.21.0(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/typescript-estree@6.18.0(typescript@5.3.3): + resolution: {integrity: sha512-klNvl+Ql4NsBNGB4W9TZ2Od03lm7aGvTbs0wYaFYsplVPhr+oeXjlPZCDI4U9jgJIDK38W1FKhacCFzCC+nbIg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.18.0 + '@typescript-eslint/visitor-keys': 6.18.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@5.62.0(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.6 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) + eslint: 8.56.0 + eslint-scope: 5.1.1 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/utils@6.18.0(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-wiKKCbUeDPGaYEYQh1S580dGxJ/V9HI7K5sbGAVklyf+o5g3O+adnS4UNJajplF4e7z2q0uVBaTdT/yLb4XAVA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.6 + '@typescript-eslint/scope-manager': 6.18.0 + '@typescript-eslint/types': 6.18.0 + '@typescript-eslint/typescript-estree': 6.18.0(typescript@5.3.3) + eslint: 8.56.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@4.33.0: + resolution: {integrity: sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + dependencies: + '@typescript-eslint/types': 4.33.0 + eslint-visitor-keys: 2.1.0 + dev: true + + /@typescript-eslint/visitor-keys@5.62.0: + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@typescript-eslint/visitor-keys@6.18.0: + resolution: {integrity: sha512-1wetAlSZpewRDb2h9p/Q8kRjdGuqdTAQbkJIOUMLug2LBLG+QOjiWoSj6/3B/hA9/tVTFFdtiKvAYoYnSRW/RA==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.18.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true + + /@vitejs/plugin-react-swc@3.5.0(vite@5.0.11): + resolution: {integrity: sha512-1PrOvAaDpqlCV+Up8RkAh9qaiUjoDUcjtttyhXDKw53XA6Ve16SOp6cCOpRs8Dj8DqUQs6eTW5YkLcLJjrXAig==} + peerDependencies: + vite: ^4 || ^5 + dependencies: + '@swc/core': 1.3.101 + vite: 5.0.11(@types/node@20.10.7) + transitivePeerDependencies: + - '@swc/helpers' + dev: true + + /@vitejs/plugin-react@3.1.0(vite@5.0.11): + resolution: {integrity: sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.1.0-beta.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.7) + magic-string: 0.27.0 + react-refresh: 0.14.0 + vite: 5.0.11(@types/node@20.10.7) + transitivePeerDependencies: + - supports-color + dev: true + + /@vitest/expect@0.34.7: + resolution: {integrity: sha512-G9iEtwrD6ZQ4MVHZufif9Iqz3eLtuwBBNx971fNAGPaugM7ftAWjQN+ob2zWhtzURp8RK3zGXOxVb01mFo3zAQ==} + dependencies: + '@vitest/spy': 0.34.7 + '@vitest/utils': 0.34.7 + chai: 4.4.0 + dev: true + + /@vitest/spy@0.34.7: + resolution: {integrity: sha512-NMMSzOY2d8L0mcOt4XcliDOS1ISyGlAXuQtERWVOoVHnKwmG+kKhinAiGw3dTtMQWybfa89FG8Ucg9tiC/FhTQ==} + dependencies: + tinyspy: 2.2.0 + dev: true + + /@vitest/utils@0.34.7: + resolution: {integrity: sha512-ziAavQLpCYS9sLOorGrFFKmy2gnfiNU0ZJ15TsMz/K92NAPS/rp9K4z6AJQQk5Y8adCy4Iwpxy7pQumQ/psnRg==} + dependencies: + diff-sequences: 29.6.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + dev: true + + /@volar/language-core@1.11.1: + resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} + dependencies: + '@volar/source-map': 1.11.1 + dev: true + + /@volar/source-map@1.11.1: + resolution: {integrity: sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==} + dependencies: + muggle-string: 0.3.1 + dev: true + + /@volar/typescript@1.11.1: + resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==} + dependencies: + '@volar/language-core': 1.11.1 + path-browserify: 1.0.1 + dev: true + + /@vue/compiler-core@3.4.0: + resolution: {integrity: sha512-cw4S15PkNGTKkP9OFFl4wnQoJJk+HqaYBafgrpDnSukiQGpcYJeRpzmqnCVCIkl6V6Eqsv58E0OAdl6b592vuA==} + dependencies: + '@babel/parser': 7.23.6 + '@vue/shared': 3.4.0 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.0.2 + dev: true + + /@vue/compiler-dom@3.4.0: + resolution: {integrity: sha512-E957uOhpoE48YjZGWeAoLmNYd3UeU4oIP8kJi8Rcsb9l2tV8Z48Jn07Zgq1aW0v3vuhlmydEKkKKbhLpADHXEA==} + dependencies: + '@vue/compiler-core': 3.4.0 + '@vue/shared': 3.4.0 + dev: true + + /@vue/language-core@1.8.27(typescript@5.3.3): + resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@volar/language-core': 1.11.1 + '@volar/source-map': 1.11.1 + '@vue/compiler-dom': 3.4.0 + '@vue/shared': 3.4.0 + computeds: 0.0.1 + minimatch: 9.0.3 + muggle-string: 0.3.1 + path-browserify: 1.0.1 + typescript: 5.3.3 + vue-template-compiler: 2.7.16 + dev: true + + /@vue/shared@3.4.0: + resolution: {integrity: sha512-Nhh3ed3G1R6HDAWiG6YYFt0Zmq/To6u5vjzwa9TIquGheCXPY6nEdIAO8ZdlwXsWqC2yNLj700FOvShpYt5CEA==} + dev: true + + /@xobotyi/scrollbar-width@1.9.5: + resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} + dev: false + + /@yarnpkg/esbuild-plugin-pnp@3.0.0-rc.15(esbuild@0.18.20): + resolution: {integrity: sha512-kYzDJO5CA9sy+on/s2aIW0411AklfCi8Ck/4QDivOqsMKpStZA2SsR+X27VTggGwpStWaLrjJcDcdDMowtG8MA==} + engines: {node: '>=14.15.0'} + peerDependencies: + esbuild: '>=0.10.0' + dependencies: + esbuild: 0.18.20 + tslib: 2.6.2 + dev: true + + /@yarnpkg/fslib@2.10.3: + resolution: {integrity: sha512-41H+Ga78xT9sHvWLlFOZLIhtU6mTGZ20pZ29EiZa97vnxdohJD2AF42rCoAoWfqUz486xY6fhjMH+DYEM9r14A==} + engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} + dependencies: + '@yarnpkg/libzip': 2.3.0 + tslib: 1.14.1 + dev: true + + /@yarnpkg/libzip@2.3.0: + resolution: {integrity: sha512-6xm38yGVIa6mKm/DUCF2zFFJhERh/QWp1ufm4cNUvxsONBmfPg8uZ9pZBdOmF6qFGr/HlT6ABBkCSx/dlEtvWg==} + engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} + dependencies: + '@types/emscripten': 1.39.10 + tslib: 1.14.1 + dev: true + + /@zag-js/dom-query@0.16.0: + resolution: {integrity: sha512-Oqhd6+biWyKnhKwFFuZrrf6lxBz2tX2pRQe6grUnYwO6HJ8BcbqZomy2lpOdr+3itlaUqx+Ywj5E5ZZDr/LBfQ==} + dev: false + + /@zag-js/element-size@0.10.5: + resolution: {integrity: sha512-uQre5IidULANvVkNOBQ1tfgwTQcGl4hliPSe69Fct1VfYb2Fd0jdAcGzqQgPhfrXFpR62MxLPB7erxJ/ngtL8w==} + dev: false + + /@zag-js/focus-visible@0.16.0: + resolution: {integrity: sha512-a7U/HSopvQbrDU4GLerpqiMcHKEkQkNPeDZJWz38cw/6Upunh41GjHetq5TB84hxyCaDzJ6q2nEdNoBQfC0FKA==} + dependencies: + '@zag-js/dom-query': 0.16.0 + dev: false + + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: true + + /acorn-jsx@5.3.2(acorn@7.4.1): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 7.4.1 + dev: true + + /acorn-jsx@5.3.2(acorn@8.11.2): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.2 + dev: true + + /acorn-walk@7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /address@1.2.2: + resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} + engines: {node: '>= 10.0.0'} + dev: true + + /agent-base@5.1.1: + resolution: {integrity: sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==} + engines: {node: '>= 6.0.0'} + dev: true + + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /app-module-path@2.2.0: + resolution: {integrity: sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ==} + dev: true + + /app-root-dir@1.0.2: + resolution: {integrity: sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==} + dev: true + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /aria-hidden@1.2.3: + resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} + engines: {node: '>=10'} + dependencies: + tslib: 2.6.2 + + /aria-query@5.1.3: + resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + dependencies: + deep-equal: 2.2.3 + dev: true + + /aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + dependencies: + dequal: 2.0.3 + dev: true + + /array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.5 + is-array-buffer: 3.0.2 + dev: true + + /array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + dev: true + + /array-includes@3.1.7: + resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + is-string: 1.0.7 + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /array.prototype.findlastindex@1.2.3: + resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 + get-intrinsic: 1.2.2 + dev: true + + /array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.tosorted@1.1.2: + resolution: {integrity: sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-shim-unscopables: 1.0.2 + get-intrinsic: 1.2.2 + dev: true + + /arraybuffer.prototype.slice@1.0.2: + resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + is-array-buffer: 3.0.2 + is-shared-array-buffer: 1.0.2 + dev: true + + /assert@2.1.0: + resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + dependencies: + call-bind: 1.0.5 + is-nan: 1.3.2 + object-is: 1.1.5 + object.assign: 4.1.5 + util: 0.12.5 + dev: true + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + + /ast-module-types@2.7.1: + resolution: {integrity: sha512-Rnnx/4Dus6fn7fTqdeLEAn5vUll5w7/vts0RN608yFa6si/rDOUonlIIiwugHBFWjylHjxm9owoSZn71KwG4gw==} + dev: true + + /ast-module-types@3.0.0: + resolution: {integrity: sha512-CMxMCOCS+4D+DkOQfuZf+vLrSEmY/7xtORwdxs4wtcC1wVgvk2MqFFTwQCFhvWsI4KPU9lcWXPI8DgRiz+xetQ==} + engines: {node: '>=6.0'} + dev: true + + /ast-module-types@4.0.0: + resolution: {integrity: sha512-Kd0o8r6CDazJGCRzs8Ivpn0xj19oNKrULhoJFzhGjRsLpekF2zyZs9Ukz+JvZhWD6smszfepakTFhAaYpsI12g==} + engines: {node: '>=12.0'} + dev: true + + /ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + dependencies: + tslib: 2.6.2 + dev: true + + /async-limiter@1.0.1: + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + dev: true + + /async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + dev: true + + /asynciterator.prototype@1.0.0: + resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} + dependencies: + has-symbols: 1.0.3 + dev: true + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: true + + /attr-accept@2.2.2: + resolution: {integrity: sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==} + engines: {node: '>=4'} + dev: false + + /available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + dev: true + + /babel-core@7.0.0-bridge.0(@babel/core@7.23.7): + resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.7 + dev: true + + /babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': 7.22.5 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + dependencies: + '@babel/runtime': 7.23.6 + cosmiconfig: 7.1.0 + resolve: 1.22.8 + dev: false + + /babel-plugin-polyfill-corejs2@0.4.7(@babel/core@7.23.7): + resolution: {integrity: sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/core': 7.23.7 + '@babel/helper-define-polyfill-provider': 0.4.4(@babel/core@7.23.7) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-corejs3@0.8.7(@babel/core@7.23.7): + resolution: {integrity: sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-define-polyfill-provider': 0.4.4(@babel/core@7.23.7) + core-js-compat: 3.35.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-regenerator@0.5.4(@babel/core@7.23.7): + resolution: {integrity: sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-define-polyfill-provider': 0.4.4(@babel/core@7.23.7) + transitivePeerDependencies: + - supports-color + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /better-opn@3.0.2: + resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} + engines: {node: '>=12.0.0'} + dependencies: + open: 8.4.2 + dev: true + + /big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + dev: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + + /body-parser@1.20.1: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /boolean@3.2.0: + resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + dev: false + + /bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + dependencies: + big-integer: 1.6.52 + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /browser-assert@1.2.1: + resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==} + dev: true + + /browserify-zlib@0.1.4: + resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} + dependencies: + pako: 0.2.9 + dev: true + + /browserslist@4.22.2: + resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001575 + electron-to-chromium: 1.4.623 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.22.2) + dev: true + + /bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + dependencies: + node-int64: 0.4.0 + dev: true + + /buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + dev: true + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /bytes@3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} + dev: true + + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: true + + /call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + dependencies: + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + set-function-length: 1.1.1 + dev: true + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true + + /caniuse-lite@1.0.30001575: + resolution: {integrity: sha512-VE+TSRJsWdtwTheYnrQikhGWlvJp+4lunXBadY66YIc+itIHm7y9d0NSA150Eh6mNY6d1S/B+fitPr9OzHJc6Q==} + dev: true + + /chai@4.4.0: + resolution: {integrity: sha512-x9cHNq1uvkCdU+5xTkNh5WtgD4e4yDFCsp9jVc7N7qVeKeftv3gO/ZrviX5d+3ZfxdYnZXZYujjRInu1RogU6A==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.3 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /chakra-react-select@4.7.6(@chakra-ui/form-control@2.2.0)(@chakra-ui/icon@3.2.0)(@chakra-ui/layout@2.3.1)(@chakra-ui/media-query@3.3.0)(@chakra-ui/menu@2.2.1)(@chakra-ui/spinner@2.1.0)(@chakra-ui/system@2.6.2)(@emotion/react@11.11.3)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-ZL43hyXPnWf1g/HjsZDecbeJ4F2Q6tTPYJozlKWkrQ7lIX7ORP0aZYwmc5/Wly4UNzMimj2Vuosl6MmIXH+G2g==} + peerDependencies: + '@chakra-ui/form-control': ^2.0.0 + '@chakra-ui/icon': ^3.0.0 + '@chakra-ui/layout': ^2.0.0 + '@chakra-ui/media-query': ^3.0.0 + '@chakra-ui/menu': ^2.0.0 + '@chakra-ui/spinner': ^2.0.0 + '@chakra-ui/system': ^2.0.0 + '@emotion/react': ^11.8.1 + react: ^18.0.0 + react-dom: ^18.0.0 + dependencies: + '@chakra-ui/form-control': 2.2.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/icon': 3.2.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/layout': 2.3.1(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/media-query': 3.3.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/menu': 2.2.1(@chakra-ui/system@2.6.2)(framer-motion@10.17.9)(react@18.2.0) + '@chakra-ui/spinner': 2.1.0(@chakra-ui/system@2.6.2)(react@18.2.0) + '@chakra-ui/system': 2.6.2(@emotion/react@11.11.3)(@emotion/styled@11.11.0)(react@18.2.0) + '@emotion/react': 11.11.3(@types/react@18.2.47)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-select: 5.7.7(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + /chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: false + + /check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + dependencies: + get-func-name: 2.0.2 + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: true + + /chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: true + + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + dev: true + + /citty@0.1.5: + resolution: {integrity: sha512-AS7n5NSc0OQVMV9v6wt3ByujNIrne0/cTjiC2MYqhvao57VNfiuVksTSr2p17nVOhEr2KtqiAkGwHcgMC/qUuQ==} + dependencies: + consola: 3.2.3 + dev: true + + /classcat@5.0.4: + resolution: {integrity: sha512-sbpkOw6z413p+HDGcBENe498WM9woqWHiJxCq7nvmxe9WmrUmqfAcxpIwAiMtM5Q3AhYkzXcNQHqsWq0mND51g==} + dev: false + + /clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + dev: true + + /clear-any-console@1.16.2: + resolution: {integrity: sha512-OL/7wZpNy9x0GBSzz3poWja84Nr7iaH8aYNsJ5Uet2BVLj6Lm1zvWpZN/yH46Vv3ae7YfHmLLMmfHj911fshJg==} + dev: true + + /cli-check-node@1.3.4: + resolution: {integrity: sha512-iLGgQXm82iP8eH3R67qbOWs5qqUOLmNnMy5Lzl/RybcMh3y+H2zWU5POzuQ6oDUOdz4XWuxcFhP75szqd6frLg==} + dependencies: + chalk: 3.0.0 + log-symbols: 3.0.0 + dev: true + + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: true + + /cli-handle-error@4.4.0: + resolution: {integrity: sha512-RyBCnKlc7xVr79cKb9RfBq+4fjwQeX8HKeNzIPnI/W+DWWIUUKh2ur576DpwJ3kZt2UGHlIAOF7N9txy+mgZsA==} + dependencies: + chalk: 3.0.0 + log-symbols: 3.0.0 + dev: true + + /cli-handle-unhandled@1.1.1: + resolution: {integrity: sha512-Em91mJvU7VdgT2MxQpyY633vW1tDzRjPDbii6ZjEBHHLLh0xDoVkFt/wjvi9nSvJcz9rJmvtJSK8KL/hvF0Stg==} + dependencies: + cli-handle-error: 4.4.0 + dev: true + + /cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + dev: true + + /cli-table3@0.6.3: + resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} + engines: {node: 10.* || >= 12.*} + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + dev: true + + /cli-welcome@2.2.2: + resolution: {integrity: sha512-LgDGS0TW4nIf8v81wpuZzfOEDPcy68u0jKR0Fy5IaWftqdminI6FoDiMFt1mjPylqKGNv/wFsZ7fCs93IeDMIw==} + dependencies: + chalk: 2.4.2 + clear-any-console: 1.16.2 + prettier: 2.8.8 + dev: true + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + dev: true + + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + dev: true + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /color2k@2.0.3: + resolution: {integrity: sha512-zW190nQTIoXcGCaU08DvVNFTmQhUpnJfVuAKfWqUQkflXKpaDdpaYoM0iluLS9lgJNHyBF58KKA2FBEwkD7wog==} + dev: false + + /colors@1.2.5: + resolution: {integrity: sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==} + engines: {node: '>=0.1.90'} + dev: true + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: true + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + /commander@6.2.1: + resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} + engines: {node: '>= 6'} + dev: true + + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: true + + /commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + dev: true + + /commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + dev: true + + /compare-versions@6.1.0: + resolution: {integrity: sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==} + dev: false + + /compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: true + + /compression@1.7.4: + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} + dependencies: + accepts: 1.3.8 + bytes: 3.0.0 + compressible: 2.0.18 + debug: 2.6.9 + on-headers: 1.0.2 + safe-buffer: 5.1.2 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /compute-scroll-into-view@3.0.3: + resolution: {integrity: sha512-nadqwNxghAGTamwIqQSG433W6OADZx2vCo3UXHNrzTRHK/htu+7+L0zhjEoaeaQVNAi3YgqWDv8+tzf0hRfR+A==} + dev: false + + /computeds@0.0.1: + resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /concat-stream@1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + typedarray: 0.0.6 + dev: true + + /concurrently@8.2.2: + resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} + engines: {node: ^14.13.0 || >=16.0.0} + hasBin: true + dependencies: + chalk: 4.1.2 + date-fns: 2.30.0 + lodash: 4.17.21 + rxjs: 7.8.1 + shell-quote: 1.8.1 + spawn-command: 0.0.2 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + dev: true + + /consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} + dev: true + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + dev: true + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: false + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + dev: true + + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: true + + /copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + dependencies: + toggle-selection: 1.0.6 + dev: false + + /core-js-compat@3.35.0: + resolution: {integrity: sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==} + dependencies: + browserslist: 4.22.2 + dev: true + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + + /cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: false + + /cross-fetch@4.0.0: + resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + dev: true + + /css-box-model@1.2.1: + resolution: {integrity: sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==} + dependencies: + tiny-invariant: 1.3.1 + dev: false + + /css-in-js-utils@3.1.0: + resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} + dependencies: + hyphenate-style-name: 1.0.4 + dev: false + + /css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + dev: false + + /css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + dev: true + + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + /d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + dev: false + + /d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + dev: false + + /d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + dev: false + + /d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + dev: false + + /d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + dependencies: + d3-color: 3.1.0 + dev: false + + /d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + dev: false + + /d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + dev: false + + /d3-transition@3.0.1(d3-selection@3.0.0): + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + dev: false + + /d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + dev: false + + /date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + dependencies: + '@babel/runtime': 7.23.6 + dev: true + + /dateformat@5.0.3: + resolution: {integrity: sha512-Kvr6HmPXUMerlLcLF+Pwq3K7apHpYmGDVqrxcDasBg86UcKeTSNWbEzU8bwdXnxnR44FtMhJAxI4Bov6Y/KUfA==} + engines: {node: '>=12.20'} + dev: false + + /de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + dev: true + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: true + + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /decode-uri-component@0.4.1: + resolution: {integrity: sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==} + engines: {node: '>=14.16'} + dev: false + + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + + /deep-equal@2.2.3: + resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.5 + es-get-iterator: 1.1.3 + get-intrinsic: 1.2.2 + is-arguments: 1.1.1 + is-array-buffer: 3.0.2 + is-date-object: 1.0.5 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + isarray: 2.0.5 + object-is: 1.1.5 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.1 + side-channel: 1.0.4 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.13 + dev: true + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: true + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /default-browser-id@3.0.0: + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} + dependencies: + bplist-parser: 0.2.0 + untildify: 4.0.0 + dev: true + + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 + dev: true + + /define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + + /define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: true + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + has-property-descriptors: 1.0.1 + object-keys: 1.1.1 + + /defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + dev: true + + /del@6.1.1: + resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} + engines: {node: '>=10'} + dependencies: + globby: 11.1.0 + graceful-fs: 4.2.11 + is-glob: 4.0.3 + is-path-cwd: 2.2.0 + is-path-inside: 3.0.3 + p-map: 4.0.0 + rimraf: 3.0.2 + slash: 3.0.0 + dev: true + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: true + + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: true + + /dependency-tree@9.0.0: + resolution: {integrity: sha512-osYHZJ1fBSon3lNLw70amAXsQ+RGzXsPvk9HbBgTLbp/bQBmpH5mOmsUvqXU+YEWVU0ZLewsmzOET/8jWswjDQ==} + engines: {node: ^10.13 || ^12 || >=14} + hasBin: true + dependencies: + commander: 2.20.3 + debug: 4.3.4 + filing-cabinet: 3.3.1 + precinct: 9.2.1 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: true + + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: true + + /detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + dev: true + + /detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + /detect-package-manager@2.0.1: + resolution: {integrity: sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==} + engines: {node: '>=12'} + dependencies: + execa: 5.1.1 + dev: true + + /detect-port@1.5.1: + resolution: {integrity: sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==} + hasBin: true + dependencies: + address: 1.2.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /detective-amd@3.1.2: + resolution: {integrity: sha512-jffU26dyqJ37JHR/o44La6CxtrDf3Rt9tvd2IbImJYxWKTMdBjctp37qoZ6ZcY80RHg+kzWz4bXn39e4P7cctQ==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + ast-module-types: 3.0.0 + escodegen: 2.1.0 + get-amd-module-type: 3.0.2 + node-source-walk: 4.3.0 + dev: true + + /detective-amd@4.2.0: + resolution: {integrity: sha512-RbuEJHz78A8nW7CklkqTzd8lDCN42En53dgEIsya0DilpkwslamSZDasLg8dJyxbw46OxhSQeY+C2btdSkCvQQ==} + engines: {node: '>=12'} + hasBin: true + dependencies: + ast-module-types: 4.0.0 + escodegen: 2.1.0 + get-amd-module-type: 4.1.0 + node-source-walk: 5.0.2 + dev: true + + /detective-cjs@3.1.3: + resolution: {integrity: sha512-ljs7P0Yj9MK64B7G0eNl0ThWSYjhAaSYy+fQcpzaKalYl/UoQBOzOeLCSFEY1qEBhziZ3w7l46KG/nH+s+L7BQ==} + engines: {node: '>=6.0'} + dependencies: + ast-module-types: 3.0.0 + node-source-walk: 4.3.0 + dev: true + + /detective-cjs@4.1.0: + resolution: {integrity: sha512-QxzMwt5MfPLwS7mG30zvnmOvHLx5vyVvjsAV6gQOyuMoBR5G1DhS1eJZ4P10AlH+HSnk93mTcrg3l39+24XCtg==} + engines: {node: '>=12'} + dependencies: + ast-module-types: 4.0.0 + node-source-walk: 5.0.2 + dev: true + + /detective-es6@2.2.2: + resolution: {integrity: sha512-eZUKCUsbHm8xoeoCM0z6JFwvDfJ5Ww5HANo+jPR7AzkFpW9Mun3t/TqIF2jjeWa2TFbAiGaWESykf2OQp3oeMw==} + engines: {node: '>=6.0'} + dependencies: + node-source-walk: 4.3.0 + dev: true + + /detective-es6@3.0.1: + resolution: {integrity: sha512-evPeYIEdK1jK3Oji5p0hX4sPV/1vK+o4ihcWZkMQE6voypSW/cIBiynOLxQk5KOOQbdP8oOAsYqouMTYO5l1sw==} + engines: {node: '>=12'} + dependencies: + node-source-walk: 5.0.2 + dev: true + + /detective-less@1.0.2: + resolution: {integrity: sha512-Rps1xDkEEBSq3kLdsdnHZL1x2S4NGDcbrjmd4q+PykK5aJwDdP5MBgrJw1Xo+kyUHuv3JEzPqxr+Dj9ryeDRTA==} + engines: {node: '>= 6.0'} + dependencies: + debug: 4.3.4 + gonzales-pe: 4.3.0 + node-source-walk: 4.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /detective-postcss@4.0.0: + resolution: {integrity: sha512-Fwc/g9VcrowODIAeKRWZfVA/EufxYL7XfuqJQFroBKGikKX83d2G7NFw6kDlSYGG3LNQIyVa+eWv1mqre+v4+A==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + debug: 4.3.4 + is-url: 1.2.4 + postcss: 8.4.32 + postcss-values-parser: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /detective-postcss@6.1.3: + resolution: {integrity: sha512-7BRVvE5pPEvk2ukUWNQ+H2XOq43xENWbH0LcdCE14mwgTBEAMoAx+Fc1rdp76SmyZ4Sp48HlV7VedUnP6GA1Tw==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dependencies: + is-url: 1.2.4 + postcss: 8.4.32 + postcss-values-parser: 6.0.2(postcss@8.4.32) + dev: true + + /detective-sass@3.0.2: + resolution: {integrity: sha512-DNVYbaSlmti/eztFGSfBw4nZvwsTaVXEQ4NsT/uFckxhJrNRFUh24d76KzoCC3aarvpZP9m8sC2L1XbLej4F7g==} + engines: {node: '>=6.0'} + dependencies: + gonzales-pe: 4.3.0 + node-source-walk: 4.3.0 + dev: true + + /detective-sass@4.1.3: + resolution: {integrity: sha512-xGRbwGaGte57gvEqM8B9GDiURY3El/H49vA6g9wFkxq9zalmTlTAuqWu+BsH0iwonGPruLt55tZZDEZqPc6lag==} + engines: {node: '>=12'} + dependencies: + gonzales-pe: 4.3.0 + node-source-walk: 5.0.2 + dev: true + + /detective-scss@2.0.2: + resolution: {integrity: sha512-hDWnWh/l0tht/7JQltumpVea/inmkBaanJUcXRB9kEEXVwVUMuZd6z7eusQ6GcBFrfifu3pX/XPyD7StjbAiBg==} + engines: {node: '>=6.0'} + dependencies: + gonzales-pe: 4.3.0 + node-source-walk: 4.3.0 + dev: true + + /detective-scss@3.1.1: + resolution: {integrity: sha512-FWkfru1jZBhUeuBsOeGKXKAVDrzYFSQFK2o2tuG/nCCFQ0U/EcXC157MNAcR5mmj+mCeneZzlkBOFJTesDjrww==} + engines: {node: '>=12'} + dependencies: + gonzales-pe: 4.3.0 + node-source-walk: 5.0.2 + dev: true + + /detective-stylus@1.0.3: + resolution: {integrity: sha512-4/bfIU5kqjwugymoxLXXLltzQNeQfxGoLm2eIaqtnkWxqbhap9puDVpJPVDx96hnptdERzS5Cy6p9N8/08A69Q==} + dev: true + + /detective-stylus@2.0.1: + resolution: {integrity: sha512-/Tvs1pWLg8eYwwV6kZQY5IslGaYqc/GACxjcaGudiNtN5nKCH6o2WnJK3j0gA3huCnoQcbv8X7oz/c1lnvE3zQ==} + engines: {node: '>=6.0'} + dev: true + + /detective-stylus@3.0.0: + resolution: {integrity: sha512-1xYTzbrduExqMYmte7Qk99IRA3Aa6oV7PYzd+3yDcQXkmENvyGF/arripri6lxRDdNYEb4fZFuHtNRAXbz3iAA==} + engines: {node: '>=12'} + dev: true + + /detective-typescript@7.0.2: + resolution: {integrity: sha512-unqovnhxzvkCz3m1/W4QW4qGsvXCU06aU2BAm8tkza+xLnp9SOFnob2QsTxUv5PdnQKfDvWcv9YeOeFckWejwA==} + engines: {node: ^10.13 || >=12.0.0} + dependencies: + '@typescript-eslint/typescript-estree': 4.33.0(typescript@3.9.10) + ast-module-types: 2.7.1 + node-source-walk: 4.3.0 + typescript: 3.9.10 + transitivePeerDependencies: + - supports-color + dev: true + + /detective-typescript@9.1.1: + resolution: {integrity: sha512-Uc1yVutTF0RRm1YJ3g//i1Cn2vx1kwHj15cnzQP6ff5koNzQ0idc1zAC73ryaWEulA0ElRXFTq6wOqe8vUQ3MA==} + engines: {node: ^12.20.0 || ^14.14.0 || >=16.0.0} + dependencies: + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + ast-module-types: 4.0.0 + node-source-walk: 5.0.2 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /diff-match-patch@1.0.5: + resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} + dev: false + + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /discontinuous-range@1.0.0: + resolution: {integrity: sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==} + dev: false + + /doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + dev: true + + /dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + dev: true + + /dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + dependencies: + '@babel/runtime': 7.23.7 + csstype: 3.1.3 + dev: false + + /dotenv-expand@10.0.0: + resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + engines: {node: '>=12'} + dev: true + + /dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + engines: {node: '>=12'} + dev: true + + /duplexify@3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 2.3.8 + stream-shift: 1.0.1 + dev: true + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: true + + /ejs@3.1.9: + resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + jake: 10.8.7 + dev: true + + /electron-to-chromium@1.4.623: + resolution: {integrity: sha512-lKoz10iCYlP1WtRYdh5MvocQPWVRoI7ysp6qf18bmeBgR8abE6+I2CsfyNKztRDZvhdWc+krKT6wS7Neg8sw3A==} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + + /engine.io-client@6.5.3: + resolution: {integrity: sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==} + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.4 + engine.io-parser: 5.2.1 + ws: 8.11.0 + xmlhttprequest-ssl: 2.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /engine.io-parser@5.2.1: + resolution: {integrity: sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==} + engines: {node: '>=10.0.0'} + dev: false + + /enhanced-resolve@5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: true + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: true + + /envinfo@7.11.0: + resolution: {integrity: sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + + /error-stack-parser@2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + dependencies: + stackframe: 1.3.4 + dev: false + + /es-abstract@1.22.3: + resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + arraybuffer.prototype.slice: 1.0.2 + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 + es-set-tostringtag: 2.0.2 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.2 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + internal-slot: 1.0.6 + is-array-buffer: 3.0.2 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-typed-array: 1.1.12 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.1 + safe-array-concat: 1.0.1 + safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.8 + string.prototype.trimend: 1.0.7 + string.prototype.trimstart: 1.0.7 + typed-array-buffer: 1.0.0 + typed-array-byte-length: 1.0.0 + typed-array-byte-offset: 1.0.0 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.13 + dev: true + + /es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + has-symbols: 1.0.3 + is-arguments: 1.1.1 + is-map: 2.0.2 + is-set: 2.0.2 + is-string: 1.0.7 + isarray: 2.0.5 + stop-iteration-iterator: 1.0.0 + dev: true + + /es-iterator-helpers@1.0.15: + resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} + dependencies: + asynciterator.prototype: 1.0.0 + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + es-set-tostringtag: 2.0.2 + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + globalthis: 1.0.3 + has-property-descriptors: 1.0.1 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.6 + iterator.prototype: 1.1.2 + safe-array-concat: 1.0.1 + dev: true + + /es-module-lexer@0.9.3: + resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} + dev: true + + /es-set-tostringtag@2.0.2: + resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + has-tostringtag: 1.0.0 + hasown: 2.0.0 + dev: true + + /es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + dependencies: + hasown: 2.0.0 + dev: true + + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /esbuild-plugin-alias@0.2.1: + resolution: {integrity: sha512-jyfL/pwPqaFXyKnj8lP8iLk6Z0m099uXR45aSN8Av1XD4vhvQutxxPzgA2bTcAwQpa1zCXDcWOlhFgyP3GKqhQ==} + dev: true + + /esbuild-register@3.5.0(esbuild@0.18.20): + resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==} + peerDependencies: + esbuild: '>=0.12 <1' + dependencies: + debug: 4.3.4 + esbuild: 0.18.20 + transitivePeerDependencies: + - supports-color + dev: true + + /esbuild@0.17.19: + resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + 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 + dev: true + + /esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: true + + /esbuild@0.19.11: + resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.11 + '@esbuild/android-arm': 0.19.11 + '@esbuild/android-arm64': 0.19.11 + '@esbuild/android-x64': 0.19.11 + '@esbuild/darwin-arm64': 0.19.11 + '@esbuild/darwin-x64': 0.19.11 + '@esbuild/freebsd-arm64': 0.19.11 + '@esbuild/freebsd-x64': 0.19.11 + '@esbuild/linux-arm': 0.19.11 + '@esbuild/linux-arm64': 0.19.11 + '@esbuild/linux-ia32': 0.19.11 + '@esbuild/linux-loong64': 0.19.11 + '@esbuild/linux-mips64el': 0.19.11 + '@esbuild/linux-ppc64': 0.19.11 + '@esbuild/linux-riscv64': 0.19.11 + '@esbuild/linux-s390x': 0.19.11 + '@esbuild/linux-x64': 0.19.11 + '@esbuild/netbsd-x64': 0.19.11 + '@esbuild/openbsd-x64': 0.19.11 + '@esbuild/sunos-x64': 0.19.11 + '@esbuild/win32-arm64': 0.19.11 + '@esbuild/win32-ia32': 0.19.11 + '@esbuild/win32-x64': 0.19.11 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: true + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + /escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + dev: true + + /eslint-config-prettier@9.1.0(eslint@8.56.0): + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.56.0 + dev: true + + /eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + dependencies: + debug: 3.2.7 + is-core-module: 2.13.1 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.18.0)(eslint-import-resolver-node@0.3.9)(eslint@8.56.0): + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 6.18.0(eslint@8.56.0)(typescript@5.3.3) + debug: 3.2.7 + eslint: 8.56.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-i18next@6.0.3: + resolution: {integrity: sha512-RtQXYfg6PZCjejIQ/YG+dUj/x15jPhufJ9hUDGH0kCpJ6CkVMAWOQ9exU1CrbPmzeykxLjrXkjAaOZF/V7+DOA==} + engines: {node: '>=0.10.0'} + dependencies: + lodash: 4.17.21 + requireindex: 1.1.0 + dev: true + + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.18.0)(eslint@8.56.0): + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 6.18.0(eslint@8.56.0)(typescript@5.3.3) + array-includes: 3.1.7 + array.prototype.findlastindex: 1.2.3 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.56.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.18.0)(eslint-import-resolver-node@0.3.9)(eslint@8.56.0) + hasown: 2.0.0 + is-core-module: 2.13.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.7 + object.groupby: 1.0.1 + object.values: 1.1.7 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-path@1.2.3(eslint@8.56.0): + resolution: {integrity: sha512-TZiuqyVBTfazWo/IwW6cd3dSisd01ew17QXTDLS0WUZK59wJ4wuI9Mzjlpr+4yRznkm/Q+nuiAZu1akiEElUww==} + engines: {node: '>= 12.22.0'} + peerDependencies: + eslint: '>=6.0.0' + dependencies: + eslint: 8.56.0 + load-tsconfig: 0.2.5 + dev: true + + /eslint-plugin-react-hooks@4.6.0(eslint@8.56.0): + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: + eslint: 8.56.0 + dev: true + + /eslint-plugin-react@7.33.2(eslint@8.56.0): + resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + array-includes: 3.1.7 + array.prototype.flatmap: 1.3.2 + array.prototype.tosorted: 1.1.2 + doctrine: 2.1.0 + es-iterator-helpers: 1.0.15 + eslint: 8.56.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.7 + object.fromentries: 2.0.7 + object.hasown: 1.1.3 + object.values: 1.1.7 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.10 + dev: true + + /eslint-plugin-simple-import-sort@10.0.0(eslint@8.56.0): + resolution: {integrity: sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==} + peerDependencies: + eslint: '>=5.0.0' + dependencies: + eslint: 8.56.0 + dev: true + + /eslint-plugin-storybook@0.6.15(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-lAGqVAJGob47Griu29KXYowI4G7KwMoJDOkEip8ujikuDLxU+oWJ1l0WL6F2oDO4QiyUFXvtDkEkISMOPzo+7w==} + engines: {node: 12.x || 14.x || >= 16} + peerDependencies: + eslint: '>=6' + dependencies: + '@storybook/csf': 0.0.1 + '@typescript-eslint/utils': 5.62.0(eslint@8.56.0)(typescript@5.3.3) + eslint: 8.56.0 + requireindex: 1.2.0 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /eslint-plugin-unused-imports@3.0.0(@typescript-eslint/eslint-plugin@6.18.0)(eslint@8.56.0): + resolution: {integrity: sha512-sduiswLJfZHeeBJ+MQaG+xYzSWdRXoSw61DpU13mzWumCkR0ufD0HmO4kdNokjrkluMHpj/7PJeN35pgbhW3kw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^6.0.0 + eslint: ^8.0.0 + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 6.18.0(@typescript-eslint/parser@6.18.0)(eslint@8.56.0)(typescript@5.3.3) + eslint: 8.56.0 + eslint-rule-composer: 0.3.0 + dev: true + + /eslint-rule-composer@0.3.0: + resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==} + engines: {node: '>=4.0.0'} + dev: true + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.56.0: + resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.56.0 + '@humanwhocodes/config-array': 0.11.13 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + eslint-visitor-keys: 3.4.3 + dev: true + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: true + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.2.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + dev: true + + /express@4.18.2: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: true + + /extract-zip@1.7.0: + resolution: {integrity: sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==} + hasBin: true + dependencies: + concat-stream: 1.6.2 + debug: 2.6.9 + mkdirp: 0.5.6 + yauzl: 2.10.0 + transitivePeerDependencies: + - supports-color + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fast-loops@1.1.3: + resolution: {integrity: sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g==} + dev: false + + /fast-printf@1.6.9: + resolution: {integrity: sha512-FChq8hbz65WMj4rstcQsFB0O7Cy++nmbNfLYnD9cYv2cRn8EG6k/MGn9kO/tjO66t09DLDugj3yL+V2o6Qftrg==} + engines: {node: '>=10.0'} + dependencies: + boolean: 3.2.0 + dev: false + + /fast-shallow-equal@1.0.0: + resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==} + dev: false + + /fastest-stable-stringify@2.0.2: + resolution: {integrity: sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==} + dev: false + + /fastq@1.16.0: + resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} + dependencies: + reusify: 1.0.4 + dev: true + + /fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + dependencies: + bser: 2.1.1 + dev: true + + /fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + dependencies: + pend: 1.2.0 + dev: true + + /fetch-retry@5.0.6: + resolution: {integrity: sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==} + dev: true + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.2.0 + dev: true + + /file-selector@0.6.0: + resolution: {integrity: sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==} + engines: {node: '>= 12'} + dependencies: + tslib: 2.6.2 + dev: false + + /file-system-cache@2.3.0: + resolution: {integrity: sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ==} + dependencies: + fs-extra: 11.1.1 + ramda: 0.29.0 + dev: true + + /filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + dependencies: + minimatch: 5.1.6 + dev: true + + /filing-cabinet@3.3.1: + resolution: {integrity: sha512-renEK4Hh6DUl9Vl22Y3cxBq1yh8oNvbAdXnhih0wVpmea+uyKjC9K4QeRjUaybIiIewdzfum+Fg15ZqJ/GyCaA==} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + app-module-path: 2.2.0 + commander: 2.20.3 + debug: 4.3.4 + enhanced-resolve: 5.15.0 + is-relative-path: 1.0.2 + module-definition: 3.4.0 + module-lookup-amd: 7.0.1 + resolve: 1.22.8 + resolve-dependency-path: 2.0.0 + sass-lookup: 3.0.0 + stylus-lookup: 3.0.2 + tsconfig-paths: 3.15.0 + typescript: 3.9.10 + transitivePeerDependencies: + - supports-color + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /filter-obj@5.1.0: + resolution: {integrity: sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==} + engines: {node: '>=14.16'} + dev: false + + /finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /find-cache-dir@2.1.0: + resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} + engines: {node: '>=6'} + dependencies: + commondir: 1.0.1 + make-dir: 2.1.0 + pkg-dir: 3.0.0 + dev: true + + /find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + dev: true + + /find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + dev: false + + /find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + dependencies: + locate-path: 3.0.0 + dev: true + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.9 + keyv: 4.5.4 + rimraf: 3.0.2 + dev: true + + /flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + dev: true + + /flatten@1.0.3: + resolution: {integrity: sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==} + deprecated: flatten is deprecated in favor of utility frameworks such as lodash. + dev: true + + /flow-parser@0.225.1: + resolution: {integrity: sha512-50fjR6zbLQcpq5IFNkheUSY/AFPxVeeLiBM5B3NQBSKId2G0cUuExOlDDOguxc49dl9lnh8hI1xcYlPJWNp4KQ==} + engines: {node: '>=0.4.0'} + dev: true + + /focus-lock@1.0.0: + resolution: {integrity: sha512-a8Ge6cdKh9za/GZR/qtigTAk7SrGore56EFcoMshClsh7FLk1zwszc/ltuMfKhx56qeuyL/jWQ4J4axou0iJ9w==} + engines: {node: '>=10'} + dependencies: + tslib: 2.6.2 + dev: false + + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + dev: true + + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: true + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + dev: true + + /framer-motion@10.17.9(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-z2NpP8r+XuALoPA7ZVZHm/OoTnwkQNJFBu91sC86o/FYvJ4x7ar3eQnixgwYWFK7kEqOtQ6whtNM37tn1KrOOA==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.2 + optionalDependencies: + '@emotion/is-prop-valid': 0.8.8 + dev: false + + /framesync@6.1.2: + resolution: {integrity: sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g==} + dependencies: + tslib: 2.4.0 + dev: false + + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: true + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: true + + /fs-extra@11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: true + + /fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: true + + /fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + + /fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + /function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + functions-have-names: 1.2.3 + dev: true + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /get-amd-module-type@3.0.2: + resolution: {integrity: sha512-PcuKwB8ouJnKuAPn6Hk3UtdfKoUV3zXRqVEvj8XGIXqjWfgd1j7QGdXy5Z9OdQfzVt1Sk29HVe/P+X74ccOuqw==} + engines: {node: '>=6.0'} + dependencies: + ast-module-types: 3.0.0 + node-source-walk: 4.3.0 + dev: true + + /get-amd-module-type@4.1.0: + resolution: {integrity: sha512-0e/eK6vTGCnSfQ6eYs3wtH05KotJYIP7ZIZEueP/KlA+0dIAEs8bYFvOd/U56w1vfjhJqBagUxVMyy9Tr/cViQ==} + engines: {node: '>=12'} + dependencies: + ast-module-types: 4.0.0 + node-source-walk: 5.0.2 + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + dev: true + + /get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + dependencies: + function-bind: 1.1.2 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + + /get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + /get-npm-tarball-url@2.1.0: + resolution: {integrity: sha512-ro+DiMu5DXgRBabqXupW38h7WPZ9+Ad8UjwhvsmmN8w1sU7ab0nzAXvVZ4kqYg57OrqomRtJvepX5/xvFKNtjA==} + engines: {node: '>=12.17'} + dev: true + + /get-own-enumerable-property-symbols@3.0.2: + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + dev: true + + /get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + dev: true + + /get-port@5.1.1: + resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} + engines: {node: '>=8'} + dev: true + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: true + + /get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + dev: true + + /giget@1.2.1: + resolution: {integrity: sha512-4VG22mopWtIeHwogGSy1FViXVo0YT+m6BrqZfz0JJFwbSsePsCdOzdLIIli5BtMp7Xe8f/o2OmBpQX2NBOC24g==} + hasBin: true + dependencies: + citty: 0.1.5 + consola: 3.2.3 + defu: 6.1.4 + node-fetch-native: 1.6.1 + nypm: 0.3.4 + ohash: 1.1.3 + pathe: 1.1.1 + tar: 6.2.0 + dev: true + + /github-slugger@1.5.0: + resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-promise@4.2.2(glob@7.2.3): + resolution: {integrity: sha512-xcUzJ8NWN5bktoTIX7eOclO1Npxd/dyVqUJxlLIDasT4C7KZyqlPIwkdJ0Ypiy3p2ZKahTjK4M9uC3sNSfNMzw==} + engines: {node: '>=12'} + peerDependencies: + glob: ^7.1.6 + dependencies: + '@types/glob': 7.2.0 + glob: 7.2.3 + dev: true + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + dev: true + + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 7.0.4 + path-scurry: 1.10.1 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.0 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: true + + /gonzales-pe@4.3.0: + resolution: {integrity: sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==} + engines: {node: '>=0.6.0'} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.2 + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /gunzip-maybe@1.4.2: + resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} + hasBin: true + dependencies: + browserify-zlib: 0.1.4 + is-deflate: 1.0.0 + is-gzip: 1.0.0 + peek-stream: 1.1.3 + pumpify: 1.5.1 + through2: 2.0.5 + dev: true + + /handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.17.4 + dev: true + + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + dependencies: + get-intrinsic: 1.2.2 + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + + /he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + dev: true + + /hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + dependencies: + react-is: 16.13.1 + dev: false + + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /html-parse-stringify@3.0.1: + resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} + dependencies: + void-elements: 3.1.0 + dev: false + + /html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + dev: true + + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: true + + /https-proxy-agent@4.0.0: + resolution: {integrity: sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==} + engines: {node: '>= 6.0.0'} + dependencies: + agent-base: 5.1.1 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: true + + /hyphenate-style-name@1.0.4: + resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==} + dev: false + + /i18next-http-backend@2.4.2: + resolution: {integrity: sha512-wKrgGcaFQ4EPjfzBTjzMU0rbFTYpa0S5gv9N/d8WBmWS64+IgJb7cHddMvV+tUkse7vUfco3eVs2lB+nJhPo3w==} + dependencies: + cross-fetch: 4.0.0 + transitivePeerDependencies: + - encoding + dev: false + + /i18next@23.7.16: + resolution: {integrity: sha512-SrqFkMn9W6Wb43ZJ9qrO6U2U4S80RsFMA7VYFSqp7oc7RllQOYDCdRfsse6A7Cq/V8MnpxKvJCYgM8++27n4Fw==} + dependencies: + '@babel/runtime': 7.23.7 + dev: false + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /idb-keyval@6.2.1: + resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} + dev: false + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + + /ignore@5.3.0: + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + engines: {node: '>= 4'} + dev: true + + /immer@10.0.3: + resolution: {integrity: sha512-pwupu3eWfouuaowscykeckFmVTpqbzW+rXFCX8rQLkZzM9ftBmU/++Ra+o+L27mz03zJTlyV4UUr+fdKNffo4A==} + dev: false + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + + /indexes-of@1.0.1: + resolution: {integrity: sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /inline-style-prefixer@7.0.0: + resolution: {integrity: sha512-I7GEdScunP1dQ6IM2mQWh6v0mOYdYmH3Bp31UecKdrcUgcURTcctSe1IECdUznSHKSmsHtjrT3CwCPI1pyxfUQ==} + dependencies: + css-in-js-utils: 3.1.0 + fast-loops: 1.1.3 + dev: false + + /internal-slot@1.0.6: + resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + hasown: 2.0.0 + side-channel: 1.0.4 + dev: true + + /invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + dependencies: + loose-envify: 1.4.0 + + /ip@2.0.0: + resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} + dev: true + + /ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + dev: true + + /is-absolute-url@3.0.3: + resolution: {integrity: sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==} + engines: {node: '>=8'} + dev: true + + /is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + has-tostringtag: 1.0.0 + dev: true + + /is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-typed-array: 1.1.12 + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + /is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + has-tostringtag: 1.0.0 + dev: true + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.0 + + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-deflate@1.0.0: + resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} + dev: true + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + dependencies: + call-bind: 1.0.5 + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-gzip@1.0.0: + resolution: {integrity: sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + dev: true + + /is-map@2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + dev: true + + /is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + dev: true + + /is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-path-cwd@2.2.0: + resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} + engines: {node: '>=6'} + dev: true + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + dev: true + + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + has-tostringtag: 1.0.0 + dev: true + + /is-regexp@1.0.0: + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} + engines: {node: '>=0.10.0'} + dev: true + + /is-relative-path@1.0.2: + resolution: {integrity: sha512-i1h+y50g+0hRbBD+dbnInl3JlJ702aar58snAeX+MxBAPvzXGej7sYoPMhlnykabt0ZzCJNBEyzMlekuQZN7fA==} + dev: true + + /is-set@2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + dev: true + + /is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.5 + dev: true + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-typed-array@1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.13 + dev: true + + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + dev: true + + /is-url-superb@4.0.0: + resolution: {integrity: sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==} + engines: {node: '>=10'} + dev: true + + /is-url@1.2.4: + resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} + dev: true + + /is-weakmap@2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + dev: true + + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.5 + dev: true + + /is-weakset@2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + dev: true + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: true + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + dev: true + + /istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.23.7 + '@babel/parser': 7.23.6 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + dependencies: + define-properties: 1.2.1 + get-intrinsic: 1.2.2 + has-symbols: 1.0.3 + reflect.getprototypeof: 1.0.4 + set-function-name: 2.0.1 + dev: true + + /its-fine@1.1.1(react@18.2.0): + resolution: {integrity: sha512-v1Ia1xl20KbuSGlwoaGsW0oxsw8Be+TrXweidxD9oT/1lAh6O3K3/GIM95Tt6WCiv6W+h2M7RB1TwdoAjQyyKw==} + peerDependencies: + react: '>=18.0' + dependencies: + '@types/react-reconciler': 0.28.8 + react: 18.2.0 + dev: false + + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: true + + /jake@10.8.7: + resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} + engines: {node: '>=10'} + hasBin: true + dependencies: + async: 3.2.5 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + dev: true + + /jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/graceful-fs': 4.1.9 + '@types/node': 20.10.7 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /jest-mock@27.5.1: + resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 20.10.7 + dev: true + + /jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.10.7 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: true + + /jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@types/node': 20.10.7 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + dev: true + + /js-cookie@2.2.1: + resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /jscodeshift@0.15.1(@babel/preset-env@7.23.7): + resolution: {integrity: sha512-hIJfxUy8Rt4HkJn/zZPU9ChKfKZM1342waJ1QC2e2YsPcWhM+3BJ4dcfQCzArTrk1jJeNLB341H+qOcEHRxJZg==} + hasBin: true + peerDependencies: + '@babel/preset-env': ^7.1.6 + peerDependenciesMeta: + '@babel/preset-env': + optional: true + dependencies: + '@babel/core': 7.23.7 + '@babel/parser': 7.23.6 + '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-nullish-coalescing-operator': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.7) + '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.23.7) + '@babel/preset-env': 7.23.7(@babel/core@7.23.7) + '@babel/preset-flow': 7.23.3(@babel/core@7.23.7) + '@babel/preset-typescript': 7.23.3(@babel/core@7.23.7) + '@babel/register': 7.23.7(@babel/core@7.23.7) + babel-core: 7.0.0-bridge.0(@babel/core@7.23.7) + chalk: 4.1.2 + flow-parser: 0.225.1 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + neo-async: 2.6.2 + node-dir: 0.1.17 + recast: 0.23.4 + temp: 0.8.4 + write-file-atomic: 2.4.3 + transitivePeerDependencies: + - supports-color + dev: true + + /jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsondiffpatch@0.6.0: + resolution: {integrity: sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + dependencies: + '@types/diff-match-patch': 1.0.36 + chalk: 5.3.0 + diff-match-patch: 1.0.5 + dev: false + + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + dependencies: + array-includes: 3.1.7 + array.prototype.flat: 1.3.2 + object.assign: 4.1.5 + object.values: 1.1.7 + dev: true + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: true + + /klona@2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} + dev: false + + /kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + dev: true + + /konva@9.3.0: + resolution: {integrity: sha512-qLTW06GRwb+WMMUXJcGIb0qP4uO0mZLAwgRI82zuCkRmCH1lFsVPmrPzqqHnjKCMu4Jzw6d/R8JxkPw7gkVnuw==} + dev: false + + /lazy-universal-dotenv@4.0.0: + resolution: {integrity: sha512-aXpZJRnTkpK6gQ/z4nk+ZBLd/Qdp118cvPruLSIQzQNRhKwEcdXCOzXuF55VDqIiuAaY3UGZ10DJtvZzDcvsxg==} + engines: {node: '>=14.0.0'} + dependencies: + app-root-dir: 1.0.2 + dotenv: 16.3.1 + dotenv-expand: 10.0.0 + dev: true + + /leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + /liqe@3.8.0: + resolution: {integrity: sha512-cZ1rDx4XzxONBTskSPBp7/KwJ9qbUdF8EPnY4VjKXwHF1Krz9lgnlMTh1G7kd+KtPYvUte1mhuZeQSnk7KiSBg==} + engines: {node: '>=12.0'} + dependencies: + nearley: 2.20.1 + ts-error: 1.0.6 + dev: false + + /load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + dev: true + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + dev: false + + /lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + dev: true + + /lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + dev: true + + /lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + dev: false + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /log-symbols@3.0.0: + resolution: {integrity: sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==} + engines: {node: '>=8'} + dependencies: + chalk: 2.4.2 + dev: true + + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: true + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + + /loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + dependencies: + get-func-name: 2.0.2 + dev: true + + /lru-cache@10.1.0: + resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} + engines: {node: 14 || >=16.14} + dev: true + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + dev: true + + /madge@6.1.0(typescript@5.3.3): + resolution: {integrity: sha512-irWhT5RpFOc6lkzGHKLihonCVgM0YtfNUh4IrFeW3EqHpnt/JHUG3z26j8PeJEktCGB4tmGOOOJi1Rl/ACWucQ==} + engines: {node: '>=14'} + hasBin: true + peerDependencies: + typescript: ^3.9.5 || ^4.9.5 || ^5 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + chalk: 4.1.2 + commander: 7.2.0 + commondir: 1.0.1 + debug: 4.3.4 + dependency-tree: 9.0.0 + detective-amd: 4.2.0 + detective-cjs: 4.1.0 + detective-es6: 3.0.1 + detective-less: 1.0.2 + detective-postcss: 6.1.3 + detective-sass: 4.1.3 + detective-scss: 3.1.1 + detective-stylus: 2.0.1 + detective-typescript: 9.1.1 + ora: 5.4.1 + pluralize: 8.0.0 + precinct: 8.3.1 + pretty-ms: 7.0.1 + rc: 1.2.8 + stream-to-array: 2.3.0 + ts-graphviz: 1.8.1 + typescript: 5.3.3 + walkdir: 0.4.1 + transitivePeerDependencies: + - supports-color + dev: true + + /magic-string@0.27.0: + resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + dependencies: + pify: 4.0.1 + semver: 5.7.2 + dev: true + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.1 + dev: true + + /makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + dependencies: + tmpl: 1.0.5 + dev: true + + /map-or-similar@1.5.0: + resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==} + dev: true + + /markdown-to-jsx@7.4.0(react@18.2.0): + resolution: {integrity: sha512-zilc+MIkVVXPyTb4iIUTIz9yyqfcWjszGXnwF9K/aiBWcHXFcmdEMTkG01/oQhwSCH7SY1BnG6+ev5BzWmbPrg==} + engines: {node: '>= 10'} + peerDependencies: + react: '>= 0.14.0' + dependencies: + react: 18.2.0 + dev: true + + /mdast-util-definitions@4.0.0: + resolution: {integrity: sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==} + dependencies: + unist-util-visit: 2.0.3 + dev: true + + /mdast-util-to-string@1.1.0: + resolution: {integrity: sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==} + dev: true + + /mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + dev: false + + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + dev: true + + /memoize-one@6.0.0: + resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + dev: false + + /memoizerific@1.11.3: + resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} + dependencies: + map-or-similar: 1.5.0 + dev: true + + /merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: true + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: true + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: true + + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + dev: true + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: true + + /minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + dev: true + + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + dev: true + + /minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + dev: true + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: true + + /mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /module-definition@3.4.0: + resolution: {integrity: sha512-XxJ88R1v458pifaSkPNLUTdSPNVGMP2SXVncVmApGO+gAfrLANiYe6JofymCzVceGOMwQE2xogxBSc8uB7XegA==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + ast-module-types: 3.0.0 + node-source-walk: 4.3.0 + dev: true + + /module-definition@4.1.0: + resolution: {integrity: sha512-rHXi/DpMcD2qcKbPCTklDbX9lBKJrUSl971TW5l6nMpqKCIlzJqmQ8cfEF5M923h2OOLHPDVlh5pJxNyV+AJlw==} + engines: {node: '>=12'} + hasBin: true + dependencies: + ast-module-types: 4.0.0 + node-source-walk: 5.0.2 + dev: true + + /module-lookup-amd@7.0.1: + resolution: {integrity: sha512-w9mCNlj0S8qviuHzpakaLVc+/7q50jl9a/kmJ/n8bmXQZgDPkQHnPBb8MUOYh3WpAYkXuNc2c+khsozhIp/amQ==} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + commander: 2.20.3 + debug: 4.3.4 + glob: 7.2.3 + requirejs: 2.3.6 + requirejs-config-file: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /moo@0.5.2: + resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==} + dev: false + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /muggle-string@0.3.1: + resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} + dev: true + + /nano-css@5.6.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-T2Mhc//CepkTa3X4pUhKgbEheJHYAxD0VptuqFhDbGMUWVV2m+lkNiW/Ieuj35wrfC8Zm0l7HvssQh7zcEttSw==} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + css-tree: 1.1.3 + csstype: 3.1.3 + fastest-stable-stringify: 2.0.2 + inline-style-prefixer: 7.0.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + rtl-css-js: 1.16.1 + stacktrace-js: 2.0.2 + stylis: 4.3.1 + dev: false + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /nanostores@0.9.5: + resolution: {integrity: sha512-Z+p+g8E7yzaWwOe5gEUB2Ox0rCEeXWYIZWmYvw/ajNYX8DlXdMvMDj8DWfM/subqPAcsf8l8Td4iAwO1DeIIRQ==} + engines: {node: ^16.0.0 || ^18.0.0 || >=20.0.0} + dev: false + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /nearley@2.20.1: + resolution: {integrity: sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==} + hasBin: true + dependencies: + commander: 2.20.3 + moo: 0.5.2 + railroad-diagrams: 1.0.0 + randexp: 0.4.6 + dev: false + + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: true + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: true + + /new-github-issue-url@1.0.0: + resolution: {integrity: sha512-wa9jlUFg3v6S3ddijQiB18SY4u9eJYcUe5sHa+6SB8m1UUbtX+H/bBglxOLnhhF1zIHuhWXnKBAa8kBeKRIozQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /node-dir@0.1.17: + resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} + engines: {node: '>= 0.10.5'} + dependencies: + minimatch: 3.1.2 + dev: true + + /node-fetch-native@1.6.1: + resolution: {integrity: sha512-bW9T/uJDPAJB2YNYEpWzE54U5O3MQidXsOyTfnbKYtTtFexRvGzb1waphBN4ZwP6EcIvYYEOwW0b72BpAqydTw==} + dev: true + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + + /node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + dev: true + + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + dev: true + + /node-source-walk@4.3.0: + resolution: {integrity: sha512-8Q1hXew6ETzqKRAs3jjLioSxNfT1cx74ooiF8RlAONwVMcfq+UdzLC2eB5qcPldUxaE5w3ytLkrmV1TGddhZTA==} + engines: {node: '>=6.0'} + dependencies: + '@babel/parser': 7.23.6 + dev: true + + /node-source-walk@5.0.2: + resolution: {integrity: sha512-Y4jr/8SRS5hzEdZ7SGuvZGwfORvNsSsNRwDXx5WisiqzsVfeftDvRgfeqWNgZvWSJbgubTRVRYBzK6UO+ErqjA==} + engines: {node: '>=12'} + dependencies: + '@babel/parser': 7.23.6 + dev: true + + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.8 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /npm-run-path@5.2.0: + resolution: {integrity: sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + + /nypm@0.3.4: + resolution: {integrity: sha512-1JLkp/zHBrkS3pZ692IqOaIKSYHmQXgqfELk6YTOfVBnwealAmPA1q2kKK7PHJAHSMBozerThEFZXP3G6o7Ukg==} + engines: {node: ^14.16.0 || >=16.10.0} + hasBin: true + dependencies: + citty: 0.1.5 + execa: 8.0.1 + pathe: 1.1.1 + ufo: 1.3.2 + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + dev: true + + /object-is@1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + dev: true + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /object.entries@1.1.7: + resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /object.fromentries@2.0.7: + resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /object.groupby@1.0.1: + resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + dev: true + + /object.hasown@1.1.3: + resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} + dependencies: + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /object.values@1.1.7: + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /ohash@1.1.3: + resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} + dev: true + + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: true + + /on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: true + + /openapi-types@12.1.3: + resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + dev: true + + /openapi-typescript@6.7.3: + resolution: {integrity: sha512-es3mGcDXV6TKPo6n3aohzHm0qxhLyR39MhF6mkD1FwFGjhxnqMqfSIgM0eCpInZvqatve4CxmXcMZw3jnnsaXw==} + hasBin: true + dependencies: + ansi-colors: 4.1.3 + fast-glob: 3.3.2 + js-yaml: 4.1.0 + supports-color: 9.4.0 + undici: 5.28.2 + yargs-parser: 21.1.1 + dev: true + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + dev: true + + /overlayscrollbars-react@0.5.3(overlayscrollbars@2.4.6)(react@18.2.0): + resolution: {integrity: sha512-mq9D9tbfSeq0cti1kKMf3B3AzsEGwHcRIDX/K49CvYkHz/tKeU38GiahDkIPKTMEAp6lzKCo4x1eJZA6ZFYOxQ==} + peerDependencies: + overlayscrollbars: ^2.0.0 + react: '>=16.8.0' + dependencies: + overlayscrollbars: 2.4.6 + react: 18.2.0 + dev: false + + /overlayscrollbars@2.4.6: + resolution: {integrity: sha512-C7tmhetwMv9frEvIT/RfkAVEgbjRNz/Gh2zE8BVmN+jl35GRaAnz73rlGQCMRoC2arpACAXyMNnJkzHb7GBrcA==} + dev: false + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.23.5 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + /parse-ms@2.1.0: + resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} + engines: {node: '>=6'} + dev: true + + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: true + + /path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + dev: true + + /path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.1.0 + minipass: 7.0.4 + dev: true + + /path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + /pathe@1.1.1: + resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} + dev: true + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + + /peek-stream@1.1.3: + resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} + dependencies: + buffer-from: 1.1.2 + duplexify: 3.7.1 + through2: 2.0.5 + dev: true + + /pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + dev: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + dev: true + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: true + + /pkg-dir@3.0.0: + resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} + engines: {node: '>=6'} + dependencies: + find-up: 3.0.0 + dev: true + + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: true + + /pkg-dir@5.0.0: + resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} + engines: {node: '>=10'} + dependencies: + find-up: 5.0.0 + dev: true + + /pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + dev: true + + /polished@4.2.2: + resolution: {integrity: sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ==} + engines: {node: '>=10'} + dependencies: + '@babel/runtime': 7.23.7 + dev: true + + /postcss-values-parser@2.0.1: + resolution: {integrity: sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==} + engines: {node: '>=6.14.4'} + dependencies: + flatten: 1.0.3 + indexes-of: 1.0.1 + uniq: 1.0.1 + dev: true + + /postcss-values-parser@6.0.2(postcss@8.4.32): + resolution: {integrity: sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw==} + engines: {node: '>=10'} + peerDependencies: + postcss: ^8.2.9 + dependencies: + color-name: 1.1.4 + is-url-superb: 4.0.0 + postcss: 8.4.32 + quote-unquote: 1.0.0 + dev: true + + /postcss@8.4.32: + resolution: {integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /postcss@8.4.33: + resolution: {integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /precinct@8.3.1: + resolution: {integrity: sha512-pVppfMWLp2wF68rwHqBIpPBYY8Kd12lDhk8LVQzOwqllifVR15qNFyod43YLyFpurKRZQKnE7E4pofAagDOm2Q==} + engines: {node: ^10.13 || ^12 || >=14} + hasBin: true + dependencies: + commander: 2.20.3 + debug: 4.3.4 + detective-amd: 3.1.2 + detective-cjs: 3.1.3 + detective-es6: 2.2.2 + detective-less: 1.0.2 + detective-postcss: 4.0.0 + detective-sass: 3.0.2 + detective-scss: 2.0.2 + detective-stylus: 1.0.3 + detective-typescript: 7.0.2 + module-definition: 3.4.0 + node-source-walk: 4.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /precinct@9.2.1: + resolution: {integrity: sha512-uzKHaTyiVejWW7VJtHInb9KBUq9yl9ojxXGujhjhDmPon2wgZPBKQIKR+6csGqSlUeGXAA4MEFnU6DesxZib+A==} + engines: {node: ^12.20.0 || ^14.14.0 || >=16.0.0} + hasBin: true + dependencies: + '@dependents/detective-less': 3.0.2 + commander: 9.5.0 + detective-amd: 4.2.0 + detective-cjs: 4.1.0 + detective-es6: 3.0.1 + detective-postcss: 6.1.3 + detective-sass: 4.1.3 + detective-scss: 3.1.1 + detective-stylus: 3.0.0 + detective-typescript: 9.1.1 + module-definition: 4.1.0 + node-source-walk: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /prettier@3.1.1: + resolution: {integrity: sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + + /pretty-hrtime@1.0.3: + resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} + engines: {node: '>= 0.8'} + dev: true + + /pretty-ms@7.0.1: + resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} + engines: {node: '>=10'} + dependencies: + parse-ms: 2.1.0 + dev: true + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: true + + /progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: true + + /prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: true + + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + /proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + dev: true + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: true + + /pump@2.0.1: + resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /pumpify@1.5.1: + resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + dependencies: + duplexify: 3.7.1 + inherits: 2.0.4 + pump: 2.0.1 + dev: true + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: true + + /puppeteer-core@2.1.1: + resolution: {integrity: sha512-n13AWriBMPYxnpbb6bnaY5YoY6rGj8vPLrz6CZF3o0qJNEwlcfJVxBzYZ0NJsQ21UbdJoijPCDrM++SUVEz7+w==} + engines: {node: '>=8.16.0'} + dependencies: + '@types/mime-types': 2.1.4 + debug: 4.3.4 + extract-zip: 1.7.0 + https-proxy-agent: 4.0.0 + mime: 2.6.0 + mime-types: 2.1.35 + progress: 2.0.3 + proxy-from-env: 1.1.0 + rimraf: 2.7.1 + ws: 6.2.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: true + + /qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: true + + /query-string@8.1.0: + resolution: {integrity: sha512-BFQeWxJOZxZGix7y+SByG3F36dA0AbTy9o6pSmKFcFz7DAj0re9Frkty3saBn3nHo3D0oZJ/+rx3r8H8r8Jbpw==} + engines: {node: '>=14.16'} + dependencies: + decode-uri-component: 0.4.1 + filter-obj: 5.1.0 + split-on-first: 3.0.0 + dev: false + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /quote-unquote@1.0.0: + resolution: {integrity: sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==} + dev: true + + /railroad-diagrams@1.0.0: + resolution: {integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==} + dev: false + + /ramda@0.29.0: + resolution: {integrity: sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==} + dev: true + + /randexp@0.4.6: + resolution: {integrity: sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==} + engines: {node: '>=0.12'} + dependencies: + discontinuous-range: 1.0.0 + ret: 0.1.15 + dev: false + + /range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: true + + /raw-body@2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: true + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: true + + /react-clientside-effect@1.2.6(react@18.2.0): + resolution: {integrity: sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==} + peerDependencies: + react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.23.7 + react: 18.2.0 + dev: false + + /react-colorful@5.6.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + /react-docgen-typescript@2.2.2(typescript@5.3.3): + resolution: {integrity: sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==} + peerDependencies: + typescript: '>= 4.3.x' + dependencies: + typescript: 5.3.3 + dev: true + + /react-docgen@7.0.1: + resolution: {integrity: sha512-rCz0HBIT0LWbIM+///LfRrJoTKftIzzwsYDf0ns5KwaEjejMHQRtphcns+IXFHDNY9pnz6G8l/JbbI6pD4EAIA==} + engines: {node: '>=16.14.0'} + dependencies: + '@babel/core': 7.23.7 + '@babel/traverse': 7.23.7 + '@babel/types': 7.23.6 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.5 + '@types/doctrine': 0.0.9 + '@types/resolve': 1.20.6 + doctrine: 3.0.0 + resolve: 1.22.8 + strip-indent: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /react-dom@18.2.0(react@18.2.0): + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + + /react-dropzone@14.2.3(react@18.2.0): + resolution: {integrity: sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==} + engines: {node: '>= 10.13'} + peerDependencies: + react: '>= 16.8 || 18.0.0' + dependencies: + attr-accept: 2.2.2 + file-selector: 0.6.0 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /react-element-to-jsx-string@15.0.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==} + peerDependencies: + react: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 + react-dom: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 + dependencies: + '@base2/pretty-print-object': 1.0.1 + is-plain-object: 5.0.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 18.1.0 + dev: true + + /react-error-boundary@4.0.12(react@18.2.0): + resolution: {integrity: sha512-kJdxdEYlb7CPC1A0SeUY38cHpjuu6UkvzKiAmqmOFL21VRfMhOcWxTCBgLVCO0VEMh9JhFNcVaXlV4/BTpiwOA==} + peerDependencies: + react: '>=16.13.1' + dependencies: + '@babel/runtime': 7.23.6 + react: 18.2.0 + dev: false + + /react-fast-compare@3.2.2: + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + dev: false + + /react-focus-lock@2.9.6(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-B7gYnCjHNrNYwY2juS71dHbf0+UpXXojt02svxybj8N5bxceAkzPChKEncHuratjUHkIFNCn06k2qj1DRlzTug==} + 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 + dependencies: + '@babel/runtime': 7.23.7 + '@types/react': 18.2.47 + focus-lock: 1.0.0 + prop-types: 15.8.1 + react: 18.2.0 + react-clientside-effect: 1.2.6(react@18.2.0) + use-callback-ref: 1.3.1(@types/react@18.2.47)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.47)(react@18.2.0) + dev: false + + /react-hook-form@7.49.2(react@18.2.0): + resolution: {integrity: sha512-TZcnSc17+LPPVpMRIDNVITY6w20deMdNi6iehTFLV1x8SqThXGwu93HjlUVU09pzFgZH7qZOvLMM7UYf2ShAHA==} + engines: {node: '>=18', pnpm: '8'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 + dependencies: + react: 18.2.0 + dev: false + + /react-hotkeys-hook@4.4.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-G6psp7OUm9xxY4G2vL48tBwWUVJLvD/PeInaPdPvqRJ8GoXBu6Djqr6WIw5gu1M0SbR1epNUlvpccxu2ZzmtFQ==} + peerDependencies: + react: '>=16.8.1' + react-dom: '>=16.8.1' + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react-i18next@14.0.0(i18next@23.7.16)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-OCrS8rHNAmnr8ggGRDxjakzihrMW7HCbsplduTm3EuuQ6fyvWGT41ksZpqbduYoqJurBmEsEVZ1pILSUWkHZng==} + peerDependencies: + i18next: '>= 23.2.3' + react: '>= 16.8.0' + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + dependencies: + '@babel/runtime': 7.23.7 + html-parse-stringify: 3.0.1 + i18next: 23.7.16 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react-icons@4.12.0(react@18.2.0): + resolution: {integrity: sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw==} + peerDependencies: + react: '*' + dependencies: + react: 18.2.0 + dev: false + + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true + + /react-is@18.1.0: + resolution: {integrity: sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==} + dev: true + + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + dev: true + + /react-konva@18.2.10(konva@9.3.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-ohcX1BJINL43m4ynjZ24MxFI1syjBdrXhqVxYVDw2rKgr3yuS0x/6m1Y2Z4sl4T/gKhfreBx8KHisd0XC6OT1g==} + peerDependencies: + konva: ^8.0.1 || ^7.2.5 || ^9.0.0 + react: '>=18.0.0' + react-dom: '>=18.0.0' + dependencies: + '@types/react-reconciler': 0.28.8 + its-fine: 1.1.1(react@18.2.0) + konva: 9.3.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-reconciler: 0.29.0(react@18.2.0) + scheduler: 0.23.0 + dev: false + + /react-reconciler@0.29.0(react@18.2.0): + resolution: {integrity: sha512-wa0fGj7Zht1EYMRhKWwoo1H9GApxYLBuhoAuXN0TlltESAjDssB+Apf0T/DngVqaMyPypDmabL37vw/2aRM98Q==} + engines: {node: '>=0.10.0'} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + dev: false + + /react-redux@9.0.4(@types/react@18.2.47)(react@18.2.0)(redux@5.0.1): + resolution: {integrity: sha512-9J1xh8sWO0vYq2sCxK2My/QO7MzUMRi3rpiILP/+tDr8krBHixC6JMM17fMK88+Oh3e4Ae6/sHIhNBgkUivwFA==} + peerDependencies: + '@types/react': ^18.2.25 + react: ^18.0 + react-native: '>=0.69' + redux: ^5.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + react-native: + optional: true + redux: + optional: true + dependencies: + '@types/react': 18.2.47 + '@types/use-sync-external-store': 0.0.3 + react: 18.2.0 + redux: 5.0.1 + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false + + /react-refresh@0.14.0: + resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} + engines: {node: '>=0.10.0'} + dev: true + + /react-remove-scroll-bar@2.3.4(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} + 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 + dependencies: + '@types/react': 18.2.47 + react: 18.2.0 + react-style-singleton: 2.2.1(@types/react@18.2.47)(react@18.2.0) + tslib: 2.6.2 + + /react-remove-scroll@2.5.5(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} + 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 + dependencies: + '@types/react': 18.2.47 + react: 18.2.0 + react-remove-scroll-bar: 2.3.4(@types/react@18.2.47)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.47)(react@18.2.0) + tslib: 2.6.2 + use-callback-ref: 1.3.1(@types/react@18.2.47)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.47)(react@18.2.0) + dev: true + + /react-remove-scroll@2.5.7(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==} + 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 + dependencies: + '@types/react': 18.2.47 + react: 18.2.0 + react-remove-scroll-bar: 2.3.4(@types/react@18.2.47)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.47)(react@18.2.0) + tslib: 2.6.2 + use-callback-ref: 1.3.1(@types/react@18.2.47)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.47)(react@18.2.0) + dev: false + + /react-resizable-panels@1.0.9(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-QPfW3L7yetEC6z04G9AYYFz5kBklh8rTWcOsVFImYMNUVhr1Y1r9Qc/20Yks2tA+lXMBWCUz4fkGEvbS7tpBSg==} + peerDependencies: + react: ^16.14.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.14.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react-select@5.7.7(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-HhashZZJDRlfF/AKj0a0Lnfs3sRdw/46VJIRd8IbB9/Ovr74+ZIwkAdSBjSPXsFMG+u72c5xShqwLSKIJllzqw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.23.6 + '@emotion/cache': 11.11.0 + '@emotion/react': 11.11.3(@types/react@18.2.47)(react@18.2.0) + '@floating-ui/dom': 1.5.3 + '@types/react-transition-group': 4.4.10 + memoize-one: 6.0.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) + use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.47)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + + /react-select@5.8.0(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-TfjLDo58XrhP6VG5M/Mi56Us0Yt8X7xD6cDybC7yoRMUNm7BGO7qk8J0TLQOua/prb8vUOtsfnXZwfm30HGsAA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.23.7 + '@emotion/cache': 11.11.0 + '@emotion/react': 11.11.3(@types/react@18.2.47)(react@18.2.0) + '@floating-ui/dom': 1.5.3 + '@types/react-transition-group': 4.4.10 + memoize-one: 6.0.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) + use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.47)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + + /react-style-singleton@2.2.1(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} + 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 + dependencies: + '@types/react': 18.2.47 + get-nonce: 1.0.1 + invariant: 2.2.4 + react: 18.2.0 + tslib: 2.6.2 + + /react-textarea-autosize@8.5.3(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==} + engines: {node: '>=10'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.23.6 + react: 18.2.0 + use-composed-ref: 1.3.0(react@18.2.0) + use-latest: 1.2.1(@types/react@18.2.47)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + + /react-transition-group@4.4.5(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + dependencies: + '@babel/runtime': 7.23.7 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react-universal-interface@0.6.2(react@18.2.0)(tslib@2.6.2): + resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==} + peerDependencies: + react: '*' + tslib: '*' + dependencies: + react: 18.2.0 + tslib: 2.6.2 + dev: false + + /react-use@17.4.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-1jPtmWLD8OJJNYCdYLJEH/HM+bPDfJuyGwCYeJFgPmWY8ttwpgZnW5QnzgM55CYUByUiTjHxsGOnEpLl6yQaoQ==} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + '@types/js-cookie': 2.2.7 + '@xobotyi/scrollbar-width': 1.9.5 + copy-to-clipboard: 3.3.3 + fast-deep-equal: 3.1.3 + fast-shallow-equal: 1.0.0 + js-cookie: 2.2.1 + nano-css: 5.6.1(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-universal-interface: 0.6.2(react@18.2.0)(tslib@2.6.2) + resize-observer-polyfill: 1.5.1 + screenfull: 5.2.0 + set-harmonic-interval: 1.0.1 + throttle-debounce: 3.0.1 + ts-easing: 0.2.0 + tslib: 2.6.2 + dev: false + + /react-virtuoso@4.6.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-vvlqvzPif+MvBrJ09+hJJrVY0xJK9yran+A+/1iwY78k0YCVKsyoNPqoLxOxzYPggspNBNXqUXEcvckN29OxyQ==} + engines: {node: '>=10'} + peerDependencies: + react: '>=16 || >=17 || >= 18' + react-dom: '>=16 || >=17 || >= 18' + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + + /reactflow@11.10.1(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Q616fElAc5/N37tMwjuRkkgm/VgmnLLTNNCj61z5mvJxae+/VXZQMfot1K6a5LLz9G3SVKqU97PMb9Ga1PRXew==} + peerDependencies: + react: '>=17' + react-dom: '>=17' + dependencies: + '@reactflow/background': 11.3.6(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/controls': 11.2.6(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/core': 11.10.1(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/minimap': 11.7.6(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/node-resizer': 2.2.6(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + '@reactflow/node-toolbar': 1.3.6(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - immer + dev: false + + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: true + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /recast@0.23.4: + resolution: {integrity: sha512-qtEDqIZGVcSZCHniWwZWbRy79Dc6Wp3kT/UmDA2RJKBPg7+7k51aQBZirHmUGn5uvHf2rg8DkjizrN26k61ATw==} + engines: {node: '>= 4'} + dependencies: + assert: 2.1.0 + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tslib: 2.6.2 + dev: true + + /redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: true + + /redux-dynamic-middlewares@2.2.0: + resolution: {integrity: sha512-GHESQC+Y0PV98ZBoaC6br6cDOsNiM1Cu4UleGMqMWCXX03jIr3BoozYVrRkLVVAl4sC216chakMnZOu6SwNdGA==} + dev: false + + /redux-remember@5.1.0(redux@5.0.1): + resolution: {integrity: sha512-Z6/S/brpwflOsGpX8Az93eujJ5fytMcaefxDfx0iib5d0DkL804zlw/Fhh/4HzZ5nXsP67j1zPUeDNWO1rhfvA==} + peerDependencies: + redux: '>=5.0.0' + dependencies: + redux: 5.0.1 + dev: false + + /redux-thunk@3.1.0(redux@5.0.1): + resolution: {integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==} + peerDependencies: + redux: ^5.0.0 + dependencies: + redux: 5.0.1 + dev: false + + /redux@5.0.1: + resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} + dev: false + + /reflect.getprototypeof@1.0.4: + resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + globalthis: 1.0.3 + which-builtin-type: 1.1.3 + dev: true + + /regenerate-unicode-properties@10.1.1: + resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + dev: true + + /regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + dev: true + + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + /regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + dependencies: + '@babel/runtime': 7.23.7 + dev: true + + /regexp.prototype.flags@1.5.1: + resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + set-function-name: 2.0.1 + dev: true + + /regexpu-core@5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + engines: {node: '>=4'} + dependencies: + '@babel/regjsgen': 0.8.0 + regenerate: 1.4.2 + regenerate-unicode-properties: 10.1.1 + regjsparser: 0.9.1 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.1.0 + dev: true + + /regjsparser@0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: true + + /remark-external-links@8.0.0: + resolution: {integrity: sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA==} + dependencies: + extend: 3.0.2 + is-absolute-url: 3.0.3 + mdast-util-definitions: 4.0.0 + space-separated-tokens: 1.1.5 + unist-util-visit: 2.0.3 + dev: true + + /remark-slug@6.1.0: + resolution: {integrity: sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ==} + dependencies: + github-slugger: 1.5.0 + mdast-util-to-string: 1.1.0 + unist-util-visit: 2.0.3 + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /requireindex@1.1.0: + resolution: {integrity: sha512-LBnkqsDE7BZKvqylbmn7lTIVdpx4K/QCduRATpO5R+wtPmky/a8pN1bO2D6wXppn1497AJF9mNjqAXr6bdl9jg==} + engines: {node: '>=0.10.5'} + dev: true + + /requireindex@1.2.0: + resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} + engines: {node: '>=0.10.5'} + dev: true + + /requirejs-config-file@4.0.0: + resolution: {integrity: sha512-jnIre8cbWOyvr8a5F2KuqBnY+SDA4NXr/hzEZJG79Mxm2WiFQz2dzhC8ibtPJS7zkmBEl1mxSwp5HhC1W4qpxw==} + engines: {node: '>=10.13.0'} + dependencies: + esprima: 4.0.1 + stringify-object: 3.3.0 + dev: true + + /requirejs@2.3.6: + resolution: {integrity: sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /reselect@5.0.1(patch_hash=kvbgwzjyy4x4fnh7znyocvb75q): + resolution: {integrity: sha512-D72j2ubjgHpvuCiORWkOUxndHJrxDaSolheiz5CO+roz8ka97/4msh2E8F5qay4GawR5vzBt5MkbDHT+Rdy/Wg==} + dev: false + patched: true + + /resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + dev: false + + /resolve-dependency-path@2.0.0: + resolution: {integrity: sha512-DIgu+0Dv+6v2XwRaNWnumKu7GPufBBOr5I1gRPJHkvghrfCGOooJODFvgFimX/KRxk9j0whD2MnKHzM1jYvk9w==} + engines: {node: '>=6.0.0'} + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve@1.19.0: + resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + dev: true + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + + /ret@0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + dev: false + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf@2.6.3: + resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /roarr@7.21.0: + resolution: {integrity: sha512-d1rPLcHmQID3GsA3p9d5vKSZYlvrTWhjbmeg9DT5DcPoLpH85VzPmkLkGKhQv376+dfkApaHwNbpYEwDB77Ibg==} + engines: {node: '>=18.0'} + dependencies: + fast-printf: 1.6.9 + safe-stable-stringify: 2.4.3 + semver-compare: 1.0.0 + dev: false + + /rollup-plugin-visualizer@5.12.0: + resolution: {integrity: sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==} + engines: {node: '>=14'} + hasBin: true + peerDependencies: + rollup: 2.x || 3.x || 4.x + peerDependenciesMeta: + rollup: + optional: true + dependencies: + open: 8.4.2 + picomatch: 2.3.1 + source-map: 0.7.4 + yargs: 17.7.2 + dev: true + + /rollup@2.79.1: + resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /rollup@3.29.4: + resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /rollup@4.9.4: + resolution: {integrity: sha512-2ztU7pY/lrQyXSCnnoU4ICjT/tCG9cdH3/G25ERqE3Lst6vl2BCM5hL2Nw+sslAvAf+ccKsAq1SkKQALyqhR7g==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.9.4 + '@rollup/rollup-android-arm64': 4.9.4 + '@rollup/rollup-darwin-arm64': 4.9.4 + '@rollup/rollup-darwin-x64': 4.9.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.9.4 + '@rollup/rollup-linux-arm64-gnu': 4.9.4 + '@rollup/rollup-linux-arm64-musl': 4.9.4 + '@rollup/rollup-linux-riscv64-gnu': 4.9.4 + '@rollup/rollup-linux-x64-gnu': 4.9.4 + '@rollup/rollup-linux-x64-musl': 4.9.4 + '@rollup/rollup-win32-arm64-msvc': 4.9.4 + '@rollup/rollup-win32-ia32-msvc': 4.9.4 + '@rollup/rollup-win32-x64-msvc': 4.9.4 + fsevents: 2.3.3 + dev: true + + /rtl-css-js@1.16.1: + resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} + dependencies: + '@babel/runtime': 7.23.7 + dev: false + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + dependencies: + tslib: 2.6.2 + dev: true + + /safe-array-concat@1.0.1: + resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /safe-regex-test@1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-regex: 1.1.4 + dev: true + + /safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + dev: false + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true + + /sass-lookup@3.0.0: + resolution: {integrity: sha512-TTsus8CfFRn1N44bvdEai1no6PqdmDiQUiqW5DlpmtT+tYnIt1tXtDIph5KA1efC+LmioJXSnCtUVpcK9gaKIg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + commander: 2.20.3 + dev: true + + /scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + + /screenfull@5.2.0: + resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} + engines: {node: '>=0.10.0'} + dev: false + + /semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + dev: false + + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + dev: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /serialize-error@11.0.3: + resolution: {integrity: sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==} + engines: {node: '>=14.16'} + dependencies: + type-fest: 2.19.0 + dev: false + + /serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + dev: true + + /set-function-length@1.1.1: + resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: true + + /set-function-name@2.0.1: + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.1 + dev: true + + /set-harmonic-interval@1.0.1: + resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==} + engines: {node: '>=6.9'} + dev: false + + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: true + + /shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + dependencies: + kind-of: 6.0.3 + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + dev: true + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + object-inspect: 1.13.1 + dev: true + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + + /simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: true + + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /socket.io-client@4.7.3: + resolution: {integrity: sha512-nU+ywttCyBitXIl9Xe0RSEfek4LneYkJxCeNnKCuhwoH4jGXO1ipIUw/VA/+Vvv2G1MTym11fzFC0SxkrcfXDw==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.4 + engine.io-client: 6.5.3 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map@0.5.6: + resolution: {integrity: sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==} + engines: {node: '>=0.10.0'} + dev: false + + /source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + dev: false + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: true + + /space-separated-tokens@1.1.5: + resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} + dev: true + + /spawn-command@0.0.2: + resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} + dev: true + + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.16 + dev: true + + /spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: true + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.16 + dev: true + + /spdx-license-ids@3.0.16: + resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} + dev: true + + /split-on-first@3.0.0: + resolution: {integrity: sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==} + engines: {node: '>=12'} + dev: false + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true + + /stack-generator@2.0.10: + resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==} + dependencies: + stackframe: 1.3.4 + dev: false + + /stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + dev: false + + /stacktrace-gps@3.1.2: + resolution: {integrity: sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==} + dependencies: + source-map: 0.5.6 + stackframe: 1.3.4 + dev: false + + /stacktrace-js@2.0.2: + resolution: {integrity: sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==} + dependencies: + error-stack-parser: 2.1.4 + stack-generator: 2.0.10 + stacktrace-gps: 3.1.2 + dev: false + + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: true + + /stop-iteration-iterator@1.0.0: + resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} + engines: {node: '>= 0.4'} + dependencies: + internal-slot: 1.0.6 + dev: true + + /store2@2.14.2: + resolution: {integrity: sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w==} + dev: true + + /storybook@7.6.7: + resolution: {integrity: sha512-1Cd895dqYIT5MOUOCDlD73OTWoJubLq/sWC7AMzkMrLu76yD4Cu6f+wv1HDrRAheRaCaeT3yhYEhsMB6qHIcaA==} + hasBin: true + dependencies: + '@storybook/cli': 7.6.7 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + + /stream-shift@1.0.1: + resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} + dev: true + + /stream-to-array@2.3.0: + resolution: {integrity: sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==} + dependencies: + any-promise: 1.3.0 + dev: true + + /string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: true + + /string.prototype.matchall@4.0.10: + resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + get-intrinsic: 1.2.2 + has-symbols: 1.0.3 + internal-slot: 1.0.6 + regexp.prototype.flags: 1.5.1 + set-function-name: 2.0.1 + side-channel: 1.0.4 + dev: true + + /string.prototype.trim@1.2.8: + resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /string.prototype.trimend@1.0.7: + resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /string.prototype.trimstart@1.0.7: + resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + dependencies: + call-bind: 1.0.5 + define-properties: 1.2.1 + es-abstract: 1.22.3 + dev: true + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /stringify-object@3.3.0: + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} + engines: {node: '>=4'} + dependencies: + get-own-enumerable-property-symbols: 3.0.2 + is-obj: 1.0.1 + is-regexp: 1.0.0 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-indent@4.0.0: + resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + engines: {node: '>=12'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + dev: false + + /stylis@4.3.1: + resolution: {integrity: sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==} + dev: false + + /stylus-lookup@3.0.2: + resolution: {integrity: sha512-oEQGHSjg/AMaWlKe7gqsnYzan8DLcGIHe0dUaFkucZZ14z4zjENRlQMCHT4FNsiWnJf17YN9OvrCfCoi7VvOyg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + commander: 2.20.3 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-color@9.4.0: + resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} + engines: {node: '>=12'} + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /synchronous-promise@2.0.17: + resolution: {integrity: sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g==} + dev: true + + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: true + + /tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: true + + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + + /tar@6.2.0: + resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: true + + /telejson@7.2.0: + resolution: {integrity: sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==} + dependencies: + memoizerific: 1.11.3 + dev: true + + /temp-dir@2.0.0: + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} + dev: true + + /temp@0.8.4: + resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==} + engines: {node: '>=6.0.0'} + dependencies: + rimraf: 2.6.3 + dev: true + + /tempy@1.0.1: + resolution: {integrity: sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==} + engines: {node: '>=10'} + dependencies: + del: 6.1.1 + is-stream: 2.0.1 + temp-dir: 2.0.0 + type-fest: 0.16.0 + unique-string: 2.0.0 + dev: true + + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /throttle-debounce@3.0.1: + resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} + engines: {node: '>=10'} + dev: false + + /through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + dev: true + + /tiny-invariant@1.3.1: + resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} + + /tinyspy@2.2.0: + resolution: {integrity: sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==} + engines: {node: '>=14.0.0'} + dev: true + + /tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + dev: true + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /tocbot@4.25.0: + resolution: {integrity: sha512-kE5wyCQJ40hqUaRVkyQ4z5+4juzYsv/eK+aqD97N62YH0TxFhzJvo22RUQQZdO3YnXAk42ZOfOpjVdy+Z0YokA==} + dev: true + + /toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + dev: false + + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: true + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + /tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + dev: true + + /ts-api-utils@1.0.3(typescript@5.3.3): + resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.3.3 + dev: true + + /ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + dev: true + + /ts-easing@0.2.0: + resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==} + dev: false + + /ts-error@1.0.6: + resolution: {integrity: sha512-tLJxacIQUM82IR7JO1UUkKlYuUTmoY9HBJAmNWFzheSlDS5SPMcNIepejHJa4BpPQLAcbRhRf3GDJzyj6rbKvA==} + dev: false + + /ts-graphviz@1.8.1: + resolution: {integrity: sha512-54/fe5iu0Jb6X0pmDmzsA2UHLfyHjUEUwfHtZcEOR0fZ6Myf+dFoO6eNsyL8CBDMJ9u7WWEewduVaiaXlvjSVw==} + engines: {node: '>=14.16'} + dev: true + + /ts-toolbelt@9.6.0: + resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} + dev: true + + /tsconfck@2.1.2(typescript@5.3.3): + resolution: {integrity: sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==} + engines: {node: ^14.13.1 || ^16 || >=18} + hasBin: true + peerDependencies: + typescript: ^4.3.5 || ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.3.3 + dev: true + + /tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true + + /tslib@2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + dev: false + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + /tsutils@3.21.0(typescript@3.9.10): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 3.9.10 + dev: true + + /tsutils@3.21.0(typescript@4.9.5): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 4.9.5 + dev: true + + /tsutils@3.21.0(typescript@5.3.3): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 5.3.3 + dev: true + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /type-fest@0.16.0: + resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + + /type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + /type-fest@4.9.0: + resolution: {integrity: sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg==} + engines: {node: '>=16'} + dev: false + + /type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: true + + /typed-array-buffer@1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-length@1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.5 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-offset@1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.5 + for-each: 0.3.3 + is-typed-array: 1.1.12 + dev: true + + /typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + dev: true + + /typescript@3.9.10: + resolution: {integrity: sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /ufo@1.3.2: + resolution: {integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==} + dev: true + + /uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + dev: true + optional: true + + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.5 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true + + /undici@5.28.2: + resolution: {integrity: sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==} + engines: {node: '>=14.0'} + dependencies: + '@fastify/busboy': 2.1.0 + dev: true + + /unicode-canonical-property-names-ecmascript@2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + dev: true + + /unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.1.0 + dev: true + + /unicode-match-property-value-ecmascript@2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + dev: true + + /unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + dev: true + + /uniq@1.0.1: + resolution: {integrity: sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==} + dev: true + + /unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + dependencies: + crypto-random-string: 2.0.0 + dev: true + + /unist-util-is@4.1.0: + resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} + dev: true + + /unist-util-visit-parents@3.1.1: + resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} + dependencies: + '@types/unist': 2.0.10 + unist-util-is: 4.1.0 + dev: true + + /unist-util-visit@2.0.3: + resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} + dependencies: + '@types/unist': 2.0.10 + unist-util-is: 4.1.0 + unist-util-visit-parents: 3.1.1 + dev: true + + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: true + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: true + + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: true + + /unplugin@1.6.0: + resolution: {integrity: sha512-BfJEpWBu3aE/AyHx8VaNE/WgouoQxgH9baAiH82JjX8cqVyi3uJQstqwD5J+SZxIK326SZIhsSZlALXVBCknTQ==} + dependencies: + acorn: 8.11.3 + chokidar: 3.5.3 + webpack-sources: 3.2.3 + webpack-virtual-modules: 0.6.1 + dev: true + + /untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + dev: true + + /update-browserslist-db@1.0.13(browserslist@4.22.2): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.2 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + dev: true + + /use-callback-ref@1.3.1(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ==} + 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 + dependencies: + '@types/react': 18.2.47 + react: 18.2.0 + tslib: 2.6.2 + + /use-composed-ref@1.3.0(react@18.2.0): + resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + + /use-debounce@10.0.0(react@18.2.0): + resolution: {integrity: sha512-XRjvlvCB46bah9IBXVnq/ACP2lxqXyZj0D9hj4K5OzNroMDpTEBg8Anuh1/UfRTRs7pLhQ+RiNxxwZu9+MVl1A==} + engines: {node: '>= 16.0.0'} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + dev: false + + /use-image@1.1.1(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-n4YO2k8AJG/BcDtxmBx8Aa+47kxY5m335dJiCQA5tTeVU4XdhrhqR6wT0WISRXwdMEOv5CSjqekDZkEMiiWaYQ==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /use-isomorphic-layout-effect@1.1.2(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.47 + react: 18.2.0 + dev: false + + /use-latest@1.2.1(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.47 + react: 18.2.0 + use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.47)(react@18.2.0) + dev: false + + /use-resize-observer@9.1.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-R25VqO9Wb3asSD4eqtcxk8sJalvIOYBqS8MNZlpDSQ4l4xMQxC/J7Id9HoTqPq8FwULIn0PVW+OAqF2dyYbjow==} + peerDependencies: + react: 16.8.0 - 18 + react-dom: 16.8.0 - 18 + dependencies: + '@juggle/resize-observer': 3.4.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: true + + /use-sidecar@1.1.2(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + 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 + dependencies: + '@types/react': 18.2.47 + detect-node-es: 1.1.0 + react: 18.2.0 + tslib: 2.6.2 + + /use-sync-external-store@1.2.0(react@18.2.0): + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + dependencies: + inherits: 2.0.4 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.12 + which-typed-array: 1.1.13 + dev: true + + /utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + dev: true + + /uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /validator@13.11.0: + resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} + engines: {node: '>= 0.10'} + dev: true + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: true + + /vite-plugin-css-injected-by-js@3.3.1(vite@5.0.11): + resolution: {integrity: sha512-PjM/X45DR3/V1K1fTRs8HtZHEQ55kIfdrn+dzaqNBFrOYO073SeSNCxp4j7gSYhV9NffVHaEnOL4myoko0ePAg==} + peerDependencies: + vite: '>2.0.0-0' + dependencies: + vite: 5.0.11(@types/node@20.10.7) + dev: true + + /vite-plugin-dts@3.7.0(@types/node@20.10.7)(typescript@5.3.3)(vite@5.0.11): + resolution: {integrity: sha512-np1uPaYzu98AtPReB8zkMnbjwcNHOABsLhqVOf81b3ol9b5M2wPcAVs8oqPnOpr6Us+7yDXVauwkxsk5+ldmRA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + typescript: '*' + vite: '*' + peerDependenciesMeta: + vite: + optional: true + dependencies: + '@microsoft/api-extractor': 7.39.0(@types/node@20.10.7) + '@rollup/pluginutils': 5.1.0 + '@vue/language-core': 1.8.27(typescript@5.3.3) + debug: 4.3.4 + kolorist: 1.8.0 + typescript: 5.3.3 + vite: 5.0.11(@types/node@20.10.7) + vue-tsc: 1.8.27(typescript@5.3.3) + transitivePeerDependencies: + - '@types/node' + - rollup + - supports-color + dev: true + + /vite-plugin-eslint@1.8.1(eslint@8.56.0)(vite@5.0.11): + resolution: {integrity: sha512-PqdMf3Y2fLO9FsNPmMX+//2BF5SF8nEWspZdgl4kSt7UvHDRHVVfHvxsD7ULYzZrJDGRxR81Nq7TOFgwMnUang==} + peerDependencies: + eslint: '>=7' + vite: '>=2' + dependencies: + '@rollup/pluginutils': 4.2.1 + '@types/eslint': 8.56.0 + eslint: 8.56.0 + rollup: 2.79.1 + vite: 5.0.11(@types/node@20.10.7) + dev: true + + /vite-tsconfig-paths@4.2.3(typescript@5.3.3)(vite@5.0.11): + resolution: {integrity: sha512-xVsA2xe6QSlzBujtWF8q2NYexh7PAUYfzJ4C8Axpe/7d2pcERYxuxGgph9F4f0iQO36g5tyGq6eBUYIssdUrVw==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + dependencies: + debug: 4.3.4 + globrex: 0.1.2 + tsconfck: 2.1.2(typescript@5.3.3) + vite: 5.0.11(@types/node@20.10.7) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /vite@5.0.11(@types/node@20.10.7): + resolution: {integrity: sha512-XBMnDjZcNAw/G1gEiskiM1v6yzM4GE5aMGvhWTlHAYYhxb7S3/V1s3m2LDHa8Vh6yIWYYB0iJwsEaS523c4oYA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.10.7 + esbuild: 0.19.11 + postcss: 8.4.33 + rollup: 4.9.4 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /void-elements@3.1.0: + resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} + engines: {node: '>=0.10.0'} + dev: false + + /vue-template-compiler@2.7.16: + resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + dev: true + + /vue-tsc@1.8.27(typescript@5.3.3): + resolution: {integrity: sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==} + hasBin: true + peerDependencies: + typescript: '*' + dependencies: + '@volar/typescript': 1.11.1 + '@vue/language-core': 1.8.27(typescript@5.3.3) + semver: 7.5.4 + typescript: 5.3.3 + dev: true + + /walkdir@0.4.1: + resolution: {integrity: sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==} + engines: {node: '>=6.0.0'} + dev: true + + /walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + dependencies: + makeerror: 1.0.12 + dev: true + + /watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + dev: true + + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.4 + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + /webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + dev: true + + /webpack-virtual-modules@0.6.1: + resolution: {integrity: sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==} + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + dependencies: + function.prototype.name: 1.1.6 + has-tostringtag: 1.0.0 + is-async-function: 2.0.0 + is-date-object: 1.0.5 + is-finalizationregistry: 1.0.2 + is-generator-function: 1.0.10 + is-regex: 1.1.4 + is-weakref: 1.0.2 + isarray: 2.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.13 + dev: true + + /which-collection@1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + dependencies: + is-map: 2.0.2 + is-set: 2.0.2 + is-weakmap: 2.0.1 + is-weakset: 2.0.2 + dev: true + + /which-typed-array@1.1.13: + resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.5 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /write-file-atomic@2.4.3: + resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} + dependencies: + graceful-fs: 4.2.11 + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: true + + /write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: true + + /ws@6.2.2: + resolution: {integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dependencies: + async-limiter: 1.0.1 + dev: true + + /ws@8.11.0: + resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + + /ws@8.16.0: + resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /xmlhttprequest-ssl@2.0.0: + resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} + engines: {node: '>=0.4.0'} + dev: false + + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: true + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: false + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + 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.8 + yargs-parser: 21.1.1 + dev: true + + /yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + + /z-schema@5.0.5: + resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} + engines: {node: '>=8.0.0'} + hasBin: true + dependencies: + lodash.get: 4.4.2 + lodash.isequal: 4.5.0 + validator: 13.11.0 + optionalDependencies: + commander: 9.5.0 + dev: true + + /zod-validation-error@2.1.0(zod@3.22.4): + resolution: {integrity: sha512-VJh93e2wb4c3tWtGgTa0OF/dTt/zoPCPzXq4V11ZjxmEAFaPi/Zss1xIZdEB5RD8GD00U0/iVXgqkF77RV7pdQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.18.0 + dependencies: + zod: 3.22.4 + dev: false + + /zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + dev: false + + /zustand@4.4.7(@types/react@18.2.47)(react@18.2.0): + resolution: {integrity: sha512-QFJWJMdlETcI69paJwhSMJz7PPWjVP8Sjhclxmxmxv/RYI7ZOvR5BHX+ktH0we9gTWQMxcne8q1OY8xxz604gw==} + 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 + dependencies: + '@types/react': 18.2.47 + react: 18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false diff --git a/invokeai/frontend/web/public/assets/images/invoke-avatar-circle.svg b/invokeai/frontend/web/public/assets/images/invoke-avatar-circle.svg new file mode 100755 index 0000000000..73221cabf3 --- /dev/null +++ b/invokeai/frontend/web/public/assets/images/invoke-avatar-circle.svg @@ -0,0 +1,4 @@ + + + + diff --git a/invokeai/frontend/web/public/assets/images/invoke-avatar-square.svg b/invokeai/frontend/web/public/assets/images/invoke-avatar-square.svg new file mode 100755 index 0000000000..1470b8cb79 --- /dev/null +++ b/invokeai/frontend/web/public/assets/images/invoke-avatar-square.svg @@ -0,0 +1,4 @@ + + + + diff --git a/invokeai/frontend/web/public/assets/images/invoke-favicon.png b/invokeai/frontend/web/public/assets/images/invoke-favicon.png new file mode 100755 index 0000000000..f9fa13c242 Binary files /dev/null and b/invokeai/frontend/web/public/assets/images/invoke-favicon.png differ diff --git a/invokeai/frontend/web/public/assets/images/invoke-favicon.svg b/invokeai/frontend/web/public/assets/images/invoke-favicon.svg new file mode 100755 index 0000000000..b1daa84f45 --- /dev/null +++ b/invokeai/frontend/web/public/assets/images/invoke-favicon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/invokeai/frontend/web/public/assets/images/invoke-key-char-lrg.svg b/invokeai/frontend/web/public/assets/images/invoke-key-char-lrg.svg new file mode 100755 index 0000000000..2df569b939 --- /dev/null +++ b/invokeai/frontend/web/public/assets/images/invoke-key-char-lrg.svg @@ -0,0 +1,4 @@ + + + + diff --git a/invokeai/frontend/web/public/assets/images/invoke-key-char-sml.svg b/invokeai/frontend/web/public/assets/images/invoke-key-char-sml.svg new file mode 100755 index 0000000000..a280e5a67b --- /dev/null +++ b/invokeai/frontend/web/public/assets/images/invoke-key-char-sml.svg @@ -0,0 +1,4 @@ + + + + diff --git a/invokeai/frontend/web/public/assets/images/invoke-key-wht-lrg.svg b/invokeai/frontend/web/public/assets/images/invoke-key-wht-lrg.svg new file mode 100755 index 0000000000..91f210c82b --- /dev/null +++ b/invokeai/frontend/web/public/assets/images/invoke-key-wht-lrg.svg @@ -0,0 +1,4 @@ + + + + diff --git a/invokeai/frontend/web/public/assets/images/invoke-key-wht-sml.svg b/invokeai/frontend/web/public/assets/images/invoke-key-wht-sml.svg new file mode 100755 index 0000000000..ef27d397bf --- /dev/null +++ b/invokeai/frontend/web/public/assets/images/invoke-key-wht-sml.svg @@ -0,0 +1,4 @@ + + + + diff --git a/invokeai/frontend/web/public/assets/images/invoke-symbol-char-lrg.svg b/invokeai/frontend/web/public/assets/images/invoke-symbol-char-lrg.svg new file mode 100755 index 0000000000..067a22386b --- /dev/null +++ b/invokeai/frontend/web/public/assets/images/invoke-symbol-char-lrg.svg @@ -0,0 +1,3 @@ + + + diff --git a/invokeai/frontend/web/public/assets/images/invoke-symbol-char-sml.svg b/invokeai/frontend/web/public/assets/images/invoke-symbol-char-sml.svg new file mode 100755 index 0000000000..6ea2abfb6f --- /dev/null +++ b/invokeai/frontend/web/public/assets/images/invoke-symbol-char-sml.svg @@ -0,0 +1,3 @@ + + + diff --git a/invokeai/frontend/web/public/assets/images/invoke-symbol-wht-lrg.svg b/invokeai/frontend/web/public/assets/images/invoke-symbol-wht-lrg.svg new file mode 100755 index 0000000000..17cfdc77da --- /dev/null +++ b/invokeai/frontend/web/public/assets/images/invoke-symbol-wht-lrg.svg @@ -0,0 +1,3 @@ + + + diff --git a/invokeai/frontend/web/public/assets/images/invoke-symbol-wht-sml.svg b/invokeai/frontend/web/public/assets/images/invoke-symbol-wht-sml.svg new file mode 100755 index 0000000000..bb2d62e21a --- /dev/null +++ b/invokeai/frontend/web/public/assets/images/invoke-symbol-wht-sml.svg @@ -0,0 +1,3 @@ + + + diff --git a/invokeai/frontend/web/public/assets/images/invoke-symbol-ylw-lrg.svg b/invokeai/frontend/web/public/assets/images/invoke-symbol-ylw-lrg.svg new file mode 100644 index 0000000000..898f20bd6f --- /dev/null +++ b/invokeai/frontend/web/public/assets/images/invoke-symbol-ylw-lrg.svg @@ -0,0 +1,3 @@ + + + diff --git a/invokeai/frontend/web/public/assets/images/invoke-tag-char-lrg.svg b/invokeai/frontend/web/public/assets/images/invoke-tag-char-lrg.svg new file mode 100644 index 0000000000..9256fb87d1 --- /dev/null +++ b/invokeai/frontend/web/public/assets/images/invoke-tag-char-lrg.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/invokeai/frontend/web/public/assets/images/invoke-tag-char-sml.svg b/invokeai/frontend/web/public/assets/images/invoke-tag-char-sml.svg new file mode 100644 index 0000000000..7d5b2846d0 --- /dev/null +++ b/invokeai/frontend/web/public/assets/images/invoke-tag-char-sml.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/invokeai/frontend/web/public/assets/images/invoke-tag-lrg.svg b/invokeai/frontend/web/public/assets/images/invoke-tag-lrg.svg new file mode 100644 index 0000000000..43c435cc5c --- /dev/null +++ b/invokeai/frontend/web/public/assets/images/invoke-tag-lrg.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/invokeai/frontend/web/public/assets/images/invoke-tag-sml.svg b/invokeai/frontend/web/public/assets/images/invoke-tag-sml.svg new file mode 100644 index 0000000000..2a31641a13 --- /dev/null +++ b/invokeai/frontend/web/public/assets/images/invoke-tag-sml.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/invokeai/frontend/web/public/assets/images/invoke-wordmark-charcoal.svg b/invokeai/frontend/web/public/assets/images/invoke-wordmark-charcoal.svg new file mode 100644 index 0000000000..a700e0c00f --- /dev/null +++ b/invokeai/frontend/web/public/assets/images/invoke-wordmark-charcoal.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/invokeai/frontend/web/public/assets/images/invoke-wordmark-white.svg b/invokeai/frontend/web/public/assets/images/invoke-wordmark-white.svg new file mode 100644 index 0000000000..9f5d216cf7 --- /dev/null +++ b/invokeai/frontend/web/public/assets/images/invoke-wordmark-white.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/invokeai/frontend/web/src/assets/images/mask.svg b/invokeai/frontend/web/public/assets/images/mask.svg similarity index 100% rename from invokeai/frontend/web/src/assets/images/mask.svg rename to invokeai/frontend/web/public/assets/images/mask.svg diff --git a/invokeai/frontend/web/public/locales/ar.json b/invokeai/frontend/web/public/locales/ar.json index 7354b21ea0..15d5c9c36d 100644 --- a/invokeai/frontend/web/public/locales/ar.json +++ b/invokeai/frontend/web/public/locales/ar.json @@ -83,10 +83,6 @@ "title": "خيارات التثبيت", "desc": "ثبت لوحة الخيارات" }, - "toggleViewer": { - "title": "تبديل العارض", - "desc": "فتح وإغلاق مشاهد الصور" - }, "toggleGallery": { "title": "تبديل المعرض", "desc": "فتح وإغلاق درابزين المعرض" @@ -147,10 +143,6 @@ "title": "الصورة التالية", "desc": "عرض الصورة التالية في الصالة" }, - "toggleGalleryPin": { - "title": "تبديل تثبيت الصالة", - "desc": "يثبت ويفتح تثبيت الصالة على الواجهة الرسومية" - }, "increaseGalleryThumbSize": { "title": "زيادة حجم صورة الصالة", "desc": "يزيد حجم الصور المصغرة في الصالة" diff --git a/invokeai/frontend/web/public/locales/de.json b/invokeai/frontend/web/public/locales/de.json index d9b64f8fc6..f84416e6d1 100644 --- a/invokeai/frontend/web/public/locales/de.json +++ b/invokeai/frontend/web/public/locales/de.json @@ -168,10 +168,6 @@ "title": "Optionen anheften", "desc": "Anheften des Optionsfeldes" }, - "toggleViewer": { - "title": "Bildbetrachter umschalten", - "desc": "Bildbetrachter öffnen und schließen" - }, "toggleGallery": { "title": "Galerie umschalten", "desc": "Öffnen und Schließen des Galerie-Schubfachs" @@ -232,10 +228,6 @@ "title": "Nächstes Bild", "desc": "Nächstes Bild in Galerie anzeigen" }, - "toggleGalleryPin": { - "title": "Galerie anheften umschalten", - "desc": "Heftet die Galerie an die Benutzeroberfläche bzw. löst die sie" - }, "increaseGalleryThumbSize": { "title": "Größe der Galeriebilder erhöhen", "desc": "Vergrößert die Galerie-Miniaturansichten" @@ -760,7 +752,6 @@ "w": "W", "addControlNet": "$t(common.controlNet) hinzufügen", "none": "Kein", - "incompatibleBaseModel": "Inkompatibles Basismodell:", "enableControlnet": "Aktiviere ControlNet", "detectResolution": "Auflösung erkennen", "controlNetT2IMutexDesc": "$t(common.controlNet) und $t(common.t2iAdapter) zur gleichen Zeit wird nicht unterstützt.", diff --git a/invokeai/frontend/web/public/locales/en.json b/invokeai/frontend/web/public/locales/en.json index 8663815adb..4ef86e94b6 100644 --- a/invokeai/frontend/web/public/locales/en.json +++ b/invokeai/frontend/web/public/locales/en.json @@ -50,9 +50,33 @@ "uncategorized": "Uncategorized", "downloadBoard": "Download Board" }, + "accordions": { + "generation": { + "title": "Generation", + "modelTab": "Model", + "conceptsTab": "Concepts" + }, + "image": { + "title": "Image" + }, + "advanced": { + "title": "Advanced" + }, + "control": { + "title": "Control", + "controlAdaptersTab": "Control Adapters", + "ipTab": "Image Prompts" + }, + "compositing": { + "title": "Compositing", + "coherenceTab": "Coherence Pass", + "infillTab": "Infill" + } + }, "common": { "accept": "Accept", "advanced": "Advanced", + "advancedOptions": "Advanced Options", "ai": "ai", "areYouSure": "Are you sure?", "auto": "Auto", @@ -62,12 +86,15 @@ "copyError": "$t(gallery.copy) Error", "close": "Close", "on": "On", + "or": "or", "checkpoint": "Checkpoint", "communityLabel": "Community", "controlNet": "ControlNet", "controlAdapter": "Control Adapter", "data": "Data", + "delete": "Delete", "details": "Details", + "direction": "Direction", "ipAdapter": "IP Adapter", "t2iAdapter": "T2I Adapter", "darkMode": "Dark Mode", @@ -77,6 +104,7 @@ "file": "File", "folder": "Folder", "format": "format", + "free": "Free", "generate": "Generate", "githubLabel": "Github", "hotkeysLabel": "Hotkeys", @@ -115,6 +143,7 @@ "nodesDesc": "A node based system for the generation of images is under development currently. Stay tuned for updates about this amazing feature.", "notInstalled": "Not $t(common.installed)", "openInNewTab": "Open in New Tab", + "orderBy": "Order By", "outpaint": "outpaint", "outputs": "Outputs", "postProcessDesc1": "Invoke AI offers a wide variety of post processing features. Image Upscaling and Face Restoration are already available in the WebUI. You can access them from the Advanced Options menu of the Text To Image and Image To Image tabs. You can also process images directly, using the image action buttons above the current image display or in the viewer.", @@ -125,7 +154,10 @@ "random": "Random", "reportBugLabel": "Report Bug", "safetensors": "Safetensors", + "save": "Save", + "saveAs": "Save As", "settingsLabel": "Settings", + "preferencesLabel": "Preferences", "simple": "Simple", "somethingWentWrong": "Something went wrong", "statusConnected": "Connected", @@ -161,7 +193,13 @@ "txt2img": "Text To Image", "unifiedCanvas": "Unified Canvas", "unknown": "Unknown", - "upload": "Upload" + "upload": "Upload", + "updated": "Updated", + "created": "Created", + "prevPage": "Previous Page", + "nextPage": "Next Page", + "unknownError": "Unknown Error", + "unsaved": "Unsaved" }, "controlnet": { "controlAdapter_one": "Control Adapter", @@ -210,7 +248,6 @@ "colorMapTileSize": "Tile Size", "importImageFromCanvas": "Import Image From Canvas", "importMaskFromCanvas": "Import Mask From Canvas", - "incompatibleBaseModel": "Incompatible base model:", "lineart": "Lineart", "lineartAnime": "Lineart Anime", "lineartAnimeDescription": "Anime-style lineart processing", @@ -235,6 +272,7 @@ "prompt": "Prompt", "resetControlImage": "Reset Control Image", "resize": "Resize", + "resizeSimple": "Resize (Simple)", "resizeMode": "Resize Mode", "safe": "Safe", "saveControlImage": "Save Control Image", @@ -273,7 +311,7 @@ "queue": "Queue", "queueFront": "Add to Front of Queue", "queueBack": "Add to Queue", - "queueCountPrediction": "Add {{predicted}} to Queue", + "queueCountPrediction": "{{promptsCount}} prompts × {{iterations}} iterations -> {{count}} generations", "queueMaxExceeded": "Max of {{max_queue_size}} exceeded, would skip {{skip}}", "queuedCount": "{{pending}} Pending", "queueTotal": "{{total}} Total", @@ -329,7 +367,8 @@ "back": "back", "batchFailedToQueue": "Failed to Queue Batch", "graphQueued": "Graph queued", - "graphFailedToQueue": "Failed to queue graph" + "graphFailedToQueue": "Failed to queue graph", + "openQueue": "Open Queue" }, "invocationCache": { "invocationCache": "Invocation Cache", @@ -384,9 +423,14 @@ "deleteSelection": "Delete Selection", "downloadSelection": "Download Selection", "preparingDownload": "Preparing Download", - "preparingDownloadFailed": "Problem Preparing Download" + "preparingDownloadFailed": "Problem Preparing Download", + "problemDeletingImages": "Problem Deleting Images", + "problemDeletingImagesDesc": "One or more images could not be deleted" }, "hotkeys": { + "searchHotkeys": "Search Hotkeys", + "clearSearch": "Clear Search", + "noHotkeysFound": "No Hotkeys Found", "acceptStagingImage": { "desc": "Accept Current Staging Area Image", "title": "Accept Staging Image" @@ -395,11 +439,15 @@ "desc": "Opens the add node menu", "title": "Add Nodes" }, - "appHotkeys": "App Hotkeys", + "appHotkeys": "App", "cancel": { - "desc": "Cancel image generation", + "desc": "Cancel current queue item", "title": "Cancel" }, + "cancelAndClear": { + "desc": "Cancel current queue item and clear all pending items", + "title": "Cancel and Clear" + }, "changeTabs": { "desc": "Switch to another workspace", "title": "Change Tabs" @@ -456,8 +504,8 @@ "desc": "Focus the prompt input area", "title": "Focus Prompt" }, - "galleryHotkeys": "Gallery Hotkeys", - "generalHotkeys": "General Hotkeys", + "galleryHotkeys": "Gallery", + "generalHotkeys": "General", "hideMask": { "desc": "Hide and unhide mask", "title": "Hide Mask" @@ -478,7 +526,7 @@ "desc": "Generate an image", "title": "Invoke" }, - "keyboardShortcuts": "Keyboard Shortcuts", + "keyboardShortcuts": "Hotkeys", "maximizeWorkSpace": { "desc": "Close panels and maximize work area", "title": "Maximize Workspace" @@ -499,7 +547,7 @@ "desc": "Next Staging Area Image", "title": "Next Staging Image" }, - "nodesHotkeys": "Nodes Hotkeys", + "nodesHotkeys": "Nodes", "pinOptions": { "desc": "Pin the options panel", "title": "Pin Options" @@ -568,31 +616,31 @@ "desc": "Open and close the gallery drawer", "title": "Toggle Gallery" }, - "toggleGalleryPin": { - "desc": "Pins and unpins the gallery to the UI", - "title": "Toggle Gallery Pin" + "toggleOptions": { + "desc": "Open and close the options panel", + "title": "Toggle Options" + }, + "toggleOptionsAndGallery": { + "desc": "Open and close the options and gallery panels", + "title": "Toggle Options and Gallery" + }, + "resetOptionsAndGallery": { + "desc": "Resets the options and gallery panels", + "title": "Reset Options and Gallery" }, "toggleLayer": { "desc": "Toggles mask/base layer selection", "title": "Toggle Layer" }, - "toggleOptions": { - "desc": "Open and close the options panel", - "title": "Toggle Options" - }, "toggleSnap": { "desc": "Toggles Snap to Grid", "title": "Toggle Snap" }, - "toggleViewer": { - "desc": "Open and close Image Viewer", - "title": "Toggle Viewer" - }, "undoStroke": { "desc": "Undo a brush stroke", "title": "Undo Stroke" }, - "unifiedCanvasHotkeys": "Unified Canvas Hotkeys", + "unifiedCanvasHotkeys": "Unified Canvas", "upscale": { "desc": "Upscale the current image", "title": "Upscale" @@ -775,17 +823,23 @@ }, "models": { "addLora": "Add LoRA", + "allLoRAsAdded": "All LoRAs added", + "loraAlreadyAdded": "LoRA already added", "esrganModel": "ESRGAN Model", "loading": "loading", + "incompatibleBaseModel": "Incompatible base model", + "noMainModelSelected": "No main model selected", "noLoRAsAvailable": "No LoRAs available", "noLoRAsLoaded": "No LoRAs Loaded", "noMatchingLoRAs": "No matching LoRAs", "noMatchingModels": "No matching Models", "noModelsAvailable": "No models available", + "lora": "LoRA", "selectLoRA": "Select a LoRA", "selectModel": "Select a Model", "noLoRAsInstalled": "No LoRAs installed", - "noRefinerModelsInstalled": "No SDXL Refiner models installed" + "noRefinerModelsInstalled": "No SDXL Refiner models installed", + "defaultVAE": "Default VAE" }, "nodes": { "addNode": "Add Node", @@ -937,9 +991,9 @@ "problemSettingTitle": "Problem Setting Title", "reloadNodeTemplates": "Reload Node Templates", "removeLinearView": "Remove from Linear View", - "resetWorkflow": "Reset Workflow", - "resetWorkflowDesc": "Are you sure you want to reset this workflow?", - "resetWorkflowDesc2": "Resetting the workflow will clear all nodes, edges and workflow details.", + "newWorkflow": "New Workflow", + "newWorkflowDesc": "Create a new workflow?", + "newWorkflowDesc2": "Your current workflow has unsaved changes.", "scheduler": "Scheduler", "schedulerDescription": "TODO", "sDXLMainModelField": "SDXL Model", @@ -1019,11 +1073,19 @@ "workflowValidation": "Workflow Validation Error", "workflowVersion": "Version", "zoomInNodes": "Zoom In", - "zoomOutNodes": "Zoom Out" + "zoomOutNodes": "Zoom Out", + "betaDesc": "This invocation is in beta. Until it is stable, it may have breaking changes during app updates. We plan to support this invocation long-term.", + "prototypeDesc": "This invocation is a prototype. It may have breaking changes during app updates and may be removed at any time." }, "parameters": { + "aspect": "Aspect", "aspectRatio": "Aspect Ratio", "aspectRatioFree": "Free", + "lockAspectRatio": "Lock Aspect Ratio", + "swapDimensions": "Swap Dimensions", + "setToOptimalSize": "Optimize size for model", + "setToOptimalSizeTooSmall": "$t(parameters.setToOptimalSize) (may be too small)", + "setToOptimalSizeTooLarge": "$t(parameters.setToOptimalSize) (may be too large)", "boundingBoxHeader": "Bounding Box", "boundingBoxHeight": "Bounding Box Height", "boundingBoxWidth": "Bounding Box Width", @@ -1062,6 +1124,7 @@ "imageFit": "Fit Initial Image To Output Size", "images": "Images", "imageToImage": "Image to Image", + "imageSize": "Image Size", "img2imgStrength": "Image To Image Strength", "infillMethod": "Infill Method", "infillScalingHeader": "Infill and Scaling", @@ -1076,7 +1139,7 @@ "noControlImageForControlAdapter": "Control Adapter #{{number}} has no control image", "noInitialImageSelected": "No initial image selected", "noModelForControlAdapter": "Control Adapter #{{number}} has no model selected.", - "incompatibleBaseModelForControlAdapter": "Control Adapter #{{number}} model is invalid with main model.", + "incompatibleBaseModelForControlAdapter": "Control Adapter #{{number}} model is incompatible with main model.", "noModelSelected": "No model selected", "noPrompts": "No prompts generated", "noNodesInGraph": "No nodes in graph", @@ -1112,8 +1175,8 @@ "seamCorrectionHeader": "Seam Correction", "seamHighThreshold": "High", "seamlessTiling": "Seamless Tiling", - "seamlessXAxis": "X Axis", - "seamlessYAxis": "Y Axis", + "seamlessXAxis": "Seamless Tiling X Axis", + "seamlessYAxis": "Seamless Tiling Y Axis", "seamlessX": "Seamless X", "seamlessY": "Seamless Y", "seamlessX&Y": "Seamless X & Y", @@ -1156,6 +1219,7 @@ }, "dynamicPrompts": { "combinatorial": "Combinatorial Generation", + "showDynamicPrompts": "Show Dynamic Prompts", "dynamicPrompts": "Dynamic Prompts", "enableDynamicPrompts": "Enable Dynamic Prompts", "maxPrompts": "Max Prompts", @@ -1168,11 +1232,13 @@ "perIterationDesc": "Use a different seed for each iteration", "perPromptLabel": "Seed per Image", "perPromptDesc": "Use a different seed for each image" - } + }, + "loading": "Generating Dynamic Prompts..." }, "sdxl": { "cfgScale": "CFG Scale", - "concatPromptStyle": "Concatenate Prompt & Style", + "concatPromptStyle": "Linking Prompt & Style", + "freePromptStyle": "Manual Style Prompting", "denoisingStrength": "Denoising Strength", "loading": "Loading...", "negAestheticScore": "Negative Aesthetic Score", @@ -1266,7 +1332,6 @@ "modelAddedSimple": "Model Added", "modelAddFailed": "Model Add Failed", "nodesBrokenConnections": "Cannot load. Some connections are broken.", - "nodesCleared": "Nodes Cleared", "nodesCorruptedGraph": "Cannot load. Graph seems to be corrupted.", "nodesLoaded": "Nodes Loaded", "nodesLoadedFailed": "Failed To Load Nodes", @@ -1315,7 +1380,10 @@ "uploadFailedInvalidUploadDesc": "Must be single PNG or JPEG image", "uploadFailedUnableToLoadDesc": "Unable to load file", "upscalingFailed": "Upscaling Failed", - "workflowLoaded": "Workflow Loaded" + "workflowLoaded": "Workflow Loaded", + "problemRetrievingWorkflow": "Problem Retrieving Workflow", + "workflowDeleted": "Workflow Deleted", + "problemDeletingWorkflow": "Problem Deleting Workflow" }, "tooltip": { "feature": { @@ -1610,5 +1678,36 @@ "showIntermediates": "Show Intermediates", "snapToGrid": "Snap to Grid", "undo": "Undo" + }, + "workflows": { + "workflows": "Workflows", + "workflowLibrary": "Library", + "userWorkflows": "My Workflows", + "defaultWorkflows": "Default Workflows", + "openWorkflow": "Open Workflow", + "uploadWorkflow": "Load from File", + "deleteWorkflow": "Delete Workflow", + "unnamedWorkflow": "Unnamed Workflow", + "downloadWorkflow": "Save to File", + "saveWorkflow": "Save Workflow", + "saveWorkflowAs": "Save Workflow As", + "savingWorkflow": "Saving Workflow...", + "problemSavingWorkflow": "Problem Saving Workflow", + "workflowSaved": "Workflow Saved", + "noRecentWorkflows": "No Recent Workflows", + "noUserWorkflows": "No User Workflows", + "noSystemWorkflows": "No System Workflows", + "problemLoading": "Problem Loading Workflows", + "loading": "Loading Workflows", + "noDescription": "No description", + "searchWorkflows": "Search Workflows", + "clearWorkflowSearchFilter": "Clear Workflow Search Filter", + "workflowName": "Workflow Name", + "newWorkflowCreated": "New Workflow Created", + "workflowEditorMenu": "Workflow Editor Menu", + "workflowIsOpen": "Workflow is Open" + }, + "app": { + "storeNotInitialized": "Store is not initialized" } } diff --git a/invokeai/frontend/web/public/locales/es.json b/invokeai/frontend/web/public/locales/es.json index cb56a4d2f0..9f2fda6089 100644 --- a/invokeai/frontend/web/public/locales/es.json +++ b/invokeai/frontend/web/public/locales/es.json @@ -127,10 +127,6 @@ "title": "Fijar opciones", "desc": "Fijar el panel de opciones" }, - "toggleViewer": { - "title": "Alternar visor", - "desc": "Mostar y ocultar el visor de imágenes" - }, "toggleGallery": { "title": "Alternar galería", "desc": "Mostar y ocultar la galería de imágenes" @@ -191,10 +187,6 @@ "title": "Imagen siguiente", "desc": "Muetra la imagen siguiente en la galería" }, - "toggleGalleryPin": { - "title": "Alternar fijado de galería", - "desc": "Fijar o desfijar la galería en la interfaz" - }, "increaseGalleryThumbSize": { "title": "Aumentar imagen en galería", "desc": "Aumenta el tamaño de las miniaturas de la galería" @@ -605,7 +597,6 @@ "nodesSaved": "Nodos guardados", "nodesLoadedFailed": "Error al cargar los nodos", "nodesLoaded": "Nodos cargados", - "nodesCleared": "Nodos borrados", "problemCopyingImage": "No se puede copiar la imagen", "nodesNotValidJSON": "JSON no válido", "nodesCorruptedGraph": "No se puede cargar. El gráfico parece estar dañado.", @@ -728,9 +719,6 @@ "showMinimapnodes": "Mostrar el minimapa", "reloadNodeTemplates": "Recargar las plantillas de nodos", "loadWorkflow": "Cargar el flujo de trabajo", - "resetWorkflow": "Reiniciar e flujo de trabajo", - "resetWorkflowDesc": "¿Está seguro de que deseas restablecer este flujo de trabajo?", - "resetWorkflowDesc2": "Al reiniciar el flujo de trabajo se borrarán todos los nodos, aristas y detalles del flujo de trabajo.", "downloadWorkflow": "Descargar el flujo de trabajo en un archivo JSON" } } diff --git a/invokeai/frontend/web/public/locales/fr.json b/invokeai/frontend/web/public/locales/fr.json index b7ab932fcc..adbfbcfc30 100644 --- a/invokeai/frontend/web/public/locales/fr.json +++ b/invokeai/frontend/web/public/locales/fr.json @@ -96,10 +96,6 @@ "title": "Epinglage des options", "desc": "Epingler le panneau d'options" }, - "toggleViewer": { - "title": "Affichage de la visionneuse", - "desc": "Afficher et masquer la visionneuse d'image" - }, "toggleGallery": { "title": "Affichage de la galerie", "desc": "Afficher et masquer la galerie" @@ -160,10 +156,6 @@ "title": "Image suivante", "desc": "Afficher l'image suivante dans la galerie" }, - "toggleGalleryPin": { - "title": "Activer/désactiver l'épinglage de la galerie", - "desc": "Épingle ou dépingle la galerie à l'interface" - }, "increaseGalleryThumbSize": { "title": "Augmenter la taille des miniatures de la galerie", "desc": "Augmente la taille des miniatures de la galerie" diff --git a/invokeai/frontend/web/public/locales/he.json b/invokeai/frontend/web/public/locales/he.json index dfb5ea0360..aee10f839b 100644 --- a/invokeai/frontend/web/public/locales/he.json +++ b/invokeai/frontend/web/public/locales/he.json @@ -192,10 +192,6 @@ "title": "הצמד הגדרות", "desc": "הצמד את פאנל ההגדרות" }, - "toggleViewer": { - "title": "הצג את חלון ההצגה", - "desc": "פתח וסגור את מציג התמונות" - }, "changeTabs": { "title": "החלף לשוניות", "desc": "החלף לאיזור עבודה אחר" @@ -236,10 +232,6 @@ "title": "תמונה קודמת", "desc": "הצג את התמונה הקודמת בגלריה" }, - "toggleGalleryPin": { - "title": "הצג את מצמיד הגלריה", - "desc": "הצמדה וביטול הצמדה של הגלריה לממשק המשתמש" - }, "decreaseGalleryThumbSize": { "title": "הקטנת גודל תמונת גלריה", "desc": "מקטין את גודל התמונות הממוזערות של הגלריה" diff --git a/invokeai/frontend/web/public/locales/hu.json b/invokeai/frontend/web/public/locales/hu.json new file mode 100644 index 0000000000..aa959bc890 --- /dev/null +++ b/invokeai/frontend/web/public/locales/hu.json @@ -0,0 +1,40 @@ +{ + "accessibility": { + "mode": "Mód", + "uploadImage": "Fénykép feltöltése", + "zoomIn": "Nagyítás", + "nextImage": "Következő kép", + "previousImage": "Előző kép", + "menu": "Menü", + "zoomOut": "Kicsinyítés", + "loadMore": "Több betöltése" + }, + "boards": { + "cancel": "Mégsem", + "loading": "Betöltés..." + }, + "accordions": { + "image": { + "title": "Kép" + } + }, + "common": { + "accept": "Elfogad", + "ai": "ai", + "back": "Vissza", + "cancel": "Mégsem", + "close": "Bezár", + "or": "vagy", + "details": "Részletek", + "darkMode": "Sötét Mód", + "error": "Hiba", + "file": "Fájl", + "githubLabel": "Github", + "hotkeysLabel": "Gyorsbillentyűk", + "delete": "Törlés", + "data": "Adat", + "discordLabel": "Discord", + "folder": "Mappa", + "langEnglish": "Angol" + } +} diff --git a/invokeai/frontend/web/public/locales/it.json b/invokeai/frontend/web/public/locales/it.json index 3f76e80a52..9c96ce9ea9 100644 --- a/invokeai/frontend/web/public/locales/it.json +++ b/invokeai/frontend/web/public/locales/it.json @@ -103,7 +103,22 @@ "somethingWentWrong": "Qualcosa è andato storto", "copyError": "$t(gallery.copy) Errore", "input": "Ingresso", - "notInstalled": "Non $t(common.installed)" + "notInstalled": "Non $t(common.installed)", + "unknownError": "Errore sconosciuto", + "updated": "Aggiornato", + "save": "Salva", + "created": "Creato", + "prevPage": "Pagina precedente", + "delete": "Elimina", + "orderBy": "Ordinato per", + "nextPage": "Pagina successiva", + "saveAs": "Salva come", + "unsaved": "Non salvato", + "direction": "Direzione", + "advancedOptions": "Opzioni avanzate", + "free": "Libero", + "or": "o", + "preferencesLabel": "Preferenze" }, "gallery": { "generations": "Generazioni", @@ -121,7 +136,7 @@ "noImagesInGallery": "Nessuna immagine da visualizzare", "deleteImage": "Elimina l'immagine", "deleteImagePermanent": "Le immagini eliminate non possono essere ripristinate.", - "deleteImageBin": "Le immagini eliminate verranno spostate nel Cestino del tuo sistema operativo.", + "deleteImageBin": "Le immagini eliminate verranno spostate nel cestino del tuo sistema operativo.", "assets": "Risorse", "autoAssignBoardOnClick": "Assegna automaticamente la bacheca al clic", "featuresWillReset": "Se elimini questa immagine, quelle funzionalità verranno immediatamente ripristinate.", @@ -141,21 +156,23 @@ "unstarImage": "Rimuovi preferenza immagine", "dropOrUpload": "$t(gallery.drop) o carica", "starImage": "Immagine preferita", - "dropToUpload": "$t(gallery.drop) per aggiornare" + "dropToUpload": "$t(gallery.drop) per aggiornare", + "problemDeletingImagesDesc": "Impossibile eliminare una o più immagini", + "problemDeletingImages": "Problema durante l'eliminazione delle immagini" }, "hotkeys": { - "keyboardShortcuts": "Tasti rapidi", - "appHotkeys": "Tasti di scelta rapida dell'applicazione", - "generalHotkeys": "Tasti di scelta rapida generali", - "galleryHotkeys": "Tasti di scelta rapida della galleria", - "unifiedCanvasHotkeys": "Tasti di scelta rapida Tela Unificata", + "keyboardShortcuts": "Tasti di scelta rapida", + "appHotkeys": "Applicazione", + "generalHotkeys": "Generale", + "galleryHotkeys": "Galleria", + "unifiedCanvasHotkeys": "Tela Unificata", "invoke": { "title": "Invoke", "desc": "Genera un'immagine" }, "cancel": { "title": "Annulla", - "desc": "Annulla la generazione dell'immagine" + "desc": "Annulla l'elemento della coda corrente" }, "focusPrompt": { "title": "Metti a fuoco il Prompt", @@ -169,12 +186,8 @@ "title": "Appunta le opzioni", "desc": "Blocca il pannello delle opzioni" }, - "toggleViewer": { - "title": "Attiva/disattiva visualizzatore", - "desc": "Apre e chiude il visualizzatore immagini" - }, "toggleGallery": { - "title": "Attiva/disattiva Galleria", + "title": "Attiva/disattiva galleria", "desc": "Apre e chiude il pannello della galleria" }, "maximizeWorkSpace": { @@ -233,10 +246,6 @@ "title": "Immagine successiva", "desc": "Visualizza l'immagine successiva nella galleria" }, - "toggleGalleryPin": { - "title": "Attiva/disattiva il blocco della galleria", - "desc": "Blocca/sblocca la galleria dall'interfaccia utente" - }, "increaseGalleryThumbSize": { "title": "Aumenta dimensione immagini nella galleria", "desc": "Aumenta la dimensione delle miniature della galleria" @@ -349,11 +358,26 @@ "title": "Accetta l'immagine della sessione", "desc": "Accetta l'immagine dell'area della sessione corrente" }, - "nodesHotkeys": "Tasti di scelta rapida dei Nodi", + "nodesHotkeys": "Nodi", "addNodes": { "title": "Aggiungi Nodi", "desc": "Apre il menu Aggiungi Nodi" - } + }, + "cancelAndClear": { + "desc": "Annulla l'elemento della coda corrente e cancella tutti gli elementi in sospeso", + "title": "Annulla e cancella" + }, + "resetOptionsAndGallery": { + "title": "Ripristina Opzioni e Galleria", + "desc": "Reimposta le opzioni e i pannelli della galleria" + }, + "searchHotkeys": "Cerca tasti di scelta rapida", + "noHotkeysFound": "Nessun tasto di scelta rapida trovato", + "toggleOptionsAndGallery": { + "desc": "Apre e chiude le opzioni e i pannelli della galleria", + "title": "Attiva/disattiva le Opzioni e la Galleria" + }, + "clearSearch": "Cancella ricerca" }, "modelManager": { "modelManager": "Gestione Modelli", @@ -568,8 +592,8 @@ "hidePreview": "Nascondi l'anteprima", "showPreview": "Mostra l'anteprima", "noiseSettings": "Rumore", - "seamlessXAxis": "Asse X", - "seamlessYAxis": "Asse Y", + "seamlessXAxis": "Piastrella senza cucitura Asse X", + "seamlessYAxis": "Piastrella senza cucitura Asse Y", "scheduler": "Campionatore", "boundingBoxWidth": "Larghezza riquadro di delimitazione", "boundingBoxHeight": "Altezza riquadro di delimitazione", @@ -626,7 +650,17 @@ "imageActions": "Azioni Immagine", "aspectRatioFree": "Libere", "maskEdge": "Maschera i bordi", - "unmasked": "No maschera" + "unmasked": "No maschera", + "cfgRescaleMultiplier": "Moltiplicatore riscala CFG", + "cfgRescale": "Riscala CFG", + "useSize": "Usa Dimensioni", + "setToOptimalSize": "Ottimizza le dimensioni per il modello", + "setToOptimalSizeTooSmall": "$t(parameters.setToOptimalSize) (potrebbe essere troppo piccolo)", + "imageSize": "Dimensione dell'immagine", + "lockAspectRatio": "Blocca proporzioni", + "swapDimensions": "Scambia dimensioni", + "aspect": "Aspetto", + "setToOptimalSizeTooLarge": "$t(parameters.setToOptimalSize) (potrebbe essere troppo grande)" }, "settings": { "models": "Modelli", @@ -670,7 +704,8 @@ "clearIntermediatesDisabled": "La coda deve essere vuota per cancellare le immagini intermedie", "enableNSFWChecker": "Abilita controllo NSFW", "enableInvisibleWatermark": "Abilita filigrana invisibile", - "enableInformationalPopovers": "Abilita testo informativo a comparsa" + "enableInformationalPopovers": "Abilita testo informativo a comparsa", + "reloadingIn": "Ricaricando in" }, "toast": { "tempFoldersEmptied": "Cartella temporanea svuotata", @@ -713,7 +748,6 @@ "nodesLoadedFailed": "Impossibile caricare i nodi", "nodesSaved": "Nodi salvati", "nodesLoaded": "Nodi caricati", - "nodesCleared": "Nodi cancellati", "problemCopyingImage": "Impossibile copiare l'immagine", "nodesNotValidGraph": "Grafico del nodo InvokeAI non valido", "nodesCorruptedGraph": "Impossibile caricare. Il grafico sembra essere danneggiato.", @@ -752,11 +786,15 @@ "setNodeField": "Imposta come campo nodo", "problemSavingMask": "Problema nel salvataggio della maschera", "problemSavingCanvasDesc": "Impossibile salvare la tela", - "setCanvasInitialImage": "Imposta come immagine iniziale della tela", + "setCanvasInitialImage": "Imposta l'immagine iniziale della tela", "workflowLoaded": "Flusso di lavoro caricato", "setIPAdapterImage": "Imposta come immagine per l'Adattatore IP", "problemSavingMaskDesc": "Impossibile salvare la maschera", - "setAsCanvasInitialImage": "Imposta come immagine iniziale della tela" + "setAsCanvasInitialImage": "Imposta come immagine iniziale della tela", + "invalidUpload": "Caricamento non valido", + "problemDeletingWorkflow": "Problema durante l'eliminazione del flusso di lavoro", + "workflowDeleted": "Flusso di lavoro eliminato", + "problemRetrievingWorkflow": "Problema nel recupero del flusso di lavoro" }, "tooltip": { "feature": { @@ -780,7 +818,7 @@ "maskingOptions": "Opzioni di mascheramento", "enableMask": "Abilita maschera", "preserveMaskedArea": "Mantieni area mascherata", - "clearMask": "Elimina la maschera", + "clearMask": "Cancella maschera (Shift+C)", "brush": "Pennello", "eraser": "Cancellino", "fillBoundingBox": "Riempi rettangolo di selezione", @@ -833,7 +871,8 @@ "betaPreserveMasked": "Conserva quanto mascherato", "antialiasing": "Anti aliasing", "showResultsOn": "Mostra i risultati (attivato)", - "showResultsOff": "Mostra i risultati (disattivato)" + "showResultsOff": "Mostra i risultati (disattivato)", + "saveMask": "Salva $t(unifiedCanvas.mask)" }, "accessibility": { "modelSelect": "Seleziona modello", @@ -859,7 +898,8 @@ "showGalleryPanel": "Mostra il pannello Galleria", "loadMore": "Carica altro", "mode": "Modalità", - "resetUI": "$t(accessibility.reset) l'Interfaccia Utente" + "resetUI": "$t(accessibility.reset) l'Interfaccia Utente", + "createIssue": "Segnala un problema" }, "ui": { "hideProgressImages": "Nascondi avanzamento immagini", @@ -877,11 +917,8 @@ "zoomInNodes": "Ingrandire", "fitViewportNodes": "Adatta vista", "showGraphNodes": "Mostra sovrapposizione grafico", - "resetWorkflowDesc2": "Reimpostare il flusso di lavoro cancellerà tutti i nodi, i bordi e i dettagli del flusso di lavoro.", "reloadNodeTemplates": "Ricarica i modelli di nodo", "loadWorkflow": "Importa flusso di lavoro JSON", - "resetWorkflow": "Reimposta flusso di lavoro", - "resetWorkflowDesc": "Sei sicuro di voler reimpostare questo flusso di lavoro?", "downloadWorkflow": "Esporta flusso di lavoro JSON", "scheduler": "Campionatore", "addNode": "Aggiungi nodo", @@ -940,7 +977,7 @@ "unknownNode": "Nodo sconosciuto", "vaeFieldDescription": "Sotto modello VAE.", "booleanPolymorphicDescription": "Una raccolta di booleani.", - "missingTemplate": "Modello mancante", + "missingTemplate": "Nodo non valido: nodo {{node}} di tipo {{type}} modello mancante (non installato?)", "outputSchemaNotFound": "Schema di output non trovato", "colorFieldDescription": "Un colore RGBA.", "maybeIncompatible": "Potrebbe essere incompatibile con quello installato", @@ -979,7 +1016,7 @@ "cannotConnectOutputToOutput": "Impossibile collegare Output ad Output", "booleanCollection": "Raccolta booleana", "cannotConnectToSelf": "Impossibile connettersi a se stesso", - "mismatchedVersion": "Ha una versione non corrispondente", + "mismatchedVersion": "Nodo non valido: il nodo {{node}} di tipo {{type}} ha una versione non corrispondente (provare ad aggiornare?)", "outputNode": "Nodo di Output", "loadingNodes": "Caricamento nodi...", "oNNXModelFieldDescription": "Campo del modello ONNX.", @@ -1058,7 +1095,7 @@ "latentsCollectionDescription": "Le immagini latenti possono essere passate tra i nodi.", "imageCollection": "Raccolta Immagini", "loRAModelField": "LoRA", - "updateAllNodes": "Aggiorna tutti i nodi", + "updateAllNodes": "Aggiorna i nodi", "unableToUpdateNodes_one": "Impossibile aggiornare {{count}} nodo", "unableToUpdateNodes_many": "Impossibile aggiornare {{count}} nodi", "unableToUpdateNodes_other": "Impossibile aggiornare {{count}} nodi", @@ -1069,7 +1106,33 @@ "unknownErrorValidatingWorkflow": "Errore sconosciuto durante la convalida del flusso di lavoro", "collectionFieldType": "{{name}} Raccolta", "collectionOrScalarFieldType": "{{name}} Raccolta|Scalare", - "nodeVersion": "Versione Nodo" + "nodeVersion": "Versione Nodo", + "inputFieldTypeParseError": "Impossibile analizzare il tipo di campo di input {{node}}.{{field}} ({{message}})", + "unsupportedArrayItemType": "Tipo di elemento dell'array non supportato \"{{type}}\"", + "targetNodeFieldDoesNotExist": "Connessione non valida: il campo di destinazione/input {{node}}.{{field}} non esiste", + "unsupportedMismatchedUnion": "tipo CollectionOrScalar non corrispondente con tipi di base {{firstType}} e {{secondType}}", + "allNodesUpdated": "Tutti i nodi sono aggiornati", + "sourceNodeDoesNotExist": "Connessione non valida: il nodo di origine/output {{node}} non esiste", + "unableToExtractEnumOptions": "Impossibile estrarre le opzioni enum", + "unableToParseFieldType": "Impossibile analizzare il tipo di campo", + "unrecognizedWorkflowVersion": "Versione dello schema del flusso di lavoro non riconosciuta {{version}}", + "outputFieldTypeParseError": "Impossibile analizzare il tipo di campo di output {{node}}.{{field}} ({{message}})", + "sourceNodeFieldDoesNotExist": "Connessione non valida: il campo di origine/output {{node}}.{{field}} non esiste", + "unableToGetWorkflowVersion": "Impossibile ottenere la versione dello schema del flusso di lavoro", + "nodePack": "Pacchetto di nodi", + "unableToExtractSchemaNameFromRef": "Impossibile estrarre il nome dello schema dal riferimento", + "unknownOutput": "Output sconosciuto: {{name}}", + "unknownNodeType": "Tipo di nodo sconosciuto", + "targetNodeDoesNotExist": "Connessione non valida: il nodo di destinazione/input {{node}} non esiste", + "unknownFieldType": "$t(nodes.unknownField) tipo: {{type}}", + "deletedInvalidEdge": "Eliminata connessione non valida {{source}} -> {{target}}", + "unknownInput": "Input sconosciuto: {{name}}", + "prototypeDesc": "Questa invocazione è un prototipo. Potrebbe subire modifiche sostanziali durante gli aggiornamenti dell'app e potrebbe essere rimossa in qualsiasi momento.", + "betaDesc": "Questa invocazione è in versione beta. Fino a quando non sarà stabile, potrebbe subire modifiche importanti durante gli aggiornamenti dell'app. Abbiamo intenzione di supportare questa invocazione a lungo termine.", + "newWorkflow": "Nuovo flusso di lavoro", + "newWorkflowDesc": "Creare un nuovo flusso di lavoro?", + "newWorkflowDesc2": "Il flusso di lavoro attuale presenta modifiche non salvate.", + "unsupportedAnyOfLength": "unione di troppi elementi ({{count}})" }, "boards": { "autoAddBoard": "Aggiungi automaticamente bacheca", @@ -1088,9 +1151,9 @@ "selectBoard": "Seleziona una Bacheca", "uncategorized": "Non categorizzato", "downloadBoard": "Scarica la bacheca", - "deleteBoardOnly": "Elimina solo la Bacheca", + "deleteBoardOnly": "solo la Bacheca", "deleteBoard": "Elimina Bacheca", - "deleteBoardAndImages": "Elimina Bacheca e Immagini", + "deleteBoardAndImages": "Bacheca e Immagini", "deletedBoardsCannotbeRestored": "Le bacheche eliminate non possono essere ripristinate", "movingImagesToBoard_one": "Spostare {{count}} immagine nella bacheca:", "movingImagesToBoard_many": "Spostare {{count}} immagini nella bacheca:", @@ -1133,7 +1196,6 @@ "w": "W", "processor": "Processore", "none": "Nessuno", - "incompatibleBaseModel": "Modello base incompatibile:", "pidiDescription": "Elaborazione immagini PIDI", "fill": "Riempie", "colorMapDescription": "Genera una mappa dei colori dall'immagine", @@ -1169,12 +1231,13 @@ "minConfidence": "Confidenza minima", "scribble": "Scribble", "amult": "Angolo di illuminazione", - "coarse": "Approssimativo" + "coarse": "Approssimativo", + "resizeSimple": "Ridimensiona (semplice)" }, "queue": { "queueFront": "Aggiungi all'inizio della coda", "queueBack": "Aggiungi alla coda", - "queueCountPrediction": "Aggiungi {{predicted}} alla coda", + "queueCountPrediction": "{{promptsCount}} prompt × {{iterations}} iterazioni -> {{count}} generazioni", "queue": "Coda", "status": "Stato", "pruneSucceeded": "Rimossi {{item_count}} elementi completati dalla coda", @@ -1232,7 +1295,8 @@ "graphFailedToQueue": "Impossibile mettere in coda il grafico", "queueMaxExceeded": "È stato superato il limite massimo di {{max_queue_size}} e {{skip}} elementi verrebbero saltati", "batchFieldValues": "Valori Campi Lotto", - "time": "Tempo" + "time": "Tempo", + "openQueue": "Apri coda" }, "embedding": { "noMatchingEmbedding": "Nessun Incorporamento corrispondente", @@ -1252,7 +1316,12 @@ "noLoRAsInstalled": "Nessun LoRA installato", "esrganModel": "Modello ESRGAN", "addLora": "Aggiungi LoRA", - "noLoRAsLoaded": "Nessuna LoRA caricata" + "noLoRAsLoaded": "Nessun LoRA caricato", + "noMainModelSelected": "Nessun modello principale selezionato", + "allLoRAsAdded": "Tutti i LoRA aggiunti", + "defaultVAE": "VAE predefinito", + "incompatibleBaseModel": "Modello base incompatibile", + "loraAlreadyAdded": "LoRA già aggiunto" }, "invocationCache": { "disable": "Disabilita", @@ -1286,7 +1355,9 @@ "promptsWithCount_many": "{{count}} Prompt", "promptsWithCount_other": "{{count}} Prompt", "dynamicPrompts": "Prompt dinamici", - "promptsPreview": "Anteprima dei prompt" + "promptsPreview": "Anteprima dei prompt", + "showDynamicPrompts": "Mostra prompt dinamici", + "loading": "Generazione prompt dinamici..." }, "popovers": { "paramScheduler": { @@ -1499,6 +1570,12 @@ "ControlNet fornisce una guida al processo di generazione, aiutando a creare immagini con composizione, struttura o stile controllati, a seconda del modello selezionato." ], "heading": "ControlNet" + }, + "paramCFGRescaleMultiplier": { + "heading": "Moltiplicatore di riscala CFG", + "paragraphs": [ + "Moltiplicatore di riscala per la guida CFG, utilizzato per modelli addestrati utilizzando SNR a terminale zero (ztsnr). Valore suggerito 0.7." + ] } }, "sdxl": { @@ -1506,7 +1583,7 @@ "scheduler": "Campionatore", "noModelsAvailable": "Nessun modello disponibile", "denoisingStrength": "Forza di riduzione del rumore", - "concatPromptStyle": "Concatena Prompt & Stile", + "concatPromptStyle": "Collega Prompt & Stile", "loading": "Caricamento...", "steps": "Passi", "refinerStart": "Inizio Affinamento", @@ -1517,7 +1594,8 @@ "useRefiner": "Utilizza l'affinatore", "refinermodel": "Modello Affinatore", "posAestheticScore": "Punteggio estetico positivo", - "posStylePrompt": "Prompt Stile positivo" + "posStylePrompt": "Prompt Stile positivo", + "freePromptStyle": "Prompt di stile manuale" }, "metadata": { "initImage": "Immagine iniziale", @@ -1559,5 +1637,59 @@ "hrf": "Correzione Alta Risoluzione", "hrfStrength": "Forza della Correzione Alta Risoluzione", "strengthTooltip": "Valori più bassi comportano meno dettagli, il che può ridurre potenziali artefatti." + }, + "workflows": { + "saveWorkflowAs": "Salva flusso di lavoro come", + "workflowEditorMenu": "Menu dell'editor del flusso di lavoro", + "noSystemWorkflows": "Nessun flusso di lavoro del sistema", + "workflowName": "Nome del flusso di lavoro", + "noUserWorkflows": "Nessun flusso di lavoro utente", + "defaultWorkflows": "Flussi di lavoro predefiniti", + "saveWorkflow": "Salva flusso di lavoro", + "openWorkflow": "Apri flusso di lavoro", + "clearWorkflowSearchFilter": "Cancella il filtro di ricerca del flusso di lavoro", + "workflowLibrary": "Libreria", + "noRecentWorkflows": "Nessun flusso di lavoro recente", + "workflowSaved": "Flusso di lavoro salvato", + "workflowIsOpen": "Il flusso di lavoro è aperto", + "unnamedWorkflow": "Flusso di lavoro senza nome", + "savingWorkflow": "Salvataggio del flusso di lavoro...", + "problemLoading": "Problema durante il caricamento dei flussi di lavoro", + "loading": "Caricamento dei flussi di lavoro", + "searchWorkflows": "Cerca flussi di lavoro", + "problemSavingWorkflow": "Problema durante il salvataggio del flusso di lavoro", + "deleteWorkflow": "Elimina flusso di lavoro", + "workflows": "Flussi di lavoro", + "noDescription": "Nessuna descrizione", + "userWorkflows": "I miei flussi di lavoro", + "newWorkflowCreated": "Nuovo flusso di lavoro creato", + "downloadWorkflow": "Salva su file", + "uploadWorkflow": "Carica da file" + }, + "app": { + "storeNotInitialized": "Il negozio non è inizializzato" + }, + "accordions": { + "compositing": { + "infillTab": "Riempimento", + "coherenceTab": "Passaggio di coerenza", + "title": "Composizione" + }, + "control": { + "controlAdaptersTab": "Adattatori di Controllo", + "ipTab": "Prompt immagine", + "title": "Controllo" + }, + "generation": { + "title": "Generazione", + "conceptsTab": "Concetti", + "modelTab": "Modello" + }, + "advanced": { + "title": "Avanzate" + }, + "image": { + "title": "Immagine" + } } } diff --git a/invokeai/frontend/web/public/locales/ja.json b/invokeai/frontend/web/public/locales/ja.json index bfcbffd7d9..0fee501e11 100644 --- a/invokeai/frontend/web/public/locales/ja.json +++ b/invokeai/frontend/web/public/locales/ja.json @@ -133,10 +133,6 @@ "title": "ピン", "desc": "オプションパネルを固定" }, - "toggleViewer": { - "title": "ビュワーのトグル", - "desc": "ビュワーを開閉" - }, "toggleGallery": { "title": "ギャラリーのトグル", "desc": "ギャラリードロワーの開閉" @@ -197,10 +193,6 @@ "title": "次の画像", "desc": "ギャラリー内の1つ後の画像を表示" }, - "toggleGalleryPin": { - "title": "ギャラリードロワーの固定", - "desc": "ギャラリーをUIにピン留め/解除" - }, "increaseGalleryThumbSize": { "title": "ギャラリーの画像を拡大", "desc": "ギャラリーのサムネイル画像を拡大" @@ -590,7 +582,6 @@ "processor": "プロセッサー", "addControlNet": "$t(common.controlNet)を追加", "none": "なし", - "incompatibleBaseModel": "互換性のないベースモデル:", "enableControlnet": "コントロールネットを有効化", "detectResolution": "検出解像度", "controlNetT2IMutexDesc": "$t(common.controlNet)と$t(common.t2iAdapter)の同時使用は現在サポートされていません。", diff --git a/invokeai/frontend/web/public/locales/ko.json b/invokeai/frontend/web/public/locales/ko.json index 9bee147c3e..476c421fa3 100644 --- a/invokeai/frontend/web/public/locales/ko.json +++ b/invokeai/frontend/web/public/locales/ko.json @@ -15,7 +15,7 @@ "langBrPortuguese": "Português do Brasil", "langRussian": "Русский", "langSpanish": "Español", - "nodes": "노드", + "nodes": "Workflow Editor", "nodesDesc": "이미지 생성을 위한 노드 기반 시스템은 현재 개발 중입니다. 이 놀라운 기능에 대한 업데이트를 계속 지켜봐 주세요.", "postProcessing": "후처리", "postProcessDesc2": "보다 진보된 후처리 작업을 위한 전용 UI가 곧 출시될 예정입니다.", @@ -25,7 +25,7 @@ "trainingDesc2": "InvokeAI는 이미 메인 스크립트를 사용한 Textual Inversion를 이용한 Custom embedding 학습을 지원하고 있습니다.", "upload": "업로드", "close": "닫기", - "load": "로드", + "load": "불러오기", "back": "뒤로 가기", "statusConnected": "연결됨", "statusDisconnected": "연결 끊김", @@ -58,7 +58,69 @@ "statusGeneratingImageToImage": "이미지->이미지 생성", "statusProcessingComplete": "처리 완료", "statusIterationComplete": "반복(Iteration) 완료", - "statusSavingImage": "이미지 저장" + "statusSavingImage": "이미지 저장", + "t2iAdapter": "T2I 어댑터", + "communityLabel": "커뮤니티", + "txt2img": "텍스트->이미지", + "dontAskMeAgain": "다시 묻지 마세요", + "loadingInvokeAI": "Invoke AI 불러오는 중", + "checkpoint": "체크포인트", + "format": "형식", + "unknown": "알려지지 않음", + "areYouSure": "확실하나요?", + "folder": "폴더", + "inpaint": "inpaint", + "updated": "업데이트 됨", + "on": "켜기", + "save": "저장", + "langPortuguese": "Português", + "created": "생성됨", + "nodeEditor": "Node Editor", + "error": "에러", + "prevPage": "이전 페이지", + "ipAdapter": "IP 어댑터", + "controlAdapter": "제어 어댑터", + "installed": "설치됨", + "accept": "수락", + "ai": "인공지능", + "auto": "자동", + "file": "파일", + "openInNewTab": "새 탭에서 열기", + "delete": "삭제", + "template": "템플릿", + "cancel": "취소", + "controlNet": "컨트롤넷", + "outputs": "결과물", + "unknownError": "알려지지 않은 에러", + "statusProcessing": "처리 중", + "linear": "선형", + "imageFailedToLoad": "이미지를 로드할 수 없음", + "direction": "방향", + "data": "데이터", + "somethingWentWrong": "뭔가 잘못됐어요", + "imagePrompt": "이미지 프롬프트", + "modelManager": "Model Manager", + "lightMode": "라이트 모드", + "safetensors": "Safetensors", + "outpaint": "outpaint", + "langKorean": "한국어", + "orderBy": "정렬 기준", + "generate": "생성", + "copyError": "$t(gallery.copy) 에러", + "learnMore": "더 알아보기", + "nextPage": "다음 페이지", + "saveAs": "다른 이름으로 저장", + "darkMode": "다크 모드", + "loading": "불러오는 중", + "random": "랜덤", + "langHebrew": "Hebrew", + "batch": "Batch 매니저", + "postprocessing": "후처리", + "advanced": "고급", + "unsaved": "저장되지 않음", + "input": "입력", + "details": "세부사항", + "notInstalled": "설치되지 않음" }, "gallery": { "showGenerations": "생성된 이미지 보기", @@ -68,7 +130,35 @@ "galleryImageSize": "이미지 크기", "galleryImageResetSize": "사이즈 리셋", "gallerySettings": "갤러리 설정", - "maintainAspectRatio": "종횡비 유지" + "maintainAspectRatio": "종횡비 유지", + "deleteSelection": "선택 항목 삭제", + "featuresWillReset": "이 이미지를 삭제하면 해당 기능이 즉시 재설정됩니다.", + "deleteImageBin": "삭제된 이미지는 운영 체제의 Bin으로 전송됩니다.", + "assets": "자산", + "problemDeletingImagesDesc": "하나 이상의 이미지를 삭제할 수 없습니다", + "noImagesInGallery": "보여줄 이미지가 없음", + "autoSwitchNewImages": "새로운 이미지로 자동 전환", + "loading": "불러오는 중", + "unableToLoad": "갤러리를 로드할 수 없음", + "preparingDownload": "다운로드 준비", + "preparingDownloadFailed": "다운로드 준비 중 발생한 문제", + "singleColumnLayout": "단일 열 레이아웃", + "image": "이미지", + "loadMore": "더 불러오기", + "drop": "드랍", + "problemDeletingImages": "이미지 삭제 중 발생한 문제", + "downloadSelection": "선택 항목 다운로드", + "deleteImage": "이미지 삭제", + "currentlyInUse": "이 이미지는 현재 다음 기능에서 사용되고 있습니다:", + "allImagesLoaded": "불러온 모든 이미지", + "dropOrUpload": "$t(gallery.drop) 또는 업로드", + "copy": "복사", + "download": "다운로드", + "deleteImagePermanent": "삭제된 이미지는 복원할 수 없습니다.", + "noImageSelected": "선택된 이미지 없음", + "autoAssignBoardOnClick": "클릭 시 Board로 자동 할당", + "setCurrentImage": "현재 이미지로 설정", + "dropToUpload": "업로드를 위해 $t(gallery.drop)" }, "unifiedCanvas": { "betaPreserveMasked": "마스크 레이어 유지" @@ -79,6 +169,743 @@ "nextImage": "다음 이미지", "mode": "모드", "menu": "메뉴", - "modelSelect": "모델 선택" + "modelSelect": "모델 선택", + "zoomIn": "확대하기", + "rotateClockwise": "시계방향으로 회전", + "uploadImage": "이미지 업로드", + "showGalleryPanel": "갤러리 패널 표시", + "useThisParameter": "해당 변수 사용", + "reset": "리셋", + "loadMore": "더 불러오기", + "zoomOut": "축소하기", + "rotateCounterClockwise": "반시계방향으로 회전", + "showOptionsPanel": "사이드 패널 표시", + "toggleAutoscroll": "자동 스크롤 전환", + "toggleLogViewer": "Log Viewer 전환" + }, + "modelManager": { + "pathToCustomConfig": "사용자 지정 구성 경로", + "importModels": "모델 가져오기", + "availableModels": "사용 가능한 모델", + "conversionNotSupported": "변환이 지원되지 않음", + "noCustomLocationProvided": "사용자 지정 위치가 제공되지 않음", + "onnxModels": "Onnx", + "vaeRepoID": "VAE Repo ID", + "modelExists": "모델 존재", + "custom": "사용자 지정", + "addModel": "모델 추가", + "none": "없음", + "modelConverted": "변환된 모델", + "width": "너비", + "weightedSum": "가중합", + "inverseSigmoid": "Inverse Sigmoid", + "invokeAIFolder": "Invoke AI 폴더", + "syncModelsDesc": "모델이 백엔드와 동기화되지 않은 경우 이 옵션을 사용하여 새로 고침할 수 있습니다. 이는 일반적으로 응용 프로그램이 부팅된 후 수동으로 모델.yaml 파일을 업데이트하거나 InvokeAI root 폴더에 모델을 추가하는 경우에 유용합니다.", + "convert": "변환", + "vae": "VAE", + "noModels": "모델을 찾을 수 없음", + "statusConverting": "변환중", + "sigmoid": "Sigmoid", + "deleteModel": "모델 삭제", + "modelLocation": "모델 위치", + "merge": "병합", + "v1": "v1", + "description": "Description", + "modelMergeInterpAddDifferenceHelp": "이 모드에서 모델 3은 먼저 모델 2에서 차감됩니다. 결과 버전은 위에 설정된 Alpha 비율로 모델 1과 혼합됩니다.", + "customConfig": "사용자 지정 구성", + "cannotUseSpaces": "공백을 사용할 수 없음", + "formMessageDiffusersModelLocationDesc": "적어도 하나 이상 입력해 주세요.", + "addDiffuserModel": "Diffusers 추가", + "search": "검색", + "predictionType": "예측 유형(안정 확산 2.x 모델 및 간혹 안정 확산 1.x 모델의 경우)", + "widthValidationMsg": "모형의 기본 너비.", + "selectAll": "모두 선택", + "vaeLocation": "VAE 위치", + "selectModel": "모델 선택", + "modelAdded": "추가된 모델", + "repo_id": "Repo ID", + "modelSyncFailed": "모델 동기화 실패", + "convertToDiffusersHelpText6": "이 모델을 변환하시겠습니까?", + "config": "구성", + "quickAdd": "빠른 추가", + "selected": "선택된", + "modelTwo": "모델 2", + "simpleModelDesc": "로컬 Difffusers 모델, 로컬 체크포인트/안전 센서 모델 HuggingFace Repo ID 또는 체크포인트/Diffusers 모델 URL의 경로를 제공합니다.", + "customSaveLocation": "사용자 정의 저장 위치", + "advanced": "고급", + "modelsFound": "발견된 모델", + "load": "불러오기", + "height": "높이", + "modelDeleted": "삭제된 모델", + "inpainting": "v1 Inpainting", + "vaeLocationValidationMsg": "VAE가 있는 경로.", + "convertToDiffusersHelpText2": "이 프로세스는 모델 관리자 항목을 동일한 모델의 Diffusers 버전으로 대체합니다.", + "modelUpdateFailed": "모델 업데이트 실패", + "modelUpdated": "업데이트된 모델", + "noModelsFound": "모델을 찾을 수 없음", + "useCustomConfig": "사용자 지정 구성 사용", + "formMessageDiffusersVAELocationDesc": "제공되지 않은 경우 호출AIA 파일을 위의 모델 위치 내에서 VAE 파일을 찾습니다.", + "formMessageDiffusersVAELocation": "VAE 위치", + "checkpointModels": "Checkpoints", + "modelOne": "모델 1", + "settings": "설정", + "heightValidationMsg": "모델의 기본 높이입니다.", + "selectAndAdd": "아래 나열된 모델 선택 및 추가", + "convertToDiffusersHelpText5": "디스크 공간이 충분한지 확인해 주세요. 모델은 일반적으로 2GB에서 7GB 사이로 다양합니다.", + "deleteConfig": "구성 삭제", + "deselectAll": "모두 선택 취소", + "modelConversionFailed": "모델 변환 실패", + "clearCheckpointFolder": "Checkpoint Folder 지우기", + "modelEntryDeleted": "모델 항목 삭제", + "deleteMsg1": "InvokeAI에서 이 모델을 삭제하시겠습니까?", + "syncModels": "동기화 모델", + "mergedModelSaveLocation": "위치 저장", + "checkpointOrSafetensors": "$t(common.checkpoint) / $t(common.safetensors)", + "modelType": "모델 유형", + "nameValidationMsg": "모델 이름 입력", + "cached": "cached", + "modelsMerged": "병합된 모델", + "formMessageDiffusersModelLocation": "Diffusers 모델 위치", + "modelsMergeFailed": "모델 병합 실패", + "convertingModelBegin": "모델 변환 중입니다. 잠시만 기다려 주십시오.", + "v2_base": "v2 (512px)", + "scanForModels": "모델 검색", + "modelLocationValidationMsg": "Diffusers 모델이 저장된 로컬 폴더의 경로 제공", + "name": "이름", + "selectFolder": "폴더 선택", + "updateModel": "모델 업데이트", + "addNewModel": "새로운 모델 추가", + "customConfigFileLocation": "사용자 지정 구성 파일 위치", + "descriptionValidationMsg": "모델에 대한 description 추가", + "safetensorModels": "SafeTensors", + "convertToDiffusersHelpText1": "이 모델은 🧨 Diffusers 형식으로 변환됩니다.", + "modelsSynced": "동기화된 모델", + "vaePrecision": "VAE 정밀도", + "invokeRoot": "InvokeAI 폴더", + "checkpointFolder": "Checkpoint Folder", + "mergedModelCustomSaveLocation": "사용자 지정 경로", + "mergeModels": "모델 병합", + "interpolationType": "Interpolation 타입", + "modelMergeHeaderHelp2": "Diffusers만 병합이 가능합니다. 체크포인트 모델 병합을 원하신다면 먼저 Diffusers로 변환해주세요.", + "convertToDiffusersSaveLocation": "위치 저장", + "deleteMsg2": "모델이 InvokeAI root 폴더에 있으면 디스크에서 모델이 삭제됩니다. 사용자 지정 위치를 사용하는 경우 모델이 디스크에서 삭제되지 않습니다.", + "oliveModels": "Olives", + "repoIDValidationMsg": "모델의 온라인 저장소", + "baseModel": "기본 모델", + "scanAgain": "다시 검색", + "pickModelType": "모델 유형 선택", + "sameFolder": "같은 폴더", + "addNew": "New 추가", + "manual": "매뉴얼", + "convertToDiffusersHelpText3": "디스크의 체크포인트 파일이 InvokeAI root 폴더에 있으면 삭제됩니다. 사용자 지정 위치에 있으면 삭제되지 않습니다.", + "addCheckpointModel": "체크포인트 / 안전 센서 모델 추가", + "configValidationMsg": "모델의 구성 파일에 대한 경로.", + "modelManager": "모델 매니저", + "variant": "Variant", + "vaeRepoIDValidationMsg": "VAE의 온라인 저장소", + "loraModels": "LoRAs", + "modelDeleteFailed": "모델을 삭제하지 못했습니다", + "convertToDiffusers": "Diffusers로 변환", + "allModels": "모든 모델", + "modelThree": "모델 3", + "findModels": "모델 찾기", + "notLoaded": "로드되지 않음", + "alpha": "Alpha", + "diffusersModels": "Diffusers", + "modelMergeAlphaHelp": "Alpha는 모델의 혼합 강도를 제어합니다. Alpha 값이 낮을수록 두 번째 모델의 영향력이 줄어듭니다.", + "addDifference": "Difference 추가", + "noModelSelected": "선택한 모델 없음", + "modelMergeHeaderHelp1": "최대 3개의 다른 모델을 병합하여 필요에 맞는 혼합물을 만들 수 있습니다.", + "ignoreMismatch": "선택한 모델 간의 불일치 무시", + "v2_768": "v2 (768px)", + "convertToDiffusersHelpText4": "이것은 한 번의 과정일 뿐입니다. 컴퓨터 사양에 따라 30-60초 정도 소요될 수 있습니다.", + "model": "모델", + "addManually": "Manually 추가", + "addSelected": "Selected 추가", + "mergedModelName": "병합된 모델 이름", + "delete": "삭제" + }, + "controlnet": { + "amult": "a_mult", + "resize": "크기 조정", + "showAdvanced": "고급 표시", + "contentShuffleDescription": "이미지에서 content 섞기", + "bgth": "bg_th", + "addT2IAdapter": "$t(common.t2iAdapter) 추가", + "pidi": "PIDI", + "importImageFromCanvas": "캔버스에서 이미지 가져오기", + "lineartDescription": "이미지->lineart 변환", + "normalBae": "Normal BAE", + "importMaskFromCanvas": "캔버스에서 Mask 가져오기", + "hed": "HED", + "contentShuffle": "Content Shuffle", + "controlNetEnabledT2IDisabled": "$t(common.controlNet) 사용 가능, $t(common.t2iAdapter) 사용 불가능", + "ipAdapterModel": "Adapter 모델", + "resetControlImage": "Control Image 재설정", + "beginEndStepPercent": "Begin / End Step Percentage", + "mlsdDescription": "Minimalist Line Segment Detector", + "duplicate": "복제", + "balanced": "Balanced", + "f": "F", + "h": "H", + "prompt": "프롬프트", + "depthMidasDescription": "Midas를 사용하여 Depth map 생성하기", + "openPoseDescription": "Openpose를 이용한 사람 포즈 추정", + "control": "Control", + "resizeMode": "크기 조정 모드", + "t2iEnabledControlNetDisabled": "$t(common.t2iAdapter) 사용 가능,$t(common.controlNet) 사용 불가능", + "coarse": "Coarse", + "weight": "Weight", + "selectModel": "모델 선택", + "crop": "Crop", + "depthMidas": "Depth (Midas)", + "w": "W", + "processor": "프로세서", + "addControlNet": "$t(common.controlNet) 추가", + "none": "해당없음", + "enableControlnet": "사용 가능한 ControlNet", + "detectResolution": "해상도 탐지", + "controlNetT2IMutexDesc": "$t(common.controlNet)와 $t(common.t2iAdapter)는 현재 동시에 지원되지 않습니다.", + "pidiDescription": "PIDI image 처리", + "mediapipeFace": "Mediapipe Face", + "mlsd": "M-LSD", + "controlMode": "Control Mode", + "fill": "채우기", + "cannyDescription": "Canny 모서리 삭제", + "addIPAdapter": "$t(common.ipAdapter) 추가", + "lineart": "Lineart", + "colorMapDescription": "이미지에서 color map을 생성합니다", + "lineartAnimeDescription": "Anime-style lineart 처리", + "minConfidence": "Min Confidence", + "imageResolution": "이미지 해상도", + "megaControl": "Mega Control", + "depthZoe": "Depth (Zoe)", + "colorMap": "색", + "lowThreshold": "Low Threshold", + "autoConfigure": "프로세서 자동 구성", + "highThreshold": "High Threshold", + "normalBaeDescription": "Normal BAE 처리", + "noneDescription": "처리되지 않음", + "saveControlImage": "Control Image 저장", + "openPose": "Openpose", + "toggleControlNet": "해당 ControlNet으로 전환", + "delete": "삭제", + "controlAdapter_other": "Control Adapter(s)", + "safe": "Safe", + "colorMapTileSize": "타일 크기", + "lineartAnime": "Lineart Anime", + "ipAdapterImageFallback": "IP Adapter Image가 선택되지 않음", + "mediapipeFaceDescription": "Mediapipe를 사용하여 Face 탐지", + "canny": "Canny", + "depthZoeDescription": "Zoe를 사용하여 Depth map 생성하기", + "hedDescription": "Holistically-Nested 모서리 탐지", + "setControlImageDimensions": "Control Image Dimensions를 W/H로 설정", + "scribble": "scribble", + "resetIPAdapterImage": "IP Adapter Image 재설정", + "handAndFace": "Hand and Face", + "enableIPAdapter": "사용 가능한 IP Adapter", + "maxFaces": "Max Faces" + }, + "hotkeys": { + "toggleSnap": { + "desc": "Snap을 Grid로 전환", + "title": "Snap 전환" + }, + "setSeed": { + "title": "시드 설정", + "desc": "현재 이미지의 시드 사용" + }, + "keyboardShortcuts": "키보드 바로 가기", + "decreaseGalleryThumbSize": { + "desc": "갤러리 미리 보기 크기 축소", + "title": "갤러리 이미지 크기 축소" + }, + "previousStagingImage": { + "title": "이전 스테이징 이미지", + "desc": "이전 스테이징 영역 이미지" + }, + "decreaseBrushSize": { + "title": "브러시 크기 줄이기", + "desc": "캔버스 브러시/지우개 크기 감소" + }, + "consoleToggle": { + "desc": "콘솔 열고 닫기", + "title": "콘솔 전환" + }, + "selectBrush": { + "desc": "캔버스 브러시를 선택", + "title": "브러시 선택" + }, + "upscale": { + "desc": "현재 이미지를 업스케일", + "title": "업스케일" + }, + "previousImage": { + "title": "이전 이미지", + "desc": "갤러리에 이전 이미지 표시" + }, + "unifiedCanvasHotkeys": "Unified Canvas Hotkeys", + "toggleOptions": { + "desc": "옵션 패널을 열고 닫기", + "title": "옵션 전환" + }, + "selectEraser": { + "title": "지우개 선택", + "desc": "캔버스 지우개를 선택" + }, + "setPrompt": { + "title": "프롬프트 설정", + "desc": "현재 이미지의 프롬프트 사용" + }, + "acceptStagingImage": { + "desc": "현재 준비 영역 이미지 허용", + "title": "준비 이미지 허용" + }, + "resetView": { + "desc": "Canvas View 초기화", + "title": "View 초기화" + }, + "hideMask": { + "title": "Mask 숨김", + "desc": "mask 숨김/숨김 해제" + }, + "pinOptions": { + "title": "옵션 고정", + "desc": "옵션 패널을 고정" + }, + "toggleGallery": { + "desc": "gallery drawer 열기 및 닫기", + "title": "Gallery 전환" + }, + "quickToggleMove": { + "title": "빠른 토글 이동", + "desc": "일시적으로 이동 모드 전환" + }, + "generalHotkeys": "General Hotkeys", + "showHideBoundingBox": { + "desc": "bounding box 표시 전환", + "title": "Bounding box 표시/숨김" + }, + "showInfo": { + "desc": "현재 이미지의 metadata 정보 표시", + "title": "정보 표시" + }, + "copyToClipboard": { + "title": "클립보드로 복사", + "desc": "현재 캔버스를 클립보드로 복사" + }, + "restoreFaces": { + "title": "Faces 복원", + "desc": "현재 이미지 복원" + }, + "fillBoundingBox": { + "title": "Bounding Box 채우기", + "desc": "bounding box를 브러시 색으로 채웁니다" + }, + "closePanels": { + "desc": "열린 panels 닫기", + "title": "panels 닫기" + }, + "downloadImage": { + "desc": "현재 캔버스 다운로드", + "title": "이미지 다운로드" + }, + "setParameters": { + "title": "매개 변수 설정", + "desc": "현재 이미지의 모든 매개 변수 사용" + }, + "maximizeWorkSpace": { + "desc": "패널을 닫고 작업 면적을 극대화", + "title": "작업 공간 극대화" + }, + "galleryHotkeys": "Gallery Hotkeys", + "cancel": { + "desc": "이미지 생성 취소", + "title": "취소" + }, + "saveToGallery": { + "title": "갤러리에 저장", + "desc": "현재 캔버스를 갤러리에 저장" + }, + "eraseBoundingBox": { + "desc": "bounding box 영역을 지웁니다", + "title": "Bounding Box 지우기" + }, + "nextImage": { + "title": "다음 이미지", + "desc": "갤러리에 다음 이미지 표시" + }, + "colorPicker": { + "desc": "canvas color picker 선택", + "title": "Color Picker 선택" + }, + "invoke": { + "desc": "이미지 생성", + "title": "불러오기" + }, + "sendToImageToImage": { + "desc": "현재 이미지를 이미지로 보내기" + }, + "toggleLayer": { + "desc": "mask/base layer 선택 전환", + "title": "Layer 전환" + }, + "increaseBrushSize": { + "title": "브러시 크기 증가", + "desc": "캔버스 브러시/지우개 크기 증가" + }, + "appHotkeys": "App Hotkeys", + "deleteImage": { + "title": "이미지 삭제", + "desc": "현재 이미지 삭제" + }, + "moveTool": { + "desc": "캔버스 탐색 허용", + "title": "툴 옮기기" + }, + "clearMask": { + "desc": "전체 mask 제거", + "title": "Mask 제거" + }, + "increaseGalleryThumbSize": { + "title": "갤러리 이미지 크기 증가", + "desc": "갤러리 미리 보기 크기를 늘립니다" + }, + "increaseBrushOpacity": { + "desc": "캔버스 브러시의 불투명도를 높입니다", + "title": "브러시 불투명도 증가" + }, + "focusPrompt": { + "desc": "프롬프트 입력 영역에 초점을 맞춥니다", + "title": "프롬프트에 초점 맞추기" + }, + "decreaseBrushOpacity": { + "desc": "캔버스 브러시의 불투명도를 줄입니다", + "title": "브러시 불투명도 감소" + }, + "nextStagingImage": { + "desc": "다음 스테이징 영역 이미지", + "title": "다음 스테이징 이미지" + }, + "redoStroke": { + "title": "Stroke 다시 실행", + "desc": "brush stroke 다시 실행" + }, + "nodesHotkeys": "Nodes Hotkeys", + "addNodes": { + "desc": "노드 추가 메뉴 열기", + "title": "노드 추가" + }, + "undoStroke": { + "title": "Stroke 실행 취소", + "desc": "brush stroke 실행 취소" + }, + "changeTabs": { + "desc": "다른 workspace으로 전환", + "title": "탭 바꾸기" + }, + "mergeVisible": { + "desc": "캔버스의 보이는 모든 레이어 병합" + } + }, + "nodes": { + "inputField": "입력 필드", + "controlFieldDescription": "노드 간에 전달된 Control 정보입니다.", + "latentsFieldDescription": "노드 사이에 Latents를 전달할 수 있습니다.", + "denoiseMaskFieldDescription": "노드 간에 Denoise Mask가 전달될 수 있음", + "floatCollectionDescription": "실수 컬렉션.", + "missingTemplate": "잘못된 노드: {{type}} 유형의 {{node}} 템플릿 누락(설치되지 않으셨나요?)", + "outputSchemaNotFound": "Output schema가 발견되지 않음", + "ipAdapterPolymorphicDescription": "IP-Adapters 컬렉션.", + "latentsPolymorphicDescription": "노드 사이에 Latents를 전달할 수 있습니다.", + "colorFieldDescription": "RGBA 색.", + "mainModelField": "모델", + "ipAdapterCollection": "IP-Adapters 컬렉션", + "conditioningCollection": "Conditioning 컬렉션", + "maybeIncompatible": "설치된 것과 호환되지 않을 수 있음", + "ipAdapterPolymorphic": "IP-Adapter 다형성", + "noNodeSelected": "선택한 노드 없음", + "addNode": "노드 추가", + "hideGraphNodes": "그래프 오버레이 숨기기", + "enum": "Enum", + "loadWorkflow": "Workflow 불러오기", + "integerPolymorphicDescription": "정수 컬렉션.", + "noOutputRecorded": "기록된 출력 없음", + "conditioningCollectionDescription": "노드 간에 Conditioning을 전달할 수 있습니다.", + "colorPolymorphic": "색상 다형성", + "colorCodeEdgesHelp": "연결된 필드에 따른 색상 코드 선", + "collectionDescription": "해야 할 일", + "hideLegendNodes": "필드 유형 범례 숨기기", + "addLinearView": "Linear View에 추가", + "float": "실수", + "targetNodeFieldDoesNotExist": "잘못된 모서리: 대상/입력 필드 {{node}}. {{field}}이(가) 없습니다", + "animatedEdges": "애니메이션 모서리", + "conditioningPolymorphic": "Conditioning 다형성", + "integer": "정수", + "colorField": "색", + "boardField": "Board", + "nodeTemplate": "노드 템플릿", + "latentsCollection": "Latents 컬렉션", + "nodeOpacity": "노드 불투명도", + "sourceNodeDoesNotExist": "잘못된 모서리: 소스/출력 노드 {{node}}이(가) 없습니다", + "pickOne": "하나 고르기", + "collectionItemDescription": "해야 할 일", + "integerDescription": "정수는 소수점이 없는 숫자입니다.", + "outputField": "출력 필드", + "conditioningPolymorphicDescription": "노드 간에 Conditioning을 전달할 수 있습니다.", + "noFieldsLinearview": "Linear View에 추가된 필드 없음", + "imagePolymorphic": "이미지 다형성", + "nodeSearch": "노드 검색", + "imagePolymorphicDescription": "이미지 컬렉션.", + "floatPolymorphic": "실수 다형성", + "outputFieldInInput": "입력 중 출력필드", + "doesNotExist": "존재하지 않음", + "ipAdapterCollectionDescription": "IP-Adapters 컬렉션.", + "controlCollection": "Control 컬렉션", + "inputMayOnlyHaveOneConnection": "입력에 하나의 연결만 있을 수 있습니다", + "notes": "메모", + "nodeOutputs": "노드 결과물", + "currentImageDescription": "Node Editor에 현재 이미지를 표시합니다", + "downloadWorkflow": "Workflow JSON 다운로드", + "ipAdapter": "IP-Adapter", + "integerCollection": "정수 컬렉션", + "collectionItem": "컬렉션 아이템", + "noConnectionInProgress": "진행중인 연결이 없습니다", + "controlCollectionDescription": "노드 간에 전달된 Control 정보입니다.", + "noConnectionData": "연결 데이터 없음", + "outputFields": "출력 필드", + "fieldTypesMustMatch": "필드 유형은 일치해야 합니다", + "edge": "Edge", + "inputNode": "입력 노드", + "enumDescription": "Enums은 여러 옵션 중 하나일 수 있는 값입니다.", + "sourceNodeFieldDoesNotExist": "잘못된 모서리: 소스/출력 필드 {{node}}. {{field}}이(가) 없습니다", + "loRAModelFieldDescription": "해야 할 일", + "imageField": "이미지", + "animatedEdgesHelp": "선택한 노드에 연결된 선택한 가장자리 및 가장자리를 애니메이션화합니다", + "cannotDuplicateConnection": "중복 연결을 만들 수 없습니다", + "booleanPolymorphic": "Boolean 다형성", + "noWorkflow": "Workflow 없음", + "colorCollectionDescription": "해야 할 일", + "integerCollectionDescription": "정수 컬렉션.", + "colorPolymorphicDescription": "색의 컬렉션.", + "denoiseMaskField": "Denoise Mask", + "missingCanvaInitImage": "캔버스 init 이미지 누락", + "conditioningFieldDescription": "노드 간에 Conditioning을 전달할 수 있습니다.", + "clipFieldDescription": "Tokenizer 및 text_encoder 서브모델.", + "fullyContainNodesHelp": "선택하려면 노드가 선택 상자 안에 완전히 있어야 합니다", + "noImageFoundState": "상태에서 초기 이미지를 찾을 수 없습니다", + "clipField": "Clip", + "nodePack": "Node pack", + "nodeType": "노드 유형", + "noMatchingNodes": "일치하는 노드 없음", + "fullyContainNodes": "선택할 노드 전체 포함", + "integerPolymorphic": "정수 다형성", + "executionStateInProgress": "진행중", + "noFieldType": "필드 유형 없음", + "colorCollection": "색의 컬렉션.", + "executionStateError": "에러", + "noOutputSchemaName": "ref 개체에 output schema 이름이 없습니다", + "ipAdapterModel": "IP-Adapter 모델", + "latentsPolymorphic": "Latents 다형성", + "ipAdapterDescription": "이미지 프롬프트 어댑터(IP-Adapter).", + "boolean": "Booleans", + "missingCanvaInitMaskImages": "캔버스 init 및 mask 이미지 누락", + "problemReadingMetadata": "이미지에서 metadata를 읽는 중 문제가 발생했습니다", + "hideMinimapnodes": "미니맵 숨기기", + "oNNXModelField": "ONNX 모델", + "executionStateCompleted": "완료된", + "node": "노드", + "currentImage": "현재 이미지", + "controlField": "Control", + "booleanDescription": "Booleans은 참 또는 거짓입니다.", + "collection": "컬렉션", + "ipAdapterModelDescription": "IP-Adapter 모델 필드", + "cannotConnectInputToInput": "입력을 입력에 연결할 수 없습니다", + "invalidOutputSchema": "잘못된 output schema", + "boardFieldDescription": "A gallery board", + "floatDescription": "실수는 소수점이 있는 숫자입니다.", + "floatPolymorphicDescription": "실수 컬렉션.", + "conditioningField": "Conditioning", + "collectionFieldType": "{{name}} 컬렉션", + "floatCollection": "실수 컬렉션", + "latentsField": "Latents", + "cannotConnectOutputToOutput": "출력을 출력에 연결할 수 없습니다", + "booleanCollection": "Boolean 컬렉션", + "connectionWouldCreateCycle": "연결하면 주기가 생성됩니다", + "cannotConnectToSelf": "자체에 연결할 수 없습니다", + "notesDescription": "Workflow에 대한 메모 추가", + "inputFields": "입력 필드", + "colorCodeEdges": "색상-코드 선", + "targetNodeDoesNotExist": "잘못된 모서리: 대상/입력 노드 {{node}}이(가) 없습니다", + "imageCollectionDescription": "이미지 컬렉션.", + "mismatchedVersion": "잘못된 노드: {{type}} 유형의 {{node}} 노드에 일치하지 않는 버전이 있습니다(업데이트 해보시겠습니까?)", + "imageFieldDescription": "노드 간에 이미지를 전달할 수 있습니다.", + "outputNode": "출력노드", + "addNodeToolTip": "노드 추가(Shift+A, Space)", + "collectionOrScalarFieldType": "{{name}} 컬렉션|Scalar", + "nodeVersion": "노드 버전", + "loadingNodes": "노드 로딩중...", + "mainModelFieldDescription": "해야 할 일", + "loRAModelField": "LoRA", + "deletedInvalidEdge": "잘못된 모서리 {{source}} -> {{target}} 삭제", + "latentsCollectionDescription": "노드 사이에 Latents를 전달할 수 있습니다.", + "oNNXModelFieldDescription": "ONNX 모델 필드.", + "imageCollection": "이미지 컬렉션" + }, + "queue": { + "status": "상태", + "pruneSucceeded": "Queue로부터 {{item_count}} 완성된 항목 잘라내기", + "cancelTooltip": "현재 항목 취소", + "queueEmpty": "비어있는 Queue", + "pauseSucceeded": "중지된 프로세서", + "in_progress": "진행 중", + "queueFront": "Front of Queue에 추가", + "notReady": "Queue를 생성할 수 없음", + "batchFailedToQueue": "Queue Batch에 실패", + "completed": "완성된", + "queueBack": "Queue에 추가", + "batchValues": "Batch 값들", + "cancelFailed": "항목 취소 중 발생한 문제", + "queueCountPrediction": "Queue에 {{predicted}} 추가", + "batchQueued": "Batch Queued", + "pauseFailed": "프로세서 중지 중 발생한 문제", + "clearFailed": "Queue 제거 중 발생한 문제", + "queuedCount": "{{pending}} Pending", + "front": "front", + "clearSucceeded": "제거된 Queue", + "pause": "중지", + "pruneTooltip": "{{item_count}} 완성된 항목 잘라내기", + "cancelSucceeded": "취소된 항목", + "batchQueuedDesc_other": "queue의 {{direction}}에 추가된 {{count}}세션", + "queue": "Queue", + "batch": "Batch", + "clearQueueAlertDialog": "Queue를 지우면 처리 항목이 즉시 취소되고 Queue가 완전히 지워집니다.", + "resumeFailed": "프로세서 재개 중 발생한 문제", + "clear": "제거하다", + "prune": "잘라내다", + "total": "총 개수", + "canceled": "취소된", + "pruneFailed": "Queue 잘라내는 중 발생한 문제", + "cancelBatchSucceeded": "취소된 Batch", + "clearTooltip": "모든 항목을 취소하고 제거", + "current": "최근", + "pauseTooltip": "프로세서 중지", + "failed": "실패한", + "cancelItem": "항목 취소", + "next": "다음", + "cancelBatch": "Batch 취소", + "back": "back", + "batchFieldValues": "Batch 필드 값들", + "cancel": "취소", + "session": "세션", + "time": "시간", + "queueTotal": "{{total}} Total", + "resumeSucceeded": "재개된 프로세서", + "enqueueing": "Queueing Batch", + "resumeTooltip": "프로세서 재개", + "resume": "재개", + "cancelBatchFailed": "Batch 취소 중 발생한 문제", + "clearQueueAlertDialog2": "Queue를 지우시겠습니까?", + "item": "항목", + "graphFailedToQueue": "queue graph에 실패" + }, + "metadata": { + "positivePrompt": "긍정적 프롬프트", + "negativePrompt": "부정적인 프롬프트", + "generationMode": "Generation Mode", + "Threshold": "Noise Threshold", + "metadata": "Metadata", + "seed": "시드", + "imageDetails": "이미지 세부 정보", + "perlin": "Perlin Noise", + "model": "모델", + "noImageDetails": "이미지 세부 정보를 찾을 수 없습니다", + "hiresFix": "고해상도 최적화", + "cfgScale": "CFG scale", + "initImage": "초기이미지", + "recallParameters": "매개변수 호출", + "height": "Height", + "variations": "Seed-weight 쌍", + "noMetaData": "metadata를 찾을 수 없습니다", + "cfgRescaleMultiplier": "$t(parameters.cfgRescaleMultiplier)", + "width": "너비", + "vae": "VAE", + "createdBy": "~에 의해 생성된", + "workflow": "작업의 흐름", + "steps": "단계", + "scheduler": "스케줄러", + "noRecallParameters": "호출할 매개 변수가 없습니다" + }, + "invocationCache": { + "useCache": "캐시 사용", + "disable": "이용 불가능한", + "misses": "캐시 미스", + "enableFailed": "Invocation 캐시를 사용하도록 설정하는 중 발생한 문제", + "invocationCache": "Invocation 캐시", + "clearSucceeded": "제거된 Invocation 캐시", + "enableSucceeded": "이용 가능한 Invocation 캐시", + "clearFailed": "Invocation 캐시 제거 중 발생한 문제", + "hits": "캐시 적중", + "disableSucceeded": "이용 불가능한 Invocation 캐시", + "disableFailed": "Invocation 캐시를 이용하지 못하게 설정 중 발생한 문제", + "enable": "이용 가능한", + "clear": "제거", + "maxCacheSize": "최대 캐시 크기", + "cacheSize": "캐시 크기" + }, + "embedding": { + "noEmbeddingsLoaded": "불러온 Embeddings이 없음", + "noMatchingEmbedding": "일치하는 Embeddings이 없음", + "addEmbedding": "Embedding 추가", + "incompatibleModel": "호환되지 않는 기본 모델:" + }, + "hrf": { + "enableHrf": "이용 가능한 고해상도 고정", + "upscaleMethod": "업스케일 방법", + "enableHrfTooltip": "낮은 초기 해상도로 생성하고 기본 해상도로 업스케일한 다음 Image-to-Image를 실행합니다.", + "metadata": { + "strength": "고해상도 고정 강도", + "enabled": "고해상도 고정 사용", + "method": "고해상도 고정 방법" + }, + "hrf": "고해상도 고정", + "hrfStrength": "고해상도 고정 강도" + }, + "models": { + "noLoRAsLoaded": "로드된 LoRA 없음", + "noMatchingModels": "일치하는 모델 없음", + "esrganModel": "ESRGAN 모델", + "loading": "로딩중", + "noMatchingLoRAs": "일치하는 LoRA 없음", + "noLoRAsAvailable": "사용 가능한 LoRA 없음", + "noModelsAvailable": "사용 가능한 모델이 없음", + "addLora": "LoRA 추가", + "selectModel": "모델 선택", + "noRefinerModelsInstalled": "SDXL Refiner 모델이 설치되지 않음", + "noLoRAsInstalled": "설치된 LoRA 없음", + "selectLoRA": "LoRA 선택" + }, + "boards": { + "autoAddBoard": "자동 추가 Board", + "topMessage": "이 보드에는 다음 기능에 사용되는 이미지가 포함되어 있습니다:", + "move": "이동", + "menuItemAutoAdd": "해당 Board에 자동 추가", + "myBoard": "나의 Board", + "searchBoard": "Board 찾는 중...", + "deleteBoardOnly": "Board만 삭제", + "noMatching": "일치하는 Board들이 없음", + "movingImagesToBoard_other": "{{count}}이미지를 Board로 이동시키기", + "selectBoard": "Board 선택", + "cancel": "취소", + "addBoard": "Board 추가", + "bottomMessage": "이 보드와 이미지를 삭제하면 현재 사용 중인 모든 기능이 재설정됩니다.", + "uncategorized": "미분류", + "downloadBoard": "Board 다운로드", + "changeBoard": "Board 바꾸기", + "loading": "불러오는 중...", + "clearSearch": "검색 지우기", + "deleteBoard": "Board 삭제", + "deleteBoardAndImages": "Board와 이미지 삭제", + "deletedBoardsCannotbeRestored": "삭제된 Board는 복원할 수 없습니다" } } diff --git a/invokeai/frontend/web/public/locales/nl.json b/invokeai/frontend/web/public/locales/nl.json index 3aa21cc77a..195fe4dc06 100644 --- a/invokeai/frontend/web/public/locales/nl.json +++ b/invokeai/frontend/web/public/locales/nl.json @@ -148,10 +148,6 @@ "title": "Zet Opties vast", "desc": "Zet het deelscherm Opties vast" }, - "toggleViewer": { - "title": "Zet Viewer vast", - "desc": "Opent of sluit Afbeeldingsviewer" - }, "toggleGallery": { "title": "Zet Galerij vast", "desc": "Opent of sluit het deelscherm Galerij" @@ -212,10 +208,6 @@ "title": "Volgende afbeelding", "desc": "Toont de volgende afbeelding in de galerij" }, - "toggleGalleryPin": { - "title": "Zet galerij vast/los", - "desc": "Zet de galerij vast of los aan de gebruikersinterface" - }, "increaseGalleryThumbSize": { "title": "Vergroot afbeeldingsgrootte galerij", "desc": "Vergroot de grootte van de galerijminiaturen" @@ -682,7 +674,6 @@ "parameterSet": "Instellen parameters", "nodesSaved": "Knooppunten bewaard", "nodesLoaded": "Knooppunten geladen", - "nodesCleared": "Knooppunten weggehaald", "nodesLoadedFailed": "Laden knooppunten mislukt", "problemCopyingImage": "Kan Afbeelding Niet Kopiëren", "nodesNotValidJSON": "Ongeldige JSON", @@ -845,9 +836,6 @@ "hideLegendNodes": "Typelegende veld verbergen", "reloadNodeTemplates": "Herlaad knooppuntsjablonen", "loadWorkflow": "Laad werkstroom", - "resetWorkflow": "Herstel werkstroom", - "resetWorkflowDesc": "Weet je zeker dat je deze werkstroom wilt herstellen?", - "resetWorkflowDesc2": "Herstel van een werkstroom haalt alle knooppunten, randen en werkstroomdetails weg.", "downloadWorkflow": "Download JSON van werkstroom", "booleanPolymorphicDescription": "Een verzameling Booleanse waarden.", "scheduler": "Planner", @@ -1075,7 +1063,6 @@ "processor": "Verwerker", "addControlNet": "Voeg $t(common.controlNet) toe", "none": "Geen", - "incompatibleBaseModel": "Niet-compatibel basismodel:", "enableControlnet": "Schakel ControlNet in", "detectResolution": "Herken resolutie", "controlNetT2IMutexDesc": "Gelijktijdig gebruik van $t(common.controlNet) en $t(common.t2iAdapter) wordt op dit moment niet ondersteund.", diff --git a/invokeai/frontend/web/public/locales/pl.json b/invokeai/frontend/web/public/locales/pl.json index f77c0c4710..35300596f4 100644 --- a/invokeai/frontend/web/public/locales/pl.json +++ b/invokeai/frontend/web/public/locales/pl.json @@ -86,10 +86,6 @@ "title": "Przypnij opcje", "desc": "Przypina panel opcji" }, - "toggleViewer": { - "title": "Przełącz podgląd", - "desc": "Otwiera lub zamyka widok podglądu" - }, "toggleGallery": { "title": "Przełącz galerię", "desc": "Wysuwa lub chowa galerię" @@ -150,10 +146,6 @@ "title": "Następny obraz", "desc": "Aktywuje następny obraz z galerii" }, - "toggleGalleryPin": { - "title": "Przypnij galerię", - "desc": "Przypina lub odpina widok galerii" - }, "increaseGalleryThumbSize": { "title": "Powiększ obrazy", "desc": "Powiększa rozmiar obrazów w galerii" diff --git a/invokeai/frontend/web/public/locales/pt.json b/invokeai/frontend/web/public/locales/pt.json index ac9dd50b4d..9dd020f7e2 100644 --- a/invokeai/frontend/web/public/locales/pt.json +++ b/invokeai/frontend/web/public/locales/pt.json @@ -81,10 +81,6 @@ "hotkeys": { "generalHotkeys": "Atalhos Gerais", "galleryHotkeys": "Atalhos da Galeria", - "toggleViewer": { - "title": "Ativar Visualizador", - "desc": "Abrir e fechar o Visualizador de Imagens" - }, "maximizeWorkSpace": { "desc": "Fechar painéis e maximixar área de trabalho", "title": "Maximizar a Área de Trabalho" @@ -232,10 +228,6 @@ "title": "Apagar Imagem", "desc": "Apaga a imagem atual" }, - "toggleGalleryPin": { - "title": "Ativar Fixar Galeria", - "desc": "Fixa e desafixa a galeria na interface" - }, "increaseGalleryThumbSize": { "title": "Aumentar Tamanho da Galeria de Imagem", "desc": "Aumenta o tamanho das thumbs na galeria" diff --git a/invokeai/frontend/web/public/locales/pt_BR.json b/invokeai/frontend/web/public/locales/pt_BR.json index 3b45dbbbf3..ac2d36839b 100644 --- a/invokeai/frontend/web/public/locales/pt_BR.json +++ b/invokeai/frontend/web/public/locales/pt_BR.json @@ -103,10 +103,6 @@ "title": "Fixar Opções", "desc": "Fixar o painel de opções" }, - "toggleViewer": { - "title": "Ativar Visualizador", - "desc": "Abrir e fechar o Visualizador de Imagens" - }, "toggleGallery": { "title": "Ativar Galeria", "desc": "Abrir e fechar a gaveta da galeria" @@ -167,10 +163,6 @@ "title": "Próxima Imagem", "desc": "Mostra a próxima imagem na galeria" }, - "toggleGalleryPin": { - "title": "Ativar Fixar Galeria", - "desc": "Fixa e desafixa a galeria na interface" - }, "increaseGalleryThumbSize": { "title": "Aumentar Tamanho da Galeria de Imagem", "desc": "Aumenta o tamanho das thumbs na galeria" diff --git a/invokeai/frontend/web/public/locales/ru.json b/invokeai/frontend/web/public/locales/ru.json index 1c83286dec..db4f7552cb 100644 --- a/invokeai/frontend/web/public/locales/ru.json +++ b/invokeai/frontend/web/public/locales/ru.json @@ -51,23 +51,23 @@ "statusConvertingModel": "Конвертация модели", "cancel": "Отменить", "accept": "Принять", - "langUkranian": "Украинский", - "langEnglish": "Английский", + "langUkranian": "Украї́нська", + "langEnglish": "English", "postprocessing": "Постобработка", - "langArabic": "Арабский", - "langSpanish": "Испанский", - "langSimplifiedChinese": "Китайский (упрощенный)", - "langDutch": "Нидерландский", - "langFrench": "Французский", - "langGerman": "Немецкий", - "langHebrew": "Иврит", - "langItalian": "Итальянский", - "langJapanese": "Японский", - "langKorean": "Корейский", - "langPolish": "Польский", - "langPortuguese": "Португальский", + "langArabic": "العربية", + "langSpanish": "Español", + "langSimplifiedChinese": "简体中文", + "langDutch": "Nederlands", + "langFrench": "Français", + "langGerman": "German", + "langHebrew": "Hebrew", + "langItalian": "Italiano", + "langJapanese": "日本語", + "langKorean": "한국어", + "langPolish": "Polski", + "langPortuguese": "Português", "txt2img": "Текст в изображение (txt2img)", - "langBrPortuguese": "Португальский (Бразилия)", + "langBrPortuguese": "Português do Brasil", "linear": "Линейная обработка", "dontAskMeAgain": "Больше не спрашивать", "areYouSure": "Вы уверены?", @@ -82,7 +82,50 @@ "darkMode": "Темная тема", "nodeEditor": "Редактор Нодов (Узлов)", "controlNet": "Controlnet", - "advanced": "Расширенные" + "advanced": "Расширенные", + "t2iAdapter": "T2I Adapter", + "checkpoint": "Checkpoint", + "format": "Формат", + "unknown": "Неизвестно", + "folder": "Папка", + "inpaint": "Перерисовать", + "updated": "Обновлен", + "on": "На", + "save": "Сохранить", + "created": "Создано", + "error": "Ошибка", + "prevPage": "Предыдущая страница", + "simple": "Простой", + "ipAdapter": "IP Adapter", + "controlAdapter": "Адаптер контроля", + "installed": "Установлено", + "ai": "ИИ", + "auto": "Авто", + "file": "Файл", + "delete": "Удалить", + "template": "Шаблон", + "outputs": "результаты", + "unknownError": "Неизвестная ошибка", + "statusProcessing": "Обработка", + "imageFailedToLoad": "Невозможно загрузить изображение", + "direction": "Направление", + "data": "Данные", + "somethingWentWrong": "Что-то пошло не так", + "safetensors": "Safetensors", + "outpaint": "Расширить изображение", + "orderBy": "Сортировать по", + "copyError": "Ошибка $t(gallery.copy)", + "learnMore": "Узнать больше", + "nextPage": "Следущая страница", + "saveAs": "Сохранить как", + "unsaved": "несохраненный", + "input": "Вход", + "details": "Детали", + "notInstalled": "Нет $t(common.installed)", + "preferencesLabel": "Предпочтения", + "or": "или", + "advancedOptions": "Расширенные настройки", + "free": "Свободно" }, "gallery": { "generations": "Генерации", @@ -102,7 +145,27 @@ "deleteImageBin": "Удаленные изображения будут отправлены в корзину вашей операционной системы.", "deleteImage": "Удалить изображение", "assets": "Ресурсы", - "autoAssignBoardOnClick": "Авто-назначение доски по клику" + "autoAssignBoardOnClick": "Авто-назначение доски по клику", + "deleteSelection": "Удалить выделенное", + "featuresWillReset": "Если вы удалите это изображение, эти функции будут немедленно сброшены.", + "problemDeletingImagesDesc": "Не удалось удалить одно или несколько изображений", + "loading": "Загрузка", + "unableToLoad": "Невозможно загрузить галерею", + "preparingDownload": "Подготовка к скачиванию", + "preparingDownloadFailed": "Проблема с подготовкой к скачиванию", + "image": "изображение", + "drop": "перебросить", + "problemDeletingImages": "Проблема с удалением изображений", + "downloadSelection": "Скачать выделенное", + "currentlyInUse": "В настоящее время это изображение используется в следующих функциях:", + "unstarImage": "Удалить из избранного", + "dropOrUpload": "$t(gallery.drop) или загрузить", + "copy": "Копировать", + "download": "Скачать", + "noImageSelected": "Изображение не выбрано", + "setCurrentImage": "Установить как текущее изображение", + "starImage": "Добавить в избранное", + "dropToUpload": "$t(gallery.drop) чтоб загрузить" }, "hotkeys": { "keyboardShortcuts": "Горячие клавиши", @@ -130,10 +193,6 @@ "title": "Закрепить параметры", "desc": "Закрепить панель параметров" }, - "toggleViewer": { - "title": "Показать просмотр", - "desc": "Открывать и закрывать просмотрщик изображений" - }, "toggleGallery": { "title": "Показать галерею", "desc": "Открывать и закрывать ящик галереи" @@ -194,10 +253,6 @@ "title": "Следующее изображение", "desc": "Отображение следующего изображения в галерее" }, - "toggleGalleryPin": { - "title": "Закрепить галерею", - "desc": "Закрепляет и открепляет галерею" - }, "increaseGalleryThumbSize": { "title": "Увеличить размер миниатюр галереи", "desc": "Увеличивает размер миниатюр галереи" @@ -314,7 +369,22 @@ "desc": "Открывает меню добавления узла", "title": "Добавление узлов" }, - "nodesHotkeys": "Горячие клавиши узлов" + "nodesHotkeys": "Горячие клавиши узлов", + "cancelAndClear": { + "desc": "Отмена текущего элемента очереди и очистка всех ожидающих элементов", + "title": "Отменить и очистить" + }, + "resetOptionsAndGallery": { + "title": "Сброс настроек и галереи", + "desc": "Сброс панелей галереи и настроек" + }, + "searchHotkeys": "Поиск горячих клавиш", + "noHotkeysFound": "Горячие клавиши не найдены", + "toggleOptionsAndGallery": { + "desc": "Открытие и закрытие панели опций и галереи", + "title": "Переключить опции и галерею" + }, + "clearSearch": "Очистить поиск" }, "modelManager": { "modelManager": "Менеджер моделей", @@ -334,7 +404,7 @@ "config": "Файл конфигурации", "configValidationMsg": "Путь до файла конфигурации.", "modelLocation": "Расположение модели", - "modelLocationValidationMsg": "Путь до файла с моделью.", + "modelLocationValidationMsg": "Укажите путь к локальной папке, в которой хранится ваша модель Diffusers", "vaeLocation": "Расположение VAE", "vaeLocationValidationMsg": "Путь до файла VAE.", "width": "Ширина", @@ -377,7 +447,7 @@ "convertToDiffusersHelpText3": "Ваш файл контрольной точки НА ДИСКЕ будет УДАЛЕН, если он находится в корневой папке InvokeAI. Если он находится в пользовательском расположении, то он НЕ будет удален.", "vaeRepoID": "ID репозитория VAE", "mergedModelName": "Название объединенной модели", - "checkpointModels": "Checkpoints", + "checkpointModels": "Модели Checkpoint", "allModels": "Все модели", "addDiffuserModel": "Добавить Diffusers", "repo_id": "ID репозитория", @@ -413,7 +483,7 @@ "none": "пусто", "addDifference": "Добавить разницу", "vaeRepoIDValidationMsg": "Онлайн репозиторий VAE", - "convertToDiffusersHelpText2": "Этот процесс заменит вашу запись в Model Manager на версию той же модели в Diffusers.", + "convertToDiffusersHelpText2": "Этот процесс заменит вашу запись в менеджере моделей на версию той же модели в Diffusers.", "custom": "Пользовательский", "modelTwo": "Модель 2", "mergedModelSaveLocation": "Путь сохранения", @@ -444,14 +514,27 @@ "modelUpdateFailed": "Не удалось обновить модель", "modelConversionFailed": "Не удалось сконвертировать модель", "modelsMergeFailed": "Не удалось выполнить слияние моделей", - "loraModels": "LoRAs", - "onnxModels": "Onnx", - "oliveModels": "Olives" + "loraModels": "Модели LoRA", + "onnxModels": "Модели Onnx", + "oliveModels": "Модели Olives", + "conversionNotSupported": "Преобразование не поддерживается", + "noModels": "Нет моделей", + "predictionType": "Тип прогноза (для моделей Stable Diffusion 2.x и периодических моделей Stable Diffusion 1.x)", + "quickAdd": "Быстрое добавление", + "simpleModelDesc": "Укажите путь к локальной модели Diffusers , локальной модели checkpoint / safetensors, идентификатор репозитория HuggingFace или URL-адрес модели контрольной checkpoint / diffusers.", + "advanced": "Продвинутый", + "useCustomConfig": "Использовать кастомный конфиг", + "checkpointOrSafetensors": "$t(common.checkpoint) / $t(common.safetensors)", + "closeAdvanced": "Скрыть расширенные", + "modelType": "Тип модели", + "customConfigFileLocation": "Расположение пользовательского файла конфигурации", + "vaePrecision": "Точность VAE", + "noModelSelected": "Модель не выбрана" }, "parameters": { "images": "Изображения", "steps": "Шаги", - "cfgScale": "Уровень CFG", + "cfgScale": "Шкала точности (CFG)", "width": "Ширина", "height": "Высота", "seed": "Сид", @@ -471,7 +554,7 @@ "upscaleImage": "Увеличить изображение", "scale": "Масштаб", "otherOptions": "Другие параметры", - "seamlessTiling": "Бесшовный узор", + "seamlessTiling": "Бесшовность", "hiresOptim": "Оптимизация High Res", "imageFit": "Уместить изображение", "codeformerFidelity": "Точность", @@ -504,7 +587,8 @@ "immediate": "Отменить немедленно", "schedule": "Отменить после текущей итерации", "isScheduled": "Отмена", - "setType": "Установить тип отмены" + "setType": "Установить тип отмены", + "cancel": "Отмена" }, "general": "Основное", "hiresStrength": "Сила High Res", @@ -516,8 +600,8 @@ "copyImage": "Скопировать изображение", "showPreview": "Показать предпросмотр", "noiseSettings": "Шум", - "seamlessXAxis": "Ось X", - "seamlessYAxis": "Ось Y", + "seamlessXAxis": "Горизонтальная", + "seamlessYAxis": "Вертикальная", "scheduler": "Планировщик", "boundingBoxWidth": "Ширина ограничивающей рамки", "boundingBoxHeight": "Высота ограничивающей рамки", @@ -534,7 +618,59 @@ "coherenceSteps": "Шагов", "coherencePassHeader": "Порог Coherence", "coherenceStrength": "Сила", - "compositingSettingsHeader": "Настройки компоновки" + "compositingSettingsHeader": "Настройки компоновки", + "invoke": { + "noNodesInGraph": "Нет узлов в графе", + "noModelSelected": "Модель не выбрана", + "noPrompts": "Подсказки не создаются", + "systemBusy": "Система занята", + "noInitialImageSelected": "Исходное изображение не выбрано", + "missingInputForField": "{{nodeLabel}} -> {{fieldLabel}} отсутствует ввод", + "noControlImageForControlAdapter": "Адаптер контроля #{{number}} не имеет изображения", + "noModelForControlAdapter": "Не выбрана модель адаптера контроля #{{number}}.", + "unableToInvoke": "Невозможно вызвать", + "incompatibleBaseModelForControlAdapter": "Модель контрольного адаптера №{{number}} недействительна для основной модели.", + "systemDisconnected": "Система отключена", + "missingNodeTemplate": "Отсутствует шаблон узла", + "readyToInvoke": "Готово к вызову", + "missingFieldTemplate": "Отсутствует шаблон поля", + "addingImagesTo": "Добавление изображений в", + "invoke": "Создать" + }, + "seamlessX&Y": "Бесшовный X & Y", + "isAllowedToUpscale": { + "useX2Model": "Изображение слишком велико для увеличения с помощью модели x4. Используйте модель x2", + "tooLarge": "Изображение слишком велико для увеличения. Выберите изображение меньшего размера" + }, + "aspectRatioFree": "Свободное", + "maskEdge": "Край маски", + "cpuNoise": "CPU шум", + "cfgRescaleMultiplier": "Множитель масштабирования CFG", + "cfgRescale": "Изменение масштаба CFG", + "patchmatchDownScaleSize": "уменьшить", + "gpuNoise": "GPU шум", + "seamlessX": "Бесшовный X", + "useCpuNoise": "Использовать шум CPU", + "clipSkipWithLayerCount": "CLIP пропуск {{layerCount}}", + "seamlessY": "Бесшовный Y", + "manualSeed": "Указанный сид", + "imageActions": "Действия с изображениями", + "randomSeed": "Случайный", + "iterations": "Кол-во", + "iterationsWithCount_one": "{{count}} Интеграция", + "iterationsWithCount_few": "{{count}} Итерации", + "iterationsWithCount_many": "{{count}} Итераций", + "useSize": "Использовать размер", + "unmasked": "Без маски", + "enableNoiseSettings": "Включить настройки шума", + "coherenceMode": "Режим", + "aspect": "Соотношение", + "imageSize": "Размер изображения", + "swapDimensions": "Поменять местами", + "setToOptimalSize": "Установить оптимальный для модели размер", + "setToOptimalSizeTooSmall": "$t(parameters.setToOptimalSize) (может быть слишком маленьким)", + "setToOptimalSizeTooLarge": "$t(parameters.setToOptimalSize) (может быть слишком большим)", + "lockAspectRatio": "Заблокировать соотношение" }, "settings": { "models": "Модели", @@ -543,7 +679,7 @@ "confirmOnDelete": "Подтверждать удаление", "displayHelpIcons": "Показывать значки подсказок", "enableImageDebugging": "Включить отладку", - "resetWebUI": "Сброс настроек Web UI", + "resetWebUI": "Сброс настроек веб-интерфейса", "resetWebUIDesc1": "Сброс настроек веб-интерфейса удаляет только локальный кэш браузера с вашими изображениями и настройками. Он не удаляет изображения с диска.", "resetWebUIDesc2": "Если изображения не отображаются в галерее или не работает что-то еще, пожалуйста, попробуйте сбросить настройки, прежде чем сообщать о проблеме на GitHub.", "resetComplete": "Настройки веб-интерфейса были сброшены.", @@ -563,7 +699,23 @@ "beta": "Бета", "alternateCanvasLayout": "Альтернативный слой холста", "showAdvancedOptions": "Показать доп. параметры", - "autoChangeDimensions": "Обновить Ш/В на стандартные для модели при изменении" + "autoChangeDimensions": "Обновить Ш/В на стандартные для модели при изменении", + "clearIntermediates": "Очистить промежуточные", + "clearIntermediatesDesc3": "Изображения вашей галереи не будут удалены.", + "clearIntermediatesWithCount_one": "Очистить {{count}} промежуточное", + "clearIntermediatesWithCount_few": "Очистить {{count}} промежуточных", + "clearIntermediatesWithCount_many": "Очистить {{count}} промежуточных", + "enableNSFWChecker": "Включить NSFW проверку", + "clearIntermediatesDisabled": "Очередь должна быть пуста, чтобы очистить промежуточные продукты", + "clearIntermediatesDesc2": "Промежуточные изображения — это побочные продукты генерации, отличные от результирующих изображений в галерее. Очистка промежуточных файлов освободит место на диске.", + "enableInvisibleWatermark": "Включить невидимый водяной знак", + "enableInformationalPopovers": "Включить информационные всплывающие окна", + "intermediatesCleared_one": "Очищено {{count}} промежуточное", + "intermediatesCleared_few": "Очищено {{count}} промежуточных", + "intermediatesCleared_many": "Очищено {{count}} промежуточных", + "clearIntermediatesDesc1": "Очистка промежуточных элементов приведет к сбросу состояния Canvas и ControlNet.", + "intermediatesClearedFailed": "Проблема очистки промежуточных", + "reloadingIn": "Перезагрузка через" }, "toast": { "tempFoldersEmptied": "Временная папка очищена", @@ -606,13 +758,53 @@ "nodesLoaded": "Узлы загружены", "problemCopyingImage": "Не удается скопировать изображение", "nodesLoadedFailed": "Не удалось загрузить Узлы", - "nodesCleared": "Узлы очищены", "nodesBrokenConnections": "Не удается загрузить. Некоторые соединения повреждены.", "nodesUnrecognizedTypes": "Не удается загрузить. Граф имеет нераспознанные типы", "nodesNotValidJSON": "Недопустимый JSON", "nodesCorruptedGraph": "Не удается загрузить. Граф, похоже, поврежден.", "nodesSaved": "Узлы сохранены", - "nodesNotValidGraph": "Недопустимый граф узлов InvokeAI" + "nodesNotValidGraph": "Недопустимый граф узлов InvokeAI", + "baseModelChangedCleared_one": "Базовая модель изменила, очистила или отключила {{count}} несовместимую подмодель", + "baseModelChangedCleared_few": "Базовая модель изменила, очистила или отключила {{count}} несовместимые подмодели", + "baseModelChangedCleared_many": "Базовая модель изменила, очистила или отключила {{count}} несовместимых подмоделей", + "imageSavingFailed": "Не удалось сохранить изображение", + "canvasSentControlnetAssets": "Холст отправлен в ControlNet и ресурсы", + "problemCopyingCanvasDesc": "Невозможно экспортировать базовый слой", + "loadedWithWarnings": "Рабочий процесс загружен с предупреждениями", + "setInitialImage": "Установить как исходное изображение", + "canvasCopiedClipboard": "Холст скопирован в буфер обмена", + "setControlImage": "Установить как контрольное изображение", + "setNodeField": "Установить как поле узла", + "problemSavingMask": "Проблема с сохранением маски", + "problemSavingCanvasDesc": "Невозможно экспортировать базовый слой", + "invalidUpload": "Неверная загрузка", + "maskSavedAssets": "Маска сохранена в ресурсах", + "modelAddFailed": "Не удалось добавить модель", + "problemDownloadingCanvas": "Проблема с скачиванием холста", + "setAsCanvasInitialImage": "Установить в качестве исходного изображения холста", + "problemMergingCanvas": "Проблема с объединением холста", + "setCanvasInitialImage": "Установить исходное изображение холста", + "imageUploaded": "Изображение загружено", + "addedToBoard": "Добавлено на доску", + "workflowLoaded": "Рабочий процесс загружен", + "problemDeletingWorkflow": "Проблема с удалением рабочего процесса", + "modelAddedSimple": "Модель добавлена", + "problemImportingMaskDesc": "Невозможно экспортировать маску", + "problemCopyingCanvas": "Проблема с копированием холста", + "workflowDeleted": "Рабочий процесс удален", + "problemSavingCanvas": "Проблема с сохранением холста", + "canvasDownloaded": "Холст скачан", + "setIPAdapterImage": "Установить как образ IP-адаптера", + "problemMergingCanvasDesc": "Невозможно экспортировать базовый слой", + "problemDownloadingCanvasDesc": "Невозможно экспортировать базовый слой", + "problemSavingMaskDesc": "Невозможно экспортировать маску", + "problemRetrievingWorkflow": "Проблема с получением рабочего процесса", + "imageSaved": "Изображение сохранено", + "maskSentControlnetAssets": "Маска отправлена в ControlNet и ресурсы", + "canvasSavedGallery": "Холст сохранен в галерею", + "imageUploadFailed": "Не удалось загрузить изображение", + "modelAdded": "Добавлена модель: {{modelName}}", + "problemImportingMask": "Проблема с импортом маски" }, "tooltip": { "feature": { @@ -687,7 +879,10 @@ "betaDarkenOutside": "Затемнить снаружи", "betaLimitToBox": "Ограничить выделением", "betaPreserveMasked": "Сохранять маскируемую область", - "antialiasing": "Не удалось скопировать ссылку на изображение" + "antialiasing": "Не удалось скопировать ссылку на изображение", + "saveMask": "Сохранить $t(unifiedCanvas.mask)", + "showResultsOn": "Показывать результаты (вкл)", + "showResultsOff": "Показывать результаты (вЫкл)" }, "accessibility": { "modelSelect": "Выбор модели", @@ -709,7 +904,12 @@ "useThisParameter": "Использовать этот параметр", "copyMetadataJson": "Скопировать метаданные JSON", "exitViewer": "Закрыть просмотрщик", - "menu": "Меню" + "menu": "Меню", + "showGalleryPanel": "Показать панель галереи", + "mode": "Режим", + "loadMore": "Загрузить больше", + "resetUI": "$t(accessibility.reset) интерфейс", + "createIssue": "Сообщить о проблеме" }, "ui": { "showProgressImages": "Показывать промежуточный итог", @@ -728,11 +928,213 @@ "hideLegendNodes": "Скрыть тип поля", "showMinimapnodes": "Показать миникарту", "loadWorkflow": "Загрузить рабочий процесс", - "resetWorkflowDesc2": "Сброс рабочего процесса очистит все узлы, ребра и детали рабочего процесса.", - "resetWorkflow": "Сбросить рабочий процесс", - "resetWorkflowDesc": "Вы уверены, что хотите сбросить этот рабочий процесс?", "reloadNodeTemplates": "Перезагрузить шаблоны узлов", - "downloadWorkflow": "Скачать JSON рабочего процесса" + "downloadWorkflow": "Скачать JSON рабочего процесса", + "booleanPolymorphicDescription": "Коллекция логических значений.", + "addNode": "Добавить узел", + "addLinearView": "Добавить в линейный вид", + "animatedEdges": "Анимированные ребра", + "booleanCollectionDescription": "Коллекция логических значений.", + "boardField": "Доска", + "animatedEdgesHelp": "Анимация выбранных ребер и ребер, соединенных с выбранными узлами", + "booleanPolymorphic": "Логическое полиморфное", + "boolean": "Логические значения", + "booleanDescription": "Логические значения могут быть только true или false.", + "cannotConnectInputToInput": "Невозможно подключить вход к входу", + "boardFieldDescription": "Доска галереи", + "cannotConnectOutputToOutput": "Невозможно подключить выход к выходу", + "booleanCollection": "Логическая коллекция", + "addNodeToolTip": "Добавить узел (Shift+A, Пробел)", + "scheduler": "Планировщик", + "inputField": "Поле ввода", + "controlFieldDescription": "Информация об управлении, передаваемая между узлами.", + "skippingUnknownOutputType": "Пропуск неизвестного типа выходного поля", + "denoiseMaskFieldDescription": "Маска шумоподавления может передаваться между узлами", + "floatCollectionDescription": "Коллекция чисел Float.", + "missingTemplate": "Недопустимый узел: узел {{node}} типа {{type}} не имеет шаблона (не установлен?)", + "outputSchemaNotFound": "Схема вывода не найдена", + "ipAdapterPolymorphicDescription": "Коллекция IP-адаптеров.", + "workflowDescription": "Краткое описание", + "inputFieldTypeParseError": "Невозможно разобрать тип поля ввода {{node}}.{{field}} ({{message}})", + "colorFieldDescription": "Цвет RGBA.", + "mainModelField": "Модель", + "unhandledInputProperty": "Необработанное входное свойство", + "unsupportedAnyOfLength": "слишком много элементов объединения ({{count}})", + "versionUnknown": " Версия неизвестна", + "ipAdapterCollection": "Коллекция IP-адаптеров", + "conditioningCollection": "Коллекция условий", + "maybeIncompatible": "Может быть несовместимо с установленным", + "unsupportedArrayItemType": "неподдерживаемый тип элемента массива \"{{type}}\"", + "ipAdapterPolymorphic": "Полиморфный IP-адаптер", + "noNodeSelected": "Узел не выбран", + "unableToValidateWorkflow": "Невозможно проверить рабочий процесс", + "enum": "Перечисления", + "updateAllNodes": "Обновить узлы", + "integerPolymorphicDescription": "Коллекция целых чисел.", + "noOutputRecorded": "Выходы не зарегистрированы", + "updateApp": "Обновить приложение", + "conditioningCollectionDescription": "Условные обозначения могут передаваться между узлами.", + "colorPolymorphic": "Полиморфный цвет", + "colorCodeEdgesHelp": "Цветовая маркировка ребер в соответствии с их связанными полями", + "float": "Float", + "workflowContact": "Контакт", + "targetNodeFieldDoesNotExist": "Неверный край: целевое/вводное поле {{node}}.{{field}} не существует", + "skippingReservedFieldType": "Пропуск зарезервированного типа поля", + "unsupportedMismatchedUnion": "несовпадение типа CollectionOrScalar с базовыми типами {{firstType}} и {{secondType}}", + "sDXLMainModelFieldDescription": "Поле модели SDXL.", + "allNodesUpdated": "Все узлы обновлены", + "conditioningPolymorphic": "Полиморфные условия", + "integer": "Целое число", + "colorField": "Цвет", + "nodeTemplate": "Шаблон узла", + "problemReadingWorkflow": "Проблема с чтением рабочего процесса из изображения", + "sourceNode": "Исходный узел", + "nodeOpacity": "Непрозрачность узла", + "sourceNodeDoesNotExist": "Недопустимое ребро: исходный/выходной узел {{node}} не существует", + "pickOne": "Выбери один", + "integerDescription": "Целые числа — это числа без запятой или точки.", + "outputField": "Поле вывода", + "unableToLoadWorkflow": "Невозможно загрузить рабочий процесс", + "unableToExtractEnumOptions": "невозможно извлечь параметры перечисления", + "snapToGrid": "Привязка к сетке", + "stringPolymorphic": "Полиморфная строка", + "conditioningPolymorphicDescription": "Условие может быть передано между узлами.", + "noFieldsLinearview": "Нет полей, добавленных в линейный вид", + "skipped": "Пропущено", + "unableToParseFieldType": "невозможно проанализировать тип поля", + "imagePolymorphic": "Полиморфное изображение", + "nodeSearch": "Поиск узлов", + "updateNode": "Обновить узел", + "imagePolymorphicDescription": "Коллекция изображений.", + "floatPolymorphic": "Полиморфные Float", + "outputFieldInInput": "Поле вывода во входных данных", + "version": "Версия", + "doesNotExist": "не найдено", + "unrecognizedWorkflowVersion": "Неизвестная версия схемы рабочего процесса {{version}}", + "ipAdapterCollectionDescription": "Коллекция IP-адаптеров.", + "stringCollectionDescription": "Коллекция строк.", + "unableToParseNode": "Невозможно разобрать узел", + "controlCollection": "Контрольная коллекция", + "validateConnections": "Проверка соединений и графика", + "stringCollection": "Коллекция строк", + "inputMayOnlyHaveOneConnection": "Вход может иметь только одно соединение", + "notes": "Заметки", + "outputFieldTypeParseError": "Невозможно разобрать тип поля вывода {{node}}.{{field}} ({{message}})", + "uNetField": "UNet", + "nodeOutputs": "Выходы узла", + "currentImageDescription": "Отображает текущее изображение в редакторе узлов", + "validateConnectionsHelp": "Предотвратить создание недопустимых соединений и вызов недопустимых графиков", + "problemSettingTitle": "Проблема с настройкой названия", + "ipAdapter": "IP-адаптер", + "integerCollection": "Коллекция целых чисел", + "collectionItem": "Элемент коллекции", + "noConnectionInProgress": "Соединение не выполняется", + "vaeModelField": "VAE", + "controlCollectionDescription": "Информация об управлении, передаваемая между узлами.", + "skippedReservedInput": "Пропущено зарезервированное поле ввода", + "workflowVersion": "Версия", + "noConnectionData": "Нет данных о соединении", + "outputFields": "Поля вывода", + "fieldTypesMustMatch": "Типы полей должны совпадать", + "workflow": "Рабочий процесс", + "edge": "Край", + "inputNode": "Входной узел", + "enumDescription": "Перечисления - это значения, которые могут быть одним из нескольких вариантов.", + "unkownInvocation": "Неизвестный тип вызова", + "sourceNodeFieldDoesNotExist": "Неверный край: поле источника/вывода {{node}}.{{field}} не существует", + "imageField": "Изображение", + "skippedReservedOutput": "Пропущено зарезервированное поле вывода", + "cannotDuplicateConnection": "Невозможно создать дубликаты соединений", + "unknownTemplate": "Неизвестный шаблон", + "noWorkflow": "Нет рабочего процесса", + "removeLinearView": "Удалить из линейного вида", + "integerCollectionDescription": "Коллекция целых чисел.", + "colorPolymorphicDescription": "Коллекция цветов.", + "sDXLMainModelField": "Модель SDXL", + "workflowTags": "Теги", + "denoiseMaskField": "Маска шумоподавления", + "missingCanvaInitImage": "Отсутствует начальное изображение холста", + "conditioningFieldDescription": "Условие может быть передано между узлами.", + "clipFieldDescription": "Подмодели Tokenizer и text_encoder.", + "fullyContainNodesHelp": "Чтобы узлы были выбраны, они должны полностью находиться в поле выбора", + "unableToGetWorkflowVersion": "Не удалось получить версию схемы рабочего процесса", + "noImageFoundState": "Начальное изображение не найдено в состоянии", + "workflowValidation": "Ошибка проверки рабочего процесса", + "nodePack": "Пакет узлов", + "stringDescription": "Строки это просто текст.", + "nodeType": "Тип узла", + "noMatchingNodes": "Нет соответствующих узлов", + "fullyContainNodes": "Выбор узлов с полным содержанием", + "integerPolymorphic": "Целочисленные полиморфные", + "executionStateInProgress": "В процессе", + "unableToExtractSchemaNameFromRef": "невозможно извлечь имя схемы из ссылки", + "noFieldType": "Нет типа поля", + "colorCollection": "Коллекция цветов.", + "executionStateError": "Ошибка", + "noOutputSchemaName": "В объекте ref не найдено имя выходной схемы", + "ipAdapterModel": "Модель IP-адаптера", + "prototypeDesc": "Этот вызов является прототипом. Он может претерпевать изменения при обновлении приложения и может быть удален в любой момент.", + "unableToMigrateWorkflow": "Невозможно перенести рабочий процесс", + "skippingInputNoTemplate": "Пропуск поля ввода без шаблона", + "ipAdapterDescription": "Image Prompt Adapter (IP-адаптер).", + "missingCanvaInitMaskImages": "Отсутствуют начальные изображения холста и маски", + "problemReadingMetadata": "Проблема с чтением метаданных с изображения", + "unknownOutput": "Неизвестный вывод: {{name}}", + "stringPolymorphicDescription": "Коллекция строк.", + "oNNXModelField": "Модель ONNX", + "executionStateCompleted": "Выполнено", + "node": "Узел", + "skippingUnknownInputType": "Пропуск неизвестного типа поля", + "workflowAuthor": "Автор", + "currentImage": "Текущее изображение", + "controlField": "Контроль", + "workflowName": "Название", + "collection": "Коллекция", + "ipAdapterModelDescription": "Поле модели IP-адаптера", + "invalidOutputSchema": "Неверная схема вывода", + "unableToUpdateNode": "Невозможно обновить узел", + "floatDescription": "Float - это числа с запятой.", + "floatPolymorphicDescription": "Коллекция Float-ов.", + "vaeField": "VAE", + "conditioningField": "Обусловленность", + "unknownErrorValidatingWorkflow": "Неизвестная ошибка при проверке рабочего процесса", + "collectionFieldType": "Коллекция {{name}}", + "unhandledOutputProperty": "Необработанное выходное свойство", + "workflowNotes": "Примечания", + "string": "Строка", + "floatCollection": "Коллекция Float", + "unknownNodeType": "Неизвестный тип узла", + "unableToUpdateNodes_one": "Невозможно обновить {{count}} узел", + "unableToUpdateNodes_few": "Невозможно обновить {{count}} узла", + "unableToUpdateNodes_many": "Невозможно обновить {{count}} узлов", + "connectionWouldCreateCycle": "Соединение создаст цикл", + "cannotConnectToSelf": "Невозможно подключиться к самому себе", + "notesDescription": "Добавляйте заметки о своем рабочем процессе", + "unknownField": "Неизвестное поле", + "inputFields": "Поля ввода", + "colorCodeEdges": "Ребра с цветовой кодировкой", + "uNetFieldDescription": "Подмодель UNet.", + "unknownNode": "Неизвестный узел", + "targetNodeDoesNotExist": "Недопустимое ребро: целевой/входной узел {{node}} не существует", + "imageCollectionDescription": "Коллекция изображений.", + "mismatchedVersion": "Недопустимый узел: узел {{node}} типа {{type}} имеет несоответствующую версию (попробовать обновить?)", + "unknownFieldType": "$t(nodes.unknownField) тип: {{type}}", + "vaeFieldDescription": "Подмодель VAE.", + "imageFieldDescription": "Изображения могут передаваться между узлами.", + "outputNode": "Выходной узел", + "collectionOrScalarFieldType": "Коллекция | Скаляр {{name}}", + "betaDesc": "Этот вызов находится в бета-версии. Пока он не станет стабильным, в нем могут происходить изменения при обновлении приложений. Мы планируем поддерживать этот вызов в течение длительного времени.", + "nodeVersion": "Версия узла", + "loadingNodes": "Загрузка узлов...", + "snapToGridHelp": "Привязка узлов к сетке при перемещении", + "workflowSettings": "Настройки редактора рабочих процессов", + "sDXLRefinerModelField": "Модель перерисовщик", + "loRAModelField": "LoRA", + "deletedInvalidEdge": "Удалено недопустимое ребро {{source}} -> {{target}}", + "unableToParseEdge": "Невозможно разобрать край", + "unknownInput": "Неизвестный вход: {{name}}", + "oNNXModelFieldDescription": "Поле модели ONNX.", + "imageCollection": "Коллекция изображений" }, "controlnet": { "amult": "a_mult", @@ -756,7 +1158,65 @@ "autoConfigure": "Автонастройка процессора", "delete": "Удалить", "canny": "Canny", - "depthZoeDescription": "Генерация карты глубины с использованием Zoe" + "depthZoeDescription": "Генерация карты глубины с использованием Zoe", + "resize": "Изменить размер", + "showAdvanced": "Показать расширенные", + "addT2IAdapter": "Добавить $t(common.t2iAdapter)", + "importImageFromCanvas": "Импортировать изображение с холста", + "lineartDescription": "Конвертация изображения в контурный рисунок", + "normalBae": "Обычный BAE", + "importMaskFromCanvas": "Импортировать маску с холста", + "hideAdvanced": "Скрыть расширенные", + "controlNetEnabledT2IDisabled": "$t(common.controlNet) включен, $t(common.t2iAdapter)s отключен", + "ipAdapterModel": "Модель адаптера", + "resetControlImage": "Сбросить контрольное изображение", + "prompt": "Запрос", + "controlnet": "$t(controlnet.controlAdapter_one) №{{number}} $t(common.controlNet)", + "openPoseDescription": "Оценка позы человека с помощью Openpose", + "resizeMode": "Режим изменения размера", + "t2iEnabledControlNetDisabled": "$t(common.t2iAdapter) включен, $t(common.controlNet)s отключен", + "weight": "Вес", + "selectModel": "Выберите модель", + "w": "В", + "processor": "Процессор", + "addControlNet": "Добавить $t(common.controlNet)", + "none": "ничего", + "controlNetT2IMutexDesc": "$t(common.controlNet) и $t(common.t2iAdapter) одновременно в настоящее время не поддерживаются.", + "ip_adapter": "$t(controlnet.controlAdapter_one) №{{number}} $t(common.ipAdapter)", + "pidiDescription": "PIDI-обработка изображений", + "mediapipeFace": "Лицо Mediapipe", + "fill": "Заполнить", + "addIPAdapter": "Добавить $t(common.ipAdapter)", + "lineart": "Контурный рисунок", + "colorMapDescription": "Создает карту цветов из изображения", + "lineartAnimeDescription": "Создание контурных рисунков в стиле аниме", + "t2i_adapter": "$t(controlnet.controlAdapter_one) №{{number}} $t(common.t2iAdapter)", + "minConfidence": "Минимальная уверенность", + "imageResolution": "Разрешение изображения", + "colorMap": "Цвет", + "lowThreshold": "Низкий порог", + "highThreshold": "Высокий порог", + "normalBaeDescription": "Обычная обработка BAE", + "noneDescription": "Обработка не применяется", + "saveControlImage": "Сохранить контрольное изображение", + "toggleControlNet": "Переключить эту ControlNet", + "controlAdapter_one": "Адаптер контроля", + "controlAdapter_few": "Адаптера контроля", + "controlAdapter_many": "Адаптеров контроля", + "safe": "Безопасный", + "colorMapTileSize": "Размер плитки", + "lineartAnime": "Контурный рисунок в стиле аниме", + "ipAdapterImageFallback": "Изображение IP Adapter не выбрано", + "mediapipeFaceDescription": "Обнаружение лиц с помощью Mediapipe", + "hedDescription": "Целостное обнаружение границ", + "setControlImageDimensions": "Установите размеры контрольного изображения на Ш/В", + "scribble": "каракули", + "resetIPAdapterImage": "Сбросить изображение IP Adapter", + "handAndFace": "Руки и Лицо", + "enableIPAdapter": "Включить IP Adapter", + "maxFaces": "Макс Лица", + "mlsdDescription": "Минималистичный детектор отрезков линии", + "resizeSimple": "Изменить размер (простой)" }, "boards": { "autoAddBoard": "Авто добавление Доски", @@ -773,6 +1233,472 @@ "uncategorized": "Без категории", "changeBoard": "Изменить Доску", "loading": "Загрузка...", - "clearSearch": "Очистить поиск" + "clearSearch": "Очистить поиск", + "deleteBoardOnly": "Удалить только доску", + "movingImagesToBoard_one": "Перемещаем {{count}} изображение на доску:", + "movingImagesToBoard_few": "Перемещаем {{count}} изображения на доску:", + "movingImagesToBoard_many": "Перемещаем {{count}} изображений на доску:", + "downloadBoard": "Скачать доску", + "deleteBoard": "Удалить доску", + "deleteBoardAndImages": "Удалить доску и изображения", + "deletedBoardsCannotbeRestored": "Удаленные доски не подлежат восстановлению" + }, + "dynamicPrompts": { + "seedBehaviour": { + "perPromptDesc": "Используйте разные сиды для каждого изображения", + "perIterationLabel": "Сид на итерацию", + "perIterationDesc": "Используйте разные сиды для каждой итерации", + "perPromptLabel": "Сид для каждого изображения", + "label": "Поведение сида" + }, + "enableDynamicPrompts": "Динамические запросы", + "combinatorial": "Комбинаторная генерация", + "maxPrompts": "Максимум запросов", + "promptsPreview": "Предпросмотр запросов", + "promptsWithCount_one": "{{count}} Запрос", + "promptsWithCount_few": "{{count}} Запроса", + "promptsWithCount_many": "{{count}} Запросов", + "dynamicPrompts": "Динамические запросы", + "loading": "Создание динамических запросов...", + "showDynamicPrompts": "Показать динамические запросы" + }, + "popovers": { + "noiseUseCPU": { + "paragraphs": [ + "Определяет, генерируется ли шум на CPU или на GPU.", + "Если включен шум CPU, определенное начальное число будет создавать одно и то же изображение на любом компьютере.", + "Включение шума CPU не влияет на производительность." + ], + "heading": "Использовать шум CPU" + }, + "paramScheduler": { + "paragraphs": [ + "Планировщик определяет, как итеративно добавлять шум к изображению или как обновлять образец на основе выходных данных модели." + ], + "heading": "Планировщик" + }, + "scaleBeforeProcessing": { + "paragraphs": [ + "Масштабирует выбранную область до размера, наиболее подходящего для модели перед процессом создания изображения." + ], + "heading": "Масштабирование перед обработкой" + }, + "compositingMaskAdjustments": { + "heading": "Регулировка маски", + "paragraphs": [ + "Отрегулируйте маску." + ] + }, + "paramRatio": { + "heading": "Соотношение сторон", + "paragraphs": [ + "Соотношение сторон создаваемого изображения.", + "Размер изображения (в пикселях), эквивалентный 512x512, рекомендуется для моделей SD1.5, а размер, эквивалентный 1024x1024, рекомендуется для моделей SDXL." + ] + }, + "compositingCoherenceSteps": { + "heading": "Шаги", + "paragraphs": [ + null, + "То же, что и основной параметр «Шаги»." + ] + }, + "dynamicPrompts": { + "paragraphs": [ + "Динамические запросы превращают одно приглашение на множество.", + "Базовый синтакиси: \"a {red|green|blue} ball\". В итоге будет 3 запроса: \"a red ball\", \"a green ball\" и \"a blue ball\".", + "Вы можете использовать синтаксис столько раз, сколько захотите в одном запросе, но обязательно контролируйте количество генерируемых запросов с помощью параметра «Максимальное количество запросов»." + ], + "heading": "Динамические запросы" + }, + "paramVAE": { + "paragraphs": [ + "Модель, используемая для преобразования вывода AI в конечное изображение." + ], + "heading": "VAE" + }, + "compositingBlur": { + "heading": "Размытие", + "paragraphs": [ + "Радиус размытия маски." + ] + }, + "paramIterations": { + "paragraphs": [ + "Количество изображений, которые нужно сгенерировать.", + "Если динамические подсказки включены, каждое из подсказок будет генерироваться столько раз." + ], + "heading": "Итерации" + }, + "paramVAEPrecision": { + "heading": "Точность VAE", + "paragraphs": [ + "Точность, используемая во время кодирования и декодирования VAE. Точность FP16/половина более эффективна за счет незначительных изменений изображения." + ] + }, + "compositingCoherenceMode": { + "heading": "Режим" + }, + "paramSeed": { + "paragraphs": [ + "Управляет стартовым шумом, используемым для генерации.", + "Отключите «Случайное начальное число», чтобы получить идентичные результаты с теми же настройками генерации." + ], + "heading": "Сид" + }, + "controlNetResizeMode": { + "heading": "Режим изменения размера", + "paragraphs": [ + "Как изображение ControlNet будет соответствовать размеру выходного изображения." + ] + }, + "controlNetBeginEnd": { + "paragraphs": [ + "На каких этапах процесса шумоподавления будет применена ControlNet.", + "ControlNet, применяемые в начале процесса, направляют композицию, а ControlNet, применяемые в конце, направляют детали." + ], + "heading": "Процент начала/конца шага" + }, + "dynamicPromptsSeedBehaviour": { + "paragraphs": [ + "Управляет использованием сида при создании запросов.", + "Для каждой итерации будет использоваться уникальный сид. Используйте это, чтобы изучить варианты запросов для одного сида.", + "Например, если у вас 5 запросов, каждое изображение будет использовать один и то же сид.", + "для каждого изображения будет использоваться уникальный сид. Это обеспечивает большую вариативность." + ], + "heading": "Поведение сида" + }, + "clipSkip": { + "paragraphs": [ + "Выберите, сколько слоев модели CLIP нужно пропустить.", + "Некоторые модели работают лучше с определенными настройками пропуска CLIP.", + "Более высокое значение обычно приводит к менее детализированному изображению." + ], + "heading": "CLIP пропуск" + }, + "paramModel": { + "heading": "Модель", + "paragraphs": [ + "Модель, используемая для шагов шумоподавления.", + "Различные модели обычно обучаются, чтобы специализироваться на достижении определенных эстетических результатов и содержания." + ] + }, + "compositingCoherencePass": { + "heading": "Согласованность", + "paragraphs": [ + "Второй этап шумоподавления помогает исправить шов между изначальным изображением и перерисованной или расширенной частью." + ] + }, + "paramDenoisingStrength": { + "paragraphs": [ + "Количество шума, добавляемого к входному изображению.", + "0 приведет к идентичному изображению, а 1 - к совершенно новому." + ], + "heading": "Шумоподавление" + }, + "compositingStrength": { + "heading": "Сила", + "paragraphs": [ + null, + "То же, что параметр «Сила шумоподавления img2img»." + ] + }, + "paramNegativeConditioning": { + "paragraphs": [ + "Stable Diffusion пытается избежать указанных в отрицательном запросе концепций. Используйте это, чтобы исключить качества или объекты из вывода.", + "Поддерживает синтаксис Compel и встраивания." + ], + "heading": "Негативный запрос" + }, + "compositingBlurMethod": { + "heading": "Метод размытия", + "paragraphs": [ + "Метод размытия, примененный к замаскированной области." + ] + }, + "dynamicPromptsMaxPrompts": { + "heading": "Макс. запросы", + "paragraphs": [ + "Ограничивает количество запросов, которые могут быть созданы с помощью динамических запросов." + ] + }, + "paramCFGRescaleMultiplier": { + "heading": "Множитель масштабирования CFG", + "paragraphs": [ + "Множитель масштабирования CFG, используемый для моделей, обученных с использованием нулевого терминального SNR (ztsnr). Рекомендуемое значение 0,7." + ] + }, + "infillMethod": { + "paragraphs": [ + "Метод заполнения выбранной области." + ], + "heading": "Метод заполнения" + }, + "controlNetWeight": { + "heading": "Вес", + "paragraphs": [ + "Насколько сильно ControlNet повлияет на созданное изображение." + ] + }, + "controlNet": { + "heading": "ControlNet", + "paragraphs": [ + "Сети ControlNets обеспечивают руководство процессом генерации, помогая создавать изображения с контролируемой композицией, структурой или стилем, в зависимости от выбранной модели." + ] + }, + "paramCFGScale": { + "heading": "Шкала точности (CFG)", + "paragraphs": [ + "Контролирует, насколько ваш запрос влияет на процесс генерации." + ] + }, + "controlNetControlMode": { + "paragraphs": [ + "Придает больший вес либо запросу, либо ControlNet." + ], + "heading": "Режим управления" + }, + "paramSteps": { + "heading": "Шаги", + "paragraphs": [ + "Количество шагов, которые будут выполнены в ходе генерации.", + "Большее количество шагов обычно приводит к созданию более качественных изображений, но требует больше времени на создание." + ] + }, + "paramPositiveConditioning": { + "heading": "Запрос", + "paragraphs": [ + "Направляет процесс генерации. Вы можете использовать любые слова и фразы.", + "Большинство моделей Stable Diffusion работают только с запросом на английском языке, но бывают исключения." + ] + }, + "lora": { + "heading": "Вес LoRA", + "paragraphs": [ + "Более высокий вес LoRA приведет к большему влиянию на конечное изображение." + ] + } + }, + "metadata": { + "seamless": "Бесшовность", + "positivePrompt": "Запрос", + "negativePrompt": "Негативный запрос", + "generationMode": "Режим генерации", + "Threshold": "Шумовой порог", + "metadata": "Метаданные", + "strength": "Сила img2img", + "seed": "Сид", + "imageDetails": "Детали изображения", + "perlin": "Шум Перлига", + "model": "Модель", + "noImageDetails": "Детали изображения не найдены", + "hiresFix": "Оптимизация высокого разрешения", + "cfgScale": "Шкала точности", + "fit": "Соответствие изображения к изображению", + "initImage": "Исходное изображение", + "recallParameters": "Вызов параметров", + "height": "Высота", + "variations": "Пары сид-высота", + "noMetaData": "Метаданные не найдены", + "width": "Ширина", + "vae": "VAE", + "createdBy": "Сделано", + "workflow": "Рабочий процесс", + "steps": "Шаги", + "scheduler": "Планировщик", + "noRecallParameters": "Параметры для вызова не найдены", + "cfgRescaleMultiplier": "$t(parameters.cfgRescaleMultiplier)" + }, + "queue": { + "status": "Статус", + "pruneSucceeded": "Из очереди удалено {{item_count}} выполненных элементов", + "cancelTooltip": "Отменить текущий элемент", + "queueEmpty": "Очередь пуста", + "pauseSucceeded": "Рендеринг приостановлен", + "in_progress": "В процессе", + "queueFront": "Добавить в начало очереди", + "notReady": "Невозможно поставить в очередь", + "batchFailedToQueue": "Не удалось поставить пакет в очередь", + "completed": "Выполнено", + "queueBack": "Добавить в очередь", + "batchValues": "Пакетные значения", + "cancelFailed": "Проблема с отменой элемента", + "queueCountPrediction": "{{promptsCount}} запросов × {{iterations}} изображений -> {{count}} генераций", + "batchQueued": "Пакетная очередь", + "pauseFailed": "Проблема с приостановкой рендеринга", + "clearFailed": "Проблема с очисткой очереди", + "queuedCount": "{{pending}} Ожидание", + "front": "передний", + "clearSucceeded": "Очередь очищена", + "pause": "Пауза", + "pruneTooltip": "Удалить {{item_count}} выполненных задач", + "cancelSucceeded": "Элемент отменен", + "batchQueuedDesc_one": "Добавлен {{count}} сеанс в {{direction}} очереди", + "batchQueuedDesc_few": "Добавлено {{count}} сеанса в {{direction}} очереди", + "batchQueuedDesc_many": "Добавлено {{count}} сеансов в {{direction}} очереди", + "graphQueued": "График поставлен в очередь", + "queue": "Очередь", + "batch": "Пакет", + "clearQueueAlertDialog": "Очистка очереди немедленно отменяет все элементы обработки и полностью очищает очередь.", + "pending": "В ожидании", + "completedIn": "Завершено за", + "resumeFailed": "Проблема с возобновлением рендеринга", + "clear": "Очистить", + "prune": "Сократить", + "total": "Всего", + "canceled": "Отменено", + "pruneFailed": "Проблема с сокращением очереди", + "cancelBatchSucceeded": "Пакет отменен", + "clearTooltip": "Отменить все и очистить очередь", + "current": "Текущий", + "pauseTooltip": "Приостановить рендеринг", + "failed": "Неудачно", + "cancelItem": "Отменить элемент", + "next": "Следующий", + "cancelBatch": "Отменить пакет", + "back": "задний", + "batchFieldValues": "Пакетные значения полей", + "cancel": "Отмена", + "session": "Сессия", + "time": "Время", + "queueTotal": "{{total}} Всего", + "resumeSucceeded": "Рендеринг возобновлен", + "enqueueing": "Пакетная очередь", + "resumeTooltip": "Возобновить рендеринг", + "queueMaxExceeded": "Превышено максимальное значение {{max_queue_size}}, будет пропущен {{skip}}", + "resume": "Продолжить", + "cancelBatchFailed": "Проблема с отменой пакета", + "clearQueueAlertDialog2": "Вы уверены, что хотите очистить очередь?", + "item": "Элемент", + "graphFailedToQueue": "Не удалось поставить график в очередь", + "openQueue": "Открыть очередь" + }, + "sdxl": { + "refinerStart": "Запуск перерисовщика", + "selectAModel": "Выберите модель", + "scheduler": "Планировщик", + "cfgScale": "Шкала точности (CFG)", + "negStylePrompt": "Негативный запрос стиля", + "noModelsAvailable": "Нет доступных моделей", + "refiner": "Перерисовщик", + "negAestheticScore": "Отрицательная эстетическая оценка", + "useRefiner": "Использовать перерисовщик", + "denoisingStrength": "Шумоподавление", + "refinermodel": "Модель перерисовщик", + "posAestheticScore": "Положительная эстетическая оценка", + "concatPromptStyle": "Объединение запроса и стиля", + "loading": "Загрузка...", + "steps": "Шаги", + "posStylePrompt": "Запрос стиля" + }, + "invocationCache": { + "useCache": "Использовать кэш", + "disable": "Отключить", + "misses": "Промахи в кэше", + "enableFailed": "Проблема с включением кэша вызовов", + "invocationCache": "Кэш вызовов", + "clearSucceeded": "Кэш вызовов очищен", + "enableSucceeded": "Кэш вызовов включен", + "clearFailed": "Проблема с очисткой кэша вызовов", + "hits": "Попадания в кэш", + "disableSucceeded": "Кэш вызовов отключен", + "disableFailed": "Проблема с отключением кэша вызовов", + "enable": "Включить", + "clear": "Очистить", + "maxCacheSize": "Максимальный размер кэша", + "cacheSize": "Размер кэша" + }, + "workflows": { + "saveWorkflowAs": "Сохранить рабочий процесс как", + "workflowEditorMenu": "Меню редактора рабочего процесса", + "noSystemWorkflows": "Нет системных рабочих процессов", + "workflowName": "Имя рабочего процесса", + "noUserWorkflows": "Нет пользовательских рабочих процессов", + "defaultWorkflows": "Рабочие процессы по умолчанию", + "saveWorkflow": "Сохранить рабочий процесс", + "openWorkflow": "Открытый рабочий процесс", + "clearWorkflowSearchFilter": "Очистить фильтр поиска рабочих процессов", + "workflowLibrary": "Библиотека", + "downloadWorkflow": "Скачать рабочий процесс", + "noRecentWorkflows": "Нет недавних рабочих процессов", + "workflowSaved": "Рабочий процесс сохранен", + "workflowIsOpen": "Рабочий процесс открыт", + "unnamedWorkflow": "Безымянный рабочий процесс", + "savingWorkflow": "Сохранение рабочего процесса...", + "problemLoading": "Проблема с загрузкой рабочих процессов", + "loading": "Загрузка рабочих процессов", + "searchWorkflows": "Поиск рабочих процессов", + "problemSavingWorkflow": "Проблема с сохранением рабочего процесса", + "deleteWorkflow": "Удалить рабочий процесс", + "workflows": "Рабочие процессы", + "noDescription": "Без описания", + "uploadWorkflow": "Загрузить рабочий процесс", + "userWorkflows": "Мои рабочие процессы", + "newWorkflowCreated": "Создан новый рабочий процесс" + }, + "embedding": { + "noEmbeddingsLoaded": "встраивания не загружены", + "noMatchingEmbedding": "Нет подходящих встраиваний", + "addEmbedding": "Добавить встраивание", + "incompatibleModel": "Несовместимая базовая модель:" + }, + "hrf": { + "enableHrf": "Включить исправление высокого разрешения", + "upscaleMethod": "Метод увеличения", + "enableHrfTooltip": "Сгенерируйте с более низким начальным разрешением, увеличьте его до базового разрешения, а затем запустите Image-to-Image.", + "metadata": { + "strength": "Сила исправления высокого разрешения", + "enabled": "Исправление высокого разрешения включено", + "method": "Метод исправления высокого разрешения" + }, + "hrf": "Исправление высокого разрешения", + "hrfStrength": "Сила исправления высокого разрешения", + "strengthTooltip": "Более низкие значения приводят к меньшему количеству деталей, что может уменьшить потенциальные артефакты." + }, + "models": { + "noLoRAsLoaded": "LoRA не загружены", + "noMatchingModels": "Нет подходящих моделей", + "esrganModel": "Модель ESRGAN", + "loading": "загрузка", + "noMatchingLoRAs": "Нет подходящих LoRA", + "noLoRAsAvailable": "Нет доступных LoRA", + "noModelsAvailable": "Нет доступных моделей", + "addLora": "Добавить LoRA", + "selectModel": "Выберите модель", + "noRefinerModelsInstalled": "Модели SDXL Refiner не установлены", + "noLoRAsInstalled": "Нет установленных LoRA", + "selectLoRA": "Выберите LoRA", + "noMainModelSelected": "Базовая модель не выбрана", + "lora": "LoRA", + "allLoRAsAdded": "Все LoRA добавлены", + "defaultVAE": "Стандартное VAE", + "incompatibleBaseModel": "Несовместимая базовая модель", + "loraAlreadyAdded": "LoRA уже добавлена" + }, + "app": { + "storeNotInitialized": "Магазин не инициализирован" + }, + "accordions": { + "compositing": { + "infillTab": "Заполнение", + "coherenceTab": "Согласованность", + "title": "Композиция" + }, + "control": { + "controlAdaptersTab": "Адаптеры контроля", + "ipTab": "Запросы изображений", + "title": "Контроль" + }, + "generation": { + "title": "Генерация", + "conceptsTab": "Концепты", + "modelTab": "Модель" + }, + "advanced": { + "title": "Расширенные" + }, + "image": { + "title": "Изображение" + } } } diff --git a/invokeai/frontend/web/public/locales/sv.json b/invokeai/frontend/web/public/locales/sv.json index eef46c4513..ac2c3661e6 100644 --- a/invokeai/frontend/web/public/locales/sv.json +++ b/invokeai/frontend/web/public/locales/sv.json @@ -129,10 +129,6 @@ "title": "Växla inställningar", "desc": "Öppna och stäng alternativpanelen" }, - "toggleViewer": { - "title": "Växla visaren", - "desc": "Öppna och stäng bildvisaren" - }, "toggleGallery": { "title": "Växla galleri", "desc": "Öppna eller stäng galleribyrån" @@ -193,10 +189,6 @@ "title": "Nästa bild", "desc": "Visa nästa bild" }, - "toggleGalleryPin": { - "title": "Växla gallerinål", - "desc": "Nålar fast eller nålar av galleriet i gränssnittet" - }, "increaseGalleryThumbSize": { "title": "Förstora galleriets bildstorlek", "desc": "Förstora miniatyrbildernas storlek" diff --git a/invokeai/frontend/web/public/locales/uk.json b/invokeai/frontend/web/public/locales/uk.json index a85faee727..92f6a88282 100644 --- a/invokeai/frontend/web/public/locales/uk.json +++ b/invokeai/frontend/web/public/locales/uk.json @@ -111,10 +111,6 @@ "title": "Закріпити параметри", "desc": "Закріпити панель параметрів" }, - "toggleViewer": { - "title": "Показати перегляд", - "desc": "Відкривати і закривати переглядач зображень" - }, "toggleGallery": { "title": "Показати галерею", "desc": "Відкривати і закривати скриньку галереї" @@ -175,10 +171,6 @@ "title": "Наступне зображення", "desc": "Відображення наступного зображення в галереї" }, - "toggleGalleryPin": { - "title": "Закріпити галерею", - "desc": "Закріплює і відкріплює галерею" - }, "increaseGalleryThumbSize": { "title": "Збільшити розмір мініатюр галереї", "desc": "Збільшує розмір мініатюр галереї" diff --git a/invokeai/frontend/web/public/locales/zh_CN.json b/invokeai/frontend/web/public/locales/zh_CN.json index 40d4630861..746f859668 100644 --- a/invokeai/frontend/web/public/locales/zh_CN.json +++ b/invokeai/frontend/web/public/locales/zh_CN.json @@ -109,7 +109,23 @@ "somethingWentWrong": "出了点问题", "copyError": "$t(gallery.copy) 错误", "input": "输入", - "notInstalled": "非 $t(common.installed)" + "notInstalled": "非 $t(common.installed)", + "delete": "删除", + "updated": "已上传", + "save": "保存", + "created": "已创建", + "prevPage": "上一页", + "unknownError": "未知错误", + "direction": "指向", + "orderBy": "排序方式:", + "nextPage": "下一页", + "saveAs": "保存为", + "unsaved": "未保存", + "ai": "ai", + "preferencesLabel": "首选项", + "or": "或", + "advancedOptions": "高级选项", + "free": "自由" }, "gallery": { "generations": "生成的图像", @@ -145,21 +161,25 @@ "image": "图像", "drop": "弃用", "dropOrUpload": "$t(gallery.drop) 或上传", - "dropToUpload": "$t(gallery.drop) 以上传" + "dropToUpload": "$t(gallery.drop) 以上传", + "problemDeletingImagesDesc": "有一张或多张图像无法被删除", + "problemDeletingImages": "删除图像时出现问题", + "unstarImage": "取消收藏图像", + "starImage": "收藏图像" }, "hotkeys": { - "keyboardShortcuts": "键盘快捷键", - "appHotkeys": "应用快捷键", - "generalHotkeys": "一般快捷键", - "galleryHotkeys": "图库快捷键", - "unifiedCanvasHotkeys": "统一画布快捷键", + "keyboardShortcuts": "快捷键", + "appHotkeys": "应用", + "generalHotkeys": "一般", + "galleryHotkeys": "图库", + "unifiedCanvasHotkeys": "统一画布", "invoke": { "title": "Invoke", "desc": "生成图像" }, "cancel": { "title": "取消", - "desc": "取消图像生成" + "desc": "取消当前队列项目" }, "focusPrompt": { "title": "打开提示词框", @@ -173,10 +193,6 @@ "title": "常开选项卡", "desc": "保持选项浮窗常开" }, - "toggleViewer": { - "title": "切换图像查看器", - "desc": "打开或关闭图像查看器" - }, "toggleGallery": { "title": "切换图库", "desc": "打开或关闭图库" @@ -237,10 +253,6 @@ "title": "下一张图像", "desc": "显示图库中的下一张图像" }, - "toggleGalleryPin": { - "title": "切换图库常开", - "desc": "开关图库在界面中的常开模式" - }, "increaseGalleryThumbSize": { "title": "增大预览尺寸", "desc": "增大图库中预览的尺寸" @@ -353,11 +365,26 @@ "title": "接受暂存图像", "desc": "接受当前暂存区中的图像" }, - "nodesHotkeys": "节点快捷键", + "nodesHotkeys": "节点", "addNodes": { "title": "添加节点", "desc": "打开添加节点菜单" - } + }, + "cancelAndClear": { + "desc": "取消当前队列项目并且清除所有待定项目", + "title": "取消和清除" + }, + "resetOptionsAndGallery": { + "title": "重置选项和图库", + "desc": "重置选项和图库面板" + }, + "searchHotkeys": "检索快捷键", + "noHotkeysFound": "未找到快捷键", + "toggleOptionsAndGallery": { + "desc": "打开和关闭选项和图库面板", + "title": "开关选项和图库" + }, + "clearSearch": "清除检索项" }, "modelManager": { "modelManager": "模型管理器", @@ -555,8 +582,8 @@ "info": "信息", "initialImage": "初始图像", "showOptionsPanel": "显示侧栏浮窗 (O 或 T)", - "seamlessYAxis": "Y 轴", - "seamlessXAxis": "X 轴", + "seamlessYAxis": "无缝平铺 Y 轴", + "seamlessXAxis": "无缝平铺 X 轴", "boundingBoxWidth": "边界框宽度", "boundingBoxHeight": "边界框高度", "denoisingStrength": "去噪强度", @@ -603,7 +630,7 @@ "readyToInvoke": "准备调用", "noControlImageForControlAdapter": "有 #{{number}} 个 Control Adapter 缺失控制图像", "noModelForControlAdapter": "有 #{{number}} 个 Control Adapter 没有选择模型。", - "incompatibleBaseModelForControlAdapter": "有 #{{number}} 个 Control Adapter 模型与主模型不匹配。" + "incompatibleBaseModelForControlAdapter": "有 #{{number}} 个 Control Adapter 模型与主模型不兼容。" }, "patchmatchDownScaleSize": "缩小", "coherenceSteps": "步数", @@ -634,7 +661,14 @@ "unmasked": "取消遮罩", "cfgRescaleMultiplier": "CFG 重缩放倍数", "cfgRescale": "CFG 重缩放", - "useSize": "使用尺寸" + "useSize": "使用尺寸", + "setToOptimalSize": "优化模型大小", + "setToOptimalSizeTooSmall": "$t(parameters.setToOptimalSize) (可能过小)", + "imageSize": "图像尺寸", + "lockAspectRatio": "锁定纵横比", + "swapDimensions": "交换尺寸", + "aspect": "纵横", + "setToOptimalSizeTooLarge": "$t(parameters.setToOptimalSize) (可能过大)" }, "settings": { "models": "模型", @@ -723,8 +757,7 @@ "nodesUnrecognizedTypes": "无法加载。节点图有无法识别的节点类型", "nodesNotValidJSON": "无效的 JSON", "nodesNotValidGraph": "无效的 InvokeAi 节点图", - "nodesCleared": "节点已清空", - "nodesLoadedFailed": "节点图加载失败", + "nodesLoadedFailed": "节点加载失败", "modelAddedSimple": "已添加模型", "modelAdded": "已添加模型: {{modelName}}", "imageSavingFailed": "图像保存失败", @@ -760,7 +793,10 @@ "problemImportingMask": "导入遮罩时出现问题", "baseModelChangedCleared_other": "基础模型已更改, 已清除或禁用 {{count}} 个不兼容的子模型", "setAsCanvasInitialImage": "设为画布初始图像", - "invalidUpload": "无效的上传" + "invalidUpload": "无效的上传", + "problemDeletingWorkflow": "删除工作流时出现问题", + "workflowDeleted": "已删除工作流", + "problemRetrievingWorkflow": "检索工作流时发生问题" }, "unifiedCanvas": { "layer": "图层", @@ -875,11 +911,8 @@ }, "nodes": { "zoomInNodes": "放大", - "resetWorkflowDesc": "是否确定要清空节点图?", - "resetWorkflow": "清空节点图", - "loadWorkflow": "读取节点图", + "loadWorkflow": "加载工作流", "zoomOutNodes": "缩小", - "resetWorkflowDesc2": "重置节点图将清除所有节点、边际和节点图详情.", "reloadNodeTemplates": "重载节点模板", "hideGraphNodes": "隐藏节点图信息", "fitViewportNodes": "自适应视图", @@ -888,7 +921,7 @@ "showLegendNodes": "显示字段类型图例", "hideLegendNodes": "隐藏字段类型图例", "showGraphNodes": "显示节点图信息", - "downloadWorkflow": "下载节点图 JSON", + "downloadWorkflow": "下载工作流 JSON", "workflowDescription": "简述", "versionUnknown": " 未知版本", "noNodeSelected": "无选中的节点", @@ -1103,7 +1136,13 @@ "collectionOrScalarFieldType": "{{name}} 合集 | 标量", "nodeVersion": "节点版本", "deletedInvalidEdge": "已删除无效的边缘 {{source}} -> {{target}}", - "unknownInput": "未知输入:{{name}}" + "unknownInput": "未知输入:{{name}}", + "prototypeDesc": "此调用是一个原型 (prototype)。它可能会在本项目更新期间发生破坏性更改,并且随时可能被删除。", + "betaDesc": "此调用尚处于测试阶段。在稳定之前,它可能会在项目更新期间发生破坏性更改。本项目计划长期支持这种调用。", + "newWorkflow": "新建工作流", + "newWorkflowDesc": "是否创建一个新的工作流?", + "newWorkflowDesc2": "当前工作流有未保存的更改。", + "unsupportedAnyOfLength": "联合(union)数据类型数目过多 ({{count}})" }, "controlnet": { "resize": "直接缩放", @@ -1128,7 +1167,6 @@ "crop": "裁剪", "processor": "处理器", "none": "无", - "incompatibleBaseModel": "不兼容的基础模型:", "enableControlnet": "启用 ControlNet", "detectResolution": "检测分辨率", "pidiDescription": "像素差分 (PIDI) 图像处理", @@ -1189,7 +1227,8 @@ "openPose": "Openpose", "controlAdapter_other": "Control Adapters", "lineartAnime": "Lineart Anime", - "canny": "Canny" + "canny": "Canny", + "resizeSimple": "缩放(简单)" }, "queue": { "status": "状态", @@ -1236,7 +1275,7 @@ "notReady": "无法排队", "batchFailedToQueue": "批次加入队列失败", "batchValues": "批次数", - "queueCountPrediction": "添加 {{predicted}} 到队列", + "queueCountPrediction": "{{promptsCount}} 提示词 × {{iterations}} 迭代次数 -> {{count}} 次生成", "batchQueued": "加入队列的批次", "queuedCount": "{{pending}} 待处理", "front": "前", @@ -1250,7 +1289,8 @@ "queueMaxExceeded": "超出最大值 {{max_queue_size}},将跳过 {{skip}}", "graphFailedToQueue": "节点图加入队列失败", "batchFieldValues": "批处理值", - "time": "时间" + "time": "时间", + "openQueue": "打开队列" }, "sdxl": { "refinerStart": "Refiner 开始作用时机", @@ -1264,11 +1304,12 @@ "denoisingStrength": "去噪强度", "refinermodel": "Refiner 模型", "posAestheticScore": "正向美学评分", - "concatPromptStyle": "连接提示词 & 样式", + "concatPromptStyle": "链接提示词 & 样式", "loading": "加载中...", "steps": "步数", "posStylePrompt": "正向样式提示词", - "refiner": "Refiner" + "refiner": "Refiner", + "freePromptStyle": "手动输入样式提示词" }, "metadata": { "positivePrompt": "正向提示词", @@ -1312,7 +1353,13 @@ "noLoRAsInstalled": "无已安装的 LoRA", "esrganModel": "ESRGAN 模型", "addLora": "添加 LoRA", - "noLoRAsLoaded": "无已加载的 LoRA" + "noLoRAsLoaded": "无已加载的 LoRA", + "noMainModelSelected": "未选择主模型", + "lora": "LoRA", + "allLoRAsAdded": "已添加所有 LoRA", + "defaultVAE": "默认 VAE", + "incompatibleBaseModel": "不兼容基础模型", + "loraAlreadyAdded": "LoRA 已经被添加" }, "boards": { "autoAddBoard": "自动添加面板", @@ -1356,7 +1403,9 @@ "maxPrompts": "最大提示词数", "dynamicPrompts": "动态提示词", "promptsWithCount_other": "{{count}} 个提示词", - "promptsPreview": "提示词预览" + "promptsPreview": "提示词预览", + "showDynamicPrompts": "显示动态提示词", + "loading": "生成动态提示词中..." }, "popovers": { "compositingMaskAdjustments": { @@ -1607,5 +1656,59 @@ "hrf": "高分辨率修复", "hrfStrength": "高分辨率修复强度", "strengthTooltip": "值越低细节越少,但可以减少部分潜在的伪影。" + }, + "workflows": { + "saveWorkflowAs": "保存工作流为", + "workflowEditorMenu": "工作流编辑器菜单", + "noSystemWorkflows": "无系统工作流", + "workflowName": "工作流名称", + "noUserWorkflows": "无用户工作流", + "defaultWorkflows": "默认工作流", + "saveWorkflow": "保存工作流", + "openWorkflow": "打开工作流", + "clearWorkflowSearchFilter": "清除工作流检索过滤器", + "workflowLibrary": "工作流库", + "downloadWorkflow": "保存到文件", + "noRecentWorkflows": "无最近工作流", + "workflowSaved": "已保存工作流", + "workflowIsOpen": "工作流已打开", + "unnamedWorkflow": "未命名的工作流", + "savingWorkflow": "保存工作流中...", + "problemLoading": "加载工作流时出现问题", + "loading": "加载工作流中", + "searchWorkflows": "检索工作流", + "problemSavingWorkflow": "保存工作流时出现问题", + "deleteWorkflow": "删除工作流", + "workflows": "工作流", + "noDescription": "无描述", + "uploadWorkflow": "从文件中加载", + "userWorkflows": "我的工作流", + "newWorkflowCreated": "已创建新的工作流" + }, + "app": { + "storeNotInitialized": "商店尚未初始化" + }, + "accordions": { + "compositing": { + "infillTab": "内补", + "coherenceTab": "一致性层", + "title": "合成" + }, + "control": { + "controlAdaptersTab": "Control Adapters", + "ipTab": "图像提示", + "title": "Control" + }, + "generation": { + "title": "生成", + "conceptsTab": "概念", + "modelTab": "模型" + }, + "advanced": { + "title": "高级" + }, + "image": { + "title": "图像" + } } } diff --git a/invokeai/frontend/web/scripts/typegen.js b/invokeai/frontend/web/scripts/typegen.js index 9e1b51eace..ce78e3e5ba 100644 --- a/invokeai/frontend/web/scripts/typegen.js +++ b/invokeai/frontend/web/scripts/typegen.js @@ -1,8 +1,9 @@ import fs from 'node:fs'; + import openapiTS from 'openapi-typescript'; const OPENAPI_URL = 'http://127.0.0.1:9090/openapi.json'; -const OUTPUT_FILE = 'src/services/api/schema.d.ts'; +const OUTPUT_FILE = 'src/services/api/schema.ts'; async function main() { process.stdout.write( diff --git a/invokeai/frontend/web/src/app/components/App.tsx b/invokeai/frontend/web/src/app/components/App.tsx index 73bd92ffab..a5294211ba 100644 --- a/invokeai/frontend/web/src/app/components/App.tsx +++ b/invokeai/frontend/web/src/app/components/App.tsx @@ -1,27 +1,29 @@ -import { Flex, Grid } from '@chakra-ui/react'; -import { useStore } from '@nanostores/react'; +import { Box } from '@chakra-ui/react'; +import { useSocketIO } from 'app/hooks/useSocketIO'; import { useLogger } from 'app/logging/useLogger'; import { appStarted } from 'app/store/middleware/listenerMiddleware/listeners/appStarted'; -import { $headerComponent } from 'app/store/nanostores/headerComponent'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; -import { PartialAppConfig } from 'app/types/invokeai'; -import ImageUploader from 'common/components/ImageUploader'; +import type { PartialAppConfig } from 'app/types/invokeai'; +import ImageUploadOverlay from 'common/components/ImageUploadOverlay'; +import { useClearStorage } from 'common/hooks/useClearStorage'; +import { useFullscreenDropzone } from 'common/hooks/useFullscreenDropzone'; +import { useGlobalHotkeys } from 'common/hooks/useGlobalHotkeys'; +import { useGlobalModifiersInit } from 'common/hooks/useGlobalModifiers'; import ChangeBoardModal from 'features/changeBoardModal/components/ChangeBoardModal'; import DeleteImageModal from 'features/deleteImageModal/components/DeleteImageModal'; -import SiteHeader from 'features/system/components/SiteHeader'; +import { DynamicPromptsModal } from 'features/dynamicPrompts/components/DynamicPromptsPreviewModal'; import { configChanged } from 'features/system/store/configSlice'; import { languageSelector } from 'features/system/store/systemSelectors'; import InvokeTabs from 'features/ui/components/InvokeTabs'; +import { AnimatePresence } from 'framer-motion'; import i18n from 'i18n'; import { size } from 'lodash-es'; import { memo, useCallback, useEffect } from 'react'; import { ErrorBoundary } from 'react-error-boundary'; + import AppErrorBoundaryFallback from './AppErrorBoundaryFallback'; -import GlobalHotkeys from './GlobalHotkeys'; import PreselectedImage from './PreselectedImage'; import Toaster from './Toaster'; -import { useSocketIO } from 'app/hooks/useSocketIO'; -import { useClearStorage } from 'common/hooks/useClearStorage'; const DEFAULT_CONFIG = {}; @@ -41,6 +43,11 @@ const App = ({ config = DEFAULT_CONFIG, selectedImage }: Props) => { // singleton! useSocketIO(); + useGlobalModifiersInit(); + useGlobalHotkeys(); + + const { dropzone, isHandlingUpload, setIsHandlingUpload } = + useFullscreenDropzone(); const handleReset = useCallback(() => { clearStorage(); @@ -63,41 +70,34 @@ const App = ({ config = DEFAULT_CONFIG, selectedImage }: Props) => { dispatch(appStarted()); }, [dispatch]); - const headerComponent = useStore($headerComponent); - return ( - - - - {headerComponent || } - - - - - - + + + + + {dropzone.isDragActive && isHandlingUpload && ( + + )} + + + - ); diff --git a/invokeai/frontend/web/src/app/components/AppErrorBoundaryFallback.tsx b/invokeai/frontend/web/src/app/components/AppErrorBoundaryFallback.tsx index 29f4016ad9..b2fd529848 100644 --- a/invokeai/frontend/web/src/app/components/AppErrorBoundaryFallback.tsx +++ b/invokeai/frontend/web/src/app/components/AppErrorBoundaryFallback.tsx @@ -1,5 +1,6 @@ -import { Flex, Heading, Link, Text, useToast } from '@chakra-ui/react'; -import IAIButton from 'common/components/IAIButton'; +import { Flex, Heading, Link, useToast } from '@chakra-ui/react'; +import { InvButton } from 'common/components/InvButton/InvButton'; +import { InvText } from 'common/components/InvText/wrapper'; import newGithubIssueUrl from 'new-github-issue-url'; import { memo, useCallback, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; @@ -37,60 +38,48 @@ const AppErrorBoundaryFallback = ({ error, resetErrorBoundary }: Props) => { return ( {t('common.somethingWentWrong')} - + {error.name}: {error.message} - + - - + } onClick={resetErrorBoundary} > {t('accessibility.resetUI')} - - } onClick={handleCopy}> + + } onClick={handleCopy}> {t('common.copyError')} - + - }> + }> {t('accessibility.createIssue')} - + diff --git a/invokeai/frontend/web/src/app/components/GlobalHotkeys.ts b/invokeai/frontend/web/src/app/components/GlobalHotkeys.ts deleted file mode 100644 index c77dfd5d86..0000000000 --- a/invokeai/frontend/web/src/app/components/GlobalHotkeys.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { createSelector } from '@reduxjs/toolkit'; -import { stateSelector } from 'app/store/store'; -import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; -import { useQueueBack } from 'features/queue/hooks/useQueueBack'; -import { useQueueFront } from 'features/queue/hooks/useQueueFront'; -import { - ctrlKeyPressed, - metaKeyPressed, - shiftKeyPressed, -} from 'features/ui/store/hotkeysSlice'; -import { setActiveTab } from 'features/ui/store/uiSlice'; -import { isEqual } from 'lodash-es'; -import React, { memo } from 'react'; -import { isHotkeyPressed, useHotkeys } from 'react-hotkeys-hook'; - -const globalHotkeysSelector = createSelector( - [stateSelector], - ({ hotkeys }) => { - const { shift, ctrl, meta } = hotkeys; - return { shift, ctrl, meta }; - }, - { - memoizeOptions: { - resultEqualityCheck: isEqual, - }, - } -); - -// TODO: Does not catch keypresses while focused in an input. Maybe there is a way? - -/** - * Logical component. Handles app-level global hotkeys. - * @returns null - */ -const GlobalHotkeys: React.FC = () => { - const dispatch = useAppDispatch(); - const { shift, ctrl, meta } = useAppSelector(globalHotkeysSelector); - const { - queueBack, - isDisabled: isDisabledQueueBack, - isLoading: isLoadingQueueBack, - } = useQueueBack(); - - useHotkeys( - ['ctrl+enter', 'meta+enter'], - queueBack, - { - enabled: () => !isDisabledQueueBack && !isLoadingQueueBack, - preventDefault: true, - enableOnFormTags: ['input', 'textarea', 'select'], - }, - [queueBack, isDisabledQueueBack, isLoadingQueueBack] - ); - - const { - queueFront, - isDisabled: isDisabledQueueFront, - isLoading: isLoadingQueueFront, - } = useQueueFront(); - - useHotkeys( - ['ctrl+shift+enter', 'meta+shift+enter'], - queueFront, - { - enabled: () => !isDisabledQueueFront && !isLoadingQueueFront, - preventDefault: true, - enableOnFormTags: ['input', 'textarea', 'select'], - }, - [queueFront, isDisabledQueueFront, isLoadingQueueFront] - ); - - useHotkeys( - '*', - () => { - if (isHotkeyPressed('shift')) { - !shift && dispatch(shiftKeyPressed(true)); - } else { - shift && dispatch(shiftKeyPressed(false)); - } - if (isHotkeyPressed('ctrl')) { - !ctrl && dispatch(ctrlKeyPressed(true)); - } else { - ctrl && dispatch(ctrlKeyPressed(false)); - } - if (isHotkeyPressed('meta')) { - !meta && dispatch(metaKeyPressed(true)); - } else { - meta && dispatch(metaKeyPressed(false)); - } - }, - { keyup: true, keydown: true }, - [shift, ctrl, meta] - ); - - useHotkeys('1', () => { - dispatch(setActiveTab('txt2img')); - }); - - useHotkeys('2', () => { - dispatch(setActiveTab('img2img')); - }); - - useHotkeys('3', () => { - dispatch(setActiveTab('unifiedCanvas')); - }); - - useHotkeys('4', () => { - dispatch(setActiveTab('nodes')); - }); - - useHotkeys('5', () => { - dispatch(setActiveTab('modelManager')); - }); - - return null; -}; - -export default memo(GlobalHotkeys); diff --git a/invokeai/frontend/web/src/app/components/InvokeAIUI.tsx b/invokeai/frontend/web/src/app/components/InvokeAIUI.tsx index b190a36f06..214e2c7b28 100644 --- a/invokeai/frontend/web/src/app/components/InvokeAIUI.tsx +++ b/invokeai/frontend/web/src/app/components/InvokeAIUI.tsx @@ -1,29 +1,27 @@ -import { Middleware } from '@reduxjs/toolkit'; +import 'i18n'; + +import type { Middleware } from '@reduxjs/toolkit'; import { $socketOptions } from 'app/hooks/useSocketIO'; import { $authToken } from 'app/store/nanostores/authToken'; import { $baseUrl } from 'app/store/nanostores/baseUrl'; -import { $customStarUI, CustomStarUi } from 'app/store/nanostores/customStarUI'; -import { $headerComponent } from 'app/store/nanostores/headerComponent'; +import { $customNavComponent } from 'app/store/nanostores/customNavComponent'; +import type { CustomStarUi } from 'app/store/nanostores/customStarUI'; +import { $customStarUI } from 'app/store/nanostores/customStarUI'; +import { $galleryHeader } from 'app/store/nanostores/galleryHeader'; import { $isDebugging } from 'app/store/nanostores/isDebugging'; +import { $logo } from 'app/store/nanostores/logo'; import { $projectId } from 'app/store/nanostores/projectId'; import { $queueId, DEFAULT_QUEUE_ID } from 'app/store/nanostores/queueId'; import { $store } from 'app/store/nanostores/store'; import { createStore } from 'app/store/store'; -import { PartialAppConfig } from 'app/types/invokeai'; +import type { PartialAppConfig } from 'app/types/invokeai'; import Loading from 'common/components/Loading/Loading'; import AppDndContext from 'features/dnd/components/AppDndContext'; -import 'i18n'; -import React, { - PropsWithChildren, - ReactNode, - lazy, - memo, - useEffect, - useMemo, -} from 'react'; +import type { PropsWithChildren, ReactNode } from 'react'; +import React, { lazy, memo, useEffect, useMemo } from 'react'; import { Provider } from 'react-redux'; import { addMiddleware, resetMiddlewares } from 'redux-dynamic-middlewares'; -import { ManagerOptions, SocketOptions } from 'socket.io-client'; +import type { ManagerOptions, SocketOptions } from 'socket.io-client'; const App = lazy(() => import('./App')); const ThemeLocaleProvider = lazy(() => import('./ThemeLocaleProvider')); @@ -32,9 +30,10 @@ interface Props extends PropsWithChildren { apiUrl?: string; token?: string; config?: PartialAppConfig; - headerComponent?: ReactNode; + customNavComponent?: ReactNode; middleware?: Middleware[]; projectId?: string; + galleryHeader?: ReactNode; queueId?: string; selectedImage?: { imageName: string; @@ -43,20 +42,23 @@ interface Props extends PropsWithChildren { customStarUi?: CustomStarUi; socketOptions?: Partial; isDebugging?: boolean; + logo?: ReactNode; } const InvokeAIUI = ({ apiUrl, token, config, - headerComponent, + customNavComponent, middleware, projectId, + galleryHeader, queueId, selectedImage, customStarUi, socketOptions, isDebugging = false, + logo, }: Props) => { useEffect(() => { // configure API client token @@ -112,14 +114,34 @@ const InvokeAIUI = ({ }, [customStarUi]); useEffect(() => { - if (headerComponent) { - $headerComponent.set(headerComponent); + if (customNavComponent) { + $customNavComponent.set(customNavComponent); } return () => { - $headerComponent.set(undefined); + $customNavComponent.set(undefined); }; - }, [headerComponent]); + }, [customNavComponent]); + + useEffect(() => { + if (galleryHeader) { + $galleryHeader.set(galleryHeader); + } + + return () => { + $galleryHeader.set(undefined); + }; + }, [galleryHeader]); + + useEffect(() => { + if (logo) { + $logo.set(logo); + } + + return () => { + $logo.set(undefined); + }; + }, [logo]); useEffect(() => { if (socketOptions) { @@ -145,6 +167,15 @@ const InvokeAIUI = ({ useEffect(() => { $store.set(store); + if (import.meta.env.MODE === 'development') { + window.$store = $store; + } + () => { + $store.set(undefined); + if (import.meta.env.MODE === 'development') { + window.$store = undefined; + } + }; }, [store]); return ( diff --git a/invokeai/frontend/web/src/app/components/ThemeLocaleProvider.tsx b/invokeai/frontend/web/src/app/components/ThemeLocaleProvider.tsx index ba0aaa5823..f2de4dc3be 100644 --- a/invokeai/frontend/web/src/app/components/ThemeLocaleProvider.tsx +++ b/invokeai/frontend/web/src/app/components/ThemeLocaleProvider.tsx @@ -1,24 +1,17 @@ -import { - ChakraProvider, - createLocalStorageManager, - extendTheme, -} from '@chakra-ui/react'; -import { ReactNode, memo, useEffect, useMemo } from 'react'; -import { useTranslation } from 'react-i18next'; -import { TOAST_OPTIONS, theme as invokeAITheme } from 'theme/theme'; - import '@fontsource-variable/inter'; -import { MantineProvider } from '@mantine/core'; -import { useMantineTheme } from 'mantine-theme/theme'; import 'overlayscrollbars/overlayscrollbars.css'; -import 'theme/css/overlayscrollbars.css'; +import 'common/components/OverlayScrollbars/overlayscrollbars.css'; + +import { ChakraProvider, extendTheme } from '@chakra-ui/react'; +import type { ReactNode } from 'react'; +import { memo, useEffect, useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; +import { theme as invokeAITheme, TOAST_OPTIONS } from 'theme/theme'; type ThemeLocaleProviderProps = { children: ReactNode; }; -const manager = createLocalStorageManager('@@invokeai-color-mode'); - function ThemeLocaleProvider({ children }: ThemeLocaleProviderProps) { const { i18n } = useTranslation(); @@ -35,18 +28,10 @@ function ThemeLocaleProvider({ children }: ThemeLocaleProviderProps) { document.body.dir = direction; }, [direction]); - const mantineTheme = useMantineTheme(); - return ( - - - {children} - - + + {children} + ); } diff --git a/invokeai/frontend/web/src/app/components/Toaster.ts b/invokeai/frontend/web/src/app/components/Toaster.ts index e319bef59c..ad10f58a5e 100644 --- a/invokeai/frontend/web/src/app/components/Toaster.ts +++ b/invokeai/frontend/web/src/app/components/Toaster.ts @@ -1,7 +1,8 @@ import { useToast } from '@chakra-ui/react'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { addToast, clearToastQueue } from 'features/system/store/systemSlice'; -import { MakeToastArg, makeToast } from 'features/system/util/makeToast'; +import type { MakeToastArg } from 'features/system/util/makeToast'; +import { makeToast } from 'features/system/util/makeToast'; import { memo, useCallback, useEffect } from 'react'; /** @@ -10,7 +11,7 @@ import { memo, useCallback, useEffect } from 'react'; */ const Toaster = () => { const dispatch = useAppDispatch(); - const toastQueue = useAppSelector((state) => state.system.toastQueue); + const toastQueue = useAppSelector((s) => s.system.toastQueue); const toast = useToast(); useEffect(() => { toastQueue.forEach((t) => { diff --git a/invokeai/frontend/web/src/app/features.ts b/invokeai/frontend/web/src/app/features.ts deleted file mode 100644 index bd6906f11c..0000000000 --- a/invokeai/frontend/web/src/app/features.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { useMemo } from 'react'; -import { useTranslation } from 'react-i18next'; - -type FeatureHelpInfo = { - text: string; - href: string; - guideImage: string; -}; - -export enum Feature { - PROMPT, - GALLERY, - OTHER, - SEED, - VARIATIONS, - UPSCALE, - FACE_CORRECTION, - IMAGE_TO_IMAGE, - BOUNDING_BOX, - SEAM_CORRECTION, - INFILL_AND_SCALING, -} -/** For each tooltip in the UI, the below feature definitions & props will pull relevant information into the tooltip. - * - * To-do: href & GuideImages are placeholders, and are not currently utilized, but will be updated (along with the tooltip UI) as feature and UI develop and we get a better idea on where things "forever homes" will be . - */ -const useFeatures = (): Record => { - const { t } = useTranslation(); - return useMemo( - () => ({ - [Feature.PROMPT]: { - text: t('tooltip.feature.prompt'), - href: 'link/to/docs/feature3.html', - guideImage: 'asset/path.gif', - }, - [Feature.GALLERY]: { - text: t('tooltip.feature.gallery'), - href: 'link/to/docs/feature3.html', - guideImage: 'asset/path.gif', - }, - [Feature.OTHER]: { - text: t('tooltip.feature.other'), - href: 'link/to/docs/feature3.html', - guideImage: 'asset/path.gif', - }, - [Feature.SEED]: { - text: t('tooltip.feature.seed'), - href: 'link/to/docs/feature3.html', - guideImage: 'asset/path.gif', - }, - [Feature.VARIATIONS]: { - text: t('tooltip.feature.variations'), - href: 'link/to/docs/feature3.html', - guideImage: 'asset/path.gif', - }, - [Feature.UPSCALE]: { - text: t('tooltip.feature.upscale'), - href: 'link/to/docs/feature1.html', - guideImage: 'asset/path.gif', - }, - [Feature.FACE_CORRECTION]: { - text: t('tooltip.feature.faceCorrection'), - href: 'link/to/docs/feature3.html', - guideImage: 'asset/path.gif', - }, - [Feature.IMAGE_TO_IMAGE]: { - text: t('tooltip.feature.imageToImage'), - href: 'link/to/docs/feature3.html', - guideImage: 'asset/path.gif', - }, - [Feature.BOUNDING_BOX]: { - text: t('tooltip.feature.boundingBox'), - href: 'link/to/docs/feature3.html', - guideImage: 'asset/path.gif', - }, - [Feature.SEAM_CORRECTION]: { - text: t('tooltip.feature.seamCorrection'), - href: 'link/to/docs/feature3.html', - guideImage: 'asset/path.gif', - }, - [Feature.INFILL_AND_SCALING]: { - text: t('tooltip.feature.infillAndScaling'), - href: 'link/to/docs/feature3.html', - guideImage: 'asset/path.gif', - }, - }), - [t] - ); -}; - -export const useFeatureHelpInfo = (feature: Feature): FeatureHelpInfo => { - const features = useFeatures(); - return features[feature]; -}; diff --git a/invokeai/frontend/web/src/app/hooks/useSocketIO.ts b/invokeai/frontend/web/src/app/hooks/useSocketIO.ts index b2f08b2815..dc2a8947fc 100644 --- a/invokeai/frontend/web/src/app/hooks/useSocketIO.ts +++ b/invokeai/frontend/web/src/app/hooks/useSocketIO.ts @@ -3,14 +3,16 @@ import { $authToken } from 'app/store/nanostores/authToken'; import { $baseUrl } from 'app/store/nanostores/baseUrl'; import { $isDebugging } from 'app/store/nanostores/isDebugging'; import { useAppDispatch } from 'app/store/storeHooks'; -import { MapStore, atom, map } from 'nanostores'; +import type { MapStore } from 'nanostores'; +import { atom, map } from 'nanostores'; import { useEffect, useMemo } from 'react'; -import { +import type { ClientToServerEvents, ServerToClientEvents, } from 'services/events/types'; import { setEventListeners } from 'services/events/util/setEventListeners'; -import { ManagerOptions, Socket, SocketOptions, io } from 'socket.io-client'; +import type { ManagerOptions, Socket, SocketOptions } from 'socket.io-client'; +import { io } from 'socket.io-client'; // Inject socket options and url into window for debugging declare global { @@ -41,7 +43,7 @@ export const useSocketIO = () => { }, [baseUrl]); const socketOptions = useMemo(() => { - const options: Parameters[0] = { + const options: Partial = { timeout: 60000, path: '/ws/socket.io', autoConnect: false, // achtung! removing this breaks the dynamic middleware @@ -69,7 +71,7 @@ export const useSocketIO = () => { setEventListeners({ dispatch, socket }); socket.connect(); - if ($isDebugging.get()) { + if ($isDebugging.get() || import.meta.env.MODE === 'development') { window.$socketOptions = $socketOptions; console.log('Socket initialized', socket); } @@ -77,7 +79,7 @@ export const useSocketIO = () => { $isSocketInitialized.set(true); return () => { - if ($isDebugging.get()) { + if ($isDebugging.get() || import.meta.env.MODE === 'development') { window.$socketOptions = undefined; console.log('Socket teardown', socket); } diff --git a/invokeai/frontend/web/src/app/logging/logger.ts b/invokeai/frontend/web/src/app/logging/logger.ts index 0e0a1a7324..c68fe64d39 100644 --- a/invokeai/frontend/web/src/app/logging/logger.ts +++ b/invokeai/frontend/web/src/app/logging/logger.ts @@ -1,7 +1,14 @@ import { createLogWriter } from '@roarr/browser-log-writer'; import { atom } from 'nanostores'; -import { Logger, ROARR, Roarr } from 'roarr'; +import type { Logger, MessageSerializer } from 'roarr'; +import { ROARR, Roarr } from 'roarr'; +import { z } from 'zod'; +const serializeMessage: MessageSerializer = (message) => { + return JSON.stringify(message); +}; + +ROARR.serializeMessage = serializeMessage; ROARR.write = createLogWriter(); export const BASE_CONTEXT = {}; @@ -26,19 +33,20 @@ export type LoggerNamespace = export const logger = (namespace: LoggerNamespace) => $logger.get().child({ namespace }); -export const VALID_LOG_LEVELS = [ +export const zLogLevel = z.enum([ 'trace', 'debug', 'info', 'warn', 'error', 'fatal', -] as const; - -export type InvokeLogLevel = (typeof VALID_LOG_LEVELS)[number]; +]); +export type LogLevel = z.infer; +export const isLogLevel = (v: unknown): v is LogLevel => + zLogLevel.safeParse(v).success; // Translate human-readable log levels to numbers, used for log filtering -export const LOG_LEVEL_MAP: Record = { +export const LOG_LEVEL_MAP: Record = { trace: 10, debug: 20, info: 30, diff --git a/invokeai/frontend/web/src/app/logging/useLogger.ts b/invokeai/frontend/web/src/app/logging/useLogger.ts index 697c3d3fc8..de60852c1b 100644 --- a/invokeai/frontend/web/src/app/logging/useLogger.ts +++ b/invokeai/frontend/web/src/app/logging/useLogger.ts @@ -1,37 +1,14 @@ -import { createSelector } from '@reduxjs/toolkit'; import { createLogWriter } from '@roarr/browser-log-writer'; -import { stateSelector } from 'app/store/store'; import { useAppSelector } from 'app/store/storeHooks'; -import { isEqual } from 'lodash-es'; import { useEffect, useMemo } from 'react'; import { ROARR, Roarr } from 'roarr'; -import { - $logger, - BASE_CONTEXT, - LOG_LEVEL_MAP, - LoggerNamespace, - logger, -} from './logger'; -const selector = createSelector( - stateSelector, - ({ system }) => { - const { consoleLogLevel, shouldLogToConsole } = system; - - return { - consoleLogLevel, - shouldLogToConsole, - }; - }, - { - memoizeOptions: { - resultEqualityCheck: isEqual, - }, - } -); +import type { LoggerNamespace } from './logger'; +import { $logger, BASE_CONTEXT, LOG_LEVEL_MAP, logger } from './logger'; export const useLogger = (namespace: LoggerNamespace) => { - const { consoleLogLevel, shouldLogToConsole } = useAppSelector(selector); + const consoleLogLevel = useAppSelector((s) => s.system.consoleLogLevel); + const shouldLogToConsole = useAppSelector((s) => s.system.shouldLogToConsole); // The provided Roarr browser log writer uses localStorage to config logging to console useEffect(() => { diff --git a/invokeai/frontend/web/src/app/store/actions.ts b/invokeai/frontend/web/src/app/store/actions.ts index 418440a5fb..0800d1a63b 100644 --- a/invokeai/frontend/web/src/app/store/actions.ts +++ b/invokeai/frontend/web/src/app/store/actions.ts @@ -1,6 +1,6 @@ import { createAction } from '@reduxjs/toolkit'; -import { InvokeTabName } from 'features/ui/store/tabMap'; -import { BatchConfig } from 'services/api/types'; +import type { InvokeTabName } from 'features/ui/store/tabMap'; +import type { BatchConfig } from 'services/api/types'; export const enqueueRequested = createAction<{ tabName: InvokeTabName; diff --git a/invokeai/frontend/web/src/app/store/createMemoizedSelector.ts b/invokeai/frontend/web/src/app/store/createMemoizedSelector.ts new file mode 100644 index 0000000000..b4d46a4ef8 --- /dev/null +++ b/invokeai/frontend/web/src/app/store/createMemoizedSelector.ts @@ -0,0 +1,35 @@ +import { + createDraftSafeSelectorCreator, + createSelectorCreator, + lruMemoize, +} from '@reduxjs/toolkit'; +import type { GetSelectorsOptions } from '@reduxjs/toolkit/dist/entities/state_selectors'; +import { isEqual } from 'lodash-es'; + +/** + * A memoized selector creator that uses LRU cache and lodash's isEqual for equality check. + */ +export const createMemoizedSelector = createSelectorCreator({ + memoize: lruMemoize, + memoizeOptions: { + resultEqualityCheck: isEqual, + }, + argsMemoize: lruMemoize, +}); + +/** + * A memoized selector creator that uses LRU cache default shallow equality check. + */ +export const createLruSelector = createSelectorCreator({ + memoize: lruMemoize, + argsMemoize: lruMemoize, +}); + +export const createLruDraftSafeSelector = createDraftSafeSelectorCreator({ + memoize: lruMemoize, + argsMemoize: lruMemoize, +}); + +export const getSelectorsOptions: GetSelectorsOptions = { + createSelector: createLruDraftSafeSelector, +}; diff --git a/invokeai/frontend/web/src/app/store/enhancers/reduxRemember/driver.ts b/invokeai/frontend/web/src/app/store/enhancers/reduxRemember/driver.ts new file mode 100644 index 0000000000..465199002b --- /dev/null +++ b/invokeai/frontend/web/src/app/store/enhancers/reduxRemember/driver.ts @@ -0,0 +1,47 @@ +import { StorageError } from 'app/store/enhancers/reduxRemember/errors'; +import { $projectId } from 'app/store/nanostores/projectId'; +import type { UseStore } from 'idb-keyval'; +import { + clear, + createStore as createIDBKeyValStore, + get, + set, +} from 'idb-keyval'; +import { action, atom } from 'nanostores'; +import type { Driver } from 'redux-remember'; + +// Create a custom idb-keyval store (just needed to customize the name) +export const $idbKeyValStore = atom( + createIDBKeyValStore('invoke', 'invoke-store') +); + +export const clearIdbKeyValStore = action($idbKeyValStore, 'clear', (store) => { + clear(store.get()); +}); + +// Create redux-remember driver, wrapping idb-keyval +export const idbKeyValDriver: Driver = { + getItem: (key) => { + try { + return get(key, $idbKeyValStore.get()); + } catch (originalError) { + throw new StorageError({ + key, + projectId: $projectId.get(), + originalError, + }); + } + }, + setItem: (key, value) => { + try { + return set(key, value, $idbKeyValStore.get()); + } catch (originalError) { + throw new StorageError({ + key, + value, + projectId: $projectId.get(), + originalError, + }); + } + }, +}; diff --git a/invokeai/frontend/web/src/app/store/enhancers/reduxRemember/errors.ts b/invokeai/frontend/web/src/app/store/enhancers/reduxRemember/errors.ts new file mode 100644 index 0000000000..0ce113fc39 --- /dev/null +++ b/invokeai/frontend/web/src/app/store/enhancers/reduxRemember/errors.ts @@ -0,0 +1,46 @@ +import { logger } from 'app/logging/logger'; +import { parseify } from 'common/util/serialize'; +import { PersistError, RehydrateError } from 'redux-remember'; +import { serializeError } from 'serialize-error'; + +export type StorageErrorArgs = { + key: string; + /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ // any is correct + value?: any; + originalError?: unknown; + projectId?: string; +}; + +export class StorageError extends Error { + key: string; + /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ // any is correct + value?: any; + originalError?: Error; + projectId?: string; + + constructor({ key, value, originalError, projectId }: StorageErrorArgs) { + super(`Error setting ${key}`); + this.name = 'StorageSetError'; + this.key = key; + if (value !== undefined) { + this.value = value; + } + if (projectId !== undefined) { + this.projectId = projectId; + } + if (originalError instanceof Error) { + this.originalError = originalError; + } + } +} + +export const errorHandler = (err: PersistError | RehydrateError) => { + const log = logger('system'); + if (err instanceof PersistError) { + log.error({ error: serializeError(err) }, 'Problem persisting state'); + } else if (err instanceof RehydrateError) { + log.error({ error: serializeError(err) }, 'Problem rehydrating state'); + } else { + log.error({ error: parseify(err) }, 'Problem in persistence layer'); + } +}; diff --git a/invokeai/frontend/web/src/app/store/enhancers/reduxRemember/serialize.ts b/invokeai/frontend/web/src/app/store/enhancers/reduxRemember/serialize.ts deleted file mode 100644 index 4741f08b16..0000000000 --- a/invokeai/frontend/web/src/app/store/enhancers/reduxRemember/serialize.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { canvasPersistDenylist } from 'features/canvas/store/canvasPersistDenylist'; -import { controlAdaptersPersistDenylist } from 'features/controlAdapters/store/controlAdaptersPersistDenylist'; -import { dynamicPromptsPersistDenylist } from 'features/dynamicPrompts/store/dynamicPromptsPersistDenylist'; -import { galleryPersistDenylist } from 'features/gallery/store/galleryPersistDenylist'; -import { nodesPersistDenylist } from 'features/nodes/store/nodesPersistDenylist'; -import { generationPersistDenylist } from 'features/parameters/store/generationPersistDenylist'; -import { postprocessingPersistDenylist } from 'features/parameters/store/postprocessingPersistDenylist'; -import { systemPersistDenylist } from 'features/system/store/systemPersistDenylist'; -import { uiPersistDenylist } from 'features/ui/store/uiPersistDenylist'; -import { omit } from 'lodash-es'; -import { SerializeFunction } from 'redux-remember'; - -const serializationDenylist: { - [key: string]: string[]; -} = { - canvas: canvasPersistDenylist, - gallery: galleryPersistDenylist, - generation: generationPersistDenylist, - nodes: nodesPersistDenylist, - postprocessing: postprocessingPersistDenylist, - system: systemPersistDenylist, - ui: uiPersistDenylist, - controlNet: controlAdaptersPersistDenylist, - dynamicPrompts: dynamicPromptsPersistDenylist, -}; - -export const serialize: SerializeFunction = (data, key) => { - const result = omit(data, serializationDenylist[key] ?? []); - return JSON.stringify(result); -}; diff --git a/invokeai/frontend/web/src/app/store/enhancers/reduxRemember/unserialize.ts b/invokeai/frontend/web/src/app/store/enhancers/reduxRemember/unserialize.ts deleted file mode 100644 index 0dcc9e5971..0000000000 --- a/invokeai/frontend/web/src/app/store/enhancers/reduxRemember/unserialize.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { initialCanvasState } from 'features/canvas/store/canvasSlice'; -import { initialControlAdapterState } from 'features/controlAdapters/store/controlAdaptersSlice'; -import { initialDynamicPromptsState } from 'features/dynamicPrompts/store/dynamicPromptsSlice'; -import { initialGalleryState } from 'features/gallery/store/gallerySlice'; -import { initialNodesState } from 'features/nodes/store/nodesSlice'; -import { initialGenerationState } from 'features/parameters/store/generationSlice'; -import { initialPostprocessingState } from 'features/parameters/store/postprocessingSlice'; -import { initialSDXLState } from 'features/sdxl/store/sdxlSlice'; -import { initialConfigState } from 'features/system/store/configSlice'; -import { initialSystemState } from 'features/system/store/systemSlice'; -import { initialHotkeysState } from 'features/ui/store/hotkeysSlice'; -import { initialUIState } from 'features/ui/store/uiSlice'; -import { defaultsDeep } from 'lodash-es'; -import { UnserializeFunction } from 'redux-remember'; - -const initialStates: { - [key: string]: object; // TODO: type this properly -} = { - canvas: initialCanvasState, - gallery: initialGalleryState, - generation: initialGenerationState, - nodes: initialNodesState, - postprocessing: initialPostprocessingState, - system: initialSystemState, - config: initialConfigState, - ui: initialUIState, - hotkeys: initialHotkeysState, - controlAdapters: initialControlAdapterState, - dynamicPrompts: initialDynamicPromptsState, - sdxl: initialSDXLState, -}; - -export const unserialize: UnserializeFunction = (data, key) => { - const result = defaultsDeep(JSON.parse(data), initialStates[key]); - return result; -}; diff --git a/invokeai/frontend/web/src/app/store/middleware/debugLoggerMiddleware.ts b/invokeai/frontend/web/src/app/store/middleware/debugLoggerMiddleware.ts new file mode 100644 index 0000000000..501a8146ec --- /dev/null +++ b/invokeai/frontend/web/src/app/store/middleware/debugLoggerMiddleware.ts @@ -0,0 +1,16 @@ +import type { Middleware, MiddlewareAPI } from '@reduxjs/toolkit'; +import { diff } from 'jsondiffpatch'; + +/** + * Super simple logger middleware. Useful for debugging when the redux devtools are awkward. + */ +export const debugLoggerMiddleware: Middleware = + (api: MiddlewareAPI) => (next) => (action) => { + const originalState = api.getState(); + console.log('REDUX: dispatching', action); + const result = next(action); + const nextState = api.getState(); + console.log('REDUX: next state', nextState); + console.log('REDUX: diff', diff(originalState, nextState)); + return result; + }; diff --git a/invokeai/frontend/web/src/app/store/middleware/devtools/actionSanitizer.ts b/invokeai/frontend/web/src/app/store/middleware/devtools/actionSanitizer.ts index 143b16594c..9c7bae725b 100644 --- a/invokeai/frontend/web/src/app/store/middleware/devtools/actionSanitizer.ts +++ b/invokeai/frontend/web/src/app/store/middleware/devtools/actionSanitizer.ts @@ -1,10 +1,12 @@ -import { AnyAction } from '@reduxjs/toolkit'; +import type { UnknownAction } from '@reduxjs/toolkit'; import { isAnyGraphBuilt } from 'features/nodes/store/actions'; -import { nodeTemplatesBuilt } from 'features/nodes/store/nodesSlice'; +import { nodeTemplatesBuilt } from 'features/nodes/store/nodeTemplatesSlice'; +import { cloneDeep } from 'lodash-es'; import { receivedOpenAPISchema } from 'services/api/thunks/schema'; -import { Graph } from 'services/api/types'; +import type { Graph } from 'services/api/types'; +import { socketGeneratorProgress } from 'services/events/actions'; -export const actionSanitizer = (action: A): A => { +export const actionSanitizer = (action: A): A => { if (isAnyGraphBuilt(action)) { if (action.payload.nodes) { const sanitizedNodes: Graph['nodes'] = {}; @@ -30,5 +32,14 @@ export const actionSanitizer = (action: A): A => { }; } + if (socketGeneratorProgress.match(action)) { + const sanitized = cloneDeep(action); + if (sanitized.payload.data.progress_image) { + sanitized.payload.data.progress_image.dataURL = + ''; + } + return sanitized; + } + return action; }; diff --git a/invokeai/frontend/web/src/app/store/middleware/devtools/actionsDenylist.ts b/invokeai/frontend/web/src/app/store/middleware/devtools/actionsDenylist.ts index a596fce931..defb98b64c 100644 --- a/invokeai/frontend/web/src/app/store/middleware/devtools/actionsDenylist.ts +++ b/invokeai/frontend/web/src/app/store/middleware/devtools/actionsDenylist.ts @@ -1,21 +1,16 @@ /** * This is a list of actions that should be excluded in the Redux DevTools. */ -export const actionsDenylist = [ +export const actionsDenylist: string[] = [ // very spammy canvas actions - 'canvas/setCursorPosition', - 'canvas/setStageCoordinates', - 'canvas/setStageScale', - 'canvas/setIsDrawing', - 'canvas/setBoundingBoxCoordinates', - 'canvas/setBoundingBoxDimensions', - 'canvas/setIsDrawing', - 'canvas/addPointToCurrentLine', + // 'canvas/setStageCoordinates', + // 'canvas/setStageScale', + // 'canvas/setBoundingBoxCoordinates', + // 'canvas/setBoundingBoxDimensions', + // 'canvas/addPointToCurrentLine', // bazillions during generation - 'socket/socketGeneratorProgress', - 'socket/appSocketGeneratorProgress', - // every time user presses shift - // 'hotkeys/shiftKeyPressed', + // 'socket/socketGeneratorProgress', + // 'socket/appSocketGeneratorProgress', // this happens after every state change - '@@REMEMBER_PERSISTED', + // '@@REMEMBER_PERSISTED', ]; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/index.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/index.ts index 13dee4c871..0b3accfd4d 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/index.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/index.ts @@ -1,12 +1,13 @@ -import type { TypedAddListener, TypedStartListening } from '@reduxjs/toolkit'; -import { - AnyAction, +import type { ListenerEffect, - addListener, - createListenerMiddleware, + TypedAddListener, + TypedStartListening, + UnknownAction, } from '@reduxjs/toolkit'; - +import { addListener, createListenerMiddleware } from '@reduxjs/toolkit'; +import { addGalleryImageClickedListener } from 'app/store/middleware/listenerMiddleware/listeners/galleryImageClicked'; import type { AppDispatch, RootState } from 'app/store/store'; + import { addCommitStagingAreaImageListener } from './listeners/addCommitStagingAreaImageListener'; import { addFirstListImagesListener } from './listeners/addFirstListImagesListener.ts'; import { addAnyEnqueuedListener } from './listeners/anyEnqueued'; @@ -43,13 +44,13 @@ import { addImageRemovedFromBoardFulfilledListener, addImageRemovedFromBoardRejectedListener, } from './listeners/imageRemovedFromBoard'; +import { addImagesStarredListener } from './listeners/imagesStarred'; +import { addImagesUnstarredListener } from './listeners/imagesUnstarred'; import { addImageToDeleteSelectedListener } from './listeners/imageToDeleteSelected'; import { addImageUploadedFulfilledListener, addImageUploadedRejectedListener, } from './listeners/imageUploaded'; -import { addImagesStarredListener } from './listeners/imagesStarred'; -import { addImagesUnstarredListener } from './listeners/imagesUnstarred'; import { addInitialImageSelectedListener } from './listeners/initialImageSelected'; import { addModelSelectedListener } from './listeners/modelSelected'; import { addModelsLoadedListener } from './listeners/modelsLoaded'; @@ -69,10 +70,9 @@ import { addSessionRetrievalErrorEventListener } from './listeners/socketio/sock import { addSocketSubscribedEventListener as addSocketSubscribedListener } from './listeners/socketio/socketSubscribed'; import { addSocketUnsubscribedEventListener as addSocketUnsubscribedListener } from './listeners/socketio/socketUnsubscribed'; import { addStagingAreaImageSavedListener } from './listeners/stagingAreaImageSaved'; -import { addTabChangedListener } from './listeners/tabChanged'; +import { addUpdateAllNodesRequestedListener } from './listeners/updateAllNodesRequested'; import { addUpscaleRequestedListener } from './listeners/upscaleRequested'; import { addWorkflowLoadRequestedListener } from './listeners/workflowLoadRequested'; -import { addUpdateAllNodesRequestedListener } from './listeners/updateAllNodesRequested'; export const listenerMiddleware = createListenerMiddleware(); @@ -87,7 +87,7 @@ export const addAppListener = addListener as TypedAddListener< >; export type AppListenerEffect = ListenerEffect< - AnyAction, + UnknownAction, RootState, AppDispatch >; @@ -118,6 +118,9 @@ addImageToDeleteSelectedListener(); addImagesStarredListener(); addImagesUnstarredListener(); +// Gallery +addGalleryImageClickedListener(); + // User Invoked addEnqueueRequestedCanvasListener(); addEnqueueRequestedNodes(); @@ -136,19 +139,7 @@ addCanvasMergedListener(); addStagingAreaImageSavedListener(); addCommitStagingAreaImageListener(); -/** - * Socket.IO Events - these handle SIO events directly and pass on internal application actions. - * We don't handle SIO events in slices via `extraReducers` because some of these events shouldn't - * actually be handled at all. - * - * For example, we don't want to respond to progress events for canceled sessions. To avoid - * duplicating the logic to determine if an event should be responded to, we handle all of that - * "is this session canceled?" logic in these listeners. - * - * The `socketGeneratorProgress` listener will then only dispatch the `appSocketGeneratorProgress` - * action if it should be handled by the rest of the application. It is this `appSocketGeneratorProgress` - * action that is handled by reducers in slices. - */ +// Socket.IO addGeneratorProgressListener(); addGraphExecutionStateCompleteListener(); addInvocationCompleteListener(); @@ -196,8 +187,5 @@ addFirstListImagesListener(); // Ad-hoc upscale workflwo addUpscaleRequestedListener(); -// Tab Change -addTabChangedListener(); - // Dynamic prompts addDynamicPromptsListener(); diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/addCommitStagingAreaImageListener.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/addCommitStagingAreaImageListener.ts index d302d50255..2dbf68a837 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/addCommitStagingAreaImageListener.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/addCommitStagingAreaImageListener.ts @@ -8,6 +8,7 @@ import { import { addToast } from 'features/system/store/systemSlice'; import { t } from 'i18next'; import { queueApi } from 'services/api/endpoints/queue'; + import { startAppListening } from '..'; const matcher = isAnyOf(commitStagingAreaImage, discardStagedImages); diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/addFirstListImagesListener.ts.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/addFirstListImagesListener.ts.ts index 15e7d48708..ed85aa2714 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/addFirstListImagesListener.ts.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/addFirstListImagesListener.ts.ts @@ -2,9 +2,10 @@ import { createAction } from '@reduxjs/toolkit'; import { imageSelected } from 'features/gallery/store/gallerySlice'; import { IMAGE_CATEGORIES } from 'features/gallery/store/types'; import { imagesApi } from 'services/api/endpoints/images'; +import type { ImageCache } from 'services/api/types'; +import { getListImagesUrl, imagesSelectors } from 'services/api/util'; + import { startAppListening } from '..'; -import { getListImagesUrl, imagesAdapter } from 'services/api/util'; -import { ImageCache } from 'services/api/types'; export const appStarted = createAction('app/appStarted'); @@ -32,7 +33,7 @@ export const addFirstListImagesListener = () => { if (data.ids.length > 0) { // Select the first image - const firstImage = imagesAdapter.getSelectors().selectAll(data)[0]; + const firstImage = imagesSelectors.selectAll(data)[0]; dispatch(imageSelected(firstImage ?? null)); } }, diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/anyEnqueued.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/anyEnqueued.ts index 3f0e3342f9..e2114769f4 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/anyEnqueued.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/anyEnqueued.ts @@ -1,11 +1,12 @@ -import { queueApi } from 'services/api/endpoints/queue'; +import { queueApi, selectQueueStatus } from 'services/api/endpoints/queue'; + import { startAppListening } from '..'; export const addAnyEnqueuedListener = () => { startAppListening({ matcher: queueApi.endpoints.enqueueBatch.matchFulfilled, effect: async (_, { dispatch, getState }) => { - const { data } = queueApi.endpoints.getQueueStatus.select()(getState()); + const { data } = selectQueueStatus(getState()); if (!data || data.processor.is_started) { return; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/appConfigReceived.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/appConfigReceived.ts index 700b4e7626..52090f7ab7 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/appConfigReceived.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/appConfigReceived.ts @@ -4,6 +4,7 @@ import { shouldUseWatermarkerChanged, } from 'features/system/store/systemSlice'; import { appInfoApi } from 'services/api/endpoints/appInfo'; + import { startAppListening } from '..'; export const addAppConfigReceivedListener = () => { diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/appStarted.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/appStarted.ts index 189a5a3530..9cbd1c4aca 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/appStarted.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/appStarted.ts @@ -1,4 +1,5 @@ import { createAction } from '@reduxjs/toolkit'; + import { startAppListening } from '..'; export const appStarted = createAction('app/appStarted'); diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/batchEnqueued.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/batchEnqueued.ts index 62a661756b..1e8608d884 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/batchEnqueued.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/batchEnqueued.ts @@ -3,9 +3,10 @@ import { logger } from 'app/logging/logger'; import { parseify } from 'common/util/serialize'; import { zPydanticValidationError } from 'features/system/store/zodSchemas'; import { t } from 'i18next'; -import { get, truncate, upperFirst } from 'lodash-es'; +import { truncate, upperFirst } from 'lodash-es'; import { queueApi } from 'services/api/endpoints/queue'; -import { TOAST_OPTIONS, theme } from 'theme/theme'; +import { theme, TOAST_OPTIONS } from 'theme/theme'; + import { startAppListening } from '..'; const { toast } = createStandaloneToast({ @@ -74,22 +75,11 @@ export const addBatchEnqueuedListener = () => { ), }); }); - } else { - let detail = 'Unknown Error'; - let duration = undefined; - if (response.status === 403 && 'body' in response) { - detail = get(response, 'body.detail', 'Unknown Error'); - } else if (response.status === 403 && 'error' in response) { - detail = get(response, 'error.detail', 'Unknown Error'); - } else if (response.status === 403 && 'data' in response) { - detail = get(response, 'data.detail', 'Unknown Error'); - duration = 15000; - } + } else if (response.status !== 403) { toast({ title: t('queue.batchFailedToQueue'), + description: t('common.unknownError'), status: 'error', - description: detail, - ...(duration ? { duration } : {}), }); } logger('queue').error( diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/boardAndImagesDeleted.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/boardAndImagesDeleted.ts index a1be8de312..83fab1df54 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/boardAndImagesDeleted.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/boardAndImagesDeleted.ts @@ -4,6 +4,7 @@ import { getImageUsage } from 'features/deleteImageModal/store/selectors'; import { nodeEditorReset } from 'features/nodes/store/nodesSlice'; import { clearInitialImage } from 'features/parameters/store/generationSlice'; import { imagesApi } from 'services/api/endpoints/images'; + import { startAppListening } from '..'; export const addDeleteBoardAndImagesFulfilledListener = () => { @@ -19,9 +20,15 @@ export const addDeleteBoardAndImagesFulfilledListener = () => { let wasNodeEditorReset = false; let wereControlAdaptersReset = false; - const state = getState(); + const { generation, canvas, nodes, controlAdapters } = getState(); deleted_images.forEach((image_name) => { - const imageUsage = getImageUsage(state, image_name); + const imageUsage = getImageUsage( + generation, + canvas, + nodes, + controlAdapters, + image_name + ); if (imageUsage.isInitialImage && !wasInitialImageReset) { dispatch(clearInitialImage()); diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/boardIdSelected.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/boardIdSelected.ts index a8e1a04fc1..0bf5e9e264 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/boardIdSelected.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/boardIdSelected.ts @@ -9,9 +9,10 @@ import { IMAGE_CATEGORIES, } from 'features/gallery/store/types'; import { imagesApi } from 'services/api/endpoints/images'; -import { startAppListening } from '..'; import { imagesSelectors } from 'services/api/util'; +import { startAppListening } from '..'; + export const addBoardIdSelectedListener = () => { startAppListening({ matcher: isAnyOf(boardIdSelected, galleryViewChanged), @@ -49,11 +50,14 @@ export const addBoardIdSelectedListener = () => { if (isSuccess) { // the board was just changed - we can select the first image - const { data: boardImagesData } = imagesApi.endpoints.listImages.select( - queryArgs - )(getState()); + const { data: boardImagesData } = + imagesApi.endpoints.listImages.select(queryArgs)(getState()); - if (boardImagesData) { + if ( + boardImagesData && + boardIdSelected.match(action) && + action.payload.selectedImageName + ) { const firstImage = imagesSelectors.selectAll(boardImagesData)[0]; const selectedImage = imagesSelectors.selectById( boardImagesData, diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasCopiedToClipboard.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasCopiedToClipboard.ts index 1ac80d219b..ec2c2388e5 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasCopiedToClipboard.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasCopiedToClipboard.ts @@ -1,11 +1,12 @@ -import { canvasCopiedToClipboard } from 'features/canvas/store/actions'; -import { startAppListening } from '..'; import { $logger } from 'app/logging/logger'; +import { canvasCopiedToClipboard } from 'features/canvas/store/actions'; import { getBaseLayerBlob } from 'features/canvas/util/getBaseLayerBlob'; import { addToast } from 'features/system/store/systemSlice'; import { copyBlobToClipboard } from 'features/system/util/copyBlobToClipboard'; import { t } from 'i18next'; +import { startAppListening } from '..'; + export const addCanvasCopiedToClipboardListener = () => { startAppListening({ actionCreator: canvasCopiedToClipboard, diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasDownloadedAsImage.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasDownloadedAsImage.ts index cfaf20b64c..0cbdb8bfcc 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasDownloadedAsImage.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasDownloadedAsImage.ts @@ -1,11 +1,12 @@ -import { canvasDownloadedAsImage } from 'features/canvas/store/actions'; -import { startAppListening } from '..'; import { $logger } from 'app/logging/logger'; +import { canvasDownloadedAsImage } from 'features/canvas/store/actions'; import { downloadBlob } from 'features/canvas/util/downloadBlob'; import { getBaseLayerBlob } from 'features/canvas/util/getBaseLayerBlob'; import { addToast } from 'features/system/store/systemSlice'; import { t } from 'i18next'; +import { startAppListening } from '..'; + export const addCanvasDownloadedAsImageListener = () => { startAppListening({ actionCreator: canvasDownloadedAsImage, diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasImageToControlNet.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasImageToControlNet.ts index 01eda311e5..b9b08d2b4e 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasImageToControlNet.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasImageToControlNet.ts @@ -1,11 +1,12 @@ import { logger } from 'app/logging/logger'; +import { canvasImageToControlAdapter } from 'features/canvas/store/actions'; import { getBaseLayerBlob } from 'features/canvas/util/getBaseLayerBlob'; import { controlAdapterImageChanged } from 'features/controlAdapters/store/controlAdaptersSlice'; import { addToast } from 'features/system/store/systemSlice'; import { t } from 'i18next'; import { imagesApi } from 'services/api/endpoints/images'; + import { startAppListening } from '..'; -import { canvasImageToControlAdapter } from 'features/canvas/store/actions'; export const addCanvasImageToControlNetListener = () => { startAppListening({ diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasMaskSavedToGallery.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasMaskSavedToGallery.ts index f814d94f3a..d8a3c3827d 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasMaskSavedToGallery.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasMaskSavedToGallery.ts @@ -2,9 +2,10 @@ import { logger } from 'app/logging/logger'; import { canvasMaskSavedToGallery } from 'features/canvas/store/actions'; import { getCanvasData } from 'features/canvas/util/getCanvasData'; import { addToast } from 'features/system/store/systemSlice'; -import { imagesApi } from 'services/api/endpoints/images'; -import { startAppListening } from '..'; import { t } from 'i18next'; +import { imagesApi } from 'services/api/endpoints/images'; + +import { startAppListening } from '..'; export const addCanvasMaskSavedToGalleryListener = () => { startAppListening({ diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasMaskToControlNet.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasMaskToControlNet.ts index ccd5a3972b..cf1658cb41 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasMaskToControlNet.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasMaskToControlNet.ts @@ -5,6 +5,7 @@ import { controlAdapterImageChanged } from 'features/controlAdapters/store/contr import { addToast } from 'features/system/store/systemSlice'; import { t } from 'i18next'; import { imagesApi } from 'services/api/endpoints/images'; + import { startAppListening } from '..'; export const addCanvasMaskToControlNetListener = () => { diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasMerged.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasMerged.ts index 35c1affb97..946f413d34 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasMerged.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasMerged.ts @@ -1,12 +1,13 @@ import { $logger } from 'app/logging/logger'; import { canvasMerged } from 'features/canvas/store/actions'; +import { $canvasBaseLayer } from 'features/canvas/store/canvasNanostore'; import { setMergedCanvas } from 'features/canvas/store/canvasSlice'; import { getFullBaseLayerBlob } from 'features/canvas/util/getFullBaseLayerBlob'; -import { getCanvasBaseLayer } from 'features/canvas/util/konvaInstanceProvider'; import { addToast } from 'features/system/store/systemSlice'; -import { imagesApi } from 'services/api/endpoints/images'; -import { startAppListening } from '..'; import { t } from 'i18next'; +import { imagesApi } from 'services/api/endpoints/images'; + +import { startAppListening } from '..'; export const addCanvasMergedListener = () => { startAppListening({ @@ -29,7 +30,7 @@ export const addCanvasMergedListener = () => { return; } - const canvasBaseLayer = getCanvasBaseLayer(); + const canvasBaseLayer = $canvasBaseLayer.get(); if (!canvasBaseLayer) { moduleLog.error('Problem getting canvas base layer'); diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasSavedToGallery.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasSavedToGallery.ts index 23e2cebe53..f09cbe12d1 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasSavedToGallery.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasSavedToGallery.ts @@ -2,9 +2,10 @@ import { logger } from 'app/logging/logger'; import { canvasSavedToGallery } from 'features/canvas/store/actions'; import { getBaseLayerBlob } from 'features/canvas/util/getBaseLayerBlob'; import { addToast } from 'features/system/store/systemSlice'; -import { imagesApi } from 'services/api/endpoints/images'; -import { startAppListening } from '..'; import { t } from 'i18next'; +import { imagesApi } from 'services/api/endpoints/images'; + +import { startAppListening } from '..'; export const addCanvasSavedToGalleryListener = () => { startAppListening({ diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetAutoProcess.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetAutoProcess.ts index b16c2d8556..78e69d71c1 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetAutoProcess.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetAutoProcess.ts @@ -1,6 +1,6 @@ -import { AnyListenerPredicate } from '@reduxjs/toolkit'; +import type { AnyListenerPredicate } from '@reduxjs/toolkit'; import { logger } from 'app/logging/logger'; -import { RootState } from 'app/store/store'; +import type { RootState } from 'app/store/store'; import { controlAdapterImageProcessed } from 'features/controlAdapters/store/actions'; import { controlAdapterAutoConfigToggled, @@ -10,9 +10,10 @@ import { controlAdapterProcessortTypeChanged, selectControlAdapterById, } from 'features/controlAdapters/store/controlAdaptersSlice'; -import { startAppListening } from '..'; import { isControlNetOrT2IAdapter } from 'features/controlAdapters/store/types'; +import { startAppListening } from '..'; + type AnyControlAdapterParamChangeAction = | ReturnType | ReturnType @@ -68,10 +69,12 @@ const predicate: AnyListenerPredicate = ( return isProcessorSelected && hasControlImage; }; +const DEBOUNCE_MS = 300; + /** * Listener that automatically processes a ControlNet image when its processor parameters are changed. * - * The network request is debounced by 1 second. + * The network request is debounced. */ export const addControlNetAutoProcessListener = () => { startAppListening({ @@ -84,7 +87,7 @@ export const addControlNetAutoProcessListener = () => { cancelActiveListeners(); log.trace('ControlNet auto-process triggered'); // Delay before starting actual work - await delay(300); + await delay(DEBOUNCE_MS); dispatch(controlAdapterImageProcessed({ id })); }, diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetImageProcessed.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetImageProcessed.ts index 0966a8c86b..61316231cc 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetImageProcessed.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetImageProcessed.ts @@ -8,14 +8,15 @@ import { selectControlAdapterById, } from 'features/controlAdapters/store/controlAdaptersSlice'; import { isControlNetOrT2IAdapter } from 'features/controlAdapters/store/types'; +import { isImageOutput } from 'features/nodes/types/common'; import { addToast } from 'features/system/store/systemSlice'; import { t } from 'i18next'; import { imagesApi } from 'services/api/endpoints/images'; import { queueApi } from 'services/api/endpoints/queue'; -import { BatchConfig, ImageDTO } from 'services/api/types'; +import type { BatchConfig, ImageDTO } from 'services/api/types'; import { socketInvocationComplete } from 'services/events/actions'; + import { startAppListening } from '..'; -import { isImageOutput } from 'features/nodes/types/common'; export const addControlNetImageProcessedListener = () => { startAppListening({ @@ -109,20 +110,9 @@ export const addControlNetImageProcessedListener = () => { t('queue.graphFailedToQueue') ); - // handle usage-related errors if (error instanceof Object) { if ('data' in error && 'status' in error) { if (error.status === 403) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const detail = (error.data as any)?.detail || 'Unknown Error'; - dispatch( - addToast({ - title: t('queue.graphFailedToQueue'), - status: 'error', - description: detail, - duration: 15000, - }) - ); dispatch(pendingControlImagesCleared()); dispatch(controlAdapterImageChanged({ id, controlImage: null })); return; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/enqueueRequestedCanvas.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/enqueueRequestedCanvas.ts index bcaf778b6e..a803441c59 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/enqueueRequestedCanvas.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/enqueueRequestedCanvas.ts @@ -14,7 +14,8 @@ import { buildCanvasGraph } from 'features/nodes/util/graph/buildCanvasGraph'; import { prepareLinearUIBatch } from 'features/nodes/util/graph/buildLinearBatchConfig'; import { imagesApi } from 'services/api/endpoints/images'; import { queueApi } from 'services/api/endpoints/queue'; -import { ImageDTO } from 'services/api/types'; +import type { ImageDTO } from 'services/api/types'; + import { startAppListening } from '..'; /** diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/enqueueRequestedLinear.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/enqueueRequestedLinear.ts index faeecfb44c..547f5e5948 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/enqueueRequestedLinear.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/enqueueRequestedLinear.ts @@ -5,6 +5,7 @@ import { buildLinearSDXLImageToImageGraph } from 'features/nodes/util/graph/buil import { buildLinearSDXLTextToImageGraph } from 'features/nodes/util/graph/buildLinearSDXLTextToImageGraph'; import { buildLinearTextToImageGraph } from 'features/nodes/util/graph/buildLinearTextToImageGraph'; import { queueApi } from 'services/api/endpoints/queue'; + import { startAppListening } from '..'; export const addEnqueueRequestedLinear = () => { diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/enqueueRequestedNodes.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/enqueueRequestedNodes.ts index b9b1060f18..0ad33057fd 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/enqueueRequestedNodes.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/enqueueRequestedNodes.ts @@ -1,7 +1,9 @@ import { enqueueRequested } from 'app/store/actions'; import { buildNodesGraph } from 'features/nodes/util/graph/buildNodesGraph'; +import { buildWorkflowWithValidation } from 'features/nodes/util/workflow/buildWorkflow'; import { queueApi } from 'services/api/endpoints/queue'; -import { BatchConfig } from 'services/api/types'; +import type { BatchConfig } from 'services/api/types'; + import { startAppListening } from '..'; export const addEnqueueRequestedNodes = () => { @@ -10,10 +12,24 @@ export const addEnqueueRequestedNodes = () => { enqueueRequested.match(action) && action.payload.tabName === 'nodes', effect: async (action, { getState, dispatch }) => { const state = getState(); + const { nodes, edges } = state.nodes; + const workflow = state.workflow; const graph = buildNodesGraph(state.nodes); + const builtWorkflow = buildWorkflowWithValidation({ + nodes, + edges, + workflow, + }); + + if (builtWorkflow) { + // embedded workflows don't have an id + delete builtWorkflow.id; + } + const batchConfig: BatchConfig = { batch: { graph, + workflow: builtWorkflow, runs: state.generation.iterations, }, prepend: action.payload.prepend, diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/galleryImageClicked.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/galleryImageClicked.ts new file mode 100644 index 0000000000..4287f3ec16 --- /dev/null +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/galleryImageClicked.ts @@ -0,0 +1,80 @@ +import { createAction } from '@reduxjs/toolkit'; +import { selectListImagesQueryArgs } from 'features/gallery/store/gallerySelectors'; +import { selectionChanged } from 'features/gallery/store/gallerySlice'; +import { imagesApi } from 'services/api/endpoints/images'; +import type { ImageDTO } from 'services/api/types'; +import { imagesSelectors } from 'services/api/util'; + +import { startAppListening } from '..'; + +export const galleryImageClicked = createAction<{ + imageDTO: ImageDTO; + shiftKey: boolean; + ctrlKey: boolean; + metaKey: boolean; +}>('gallery/imageClicked'); + +/** + * This listener handles the logic for selecting images in the gallery. + * + * Previously, this logic was in a `useCallback` with the whole gallery selection as a dependency. Every time + * the selection changed, the callback got recreated and all images rerendered. This could easily block for + * hundreds of ms, more for lower end devices. + * + * Moving this logic into a listener means we don't need to recalculate anything dynamically and the gallery + * is much more responsive. + */ + +export const addGalleryImageClickedListener = () => { + startAppListening({ + actionCreator: galleryImageClicked, + effect: async (action, { dispatch, getState }) => { + const { imageDTO, shiftKey, ctrlKey, metaKey } = action.payload; + const state = getState(); + const queryArgs = selectListImagesQueryArgs(state); + const { data: listImagesData } = + imagesApi.endpoints.listImages.select(queryArgs)(state); + + if (!listImagesData) { + // Should never happen if we have clicked a gallery image + return; + } + + const imageDTOs = imagesSelectors.selectAll(listImagesData); + const selection = state.gallery.selection; + + if (shiftKey) { + const rangeEndImageName = imageDTO.image_name; + const lastSelectedImage = selection[selection.length - 1]?.image_name; + const lastClickedIndex = imageDTOs.findIndex( + (n) => n.image_name === lastSelectedImage + ); + const currentClickedIndex = imageDTOs.findIndex( + (n) => n.image_name === rangeEndImageName + ); + if (lastClickedIndex > -1 && currentClickedIndex > -1) { + // We have a valid range! + const start = Math.min(lastClickedIndex, currentClickedIndex); + const end = Math.max(lastClickedIndex, currentClickedIndex); + const imagesToSelect = imageDTOs.slice(start, end + 1); + dispatch(selectionChanged(selection.concat(imagesToSelect))); + } + } else if (ctrlKey || metaKey) { + if ( + selection.some((i) => i.image_name === imageDTO.image_name) && + selection.length > 1 + ) { + dispatch( + selectionChanged( + selection.filter((n) => n.image_name !== imageDTO.image_name) + ) + ); + } else { + dispatch(selectionChanged(selection.concat(imageDTO))); + } + } else { + dispatch(selectionChanged([imageDTO])); + } + }, + }); +}; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageAddedToBoard.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageAddedToBoard.ts index 039cbb657a..61da8ff669 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageAddedToBoard.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageAddedToBoard.ts @@ -1,5 +1,6 @@ import { logger } from 'app/logging/logger'; import { imagesApi } from 'services/api/endpoints/images'; + import { startAppListening } from '..'; export const addImageAddedToBoardFulfilledListener = () => { diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageDeleted.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageDeleted.ts index f23b7284fe..ccc6130cff 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageDeleted.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageDeleted.ts @@ -8,7 +8,7 @@ import { import { isControlNetOrT2IAdapter } from 'features/controlAdapters/store/types'; import { imageDeletionConfirmed } from 'features/deleteImageModal/store/actions'; import { isModalOpenChanged } from 'features/deleteImageModal/store/slice'; -import { selectListImagesBaseQueryArgs } from 'features/gallery/store/gallerySelectors'; +import { selectListImagesQueryArgs } from 'features/gallery/store/gallerySelectors'; import { imageSelected } from 'features/gallery/store/gallerySlice'; import { fieldImageValueChanged } from 'features/nodes/store/nodesSlice'; import { isImageFieldInputInstance } from 'features/nodes/types/field'; @@ -17,7 +17,8 @@ import { clearInitialImage } from 'features/parameters/store/generationSlice'; import { clamp, forEach } from 'lodash-es'; import { api } from 'services/api'; import { imagesApi } from 'services/api/endpoints/images'; -import { imagesAdapter } from 'services/api/util'; +import { imagesSelectors } from 'services/api/util'; + import { startAppListening } from '..'; export const addRequestedSingleImageDeletionListener = () => { @@ -48,13 +49,11 @@ export const addRequestedSingleImageDeletionListener = () => { if (imageDTO && imageDTO?.image_name === lastSelectedImage) { const { image_name } = imageDTO; - const baseQueryArgs = selectListImagesBaseQueryArgs(state); + const baseQueryArgs = selectListImagesQueryArgs(state); const { data } = imagesApi.endpoints.listImages.select(baseQueryArgs)(state); - const cachedImageDTOs = data - ? imagesAdapter.getSelectors().selectAll(data) - : []; + const cachedImageDTOs = data ? imagesSelectors.selectAll(data) : []; const deletedImageIndex = cachedImageDTOs.findIndex( (i) => i.image_name === image_name @@ -181,12 +180,12 @@ export const addRequestedMultipleImageDeletionListener = () => { imagesApi.endpoints.deleteImages.initiate({ imageDTOs }) ).unwrap(); const state = getState(); - const baseQueryArgs = selectListImagesBaseQueryArgs(state); + const queryArgs = selectListImagesQueryArgs(state); const { data } = - imagesApi.endpoints.listImages.select(baseQueryArgs)(state); + imagesApi.endpoints.listImages.select(queryArgs)(state); const newSelectedImageDTO = data - ? imagesAdapter.getSelectors().selectAll(data)[0] + ? imagesSelectors.selectAll(data)[0] : undefined; if (newSelectedImageDTO) { diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageDropped.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageDropped.ts index 584ec18f26..fdd5b45907 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageDropped.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageDropped.ts @@ -6,17 +6,18 @@ import { controlAdapterImageChanged, controlAdapterIsEnabledChanged, } from 'features/controlAdapters/store/controlAdaptersSlice'; -import { +import type { TypesafeDraggableData, TypesafeDroppableData, } from 'features/dnd/types'; import { imageSelected } from 'features/gallery/store/gallerySlice'; +import { fieldImageValueChanged } from 'features/nodes/store/nodesSlice'; import { - fieldImageValueChanged, - workflowExposedFieldAdded, -} from 'features/nodes/store/nodesSlice'; -import { initialImageChanged } from 'features/parameters/store/generationSlice'; + initialImageChanged, + selectOptimalDimension, +} from 'features/parameters/store/generationSlice'; import { imagesApi } from 'services/api/endpoints/images'; + import { startAppListening } from '../'; export const dndDropped = createAction<{ @@ -27,16 +28,16 @@ export const dndDropped = createAction<{ export const addImageDroppedListener = () => { startAppListening({ actionCreator: dndDropped, - effect: async (action, { dispatch }) => { + effect: async (action, { dispatch, getState }) => { const log = logger('dnd'); const { activeData, overData } = action.payload; if (activeData.payloadType === 'IMAGE_DTO') { log.debug({ activeData, overData }, 'Image dropped'); - } else if (activeData.payloadType === 'IMAGE_DTOS') { + } else if (activeData.payloadType === 'GALLERY_SELECTION') { log.debug( { activeData, overData }, - `Images (${activeData.payload.imageDTOs.length}) dropped` + `Images (${getState().gallery.selection.length}) dropped` ); } else if (activeData.payloadType === 'NODE_FIELD') { log.debug( @@ -47,19 +48,6 @@ export const addImageDroppedListener = () => { log.debug({ activeData, overData }, `Unknown payload dropped`); } - if ( - overData.actionType === 'ADD_FIELD_TO_LINEAR' && - activeData.payloadType === 'NODE_FIELD' - ) { - const { nodeId, field } = activeData.payload; - dispatch( - workflowExposedFieldAdded({ - nodeId, - fieldName: field.name, - }) - ); - } - /** * Image dropped on current image */ @@ -116,7 +104,12 @@ export const addImageDroppedListener = () => { activeData.payloadType === 'IMAGE_DTO' && activeData.payload.imageDTO ) { - dispatch(setInitialCanvasImage(activeData.payload.imageDTO)); + dispatch( + setInitialCanvasImage( + activeData.payload.imageDTO, + selectOptimalDimension(getState()) + ) + ); return; } @@ -200,10 +193,9 @@ export const addImageDroppedListener = () => { */ if ( overData.actionType === 'ADD_TO_BOARD' && - activeData.payloadType === 'IMAGE_DTOS' && - activeData.payload.imageDTOs + activeData.payloadType === 'GALLERY_SELECTION' ) { - const { imageDTOs } = activeData.payload; + const imageDTOs = getState().gallery.selection; const { boardId } = overData.context; dispatch( imagesApi.endpoints.addImagesToBoard.initiate({ @@ -219,10 +211,9 @@ export const addImageDroppedListener = () => { */ if ( overData.actionType === 'REMOVE_FROM_BOARD' && - activeData.payloadType === 'IMAGE_DTOS' && - activeData.payload.imageDTOs + activeData.payloadType === 'GALLERY_SELECTION' ) { - const { imageDTOs } = activeData.payload; + const imageDTOs = getState().gallery.selection; dispatch( imagesApi.endpoints.removeImagesFromBoard.initiate({ imageDTOs, diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageRemovedFromBoard.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageRemovedFromBoard.ts index a8bf0e6791..4c21a750f1 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageRemovedFromBoard.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageRemovedFromBoard.ts @@ -1,5 +1,6 @@ import { logger } from 'app/logging/logger'; import { imagesApi } from 'services/api/endpoints/images'; + import { startAppListening } from '..'; export const addImageRemovedFromBoardFulfilledListener = () => { diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageToDeleteSelected.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageToDeleteSelected.ts index 1c07caad29..ccc14165a3 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageToDeleteSelected.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageToDeleteSelected.ts @@ -4,6 +4,7 @@ import { imagesToDeleteSelected, isModalOpenChanged, } from 'features/deleteImageModal/store/slice'; + import { startAppListening } from '..'; export const addImageToDeleteSelectedListener = () => { diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageUploaded.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageUploaded.ts index 8b1a374207..c7141c51c5 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageUploaded.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageUploaded.ts @@ -1,4 +1,4 @@ -import { UseToastOptions } from '@chakra-ui/react'; +import type { UseToastOptions } from '@chakra-ui/react'; import { logger } from 'app/logging/logger'; import { setInitialCanvasImage } from 'features/canvas/store/canvasSlice'; import { @@ -6,14 +6,18 @@ import { controlAdapterIsEnabledChanged, } from 'features/controlAdapters/store/controlAdaptersSlice'; import { fieldImageValueChanged } from 'features/nodes/store/nodesSlice'; -import { initialImageChanged } from 'features/parameters/store/generationSlice'; +import { + initialImageChanged, + selectOptimalDimension, +} from 'features/parameters/store/generationSlice'; import { addToast } from 'features/system/store/systemSlice'; import { t } from 'i18next'; import { omit } from 'lodash-es'; import { boardsApi } from 'services/api/endpoints/boards'; -import { startAppListening } from '..'; import { imagesApi } from 'services/api/endpoints/images'; +import { startAppListening } from '..'; + export const addImageUploadedFulfilledListener = () => { startAppListening({ matcher: imagesApi.endpoints.uploadImage.matchFulfilled, @@ -75,7 +79,9 @@ export const addImageUploadedFulfilledListener = () => { } if (postUploadAction?.type === 'SET_CANVAS_INITIAL_IMAGE') { - dispatch(setInitialCanvasImage(imageDTO)); + dispatch( + setInitialCanvasImage(imageDTO, selectOptimalDimension(state)) + ); dispatch( addToast({ ...DEFAULT_UPLOADED_TOAST, diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imagesStarred.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imagesStarred.ts index 624fd0aa00..064e9876fc 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imagesStarred.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imagesStarred.ts @@ -1,7 +1,8 @@ -import { imagesApi } from 'services/api/endpoints/images'; -import { startAppListening } from '..'; import { selectionChanged } from 'features/gallery/store/gallerySlice'; -import { ImageDTO } from 'services/api/types'; +import { imagesApi } from 'services/api/endpoints/images'; +import type { ImageDTO } from 'services/api/types'; + +import { startAppListening } from '..'; export const addImagesStarredListener = () => { startAppListening({ diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imagesUnstarred.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imagesUnstarred.ts index f4fc12718e..7174bd066d 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imagesUnstarred.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imagesUnstarred.ts @@ -1,7 +1,8 @@ -import { imagesApi } from 'services/api/endpoints/images'; -import { startAppListening } from '..'; import { selectionChanged } from 'features/gallery/store/gallerySlice'; -import { ImageDTO } from 'services/api/types'; +import { imagesApi } from 'services/api/endpoints/images'; +import type { ImageDTO } from 'services/api/types'; + +import { startAppListening } from '..'; export const addImagesUnstarredListener = () => { startAppListening({ diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/initialImageSelected.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/initialImageSelected.ts index 7748ca6fe5..09598440a5 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/initialImageSelected.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/initialImageSelected.ts @@ -3,6 +3,7 @@ import { initialImageChanged } from 'features/parameters/store/generationSlice'; import { addToast } from 'features/system/store/systemSlice'; import { makeToast } from 'features/system/util/makeToast'; import { t } from 'i18next'; + import { startAppListening } from '..'; export const addInitialImageSelectedListener = () => { diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts index e4175affe6..67a85cdc14 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts @@ -1,5 +1,4 @@ import { logger } from 'app/logging/logger'; -import { setBoundingBoxDimensions } from 'features/canvas/store/canvasSlice'; import { controlAdapterIsEnabledChanged, selectControlAdapterAll, @@ -8,16 +7,15 @@ import { loraRemoved } from 'features/lora/store/loraSlice'; import { modelSelected } from 'features/parameters/store/actions'; import { modelChanged, - setHeight, - setWidth, vaeSelected, } from 'features/parameters/store/generationSlice'; +import { zParameterModel } from 'features/parameters/types/parameterSchemas'; import { addToast } from 'features/system/store/systemSlice'; import { makeToast } from 'features/system/util/makeToast'; import { t } from 'i18next'; import { forEach } from 'lodash-es'; + import { startAppListening } from '..'; -import { zParameterModel } from 'features/parameters/types/parameterSchemas'; export const addModelSelectedListener = () => { startAppListening({ @@ -39,8 +37,10 @@ export const addModelSelectedListener = () => { const newModel = result.data; const { base_model } = newModel; + const didBaseModelChange = + state.generation.model?.base_model !== base_model; - if (state.generation.model?.base_model !== base_model) { + if (didBaseModelChange) { // we may need to reset some incompatible submodels let modelsCleared = 0; @@ -83,23 +83,7 @@ export const addModelSelectedListener = () => { } } - // Update Width / Height / Bounding Box Dimensions on Model Change - if ( - state.generation.model?.base_model !== newModel.base_model && - state.ui.shouldAutoChangeDimensions - ) { - if (['sdxl', 'sdxl-refiner'].includes(newModel.base_model)) { - dispatch(setWidth(1024)); - dispatch(setHeight(1024)); - dispatch(setBoundingBoxDimensions({ width: 1024, height: 1024 })); - } else { - dispatch(setWidth(512)); - dispatch(setHeight(512)); - dispatch(setBoundingBoxDimensions({ width: 512, height: 512 })); - } - } - - dispatch(modelChanged(newModel)); + dispatch(modelChanged(newModel, state.generation.model)); }, }); }; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelsLoaded.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelsLoaded.ts index afb390470b..1e50d3578b 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelsLoaded.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelsLoaded.ts @@ -12,20 +12,17 @@ import { } from 'features/parameters/store/generationSlice'; import { zParameterModel, - zParameterSDXLRefinerModel, zParameterVAEModel, } from 'features/parameters/types/parameterSchemas'; -import { - refinerModelChanged, - setShouldUseSDXLRefiner, -} from 'features/sdxl/store/sdxlSlice'; +import { refinerModelChanged } from 'features/sdxl/store/sdxlSlice'; import { forEach, some } from 'lodash-es'; import { - mainModelsAdapter, + mainModelsAdapterSelectors, modelsApi, - vaeModelsAdapter, + vaeModelsAdapterSelectors, } from 'services/api/endpoints/models'; -import { TypeGuardFor } from 'services/api/types'; +import type { TypeGuardFor } from 'services/api/types'; + import { startAppListening } from '..'; export const addModelsLoadedListener = () => { @@ -46,7 +43,7 @@ export const addModelsLoadedListener = () => { ); const currentModel = getState().generation.model; - const models = mainModelsAdapter.getSelectors().selectAll(action.payload); + const models = mainModelsAdapterSelectors.selectAll(action.payload); if (models.length === 0) { // No models loaded at all @@ -77,7 +74,7 @@ export const addModelsLoadedListener = () => { return; } - dispatch(modelChanged(result.data)); + dispatch(modelChanged(result.data, currentModel)); }, }); startAppListening({ @@ -97,12 +94,11 @@ export const addModelsLoadedListener = () => { ); const currentModel = getState().sdxl.refinerModel; - const models = mainModelsAdapter.getSelectors().selectAll(action.payload); + const models = mainModelsAdapterSelectors.selectAll(action.payload); if (models.length === 0) { // No models loaded at all dispatch(refinerModelChanged(null)); - dispatch(setShouldUseSDXLRefiner(false)); return; } @@ -115,21 +111,10 @@ export const addModelsLoadedListener = () => { ) : false; - if (isCurrentModelAvailable) { + if (!isCurrentModelAvailable) { + dispatch(refinerModelChanged(null)); return; } - - const result = zParameterSDXLRefinerModel.safeParse(models[0]); - - if (!result.success) { - log.error( - { error: result.error.format() }, - 'Failed to parse SDXL Refiner Model' - ); - return; - } - - dispatch(refinerModelChanged(result.data)); }, }); startAppListening({ @@ -160,13 +145,11 @@ export const addModelsLoadedListener = () => { return; } - const firstModel = vaeModelsAdapter - .getSelectors() - .selectAll(action.payload)[0]; + const firstModel = vaeModelsAdapterSelectors.selectAll(action.payload)[0]; if (!firstModel) { // No custom VAEs loaded at all; use the default - dispatch(modelChanged(null)); + dispatch(vaeSelected(null)); return; } @@ -244,7 +227,7 @@ export const addModelsLoadedListener = () => { const log = logger('models'); log.info( { models: action.payload.entities }, - `ControlNet models loaded (${action.payload.ids.length})` + `T2I Adapter models loaded (${action.payload.ids.length})` ); selectAllT2IAdapters(getState().controlAdapters).forEach((ca) => { diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/promptChanged.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/promptChanged.ts index a48a84a30f..7b24220e98 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/promptChanged.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/promptChanged.ts @@ -8,9 +8,11 @@ import { parsingErrorChanged, promptsChanged, } from 'features/dynamicPrompts/store/dynamicPromptsSlice'; +import { getShouldProcessPrompt } from 'features/dynamicPrompts/util/getShouldProcessPrompt'; import { setPositivePrompt } from 'features/parameters/store/generationSlice'; import { utilitiesApi } from 'services/api/endpoints/utilities'; -import { appSocketConnected } from 'services/events/actions'; +import { socketConnected } from 'services/events/actions'; + import { startAppListening } from '..'; const matcher = isAnyOf( @@ -18,7 +20,7 @@ const matcher = isAnyOf( combinatorialToggled, maxPromptsChanged, maxPromptsReset, - appSocketConnected + socketConnected ); export const addDynamicPromptsListener = () => { @@ -28,20 +30,39 @@ export const addDynamicPromptsListener = () => { action, { dispatch, getState, cancelActiveListeners, delay } ) => { - // debounce request cancelActiveListeners(); - await delay(1000); - const state = getState(); + const { positivePrompt } = state.generation; + const { maxPrompts } = state.dynamicPrompts; if (state.config.disabledFeatures.includes('dynamicPrompting')) { return; } - const { positivePrompt } = state.generation; - const { maxPrompts } = state.dynamicPrompts; + const cachedPrompts = utilitiesApi.endpoints.dynamicPrompts.select({ + prompt: positivePrompt, + max_prompts: maxPrompts, + })(getState()).data; - dispatch(isLoadingChanged(true)); + if (cachedPrompts) { + dispatch(promptsChanged(cachedPrompts.prompts)); + return; + } + + if (!getShouldProcessPrompt(state.generation.positivePrompt)) { + if (state.dynamicPrompts.isLoading) { + dispatch(isLoadingChanged(false)); + } + dispatch(promptsChanged([state.generation.positivePrompt])); + return; + } + + if (!state.dynamicPrompts.isLoading) { + dispatch(isLoadingChanged(true)); + } + + // debounce request + await delay(1000); try { const req = dispatch( diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/receivedOpenAPISchema.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/receivedOpenAPISchema.ts index ff44317fcf..a11c49d069 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/receivedOpenAPISchema.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/receivedOpenAPISchema.ts @@ -1,9 +1,10 @@ import { logger } from 'app/logging/logger'; import { parseify } from 'common/util/serialize'; -import { nodeTemplatesBuilt } from 'features/nodes/store/nodesSlice'; +import { nodeTemplatesBuilt } from 'features/nodes/store/nodeTemplatesSlice'; import { parseSchema } from 'features/nodes/util/schema/parseSchema'; import { size } from 'lodash-es'; import { receivedOpenAPISchema } from 'services/api/thunks/schema'; + import { startAppListening } from '..'; export const addReceivedOpenAPISchemaListener = () => { diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketConnected.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketConnected.ts index 9957b7f117..e8e36d026c 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketConnected.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketConnected.ts @@ -1,36 +1,99 @@ import { logger } from 'app/logging/logger'; -import { size } from 'lodash-es'; +import { $baseUrl } from 'app/store/nanostores/baseUrl'; +import { isEqual, size } from 'lodash-es'; +import { atom } from 'nanostores'; import { api } from 'services/api'; +import { queueApi, selectQueueStatus } from 'services/api/endpoints/queue'; import { receivedOpenAPISchema } from 'services/api/thunks/schema'; -import { appSocketConnected, socketConnected } from 'services/events/actions'; +import { socketConnected } from 'services/events/actions'; + import { startAppListening } from '../..'; -import { isInitializedChanged } from 'features/system/store/systemSlice'; + +const log = logger('socketio'); + +const $isFirstConnection = atom(true); export const addSocketConnectedEventListener = () => { startAppListening({ actionCreator: socketConnected, - effect: (action, { dispatch, getState }) => { - const log = logger('socketio'); - + effect: async ( + action, + { dispatch, getState, cancelActiveListeners, delay } + ) => { log.debug('Connected'); - const { nodes, config, system } = getState(); + /** + * The rest of this listener has recovery logic for when the socket disconnects and reconnects. + * + * We need to re-fetch if something has changed while we were disconnected. In practice, the only + * thing that could change while disconnected is a queue item finishes processing. + * + * The queue status is a proxy for this - if the queue status has changed, we need to re-fetch + * the queries that may have changed while we were disconnected. + */ - const { disabledTabs } = config; + // Bail on the recovery logic if this is the first connection - we don't need to recover anything + if ($isFirstConnection.get()) { + $isFirstConnection.set(false); + return; + } - if (!size(nodes.nodeTemplates) && !disabledTabs.includes('nodes')) { + // If we are in development mode, reset the whole API state. In this scenario, reconnects will + // typically be caused by reloading the server, in which case we do want to reset the whole API. + if (import.meta.env.MODE === 'development') { + dispatch(api.util.resetApiState()); + } + + // Else, we need to compare the last-known queue status with the current queue status, re-fetching + // everything if it has changed. + + if ($baseUrl.get()) { + // If we have a baseUrl (e.g. not localhost), we need to debounce the re-fetch to not hammer server + cancelActiveListeners(); + // Add artificial jitter to the debounce + await delay(1000 + Math.random() * 1000); + } + + const prevQueueStatusData = selectQueueStatus(getState()).data; + + try { + // Fetch the queue status again + const queueStatusRequest = dispatch( + await queueApi.endpoints.getQueueStatus.initiate(undefined, { + forceRefetch: true, + }) + ); + const nextQueueStatusData = await queueStatusRequest.unwrap(); + queueStatusRequest.unsubscribe(); + + // If the queue hasn't changed, we don't need to do anything. + if (isEqual(prevQueueStatusData?.queue, nextQueueStatusData.queue)) { + return; + } + + //The queue has changed. We need to re-fetch everything that may have changed while we were + // disconnected. + dispatch(api.util.invalidateTags(['FetchOnReconnect'])); + } catch { + // no-op + log.debug('Unable to get current queue status on reconnect'); + } + }, + }); + + startAppListening({ + actionCreator: socketConnected, + effect: async (action, { dispatch, getState }) => { + const { nodeTemplates, config } = getState(); + // We only want to re-fetch the schema if we don't have any node templates + if ( + !size(nodeTemplates.templates) && + !config.disabledTabs.includes('nodes') + ) { + // This request is a createAsyncThunk - resetting API state as in the above listener + // will not trigger this request, so we need to manually do it. dispatch(receivedOpenAPISchema()); } - - if (system.isInitialized) { - // only reset the query caches if this connect event is a *reconnect* event - dispatch(api.util.resetApiState()); - } else { - dispatch(isInitializedChanged(true)); - } - - // pass along the socket event as an application action - dispatch(appSocketConnected(action.payload)); }, }); }; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketDisconnected.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketDisconnected.ts index 80e6fb0813..02d3b77f89 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketDisconnected.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketDisconnected.ts @@ -1,19 +1,15 @@ import { logger } from 'app/logging/logger'; -import { - appSocketDisconnected, - socketDisconnected, -} from 'services/events/actions'; +import { socketDisconnected } from 'services/events/actions'; + import { startAppListening } from '../..'; +const log = logger('socketio'); + export const addSocketDisconnectedEventListener = () => { startAppListening({ actionCreator: socketDisconnected, - effect: (action, { dispatch }) => { - const log = logger('socketio'); + effect: () => { log.debug('Disconnected'); - - // pass along the socket event as an application action - dispatch(appSocketDisconnected(action.payload)); }, }); }; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketGeneratorProgress.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketGeneratorProgress.ts index 44d6ceed63..0965f41ee1 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketGeneratorProgress.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketGeneratorProgress.ts @@ -1,19 +1,15 @@ import { logger } from 'app/logging/logger'; -import { - appSocketGeneratorProgress, - socketGeneratorProgress, -} from 'services/events/actions'; +import { socketGeneratorProgress } from 'services/events/actions'; + import { startAppListening } from '../..'; +const log = logger('socketio'); + export const addGeneratorProgressEventListener = () => { startAppListening({ actionCreator: socketGeneratorProgress, - effect: (action, { dispatch }) => { - const log = logger('socketio'); - + effect: (action) => { log.trace(action.payload, `Generator progress`); - - dispatch(appSocketGeneratorProgress(action.payload)); }, }); }; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketGraphExecutionStateComplete.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketGraphExecutionStateComplete.ts index 23ab9a8cb3..e4f83561c8 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketGraphExecutionStateComplete.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketGraphExecutionStateComplete.ts @@ -1,18 +1,15 @@ import { logger } from 'app/logging/logger'; -import { - appSocketGraphExecutionStateComplete, - socketGraphExecutionStateComplete, -} from 'services/events/actions'; +import { socketGraphExecutionStateComplete } from 'services/events/actions'; + import { startAppListening } from '../..'; +const log = logger('socketio'); + export const addGraphExecutionStateCompleteEventListener = () => { startAppListening({ actionCreator: socketGraphExecutionStateComplete, - effect: (action, { dispatch }) => { - const log = logger('socketio'); + effect: (action) => { log.debug(action.payload, 'Session complete'); - // pass along the socket event as an application action - dispatch(appSocketGraphExecutionStateComplete(action.payload)); }, }); }; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketInvocationComplete.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketInvocationComplete.ts index 364a2658bf..d59ac3fb11 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketInvocationComplete.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketInvocationComplete.ts @@ -7,6 +7,7 @@ import { imageSelected, } from 'features/gallery/store/gallerySlice'; import { IMAGE_CATEGORIES } from 'features/gallery/store/types'; +import { isImageOutput } from 'features/nodes/types/common'; import { LINEAR_UI_OUTPUT, nodeIDDenyList, @@ -14,21 +15,19 @@ import { import { boardsApi } from 'services/api/endpoints/boards'; import { imagesApi } from 'services/api/endpoints/images'; import { imagesAdapter } from 'services/api/util'; -import { - appSocketInvocationComplete, - socketInvocationComplete, -} from 'services/events/actions'; +import { socketInvocationComplete } from 'services/events/actions'; + import { startAppListening } from '../..'; -import { isImageOutput } from 'features/nodes/types/common'; // These nodes output an image, but do not actually *save* an image, so we don't want to handle the gallery logic on them const nodeTypeDenylist = ['load_image', 'image']; +const log = logger('socketio'); + export const addInvocationCompleteEventListener = () => { startAppListening({ actionCreator: socketInvocationComplete, effect: async (action, { dispatch, getState }) => { - const log = logger('socketio'); const { data } = action.payload; log.debug( { data: parseify(data) }, @@ -135,8 +134,6 @@ export const addInvocationCompleteEventListener = () => { } } } - // pass along the socket event as an application action - dispatch(appSocketInvocationComplete(action.payload)); }, }); }; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketInvocationError.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketInvocationError.ts index ce15b8398c..a13a9011c5 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketInvocationError.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketInvocationError.ts @@ -1,20 +1,18 @@ import { logger } from 'app/logging/logger'; -import { - appSocketInvocationError, - socketInvocationError, -} from 'services/events/actions'; +import { socketInvocationError } from 'services/events/actions'; + import { startAppListening } from '../..'; +const log = logger('socketio'); + export const addInvocationErrorEventListener = () => { startAppListening({ actionCreator: socketInvocationError, - effect: (action, { dispatch }) => { - const log = logger('socketio'); + effect: (action) => { log.error( action.payload, `Invocation error (${action.payload.data.node.type})` ); - dispatch(appSocketInvocationError(action.payload)); }, }); }; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketInvocationRetrievalError.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketInvocationRetrievalError.ts index aa88457eb7..394c67dbc9 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketInvocationRetrievalError.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketInvocationRetrievalError.ts @@ -1,20 +1,18 @@ import { logger } from 'app/logging/logger'; -import { - appSocketInvocationRetrievalError, - socketInvocationRetrievalError, -} from 'services/events/actions'; +import { socketInvocationRetrievalError } from 'services/events/actions'; + import { startAppListening } from '../..'; +const log = logger('socketio'); + export const addInvocationRetrievalErrorEventListener = () => { startAppListening({ actionCreator: socketInvocationRetrievalError, - effect: (action, { dispatch }) => { - const log = logger('socketio'); + effect: (action) => { log.error( action.payload, `Invocation retrieval error (${action.payload.data.graph_execution_state_id})` ); - dispatch(appSocketInvocationRetrievalError(action.payload)); }, }); }; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketInvocationStarted.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketInvocationStarted.ts index 50f52e2851..6b293132a2 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketInvocationStarted.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketInvocationStarted.ts @@ -1,22 +1,18 @@ import { logger } from 'app/logging/logger'; -import { - appSocketInvocationStarted, - socketInvocationStarted, -} from 'services/events/actions'; +import { socketInvocationStarted } from 'services/events/actions'; + import { startAppListening } from '../..'; +const log = logger('socketio'); + export const addInvocationStartedEventListener = () => { startAppListening({ actionCreator: socketInvocationStarted, - effect: (action, { dispatch }) => { - const log = logger('socketio'); - + effect: (action) => { log.debug( action.payload, `Invocation started (${action.payload.data.node.type})` ); - - dispatch(appSocketInvocationStarted(action.payload)); }, }); }; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketModelLoad.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketModelLoad.ts index 0f3fabbc1e..828102bfa9 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketModelLoad.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketModelLoad.ts @@ -1,17 +1,17 @@ import { logger } from 'app/logging/logger'; import { - appSocketModelLoadCompleted, - appSocketModelLoadStarted, socketModelLoadCompleted, socketModelLoadStarted, } from 'services/events/actions'; + import { startAppListening } from '../..'; +const log = logger('socketio'); + export const addModelLoadEventListener = () => { startAppListening({ actionCreator: socketModelLoadStarted, - effect: (action, { dispatch }) => { - const log = logger('socketio'); + effect: (action) => { const { base_model, model_name, model_type, submodel } = action.payload.data; @@ -22,16 +22,12 @@ export const addModelLoadEventListener = () => { } log.debug(action.payload, message); - - // pass along the socket event as an application action - dispatch(appSocketModelLoadStarted(action.payload)); }, }); startAppListening({ actionCreator: socketModelLoadCompleted, - effect: (action, { dispatch }) => { - const log = logger('socketio'); + effect: (action) => { const { base_model, model_name, model_type, submodel } = action.payload.data; @@ -42,8 +38,6 @@ export const addModelLoadEventListener = () => { } log.debug(action.payload, message); - // pass along the socket event as an application action - dispatch(appSocketModelLoadCompleted(action.payload)); }, }); }; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketQueueItemStatusChanged.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketQueueItemStatusChanged.ts index a7d4c68437..a766437f15 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketQueueItemStatusChanged.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketQueueItemStatusChanged.ts @@ -1,17 +1,15 @@ import { logger } from 'app/logging/logger'; import { queueApi, queueItemsAdapter } from 'services/api/endpoints/queue'; -import { - appSocketQueueItemStatusChanged, - socketQueueItemStatusChanged, -} from 'services/events/actions'; +import { socketQueueItemStatusChanged } from 'services/events/actions'; + import { startAppListening } from '../..'; +const log = logger('socketio'); + export const addSocketQueueItemStatusChangedEventListener = () => { startAppListening({ actionCreator: socketQueueItemStatusChanged, effect: async (action, { dispatch }) => { - const log = logger('socketio'); - // we've got new status for the queue item, batch and queue const { queue_item, batch_status, queue_status } = action.payload.data; @@ -24,7 +22,7 @@ export const addSocketQueueItemStatusChangedEventListener = () => { dispatch( queueApi.util.updateQueryData('listQueueItems', undefined, (draft) => { queueItemsAdapter.updateOne(draft, { - id: queue_item.item_id, + id: String(queue_item.item_id), changes: queue_item, }); }) @@ -72,9 +70,6 @@ export const addSocketQueueItemStatusChangedEventListener = () => { 'InvocationCacheStatus', ]) ); - - // Pass the event along - dispatch(appSocketQueueItemStatusChanged(action.payload)); }, }); }; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketSessionRetrievalError.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketSessionRetrievalError.ts index 7efb7f463a..e20a8cf6cb 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketSessionRetrievalError.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketSessionRetrievalError.ts @@ -1,20 +1,18 @@ import { logger } from 'app/logging/logger'; -import { - appSocketSessionRetrievalError, - socketSessionRetrievalError, -} from 'services/events/actions'; +import { socketSessionRetrievalError } from 'services/events/actions'; + import { startAppListening } from '../..'; +const log = logger('socketio'); + export const addSessionRetrievalErrorEventListener = () => { startAppListening({ actionCreator: socketSessionRetrievalError, - effect: (action, { dispatch }) => { - const log = logger('socketio'); + effect: (action) => { log.error( action.payload, `Session retrieval error (${action.payload.data.graph_execution_state_id})` ); - dispatch(appSocketSessionRetrievalError(action.payload)); }, }); }; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketSubscribed.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketSubscribed.ts index 1f9354ee67..df7d5b4e02 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketSubscribed.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketSubscribed.ts @@ -1,17 +1,15 @@ import { logger } from 'app/logging/logger'; -import { - appSocketSubscribedSession, - socketSubscribedSession, -} from 'services/events/actions'; +import { socketSubscribedSession } from 'services/events/actions'; + import { startAppListening } from '../..'; +const log = logger('socketio'); + export const addSocketSubscribedEventListener = () => { startAppListening({ actionCreator: socketSubscribedSession, - effect: (action, { dispatch }) => { - const log = logger('socketio'); + effect: (action) => { log.debug(action.payload, 'Subscribed'); - dispatch(appSocketSubscribedSession(action.payload)); }, }); }; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketUnsubscribed.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketUnsubscribed.ts index 2f4f65edc6..4552fba2c5 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketUnsubscribed.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketUnsubscribed.ts @@ -1,17 +1,14 @@ import { logger } from 'app/logging/logger'; -import { - appSocketUnsubscribedSession, - socketUnsubscribedSession, -} from 'services/events/actions'; +import { socketUnsubscribedSession } from 'services/events/actions'; + import { startAppListening } from '../..'; +const log = logger('socketio'); export const addSocketUnsubscribedEventListener = () => { startAppListening({ actionCreator: socketUnsubscribedSession, - effect: (action, { dispatch }) => { - const log = logger('socketio'); + effect: (action) => { log.debug(action.payload, 'Unsubscribed'); - dispatch(appSocketUnsubscribedSession(action.payload)); }, }); }; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/stagingAreaImageSaved.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/stagingAreaImageSaved.ts index c00cf78beb..8a38be1b77 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/stagingAreaImageSaved.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/stagingAreaImageSaved.ts @@ -1,8 +1,9 @@ import { stagingAreaImageSaved } from 'features/canvas/store/actions'; import { addToast } from 'features/system/store/systemSlice'; -import { imagesApi } from 'services/api/endpoints/images'; -import { startAppListening } from '..'; import { t } from 'i18next'; +import { imagesApi } from 'services/api/endpoints/images'; + +import { startAppListening } from '..'; export const addStagingAreaImageSavedListener = () => { startAppListening({ diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/tabChanged.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/tabChanged.ts deleted file mode 100644 index 6791324fdd..0000000000 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/tabChanged.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { modelChanged } from 'features/parameters/store/generationSlice'; -import { setActiveTab } from 'features/ui/store/uiSlice'; -import { NON_REFINER_BASE_MODELS } from 'services/api/constants'; -import { mainModelsAdapter, modelsApi } from 'services/api/endpoints/models'; -import { startAppListening } from '..'; - -export const addTabChangedListener = () => { - startAppListening({ - actionCreator: setActiveTab, - effect: async (action, { getState, dispatch }) => { - const activeTabName = action.payload; - if (activeTabName === 'unifiedCanvas') { - const currentBaseModel = getState().generation.model?.base_model; - - if ( - currentBaseModel && - ['sd-1', 'sd-2', 'sdxl'].includes(currentBaseModel) - ) { - // if we're already on a valid model, no change needed - return; - } - - try { - // just grab fresh models - const modelsRequest = dispatch( - modelsApi.endpoints.getMainModels.initiate(NON_REFINER_BASE_MODELS) - ); - const models = await modelsRequest.unwrap(); - // cancel this cache subscription - modelsRequest.unsubscribe(); - - if (!models.ids.length) { - // no valid canvas models - dispatch(modelChanged(null)); - return; - } - - // need to filter out all the invalid canvas models (currently sdxl & refiner) - const validCanvasModels = mainModelsAdapter - .getSelectors() - .selectAll(models) - .filter((model) => - ['sd-1', 'sd-2', 'sxdl'].includes(model.base_model) - ); - - const firstValidCanvasModel = validCanvasModels[0]; - - if (!firstValidCanvasModel) { - // no valid canvas models - dispatch(modelChanged(null)); - return; - } - - const { base_model, model_name, model_type } = firstValidCanvasModel; - - dispatch(modelChanged({ base_model, model_name, model_type })); - } catch { - // network request failed, bail - dispatch(modelChanged(null)); - } - } - }, - }); -}; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/updateAllNodesRequested.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/updateAllNodesRequested.ts index 1df083c795..371983c781 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/updateAllNodesRequested.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/updateAllNodesRequested.ts @@ -1,15 +1,16 @@ import { logger } from 'app/logging/logger'; import { updateAllNodesRequested } from 'features/nodes/store/actions'; import { nodeReplaced } from 'features/nodes/store/nodesSlice'; +import { NodeUpdateError } from 'features/nodes/types/error'; +import { isInvocationNode } from 'features/nodes/types/invocation'; import { getNeedsUpdate, updateNode, } from 'features/nodes/util/node/nodeUpdate'; -import { NodeUpdateError } from 'features/nodes/types/error'; -import { isInvocationNode } from 'features/nodes/types/invocation'; import { addToast } from 'features/system/store/systemSlice'; import { makeToast } from 'features/system/util/makeToast'; import { t } from 'i18next'; + import { startAppListening } from '..'; export const addUpdateAllNodesRequestedListener = () => { @@ -18,7 +19,7 @@ export const addUpdateAllNodesRequestedListener = () => { effect: (action, { dispatch, getState }) => { const log = logger('nodes'); const nodes = getState().nodes.nodes; - const templates = getState().nodes.nodeTemplates; + const templates = getState().nodeTemplates.templates; let unableToUpdateCount = 0; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/upscaleRequested.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/upscaleRequested.ts index 7dbb7d9fb1..75c67a08cc 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/upscaleRequested.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/upscaleRequested.ts @@ -2,12 +2,13 @@ import { createAction } from '@reduxjs/toolkit'; import { logger } from 'app/logging/logger'; import { parseify } from 'common/util/serialize'; import { buildAdHocUpscaleGraph } from 'features/nodes/util/graph/buildAdHocUpscaleGraph'; +import { createIsAllowedToUpscaleSelector } from 'features/parameters/hooks/useIsAllowedToUpscale'; import { addToast } from 'features/system/store/systemSlice'; import { t } from 'i18next'; import { queueApi } from 'services/api/endpoints/queue'; +import type { BatchConfig, ImageDTO } from 'services/api/types'; + import { startAppListening } from '..'; -import { BatchConfig, ImageDTO } from 'services/api/types'; -import { createIsAllowedToUpscaleSelector } from 'features/parameters/hooks/useIsAllowedToUpscale'; export const upscaleRequested = createAction<{ imageDTO: ImageDTO }>( `upscale/upscaleRequested` @@ -75,31 +76,20 @@ export const addUpscaleRequestedListener = () => { t('queue.graphFailedToQueue') ); - // handle usage-related errors - if (error instanceof Object) { - if ('data' in error && 'status' in error) { - if (error.status === 403) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const detail = (error.data as any)?.detail || 'Unknown Error'; - dispatch( - addToast({ - title: t('queue.graphFailedToQueue'), - status: 'error', - description: detail, - duration: 15000, - }) - ); - return; - } - } + if ( + error instanceof Object && + 'status' in error && + error.status === 403 + ) { + return; + } else { + dispatch( + addToast({ + title: t('queue.graphFailedToQueue'), + status: 'error', + }) + ); } - - dispatch( - addToast({ - title: t('queue.graphFailedToQueue'), - status: 'error', - }) - ); } }, }); diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/workflowLoadRequested.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/workflowLoadRequested.ts index bd677ca6f1..1e26ea7a0c 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/workflowLoadRequested.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/workflowLoadRequested.ts @@ -1,7 +1,9 @@ import { logger } from 'app/logging/logger'; import { parseify } from 'common/util/serialize'; -import { workflowLoadRequested } from 'features/nodes/store/actions'; -import { workflowLoaded } from 'features/nodes/store/nodesSlice'; +import { + workflowLoaded, + workflowLoadRequested, +} from 'features/nodes/store/actions'; import { $flow } from 'features/nodes/store/reactFlowInstance'; import { WorkflowMigrationError, @@ -14,6 +16,7 @@ import { setActiveTab } from 'features/ui/store/uiSlice'; import { t } from 'i18next'; import { z } from 'zod'; import { fromZodError } from 'zod-validation-error'; + import { startAppListening } from '..'; export const addWorkflowLoadRequestedListener = () => { @@ -21,14 +24,20 @@ export const addWorkflowLoadRequestedListener = () => { actionCreator: workflowLoadRequested, effect: (action, { dispatch, getState }) => { const log = logger('nodes'); - const workflow = action.payload; - const nodeTemplates = getState().nodes.nodeTemplates; + const { workflow, asCopy } = action.payload; + const nodeTemplates = getState().nodeTemplates.templates; try { const { workflow: validatedWorkflow, warnings } = validateWorkflow( workflow, nodeTemplates ); + + if (asCopy) { + // If we're loading a copy, we need to remove the ID so that the backend will create a new workflow + delete validatedWorkflow.id; + } + dispatch(workflowLoaded(validatedWorkflow)); if (!warnings.length) { dispatch( @@ -99,7 +108,6 @@ export const addWorkflowLoadRequestedListener = () => { ); } else { // Some other error occurred - console.log(e); log.error( { error: parseify(e) }, t('nodes.unknownErrorValidatingWorkflow') diff --git a/invokeai/frontend/web/src/app/store/nanostores/README.md b/invokeai/frontend/web/src/app/store/nanostores/README.md new file mode 100644 index 0000000000..9b85e586ba --- /dev/null +++ b/invokeai/frontend/web/src/app/store/nanostores/README.md @@ -0,0 +1,3 @@ +# nanostores + +For non-serializable data that needs to be available throughout the app, or when redux is not appropriate, use nanostores. diff --git a/invokeai/frontend/web/src/app/store/nanostores/customNavComponent.ts b/invokeai/frontend/web/src/app/store/nanostores/customNavComponent.ts new file mode 100644 index 0000000000..1a6a5571a0 --- /dev/null +++ b/invokeai/frontend/web/src/app/store/nanostores/customNavComponent.ts @@ -0,0 +1,4 @@ +import { atom } from 'nanostores'; +import type { ReactNode } from 'react'; + +export const $customNavComponent = atom(undefined); diff --git a/invokeai/frontend/web/src/app/store/nanostores/customStarUI.ts b/invokeai/frontend/web/src/app/store/nanostores/customStarUI.ts index 0459c2f31f..bb815164e5 100644 --- a/invokeai/frontend/web/src/app/store/nanostores/customStarUI.ts +++ b/invokeai/frontend/web/src/app/store/nanostores/customStarUI.ts @@ -1,4 +1,4 @@ -import { MenuItemProps } from '@chakra-ui/react'; +import type { MenuItemProps } from '@chakra-ui/react'; import { atom } from 'nanostores'; export type CustomStarUi = { diff --git a/invokeai/frontend/web/src/app/store/nanostores/galleryHeader.ts b/invokeai/frontend/web/src/app/store/nanostores/galleryHeader.ts new file mode 100644 index 0000000000..5de7b1dd40 --- /dev/null +++ b/invokeai/frontend/web/src/app/store/nanostores/galleryHeader.ts @@ -0,0 +1,4 @@ +import { atom } from 'nanostores'; +import type { ReactNode } from 'react'; + +export const $galleryHeader = atom(undefined); diff --git a/invokeai/frontend/web/src/app/store/nanostores/headerComponent.ts b/invokeai/frontend/web/src/app/store/nanostores/headerComponent.ts deleted file mode 100644 index 90a4775ff9..0000000000 --- a/invokeai/frontend/web/src/app/store/nanostores/headerComponent.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { atom } from 'nanostores'; -import { ReactNode } from 'react'; - -export const $headerComponent = atom(undefined); diff --git a/invokeai/frontend/web/src/app/store/nanostores/index.ts b/invokeai/frontend/web/src/app/store/nanostores/index.ts deleted file mode 100644 index ae43ed3035..0000000000 --- a/invokeai/frontend/web/src/app/store/nanostores/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -/** - * For non-serializable data that needs to be available throughout the app, or when redux is not appropriate, use nanostores. - */ diff --git a/invokeai/frontend/web/src/app/store/nanostores/logo.ts b/invokeai/frontend/web/src/app/store/nanostores/logo.ts new file mode 100644 index 0000000000..5fd94ebd90 --- /dev/null +++ b/invokeai/frontend/web/src/app/store/nanostores/logo.ts @@ -0,0 +1,4 @@ +import { atom } from 'nanostores'; +import type { ReactNode } from 'react'; + +export const $logo = atom(undefined); diff --git a/invokeai/frontend/web/src/app/store/nanostores/store.ts b/invokeai/frontend/web/src/app/store/nanostores/store.ts index c9f041fa5d..59eba50e87 100644 --- a/invokeai/frontend/web/src/app/store/nanostores/store.ts +++ b/invokeai/frontend/web/src/app/store/nanostores/store.ts @@ -1,5 +1,13 @@ -import { Store } from '@reduxjs/toolkit'; +import type { createStore } from 'app/store/store'; import { atom } from 'nanostores'; -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export const $store = atom | undefined>(); +// Inject socket options and url into window for debugging +declare global { + interface Window { + $store?: typeof $store; + } +} + +export const $store = atom< + Readonly> | undefined +>(); diff --git a/invokeai/frontend/web/src/app/store/store.ts b/invokeai/frontend/web/src/app/store/store.ts index 0e3634468b..567b70786f 100644 --- a/invokeai/frontend/web/src/app/store/store.ts +++ b/invokeai/frontend/web/src/app/store/store.ts @@ -1,49 +1,107 @@ +import type { ThunkDispatch, UnknownAction } from '@reduxjs/toolkit'; import { - AnyAction, - ThunkDispatch, autoBatchEnhancer, combineReducers, configureStore, } from '@reduxjs/toolkit'; -import canvasReducer from 'features/canvas/store/canvasSlice'; +import { logger } from 'app/logging/logger'; +import { idbKeyValDriver } from 'app/store/enhancers/reduxRemember/driver'; +import { errorHandler } from 'app/store/enhancers/reduxRemember/errors'; +import { canvasPersistDenylist } from 'features/canvas/store/canvasPersistDenylist'; +import canvasReducer, { + initialCanvasState, + migrateCanvasState, +} from 'features/canvas/store/canvasSlice'; import changeBoardModalReducer from 'features/changeBoardModal/store/slice'; -import controlAdaptersReducer from 'features/controlAdapters/store/controlAdaptersSlice'; +import { controlAdaptersPersistDenylist } from 'features/controlAdapters/store/controlAdaptersPersistDenylist'; +import controlAdaptersReducer, { + initialControlAdaptersState, + migrateControlAdaptersState, +} from 'features/controlAdapters/store/controlAdaptersSlice'; import deleteImageModalReducer from 'features/deleteImageModal/store/slice'; -import dynamicPromptsReducer from 'features/dynamicPrompts/store/dynamicPromptsSlice'; -import galleryReducer from 'features/gallery/store/gallerySlice'; -import loraReducer from 'features/lora/store/loraSlice'; -import modelmanagerReducer from 'features/modelManager/store/modelManagerSlice'; -import nodesReducer from 'features/nodes/store/nodesSlice'; -import generationReducer from 'features/parameters/store/generationSlice'; -import postprocessingReducer from 'features/parameters/store/postprocessingSlice'; +import { dynamicPromptsPersistDenylist } from 'features/dynamicPrompts/store/dynamicPromptsPersistDenylist'; +import dynamicPromptsReducer, { + initialDynamicPromptsState, + migrateDynamicPromptsState, +} from 'features/dynamicPrompts/store/dynamicPromptsSlice'; +import { galleryPersistDenylist } from 'features/gallery/store/galleryPersistDenylist'; +import galleryReducer, { + initialGalleryState, + migrateGalleryState, +} from 'features/gallery/store/gallerySlice'; +import hrfReducer, { + initialHRFState, + migrateHRFState, +} from 'features/hrf/store/hrfSlice'; +import loraReducer, { + initialLoraState, + migrateLoRAState, +} from 'features/lora/store/loraSlice'; +import modelmanagerReducer, { + initialModelManagerState, + migrateModelManagerState, +} from 'features/modelManager/store/modelManagerSlice'; +import { nodesPersistDenylist } from 'features/nodes/store/nodesPersistDenylist'; +import nodesReducer, { + initialNodesState, + migrateNodesState, +} from 'features/nodes/store/nodesSlice'; +import nodeTemplatesReducer from 'features/nodes/store/nodeTemplatesSlice'; +import workflowReducer, { + initialWorkflowState, + migrateWorkflowState, +} from 'features/nodes/store/workflowSlice'; +import { generationPersistDenylist } from 'features/parameters/store/generationPersistDenylist'; +import generationReducer, { + initialGenerationState, + migrateGenerationState, +} from 'features/parameters/store/generationSlice'; +import { postprocessingPersistDenylist } from 'features/parameters/store/postprocessingPersistDenylist'; +import postprocessingReducer, { + initialPostprocessingState, + migratePostprocessingState, +} from 'features/parameters/store/postprocessingSlice'; import queueReducer from 'features/queue/store/queueSlice'; -import sdxlReducer from 'features/sdxl/store/sdxlSlice'; +import sdxlReducer, { + initialSDXLState, + migrateSDXLState, +} from 'features/sdxl/store/sdxlSlice'; import configReducer from 'features/system/store/configSlice'; -import systemReducer from 'features/system/store/systemSlice'; -import hotkeysReducer from 'features/ui/store/hotkeysSlice'; -import uiReducer from 'features/ui/store/uiSlice'; +import { systemPersistDenylist } from 'features/system/store/systemPersistDenylist'; +import systemReducer, { + initialSystemState, + migrateSystemState, +} from 'features/system/store/systemSlice'; +import { uiPersistDenylist } from 'features/ui/store/uiPersistDenylist'; +import uiReducer, { + initialUIState, + migrateUIState, +} from 'features/ui/store/uiSlice'; +import { diff } from 'jsondiffpatch'; +import { defaultsDeep, keys, omit, pick } from 'lodash-es'; import dynamicMiddlewares from 'redux-dynamic-middlewares'; -import { Driver, rememberEnhancer, rememberReducer } from 'redux-remember'; +import type { SerializeFunction, UnserializeFunction } from 'redux-remember'; +import { rememberEnhancer, rememberReducer } from 'redux-remember'; +import { serializeError } from 'serialize-error'; import { api } from 'services/api'; +import { authToastMiddleware } from 'services/api/authToastMiddleware'; +import type { JsonObject } from 'type-fest'; + import { STORAGE_PREFIX } from './constants'; -import { serialize } from './enhancers/reduxRemember/serialize'; -import { unserialize } from './enhancers/reduxRemember/unserialize'; import { actionSanitizer } from './middleware/devtools/actionSanitizer'; import { actionsDenylist } from './middleware/devtools/actionsDenylist'; import { stateSanitizer } from './middleware/devtools/stateSanitizer'; import { listenerMiddleware } from './middleware/listenerMiddleware'; -import { createStore as createIDBKeyValStore, get, set } from 'idb-keyval'; - const allReducers = { canvas: canvasReducer, gallery: galleryReducer, generation: generationReducer, nodes: nodesReducer, + nodeTemplates: nodeTemplatesReducer, postprocessing: postprocessingReducer, system: systemReducer, config: configReducer, ui: uiReducer, - hotkeys: hotkeysReducer, controlAdapters: controlAdaptersReducer, dynamicPrompts: dynamicPromptsReducer, deleteImageModal: deleteImageModalReducer, @@ -52,6 +110,8 @@ const allReducers = { modelmanager: modelmanagerReducer, sdxl: sdxlReducer, queue: queueReducer, + workflow: workflowReducer, + hrf: hrfReducer, [api.reducerPath]: api.reducer, }; @@ -59,12 +119,13 @@ const rootReducer = combineReducers(allReducers); const rememberedRootReducer = rememberReducer(rootReducer); -const rememberedKeys: (keyof typeof allReducers)[] = [ +const rememberedKeys = [ 'canvas', 'gallery', 'generation', 'sdxl', 'nodes', + 'workflow', 'postprocessing', 'system', 'ui', @@ -72,34 +133,112 @@ const rememberedKeys: (keyof typeof allReducers)[] = [ 'dynamicPrompts', 'lora', 'modelmanager', -]; + 'hrf', +] satisfies (keyof typeof allReducers)[]; -// Create a custom idb-keyval store (just needed to customize the name) -export const idbKeyValStore = createIDBKeyValStore('invoke', 'invoke-store'); - -// Create redux-remember driver, wrapping idb-keyval -const idbKeyValDriver: Driver = { - getItem: (key) => get(key, idbKeyValStore), - setItem: (key, value) => set(key, value, idbKeyValStore), +type SliceConfig = { + /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ + initialState: any; + /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ + migrate: (state: any) => any; }; -export const createStore = (uniqueStoreKey?: string) => +const sliceConfigs: { + [key in (typeof rememberedKeys)[number]]: SliceConfig; +} = { + canvas: { initialState: initialCanvasState, migrate: migrateCanvasState }, + gallery: { initialState: initialGalleryState, migrate: migrateGalleryState }, + generation: { + initialState: initialGenerationState, + migrate: migrateGenerationState, + }, + nodes: { initialState: initialNodesState, migrate: migrateNodesState }, + postprocessing: { + initialState: initialPostprocessingState, + migrate: migratePostprocessingState, + }, + system: { initialState: initialSystemState, migrate: migrateSystemState }, + workflow: { + initialState: initialWorkflowState, + migrate: migrateWorkflowState, + }, + ui: { initialState: initialUIState, migrate: migrateUIState }, + controlAdapters: { + initialState: initialControlAdaptersState, + migrate: migrateControlAdaptersState, + }, + dynamicPrompts: { + initialState: initialDynamicPromptsState, + migrate: migrateDynamicPromptsState, + }, + sdxl: { initialState: initialSDXLState, migrate: migrateSDXLState }, + lora: { initialState: initialLoraState, migrate: migrateLoRAState }, + modelmanager: { + initialState: initialModelManagerState, + migrate: migrateModelManagerState, + }, + hrf: { initialState: initialHRFState, migrate: migrateHRFState }, +}; + +const unserialize: UnserializeFunction = (data, key) => { + const log = logger('system'); + const config = sliceConfigs[key as keyof typeof sliceConfigs]; + if (!config) { + throw new Error(`No unserialize config for slice "${key}"`); + } + try { + const { initialState, migrate } = config; + const parsed = JSON.parse(data); + // strip out old keys + const stripped = pick(parsed, keys(initialState)); + // run (additive) migrations + const migrated = migrate(stripped); + // merge in initial state as default values, covering any missing keys + const transformed = defaultsDeep(migrated, initialState); + + log.debug( + { + persistedData: parsed, + rehydratedData: transformed, + diff: diff(parsed, transformed) as JsonObject, // this is always serializable + }, + `Rehydrated slice "${key}"` + ); + return transformed; + } catch (err) { + log.warn( + { error: serializeError(err) }, + `Error rehydrating slice "${key}", falling back to default initial state` + ); + return config.initialState; + } +}; + +const serializationDenylist: { + [key in (typeof rememberedKeys)[number]]?: string[]; +} = { + canvas: canvasPersistDenylist, + gallery: galleryPersistDenylist, + generation: generationPersistDenylist, + nodes: nodesPersistDenylist, + postprocessing: postprocessingPersistDenylist, + system: systemPersistDenylist, + ui: uiPersistDenylist, + controlAdapters: controlAdaptersPersistDenylist, + dynamicPrompts: dynamicPromptsPersistDenylist, +}; + +export const serialize: SerializeFunction = (data, key) => { + const result = omit( + data, + serializationDenylist[key as keyof typeof serializationDenylist] ?? [] + ); + return JSON.stringify(result); +}; + +export const createStore = (uniqueStoreKey?: string, persist = true) => configureStore({ reducer: rememberedRootReducer, - enhancers: (existingEnhancers) => { - return existingEnhancers - .concat( - rememberEnhancer(idbKeyValDriver, rememberedKeys, { - persistDebounce: 300, - serialize, - unserialize, - prefix: uniqueStoreKey - ? `${STORAGE_PREFIX}${uniqueStoreKey}-` - : STORAGE_PREFIX, - }) - ) - .concat(autoBatchEnhancer()); - }, middleware: (getDefaultMiddleware) => getDefaultMiddleware({ serializableCheck: false, @@ -107,27 +246,33 @@ export const createStore = (uniqueStoreKey?: string) => }) .concat(api.middleware) .concat(dynamicMiddlewares) + .concat(authToastMiddleware) .prepend(listenerMiddleware.middleware), + enhancers: (getDefaultEnhancers) => { + const _enhancers = getDefaultEnhancers().concat(autoBatchEnhancer()); + if (persist) { + _enhancers.push( + rememberEnhancer(idbKeyValDriver, rememberedKeys, { + persistDebounce: 300, + serialize, + unserialize, + prefix: uniqueStoreKey + ? `${STORAGE_PREFIX}${uniqueStoreKey}-` + : STORAGE_PREFIX, + errorHandler, + }) + ); + } + return _enhancers; + }, devTools: { actionSanitizer, stateSanitizer, trace: true, predicate: (state, action) => { - // TODO: hook up to the log level param in system slice - // manually type state, cannot type the arg - // const typedState = state as ReturnType; - - // TODO: doing this breaks the rtk query devtools, commenting out for now - // if (action.type.startsWith('api/')) { - // // don't log api actions, with manual cache updates they are extremely noisy - // return false; - // } - if (actionsDenylist.includes(action.type)) { - // don't log other noisy actions return false; } - return true; }, }, @@ -138,6 +283,5 @@ export type AppGetState = ReturnType< >; export type RootState = ReturnType['getState']>; // eslint-disable-next-line @typescript-eslint/no-explicit-any -export type AppThunkDispatch = ThunkDispatch; +export type AppThunkDispatch = ThunkDispatch; export type AppDispatch = ReturnType['dispatch']; -export const stateSelector = (state: RootState) => state; diff --git a/invokeai/frontend/web/src/app/store/storeHooks.ts b/invokeai/frontend/web/src/app/store/storeHooks.ts index f0400c3a3c..f1a9aa979c 100644 --- a/invokeai/frontend/web/src/app/store/storeHooks.ts +++ b/invokeai/frontend/web/src/app/store/storeHooks.ts @@ -1,5 +1,6 @@ -import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux'; -import { AppThunkDispatch, RootState } from 'app/store/store'; +import type { AppThunkDispatch, RootState } from 'app/store/store'; +import type { TypedUseSelectorHook } from 'react-redux'; +import { useDispatch, useSelector } from 'react-redux'; // Use throughout your app instead of plain `useDispatch` and `useSelector` export const useAppDispatch = () => useDispatch(); diff --git a/invokeai/frontend/web/src/app/store/util/defaultMemoizeOptions.ts b/invokeai/frontend/web/src/app/store/util/defaultMemoizeOptions.ts deleted file mode 100644 index fd2abd228d..0000000000 --- a/invokeai/frontend/web/src/app/store/util/defaultMemoizeOptions.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { isEqual } from 'lodash-es'; - -export const defaultSelectorOptions = { - memoizeOptions: { - resultEqualityCheck: isEqual, - }, -}; diff --git a/invokeai/frontend/web/src/app/types/invokeai.ts b/invokeai/frontend/web/src/app/types/invokeai.ts index 0fe7a36052..faee66a9a9 100644 --- a/invokeai/frontend/web/src/app/types/invokeai.ts +++ b/invokeai/frontend/web/src/app/types/invokeai.ts @@ -1,6 +1,6 @@ -import { CONTROLNET_PROCESSORS } from 'features/controlAdapters/store/constants'; -import { InvokeTabName } from 'features/ui/store/tabMap'; -import { O } from 'ts-toolbelt'; +import type { CONTROLNET_PROCESSORS } from 'features/controlAdapters/store/constants'; +import type { InvokeTabName } from 'features/ui/store/tabMap'; +import type { O } from 'ts-toolbelt'; /** * A disable-able application feature @@ -23,7 +23,8 @@ export type AppFeature = | 'resumeQueue' | 'prependQueue' | 'invocationCache' - | 'bulkDownload'; + | 'bulkDownload' + | 'workflowLibrary'; /** * A disable-able Stable Diffusion feature @@ -42,6 +43,16 @@ export type SDFeature = | 'vae' | 'hrf'; +export type NumericalParameterConfig = { + initial: number; + sliderMin: number; + sliderMax: number; + numberInputMin: number; + numberInputMax: number; + fineStep: number; + coarseStep: number; +}; + /** * Configuration options for the InvokeAI UI. * Distinct from system settings which may be changed inside the app. @@ -65,69 +76,32 @@ export type AppConfig = { defaultModel?: string; disabledControlNetModels: string[]; disabledControlNetProcessors: (keyof typeof CONTROLNET_PROCESSORS)[]; - iterations: { - initial: number; - min: number; - sliderMax: number; - inputMax: number; - fineStep: number; - coarseStep: number; - }; - width: { - initial: number; - min: number; - sliderMax: number; - inputMax: number; - fineStep: number; - coarseStep: number; - }; - height: { - initial: number; - min: number; - sliderMax: number; - inputMax: number; - fineStep: number; - coarseStep: number; - }; - steps: { - initial: number; - min: number; - sliderMax: number; - inputMax: number; - fineStep: number; - coarseStep: number; - }; - guidance: { - initial: number; - min: number; - sliderMax: number; - inputMax: number; - fineStep: number; - coarseStep: number; - }; - img2imgStrength: { - initial: number; - min: number; - sliderMax: number; - inputMax: number; - fineStep: number; - coarseStep: number; - }; - hrfStrength: { - initial: number; - min: number; - sliderMax: number; - inputMax: number; - fineStep: number; - coarseStep: number; - }; + // Core parameters + iterations: NumericalParameterConfig; + width: NumericalParameterConfig; // initial value comes from model + height: NumericalParameterConfig; // initial value comes from model + steps: NumericalParameterConfig; + guidance: NumericalParameterConfig; + cfgRescaleMultiplier: NumericalParameterConfig; + img2imgStrength: NumericalParameterConfig; + // Canvas + boundingBoxHeight: NumericalParameterConfig; // initial value comes from model + boundingBoxWidth: NumericalParameterConfig; // initial value comes from model + scaledBoundingBoxHeight: NumericalParameterConfig; // initial value comes from model + scaledBoundingBoxWidth: NumericalParameterConfig; // initial value comes from model + canvasCoherenceStrength: NumericalParameterConfig; + canvasCoherenceSteps: NumericalParameterConfig; + infillTileSize: NumericalParameterConfig; + infillPatchmatchDownscaleSize: NumericalParameterConfig; + // Misc advanced + clipSkip: NumericalParameterConfig; // slider and input max are ignored for this, because the values depend on the model + maskBlur: NumericalParameterConfig; + hrfStrength: NumericalParameterConfig; dynamicPrompts: { - maxPrompts: { - initial: number; - min: number; - sliderMax: number; - inputMax: number; - }; + maxPrompts: NumericalParameterConfig; + }; + ca: { + weight: NumericalParameterConfig; }; }; }; diff --git a/invokeai/frontend/web/src/assets/images/image2img.png b/invokeai/frontend/web/src/assets/images/image2img.png deleted file mode 100644 index bacc938ea6..0000000000 Binary files a/invokeai/frontend/web/src/assets/images/image2img.png and /dev/null differ diff --git a/invokeai/frontend/web/src/assets/images/logo.png b/invokeai/frontend/web/src/assets/images/logo.png deleted file mode 100644 index 54f8ed8a8f..0000000000 Binary files a/invokeai/frontend/web/src/assets/images/logo.png and /dev/null differ diff --git a/invokeai/frontend/web/src/assets/images/mask.afdesign b/invokeai/frontend/web/src/assets/images/mask.afdesign deleted file mode 100644 index 52c8ea4105..0000000000 Binary files a/invokeai/frontend/web/src/assets/images/mask.afdesign and /dev/null differ diff --git a/invokeai/frontend/web/src/common/components/GreyscaleInvokeAIIcon.tsx b/invokeai/frontend/web/src/common/components/GreyscaleInvokeAIIcon.tsx deleted file mode 100644 index a6c6cdca18..0000000000 --- a/invokeai/frontend/web/src/common/components/GreyscaleInvokeAIIcon.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { Box, Image } from '@chakra-ui/react'; -import InvokeAILogoImage from 'assets/images/logo.png'; -import { memo } from 'react'; - -const GreyscaleInvokeAIIcon = () => ( - - invoke-ai-logo - -); - -export default memo(GreyscaleInvokeAIIcon); diff --git a/invokeai/frontend/web/src/common/components/IAIAlertDialog.tsx b/invokeai/frontend/web/src/common/components/IAIAlertDialog.tsx deleted file mode 100644 index a82095daa3..0000000000 --- a/invokeai/frontend/web/src/common/components/IAIAlertDialog.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import { - AlertDialog, - AlertDialogBody, - AlertDialogContent, - AlertDialogFooter, - AlertDialogHeader, - AlertDialogOverlay, - forwardRef, - useDisclosure, -} from '@chakra-ui/react'; -import { - cloneElement, - memo, - ReactElement, - ReactNode, - useCallback, - useRef, -} from 'react'; -import { useTranslation } from 'react-i18next'; -import IAIButton from './IAIButton'; - -type Props = { - acceptButtonText?: string; - acceptCallback: () => void; - cancelButtonText?: string; - cancelCallback?: () => void; - children: ReactNode; - title: string; - triggerComponent: ReactElement; -}; - -const IAIAlertDialog = forwardRef((props: Props, ref) => { - const { t } = useTranslation(); - - const { - acceptButtonText = t('common.accept'), - acceptCallback, - cancelButtonText = t('common.cancel'), - cancelCallback, - children, - title, - triggerComponent, - } = props; - - const { isOpen, onOpen, onClose } = useDisclosure(); - const cancelRef = useRef(null); - - const handleAccept = useCallback(() => { - acceptCallback(); - onClose(); - }, [acceptCallback, onClose]); - - const handleCancel = useCallback(() => { - cancelCallback && cancelCallback(); - onClose(); - }, [cancelCallback, onClose]); - - return ( - <> - {cloneElement(triggerComponent, { - onClick: onOpen, - ref: ref, - })} - - - - - - {title} - - - {children} - - - - {cancelButtonText} - - - {acceptButtonText} - - - - - - - ); -}); -export default memo(IAIAlertDialog); diff --git a/invokeai/frontend/web/src/common/components/IAIButton.tsx b/invokeai/frontend/web/src/common/components/IAIButton.tsx deleted file mode 100644 index 4058296aaf..0000000000 --- a/invokeai/frontend/web/src/common/components/IAIButton.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { - Button, - ButtonProps, - forwardRef, - Tooltip, - TooltipProps, -} from '@chakra-ui/react'; -import { memo, ReactNode } from 'react'; - -export interface IAIButtonProps extends ButtonProps { - tooltip?: TooltipProps['label']; - tooltipProps?: Omit; - isChecked?: boolean; - children: ReactNode; -} - -const IAIButton = forwardRef((props: IAIButtonProps, forwardedRef) => { - const { - children, - tooltip = '', - tooltipProps: { placement = 'top', hasArrow = true, ...tooltipProps } = {}, - isChecked, - ...rest - } = props; - return ( - - - - ); -}); - -export default memo(IAIButton); diff --git a/invokeai/frontend/web/src/common/components/IAICollapse.tsx b/invokeai/frontend/web/src/common/components/IAICollapse.tsx deleted file mode 100644 index ca7140ffa5..0000000000 --- a/invokeai/frontend/web/src/common/components/IAICollapse.tsx +++ /dev/null @@ -1,106 +0,0 @@ -import { ChevronUpIcon } from '@chakra-ui/icons'; -import { - Box, - Collapse, - Flex, - Spacer, - Text, - useColorMode, - useDisclosure, -} from '@chakra-ui/react'; -import { AnimatePresence, motion } from 'framer-motion'; -import { PropsWithChildren, memo } from 'react'; -import { mode } from 'theme/util/mode'; - -export type IAIToggleCollapseProps = PropsWithChildren & { - label: string; - activeLabel?: string; - defaultIsOpen?: boolean; -}; - -const IAICollapse = (props: IAIToggleCollapseProps) => { - const { label, activeLabel, children, defaultIsOpen = false } = props; - const { isOpen, onToggle } = useDisclosure({ defaultIsOpen }); - const { colorMode } = useColorMode(); - - return ( - - - {label} - - {activeLabel && ( - - - {activeLabel} - - - )} - - - - - - - {children} - - - - ); -}; - -export default memo(IAICollapse); diff --git a/invokeai/frontend/web/src/common/components/IAIColorPicker.tsx b/invokeai/frontend/web/src/common/components/IAIColorPicker.tsx index b61693c86a..5072b3442a 100644 --- a/invokeai/frontend/web/src/common/components/IAIColorPicker.tsx +++ b/invokeai/frontend/web/src/common/components/IAIColorPicker.tsx @@ -1,27 +1,36 @@ -import { ChakraProps, Flex } from '@chakra-ui/react'; +import type { ChakraProps } from '@chakra-ui/react'; +import { Flex } from '@chakra-ui/react'; +import type { CSSProperties } from 'react'; import { memo, useCallback } from 'react'; import { RgbaColorPicker } from 'react-colorful'; -import { ColorPickerBaseProps, RgbaColor } from 'react-colorful/dist/types'; -import IAINumberInput from './IAINumberInput'; +import type { + ColorPickerBaseProps, + RgbaColor, +} from 'react-colorful/dist/types'; + +import { InvControl } from './InvControl/InvControl'; +import { InvNumberInput } from './InvNumberInput/InvNumberInput'; type IAIColorPickerProps = ColorPickerBaseProps & { withNumberInput?: boolean; }; -const colorPickerStyles: NonNullable = { +const colorPickerPointerStyles: NonNullable = { width: 6, height: 6, borderColor: 'base.100', }; const sx: ChakraProps['sx'] = { - '.react-colorful__hue-pointer': colorPickerStyles, - '.react-colorful__saturation-pointer': colorPickerStyles, - '.react-colorful__alpha-pointer': colorPickerStyles, + '.react-colorful__hue-pointer': colorPickerPointerStyles, + '.react-colorful__saturation-pointer': colorPickerPointerStyles, + '.react-colorful__alpha-pointer': colorPickerPointerStyles, gap: 2, flexDir: 'column', }; +const colorPickerStyles: CSSProperties = { width: '100%' }; + const numberInputWidth: ChakraProps['w'] = '4.2rem'; const IAIColorPicker = (props: IAIColorPickerProps) => { @@ -47,48 +56,55 @@ const IAIColorPicker = (props: IAIColorPickerProps) => { {withNumberInput && ( - - - - + + + + + + + + + + + + )} diff --git a/invokeai/frontend/web/src/common/components/IAIContextMenu.tsx b/invokeai/frontend/web/src/common/components/IAIContextMenu.tsx deleted file mode 100644 index 757faca866..0000000000 --- a/invokeai/frontend/web/src/common/components/IAIContextMenu.tsx +++ /dev/null @@ -1,126 +0,0 @@ -/** - * This is a copy-paste of https://github.com/lukasbach/chakra-ui-contextmenu with a small change. - * - * The reactflow background element somehow prevents the chakra `useOutsideClick()` hook from working. - * With a menu open, clicking on the reactflow background element doesn't close the menu. - * - * Reactflow does provide an `onPaneClick` to handle clicks on the background element, but it is not - * straightforward to programatically close the menu. - * - * As a (hopefully temporary) workaround, we will use a dirty hack: - * - create `globalContextMenuCloseTrigger: number` in `ui` slice - * - increment it in `onPaneClick` - * - `useEffect()` to close the menu when `globalContextMenuCloseTrigger` changes - */ - -import { - Menu, - MenuButton, - MenuButtonProps, - MenuProps, - Portal, - PortalProps, - useEventListener, -} from '@chakra-ui/react'; -import { useAppSelector } from 'app/store/storeHooks'; -import * as React from 'react'; -import { - MutableRefObject, - useCallback, - useEffect, - useRef, - useState, -} from 'react'; - -export interface IAIContextMenuProps { - renderMenu: () => JSX.Element | null; - children: (ref: MutableRefObject) => JSX.Element | null; - menuProps?: Omit & { children?: React.ReactNode }; - portalProps?: Omit & { children?: React.ReactNode }; - menuButtonProps?: MenuButtonProps; -} - -export function IAIContextMenu( - props: IAIContextMenuProps -) { - const [isOpen, setIsOpen] = useState(false); - const [isRendered, setIsRendered] = useState(false); - const [isDeferredOpen, setIsDeferredOpen] = useState(false); - const [position, setPosition] = useState<[number, number]>([0, 0]); - const targetRef = useRef(null); - - const globalContextMenuCloseTrigger = useAppSelector( - (state) => state.ui.globalContextMenuCloseTrigger - ); - - useEffect(() => { - if (isOpen) { - setTimeout(() => { - setIsRendered(true); - setTimeout(() => { - setIsDeferredOpen(true); - }); - }); - } else { - setIsDeferredOpen(false); - const timeout = setTimeout(() => { - setIsRendered(isOpen); - }, 1000); - return () => clearTimeout(timeout); - } - }, [isOpen]); - - useEffect(() => { - setIsOpen(false); - setIsDeferredOpen(false); - setIsRendered(false); - }, [globalContextMenuCloseTrigger]); - - useEventListener('contextmenu', (e) => { - if ( - targetRef.current?.contains(e.target as HTMLElement) || - e.target === targetRef.current - ) { - e.preventDefault(); - setIsOpen(true); - setPosition([e.pageX, e.pageY]); - } else { - setIsOpen(false); - } - }); - - const onCloseHandler = useCallback(() => { - props.menuProps?.onClose?.(); - setIsOpen(false); - }, [props.menuProps]); - - return ( - <> - {props.children(targetRef)} - {isRendered && ( - - - - {props.renderMenu()} - - - )} - - ); -} diff --git a/invokeai/frontend/web/src/common/components/IAIDndImage.tsx b/invokeai/frontend/web/src/common/components/IAIDndImage.tsx index eed8a1e49c..2854fbb2e9 100644 --- a/invokeai/frontend/web/src/common/components/IAIDndImage.tsx +++ b/invokeai/frontend/web/src/common/components/IAIDndImage.tsx @@ -1,46 +1,35 @@ -import { +import type { ChakraProps, - Flex, FlexProps, - Icon, - Image, - useColorMode, + SystemStyleObject, } from '@chakra-ui/react'; +import { Flex, Icon, Image } from '@chakra-ui/react'; import { IAILoadingImageFallback, IAINoContentFallback, } from 'common/components/IAIImageFallback'; import ImageMetadataOverlay from 'common/components/ImageMetadataOverlay'; import { useImageUploadButton } from 'common/hooks/useImageUploadButton'; +import type { + TypesafeDraggableData, + TypesafeDroppableData, +} from 'features/dnd/types'; import ImageContextMenu from 'features/gallery/components/ImageContextMenu/ImageContextMenu'; -import { +import type { MouseEvent, ReactElement, ReactNode, SyntheticEvent, - memo, - useCallback, - useState, } from 'react'; +import { memo, useCallback, useMemo, useState } from 'react'; import { FaImage, FaUpload } from 'react-icons/fa'; -import { ImageDTO, PostUploadAction } from 'services/api/types'; -import { mode } from 'theme/util/mode'; +import type { ImageDTO, PostUploadAction } from 'services/api/types'; + import IAIDraggable from './IAIDraggable'; import IAIDroppable from './IAIDroppable'; import SelectionOverlay from './SelectionOverlay'; -import { - TypesafeDraggableData, - TypesafeDroppableData, -} from 'features/dnd/types'; -const defaultUploadElement = ( - -); +const defaultUploadElement = ; const defaultNoContentFallback = ; @@ -98,7 +87,6 @@ const IAIDndImage = (props: IAIDndImageProps) => { dataTestId, } = props; - const { colorMode } = useColorMode(); const [isHovered, setIsHovered] = useState(false); const handleMouseOver = useCallback( (e: MouseEvent) => { @@ -124,16 +112,30 @@ const IAIDndImage = (props: IAIDndImageProps) => { isDisabled: isUploadDisabled, }); - const uploadButtonStyles = isUploadDisabled - ? {} - : { + const uploadButtonStyles = useMemo(() => { + const styles: SystemStyleObject = { + minH: minSize, + w: 'full', + h: 'full', + alignItems: 'center', + justifyContent: 'center', + borderRadius: 'base', + transitionProperty: 'common', + transitionDuration: '0.1s', + color: 'base.500', + }; + if (!isUploadDisabled) { + Object.assign(styles, { cursor: 'pointer', - bg: mode('base.200', 'base.700')(colorMode), + bg: 'base.700', _hover: { - bg: mode('base.300', 'base.650')(colorMode), - color: mode('base.500', 'base.300')(colorMode), + bg: 'base.650', + color: 'base.300', }, - }; + }); + } + return styles; + }, [isUploadDisabled, minSize]); return ( @@ -142,27 +144,23 @@ const IAIDndImage = (props: IAIDndImageProps) => { ref={ref} onMouseOver={handleMouseOver} onMouseOut={handleMouseOut} - sx={{ - width: 'full', - height: 'full', - alignItems: 'center', - justifyContent: 'center', - position: 'relative', - minW: minSize ? minSize : undefined, - minH: minSize ? minSize : undefined, - userSelect: 'none', - cursor: isDragDisabled || !imageDTO ? 'default' : 'pointer', - }} + width="full" + height="full" + alignItems="center" + justifyContent="center" + position="relative" + minW={minSize ? minSize : undefined} + minH={minSize ? minSize : undefined} + userSelect="none" + cursor={isDragDisabled || !imageDTO ? 'default' : 'pointer'} > {imageDTO && ( { } onError={onError} draggable={false} - sx={{ - w: imageDTO.width, - objectFit: 'contain', - maxW: 'full', - maxH: 'full', - borderRadius: 'base', - ...imageSx, - }} + w={imageDTO.width} + objectFit="contain" + maxW="full" + maxH="full" + borderRadius="base" + sx={imageSx} data-testid={dataTestId} /> {withMetadataOverlay && ( @@ -198,21 +194,7 @@ const IAIDndImage = (props: IAIDndImageProps) => { )} {!imageDTO && !isUploadDisabled && ( <> - + {uploadElement} diff --git a/invokeai/frontend/web/src/common/components/IAIDndImageIcon.tsx b/invokeai/frontend/web/src/common/components/IAIDndImageIcon.tsx index 01755b764a..ce0fecb20c 100644 --- a/invokeai/frontend/web/src/common/components/IAIDndImageIcon.tsx +++ b/invokeai/frontend/web/src/common/components/IAIDndImageIcon.tsx @@ -1,6 +1,8 @@ -import { SystemStyleObject, useColorModeValue } from '@chakra-ui/react'; -import { MouseEvent, ReactElement, memo } from 'react'; -import IAIIconButton from './IAIIconButton'; +import type { SystemStyleObject } from '@chakra-ui/react'; +import type { MouseEvent, ReactElement } from 'react'; +import { memo, useMemo } from 'react'; + +import { InvIconButton } from './InvIconButton/InvIconButton'; type Props = { onClick: (event: MouseEvent) => void; @@ -12,33 +14,34 @@ type Props = { const IAIDndImageIcon = (props: Props) => { const { onClick, tooltip, icon, styleOverrides } = props; - const resetIconShadow = useColorModeValue( - `drop-shadow(0px 0px 0.1rem var(--invokeai-colors-base-600))`, - `drop-shadow(0px 0px 0.1rem var(--invokeai-colors-base-800))` + const sx = useMemo( + () => ({ + position: 'absolute', + top: 1, + insetInlineEnd: 1, + p: 0, + minW: 0, + svg: { + transitionProperty: 'common', + transitionDuration: 'normal', + fill: 'base.100', + _hover: { fill: 'base.50' }, + filter: 'drop-shadow(0px 0px 0.1rem var(--invokeai-colors-base-800))', + }, + ...styleOverrides, + }), + [styleOverrides] ); + return ( - ); diff --git a/invokeai/frontend/web/src/common/components/IAIDraggable.tsx b/invokeai/frontend/web/src/common/components/IAIDraggable.tsx index 363799a573..1efabab12c 100644 --- a/invokeai/frontend/web/src/common/components/IAIDraggable.tsx +++ b/invokeai/frontend/web/src/common/components/IAIDraggable.tsx @@ -1,6 +1,7 @@ -import { Box, BoxProps } from '@chakra-ui/react'; +import type { BoxProps } from '@chakra-ui/react'; +import { Box } from '@chakra-ui/react'; import { useDraggableTypesafe } from 'features/dnd/hooks/typesafeHooks'; -import { TypesafeDraggableData } from 'features/dnd/types'; +import type { TypesafeDraggableData } from 'features/dnd/types'; import { memo, useRef } from 'react'; import { v4 as uuidv4 } from 'uuid'; diff --git a/invokeai/frontend/web/src/common/components/IAIDropOverlay.tsx b/invokeai/frontend/web/src/common/components/IAIDropOverlay.tsx index f9bb36cc50..809c00653b 100644 --- a/invokeai/frontend/web/src/common/components/IAIDropOverlay.tsx +++ b/invokeai/frontend/web/src/common/components/IAIDropOverlay.tsx @@ -1,7 +1,8 @@ -import { Box, Flex, useColorMode } from '@chakra-ui/react'; +import { Box, Flex } from '@chakra-ui/react'; +import type { AnimationProps } from 'framer-motion'; import { motion } from 'framer-motion'; -import { ReactNode, memo, useRef } from 'react'; -import { mode } from 'theme/util/mode'; +import type { ReactNode } from 'react'; +import { memo, useRef } from 'react'; import { v4 as uuidv4 } from 'uuid'; type Props = { @@ -9,82 +10,67 @@ type Props = { label?: ReactNode; }; -export const IAIDropOverlay = (props: Props) => { +const initial: AnimationProps['initial'] = { + opacity: 0, +}; +const animate: AnimationProps['animate'] = { + opacity: 1, + transition: { duration: 0.1 }, +}; +const exit: AnimationProps['exit'] = { + opacity: 0, + transition: { duration: 0.1 }, +}; + +const IAIDropOverlay = (props: Props) => { const { isOver, label = 'Drop' } = props; const motionId = useRef(uuidv4()); - const { colorMode } = useColorMode(); return ( - + {label} diff --git a/invokeai/frontend/web/src/common/components/IAIDroppable.tsx b/invokeai/frontend/web/src/common/components/IAIDroppable.tsx index bf98961c21..fef521ec3e 100644 --- a/invokeai/frontend/web/src/common/components/IAIDroppable.tsx +++ b/invokeai/frontend/web/src/common/components/IAIDroppable.tsx @@ -1,10 +1,12 @@ import { Box } from '@chakra-ui/react'; import { useDroppableTypesafe } from 'features/dnd/hooks/typesafeHooks'; -import { TypesafeDroppableData } from 'features/dnd/types'; +import type { TypesafeDroppableData } from 'features/dnd/types'; import { isValidDrop } from 'features/dnd/util/isValidDrop'; import { AnimatePresence } from 'framer-motion'; -import { ReactNode, memo, useRef } from 'react'; +import type { ReactNode } from 'react'; +import { memo, useRef } from 'react'; import { v4 as uuidv4 } from 'uuid'; + import IAIDropOverlay from './IAIDropOverlay'; type IAIDroppableProps = { diff --git a/invokeai/frontend/web/src/common/components/IAIFillSkeleton.tsx b/invokeai/frontend/web/src/common/components/IAIFillSkeleton.tsx index 8081714432..52d57398fe 100644 --- a/invokeai/frontend/web/src/common/components/IAIFillSkeleton.tsx +++ b/invokeai/frontend/web/src/common/components/IAIFillSkeleton.tsx @@ -1,28 +1,27 @@ +import type { SystemStyleObject } from '@chakra-ui/react'; import { Box, Skeleton } from '@chakra-ui/react'; import { memo } from 'react'; +const skeletonStyles: SystemStyleObject = { + position: 'relative', + height: 'full', + width: 'full', + '::before': { + content: "''", + display: 'block', + pt: '100%', + }, +}; + const IAIFillSkeleton = () => { return ( - + ); diff --git a/invokeai/frontend/web/src/common/components/IAIIconButton.tsx b/invokeai/frontend/web/src/common/components/IAIIconButton.tsx deleted file mode 100644 index e426a37e15..0000000000 --- a/invokeai/frontend/web/src/common/components/IAIIconButton.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { - forwardRef, - IconButton, - IconButtonProps, - Tooltip, - TooltipProps, -} from '@chakra-ui/react'; -import { memo } from 'react'; - -export type IAIIconButtonProps = IconButtonProps & { - role?: string; - tooltip?: TooltipProps['label']; - tooltipProps?: Omit; - isChecked?: boolean; -}; - -const IAIIconButton = forwardRef((props: IAIIconButtonProps, forwardedRef) => { - const { role, tooltip = '', tooltipProps, isChecked, ...rest } = props; - - return ( - - - - ); -}); - -IAIIconButton.displayName = 'IAIIconButton'; -export default memo(IAIIconButton); diff --git a/invokeai/frontend/web/src/common/components/IAIImageFallback.tsx b/invokeai/frontend/web/src/common/components/IAIImageFallback.tsx index 3c1a05d527..4a4133dc19 100644 --- a/invokeai/frontend/web/src/common/components/IAIImageFallback.tsx +++ b/invokeai/frontend/web/src/common/components/IAIImageFallback.tsx @@ -1,51 +1,40 @@ -import { - As, - Flex, - FlexProps, - Icon, - Skeleton, - Spinner, - StyleProps, - Text, -} from '@chakra-ui/react'; +import type { As, FlexProps, StyleProps } from '@chakra-ui/react'; +import { Flex, Icon, Skeleton, Spinner } from '@chakra-ui/react'; +import { memo, useMemo } from 'react'; import { FaImage } from 'react-icons/fa'; -import { ImageDTO } from 'services/api/types'; +import type { ImageDTO } from 'services/api/types'; + +import { InvText } from './InvText/wrapper'; type Props = { image: ImageDTO | undefined }; -export const IAILoadingImageFallback = (props: Props) => { +export const IAILoadingImageFallback = memo((props: Props) => { if (props.image) { return ( ); } return ( ); -}; +}); +IAILoadingImageFallback.displayName = 'IAILoadingImageFallback'; type IAINoImageFallbackProps = FlexProps & { label?: string; @@ -53,47 +42,48 @@ type IAINoImageFallbackProps = FlexProps & { boxSize?: StyleProps['boxSize']; }; -export const IAINoContentFallback = (props: IAINoImageFallbackProps) => { +export const IAINoContentFallback = memo((props: IAINoImageFallbackProps) => { const { icon = FaImage, boxSize = 16, sx, ...rest } = props; + const styles = useMemo( + () => ({ + w: 'full', + h: 'full', + alignItems: 'center', + justifyContent: 'center', + borderRadius: 'base', + flexDir: 'column', + gap: 2, + userSelect: 'none', + opacity: 0.7, + color: 'base.500', + ...sx, + }), + [sx] + ); + return ( - + {icon && } - {props.label && {props.label}} + {props.label && ( + + {props.label} + + )} ); -}; +}); +IAINoContentFallback.displayName = 'IAINoContentFallback'; type IAINoImageFallbackWithSpinnerProps = FlexProps & { label?: string; }; -export const IAINoContentFallbackWithSpinner = ( - props: IAINoImageFallbackWithSpinnerProps -) => { - const { sx, ...rest } = props; - - return ( - { + const { sx, ...rest } = props; + const styles = useMemo( + () => ({ w: 'full', h: 'full', alignItems: 'center', @@ -103,16 +93,18 @@ export const IAINoContentFallbackWithSpinner = ( gap: 2, userSelect: 'none', opacity: 0.7, - color: 'base.700', - _dark: { - color: 'base.500', - }, + color: 'base.500', ...sx, - }} - {...rest} - > - - {props.label && {props.label}} - - ); -}; + }), + [sx] + ); + + return ( + + + {props.label && {props.label}} + + ); + } +); +IAINoContentFallbackWithSpinner.displayName = 'IAINoContentFallbackWithSpinner'; diff --git a/invokeai/frontend/web/src/common/components/IAIInformationalPopover/IAIInformationalPopover.tsx b/invokeai/frontend/web/src/common/components/IAIInformationalPopover/IAIInformationalPopover.tsx index 6313bf1dc7..e435d550d6 100644 --- a/invokeai/frontend/web/src/common/components/IAIInformationalPopover/IAIInformationalPopover.tsx +++ b/invokeai/frontend/web/src/common/components/IAIInformationalPopover/IAIInformationalPopover.tsx @@ -1,155 +1,147 @@ +import { Divider, Flex, Image, Portal } from '@chakra-ui/react'; +import { useAppSelector } from 'app/store/storeHooks'; +import { InvButton } from 'common/components/InvButton/InvButton'; +import { InvHeading } from 'common/components/InvHeading/wrapper'; import { - Box, - BoxProps, - Button, - Divider, - Flex, - Heading, - Image, - Popover, - PopoverBody, - PopoverCloseButton, - PopoverContent, - PopoverProps, - PopoverTrigger, - Portal, - Text, - forwardRef, -} from '@chakra-ui/react'; + InvPopover, + InvPopoverBody, + InvPopoverCloseButton, + InvPopoverContent, + InvPopoverTrigger, +} from 'common/components/InvPopover/wrapper'; +import { InvText } from 'common/components/InvText/wrapper'; import { merge, omit } from 'lodash-es'; -import { PropsWithChildren, memo, useCallback, useMemo } from 'react'; +import type { ReactElement } from 'react'; +import { memo, useCallback, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { FaExternalLinkAlt } from 'react-icons/fa'; -import { useAppSelector } from 'app/store/storeHooks'; -import { - Feature, - OPEN_DELAY, - POPOVER_DATA, - POPPER_MODIFIERS, -} from './constants'; -type Props = PropsWithChildren & { +import type { Feature, PopoverData } from './constants'; +import { OPEN_DELAY, POPOVER_DATA, POPPER_MODIFIERS } from './constants'; + +type Props = { feature: Feature; - wrapperProps?: BoxProps; - popoverProps?: PopoverProps; + inPortal?: boolean; + children: ReactElement; }; -const IAIInformationalPopover = forwardRef( - ({ feature, children, wrapperProps, ...rest }: Props, ref) => { - const { t } = useTranslation(); - const shouldEnableInformationalPopovers = useAppSelector( - (state) => state.system.shouldEnableInformationalPopovers - ); +const IAIInformationalPopover = ({ + feature, + children, + inPortal = true, + ...rest +}: Props) => { + const shouldEnableInformationalPopovers = useAppSelector( + (s) => s.system.shouldEnableInformationalPopovers + ); - const data = useMemo(() => POPOVER_DATA[feature], [feature]); + const data = useMemo(() => POPOVER_DATA[feature], [feature]); - const popoverProps = useMemo( - () => merge(omit(data, ['image', 'href', 'buttonLabel']), rest), - [data, rest] - ); + const popoverProps = useMemo( + () => merge(omit(data, ['image', 'href', 'buttonLabel']), rest), + [data, rest] + ); - const heading = useMemo( - () => t(`popovers.${feature}.heading`), - [feature, t] - ); - - const paragraphs = useMemo( - () => - t(`popovers.${feature}.paragraphs`, { - returnObjects: true, - }) ?? [], - [feature, t] - ); - - const handleClick = useCallback(() => { - if (!data?.href) { - return; - } - window.open(data.href); - }, [data?.href]); - - if (!shouldEnableInformationalPopovers) { - return ( - - {children} - - ); - } - - return ( - - - - {children} - - - - - - - - {heading && ( - <> - {heading} - - - )} - {data?.image && ( - <> - Optional Image - - - )} - {paragraphs.map((p) => ( - {p} - ))} - {data?.href && ( - <> - - - - )} - - - - - - ); + if (!shouldEnableInformationalPopovers) { + return children; } -); -IAIInformationalPopover.displayName = 'IAIInformationalPopover'; + return ( + + {children} + {inPortal ? ( + + + + ) : ( + + )} + + ); +}; export default memo(IAIInformationalPopover); + +type PopoverContentProps = { + data?: PopoverData; + feature: Feature; +}; + +const PopoverContent = ({ data, feature }: PopoverContentProps) => { + const { t } = useTranslation(); + + const heading = useMemo( + () => t(`popovers.${feature}.heading`), + [feature, t] + ); + + const paragraphs = useMemo( + () => + t(`popovers.${feature}.paragraphs`, { + returnObjects: true, + }) ?? [], + [feature, t] + ); + + const handleClick = useCallback(() => { + if (!data?.href) { + return; + } + window.open(data.href); + }, [data?.href]); + + return ( + + + + + {heading && ( + <> + {heading} + + + )} + {data?.image && ( + <> + Optional Image + + + )} + {paragraphs.map((p) => ( + {p} + ))} + {data?.href && ( + <> + + } + alignSelf="flex-end" + variant="link" + > + {t('common.learnMore') ?? heading} + + + )} + + + + ); +}; diff --git a/invokeai/frontend/web/src/common/components/IAIInformationalPopover/constants.ts b/invokeai/frontend/web/src/common/components/IAIInformationalPopover/constants.ts index 8960399b48..c48df92794 100644 --- a/invokeai/frontend/web/src/common/components/IAIInformationalPopover/constants.ts +++ b/invokeai/frontend/web/src/common/components/IAIInformationalPopover/constants.ts @@ -1,4 +1,4 @@ -import { PopoverProps } from '@chakra-ui/react'; +import type { PopoverProps } from '@chakra-ui/react'; export type Feature = | 'clipSkip' diff --git a/invokeai/frontend/web/src/common/components/IAIInput.tsx b/invokeai/frontend/web/src/common/components/IAIInput.tsx deleted file mode 100644 index 31dac20998..0000000000 --- a/invokeai/frontend/web/src/common/components/IAIInput.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import { - FormControl, - FormControlProps, - FormLabel, - Input, - InputProps, -} from '@chakra-ui/react'; -import { useAppDispatch } from 'app/store/storeHooks'; -import { stopPastePropagation } from 'common/util/stopPastePropagation'; -import { shiftKeyPressed } from 'features/ui/store/hotkeysSlice'; -import { - CSSProperties, - ChangeEvent, - KeyboardEvent, - memo, - useCallback, -} from 'react'; - -interface IAIInputProps extends InputProps { - label?: string; - labelPos?: 'top' | 'side'; - value?: string; - size?: string; - onChange?: (e: ChangeEvent) => void; - formControlProps?: Omit; -} - -const labelPosVerticalStyle: CSSProperties = { - display: 'flex', - flexDirection: 'row', - alignItems: 'center', - gap: 10, -}; - -const IAIInput = (props: IAIInputProps) => { - const { - label = '', - labelPos = 'top', - isDisabled = false, - isInvalid, - formControlProps, - ...rest - } = props; - - const dispatch = useAppDispatch(); - const handleKeyDown = useCallback( - (e: KeyboardEvent) => { - if (e.shiftKey) { - dispatch(shiftKeyPressed(true)); - } - }, - [dispatch] - ); - - const handleKeyUp = useCallback( - (e: KeyboardEvent) => { - if (!e.shiftKey) { - dispatch(shiftKeyPressed(false)); - } - }, - [dispatch] - ); - - return ( - - {label !== '' && {label}} - - - ); -}; - -export default memo(IAIInput); diff --git a/invokeai/frontend/web/src/common/components/IAIMantineInput.tsx b/invokeai/frontend/web/src/common/components/IAIMantineInput.tsx deleted file mode 100644 index a324f80770..0000000000 --- a/invokeai/frontend/web/src/common/components/IAIMantineInput.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { useColorMode } from '@chakra-ui/react'; -import { TextInput, TextInputProps } from '@mantine/core'; -import { useChakraThemeTokens } from 'common/hooks/useChakraThemeTokens'; -import { useCallback } from 'react'; -import { mode } from 'theme/util/mode'; - -type IAIMantineTextInputProps = TextInputProps; - -export default function IAIMantineTextInput(props: IAIMantineTextInputProps) { - const { ...rest } = props; - const { - base50, - base100, - base200, - base300, - base800, - base700, - base900, - accent500, - accent300, - } = useChakraThemeTokens(); - const { colorMode } = useColorMode(); - - const stylesFunc = useCallback( - () => ({ - input: { - color: mode(base900, base100)(colorMode), - backgroundColor: mode(base50, base900)(colorMode), - borderColor: mode(base200, base800)(colorMode), - borderWidth: 2, - outline: 'none', - ':focus': { - borderColor: mode(accent300, accent500)(colorMode), - }, - }, - label: { - color: mode(base700, base300)(colorMode), - fontWeight: 'normal' as const, - marginBottom: 4, - }, - }), - [ - accent300, - accent500, - base100, - base200, - base300, - base50, - base700, - base800, - base900, - colorMode, - ] - ); - - return ; -} diff --git a/invokeai/frontend/web/src/common/components/IAIMantineMultiSelect.tsx b/invokeai/frontend/web/src/common/components/IAIMantineMultiSelect.tsx deleted file mode 100644 index 5ea17f788c..0000000000 --- a/invokeai/frontend/web/src/common/components/IAIMantineMultiSelect.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import { FormControl, FormLabel, Tooltip, forwardRef } from '@chakra-ui/react'; -import { MultiSelect, MultiSelectProps } from '@mantine/core'; -import { useAppDispatch } from 'app/store/storeHooks'; -import { shiftKeyPressed } from 'features/ui/store/hotkeysSlice'; -import { useMantineMultiSelectStyles } from 'mantine-theme/hooks/useMantineMultiSelectStyles'; -import { KeyboardEvent, RefObject, memo, useCallback } from 'react'; - -type IAIMultiSelectProps = Omit & { - tooltip?: string | null; - inputRef?: RefObject; - label?: string; -}; - -const IAIMantineMultiSelect = forwardRef((props: IAIMultiSelectProps, ref) => { - const { - searchable = true, - tooltip, - inputRef, - label, - disabled, - ...rest - } = props; - const dispatch = useAppDispatch(); - - const handleKeyDown = useCallback( - (e: KeyboardEvent) => { - if (e.shiftKey) { - dispatch(shiftKeyPressed(true)); - } - }, - [dispatch] - ); - - const handleKeyUp = useCallback( - (e: KeyboardEvent) => { - if (!e.shiftKey) { - dispatch(shiftKeyPressed(false)); - } - }, - [dispatch] - ); - - const styles = useMantineMultiSelectStyles(); - - return ( - - - {label && {label}} - - - - ); -}); - -IAIMantineMultiSelect.displayName = 'IAIMantineMultiSelect'; - -export default memo(IAIMantineMultiSelect); diff --git a/invokeai/frontend/web/src/common/components/IAIMantineSearchableSelect.tsx b/invokeai/frontend/web/src/common/components/IAIMantineSearchableSelect.tsx deleted file mode 100644 index 675314b421..0000000000 --- a/invokeai/frontend/web/src/common/components/IAIMantineSearchableSelect.tsx +++ /dev/null @@ -1,100 +0,0 @@ -import { FormControl, FormLabel, Tooltip, forwardRef } from '@chakra-ui/react'; -import { Select, SelectProps } from '@mantine/core'; -import { useAppDispatch } from 'app/store/storeHooks'; -import { shiftKeyPressed } from 'features/ui/store/hotkeysSlice'; -import { useMantineSelectStyles } from 'mantine-theme/hooks/useMantineSelectStyles'; -import { KeyboardEvent, RefObject, memo, useCallback, useState } from 'react'; - -export type IAISelectDataType = { - value: string; - label: string; - tooltip?: string; -}; - -type IAISelectProps = Omit & { - tooltip?: string | null; - label?: string; - inputRef?: RefObject; -}; - -const IAIMantineSearchableSelect = forwardRef((props: IAISelectProps, ref) => { - const { - searchable = true, - tooltip, - inputRef, - onChange, - label, - disabled, - ...rest - } = props; - const dispatch = useAppDispatch(); - - const [searchValue, setSearchValue] = useState(''); - - // we want to capture shift keypressed even when an input is focused - const handleKeyDown = useCallback( - (e: KeyboardEvent) => { - if (e.shiftKey) { - dispatch(shiftKeyPressed(true)); - } - }, - [dispatch] - ); - - const handleKeyUp = useCallback( - (e: KeyboardEvent) => { - if (!e.shiftKey) { - dispatch(shiftKeyPressed(false)); - } - }, - [dispatch] - ); - - // wrap onChange to clear search value on select - const handleChange = useCallback( - (v: string | null) => { - // cannot figure out why we were doing this, but it was causing an issue where if you - // select the currently-selected item, it reset the search value to empty - // setSearchValue(''); - - if (!onChange) { - return; - } - - onChange(v); - }, - [onChange] - ); - - const styles = useMantineSelectStyles(); - - return ( - - - {label && {label}} - - - - ); -}); - -IAIMantineSelect.displayName = 'IAIMantineSelect'; - -export default memo(IAIMantineSelect); diff --git a/invokeai/frontend/web/src/common/components/IAIMantineSelectItemWithDescription.tsx b/invokeai/frontend/web/src/common/components/IAIMantineSelectItemWithDescription.tsx deleted file mode 100644 index a61268c99e..0000000000 --- a/invokeai/frontend/web/src/common/components/IAIMantineSelectItemWithDescription.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { Box, Text } from '@chakra-ui/react'; -import { forwardRef, memo } from 'react'; - -interface ItemProps extends React.ComponentPropsWithoutRef<'div'> { - label: string; - value: string; - description?: string; -} - -const IAIMantineSelectItemWithDescription = forwardRef< - HTMLDivElement, - ItemProps ->(({ label, description, ...rest }: ItemProps, ref) => ( - - - {label} - {description && ( - - {description} - - )} - - -)); - -IAIMantineSelectItemWithDescription.displayName = - 'IAIMantineSelectItemWithDescription'; - -export default memo(IAIMantineSelectItemWithDescription); diff --git a/invokeai/frontend/web/src/common/components/IAIMantineSelectItemWithTooltip.tsx b/invokeai/frontend/web/src/common/components/IAIMantineSelectItemWithTooltip.tsx deleted file mode 100644 index 056bd4a8fa..0000000000 --- a/invokeai/frontend/web/src/common/components/IAIMantineSelectItemWithTooltip.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { Box, Tooltip } from '@chakra-ui/react'; -import { Text } from '@mantine/core'; -import { forwardRef, memo } from 'react'; - -interface ItemProps extends React.ComponentPropsWithoutRef<'div'> { - label: string; - description?: string; - tooltip?: string; - disabled?: boolean; -} - -const IAIMantineSelectItemWithTooltip = forwardRef( - ( - { label, tooltip, description, disabled: _disabled, ...others }: ItemProps, - ref - ) => ( - - - - {label} - {description && ( - - {description} - - )} - - - - ) -); - -IAIMantineSelectItemWithTooltip.displayName = 'IAIMantineSelectItemWithTooltip'; - -export default memo(IAIMantineSelectItemWithTooltip); diff --git a/invokeai/frontend/web/src/common/components/IAINumberInput.tsx b/invokeai/frontend/web/src/common/components/IAINumberInput.tsx deleted file mode 100644 index 36098ec097..0000000000 --- a/invokeai/frontend/web/src/common/components/IAINumberInput.tsx +++ /dev/null @@ -1,187 +0,0 @@ -import { - FormControl, - FormControlProps, - FormLabel, - FormLabelProps, - NumberDecrementStepper, - NumberIncrementStepper, - NumberInput, - NumberInputField, - NumberInputFieldProps, - NumberInputProps, - NumberInputStepper, - NumberInputStepperProps, - Tooltip, - TooltipProps, - forwardRef, -} from '@chakra-ui/react'; -import { useAppDispatch } from 'app/store/storeHooks'; -import { stopPastePropagation } from 'common/util/stopPastePropagation'; -import { shiftKeyPressed } from 'features/ui/store/hotkeysSlice'; -import { clamp } from 'lodash-es'; - -import { - FocusEvent, - KeyboardEvent, - memo, - useCallback, - useEffect, - useState, -} from 'react'; - -export const numberStringRegex = /^-?(0\.)?\.?$/; - -interface Props extends Omit { - label?: string; - showStepper?: boolean; - value?: number; - onChange: (v: number) => void; - min: number; - max: number; - clamp?: boolean; - isInteger?: boolean; - formControlProps?: FormControlProps; - formLabelProps?: FormLabelProps; - numberInputProps?: NumberInputProps; - numberInputFieldProps?: NumberInputFieldProps; - numberInputStepperProps?: NumberInputStepperProps; - tooltipProps?: Omit; -} - -/** - * Customized Chakra FormControl + NumberInput multi-part component. - */ -const IAINumberInput = forwardRef((props: Props, ref) => { - const { - label, - isDisabled = false, - showStepper = true, - isInvalid, - value, - onChange, - min, - max, - isInteger = true, - formControlProps, - formLabelProps, - numberInputFieldProps, - numberInputStepperProps, - tooltipProps, - ...rest - } = props; - - const dispatch = useAppDispatch(); - - /** - * Using a controlled input with a value that accepts decimals needs special - * handling. If the user starts to type in "1.5", by the time they press the - * 5, the value has been parsed from "1." to "1" and they end up with "15". - * - * To resolve this, this component keeps a the value as a string internally, - * and the UI component uses that. When a change is made, that string is parsed - * as a number and given to the `onChange` function. - */ - - const [valueAsString, setValueAsString] = useState(String(value)); - - /** - * When `value` changes (e.g. from a diff source than this component), we need - * to update the internal `valueAsString`, but only if the actual value is different - * from the current value. - */ - useEffect(() => { - if ( - !valueAsString.match(numberStringRegex) && - value !== Number(valueAsString) - ) { - setValueAsString(String(value)); - } - }, [value, valueAsString]); - - const handleOnChange = useCallback( - (v: string) => { - setValueAsString(v); - // This allows negatives and decimals e.g. '-123', `.5`, `-0.2`, etc. - if (!v.match(numberStringRegex)) { - // Cast the value to number. Floor it if it should be an integer. - onChange(isInteger ? Math.floor(Number(v)) : Number(v)); - } - }, - [isInteger, onChange] - ); - - /** - * Clicking the steppers allows the value to go outside bounds; we need to - * clamp it on blur and floor it if needed. - */ - const handleBlur = useCallback( - (e: FocusEvent) => { - const clamped = clamp( - isInteger ? Math.floor(Number(e.target.value)) : Number(e.target.value), - min, - max - ); - setValueAsString(String(clamped)); - onChange(clamped); - }, - [isInteger, max, min, onChange] - ); - - const handleKeyDown = useCallback( - (e: KeyboardEvent) => { - if (e.shiftKey) { - dispatch(shiftKeyPressed(true)); - } - }, - [dispatch] - ); - - const handleKeyUp = useCallback( - (e: KeyboardEvent) => { - if (!e.shiftKey) { - dispatch(shiftKeyPressed(false)); - } - }, - [dispatch] - ); - - return ( - - - {label && {label}} - - - {showStepper && ( - - - - - )} - - - - ); -}); - -IAINumberInput.displayName = 'IAINumberInput'; - -export default memo(IAINumberInput); diff --git a/invokeai/frontend/web/src/common/components/IAIOption.tsx b/invokeai/frontend/web/src/common/components/IAIOption.tsx deleted file mode 100644 index 9c8a611160..0000000000 --- a/invokeai/frontend/web/src/common/components/IAIOption.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { useToken } from '@chakra-ui/react'; -import { ReactNode } from 'react'; - -type IAIOptionProps = { - children: ReactNode | string | number; - value: string | number; -}; - -export default function IAIOption(props: IAIOptionProps) { - const { children, value } = props; - const [base800, base200] = useToken('colors', ['base.800', 'base.200']); - - return ( - - ); -} diff --git a/invokeai/frontend/web/src/common/components/IAIPopover.tsx b/invokeai/frontend/web/src/common/components/IAIPopover.tsx deleted file mode 100644 index 51562b969c..0000000000 --- a/invokeai/frontend/web/src/common/components/IAIPopover.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { - BoxProps, - Popover, - PopoverArrow, - PopoverContent, - PopoverProps, - PopoverTrigger, -} from '@chakra-ui/react'; -import { memo, ReactNode } from 'react'; - -export type IAIPopoverProps = PopoverProps & { - triggerComponent: ReactNode; - triggerContainerProps?: BoxProps; - children: ReactNode; - hasArrow?: boolean; -}; - -const IAIPopover = (props: IAIPopoverProps) => { - const { - triggerComponent, - children, - hasArrow = true, - isLazy = true, - ...rest - } = props; - - return ( - - {triggerComponent} - - {hasArrow && } - {children} - - - ); -}; - -export default memo(IAIPopover); diff --git a/invokeai/frontend/web/src/common/components/IAIScrollArea.tsx b/invokeai/frontend/web/src/common/components/IAIScrollArea.tsx deleted file mode 100644 index 5dc96859b5..0000000000 --- a/invokeai/frontend/web/src/common/components/IAIScrollArea.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { ScrollArea, ScrollAreaProps } from '@mantine/core'; - -type IAIScrollArea = ScrollAreaProps; - -export default function IAIScrollArea(props: IAIScrollArea) { - const { ...rest } = props; - return ( - - {props.children} - - ); -} diff --git a/invokeai/frontend/web/src/common/components/IAISelect.tsx b/invokeai/frontend/web/src/common/components/IAISelect.tsx deleted file mode 100644 index faa5732017..0000000000 --- a/invokeai/frontend/web/src/common/components/IAISelect.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import { - FormControl, - FormLabel, - Select, - SelectProps, - Tooltip, - TooltipProps, -} from '@chakra-ui/react'; -import { memo, MouseEvent, useCallback } from 'react'; -import IAIOption from './IAIOption'; - -type IAISelectProps = SelectProps & { - label?: string; - tooltip?: string; - tooltipProps?: Omit; - validValues: - | Array - | Array<{ key: string; value: string | number }>; - horizontal?: boolean; - spaceEvenly?: boolean; -}; -/** - * Customized Chakra FormControl + Select multi-part component. - */ -const IAISelect = (props: IAISelectProps) => { - const { - label, - isDisabled, - validValues, - tooltip, - tooltipProps, - horizontal, - spaceEvenly, - ...rest - } = props; - const handleClick = useCallback((e: MouseEvent) => { - e.stopPropagation(); - e.nativeEvent.stopImmediatePropagation(); - e.nativeEvent.stopPropagation(); - e.nativeEvent.cancelBubble = true; - }, []); - return ( - - {label && ( - - {label} - - )} - - - - - ); -}; - -export default memo(IAISelect); diff --git a/invokeai/frontend/web/src/common/components/IAISimpleCheckbox.tsx b/invokeai/frontend/web/src/common/components/IAISimpleCheckbox.tsx deleted file mode 100644 index 47e328727d..0000000000 --- a/invokeai/frontend/web/src/common/components/IAISimpleCheckbox.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { Checkbox, CheckboxProps, Text, useColorMode } from '@chakra-ui/react'; -import { memo, ReactElement } from 'react'; -import { mode } from 'theme/util/mode'; - -type IAISimpleCheckboxProps = CheckboxProps & { - label: string | ReactElement; -}; - -const IAISimpleCheckbox = (props: IAISimpleCheckboxProps) => { - const { label, ...rest } = props; - const { colorMode } = useColorMode(); - return ( - - - {label} - - - ); -}; - -export default memo(IAISimpleCheckbox); diff --git a/invokeai/frontend/web/src/common/components/IAISimpleMenu.tsx b/invokeai/frontend/web/src/common/components/IAISimpleMenu.tsx deleted file mode 100644 index 83a60887b5..0000000000 --- a/invokeai/frontend/web/src/common/components/IAISimpleMenu.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import { - Menu, - MenuButton, - MenuItem, - MenuList, - MenuProps, - MenuListProps, - MenuItemProps, - IconButton, - Button, - IconButtonProps, - ButtonProps, -} from '@chakra-ui/react'; -import { memo, MouseEventHandler, ReactNode } from 'react'; -import { MdArrowDropDown, MdArrowDropUp } from 'react-icons/md'; - -interface IAIMenuItem { - item: ReactNode | string; - onClick: MouseEventHandler | undefined; -} - -interface IAIMenuProps { - menuType?: 'icon' | 'regular'; - buttonText?: string; - iconTooltip?: string; - isLazy?: boolean; - menuItems: IAIMenuItem[]; - menuProps?: MenuProps; - menuButtonProps?: IconButtonProps | ButtonProps; - menuListProps?: MenuListProps; - menuItemProps?: MenuItemProps; -} - -const IAISimpleMenu = (props: IAIMenuProps) => { - const { - menuType = 'icon', - iconTooltip, - buttonText, - isLazy = true, - menuItems, - menuProps, - menuButtonProps, - menuListProps, - menuItemProps, - } = props; - - const renderMenuItems = () => { - const menuItemsToRender: ReactNode[] = []; - menuItems.forEach((menuItem, index) => { - menuItemsToRender.push( - - {menuItem.item} - - ); - }); - return menuItemsToRender; - }; - - return ( - - {({ isOpen }) => ( - <> - : } - paddingX={0} - paddingY={menuType === 'regular' ? 2 : 0} - {...menuButtonProps} - > - {menuType === 'regular' && buttonText} - - - {renderMenuItems()} - - - )} - - ); -}; - -export default memo(IAISimpleMenu); diff --git a/invokeai/frontend/web/src/common/components/IAISlider.tsx b/invokeai/frontend/web/src/common/components/IAISlider.tsx deleted file mode 100644 index 3ed3ee1920..0000000000 --- a/invokeai/frontend/web/src/common/components/IAISlider.tsx +++ /dev/null @@ -1,366 +0,0 @@ -import { - FormControl, - FormControlProps, - FormLabel, - FormLabelProps, - HStack, - NumberDecrementStepper, - NumberIncrementStepper, - NumberInput, - NumberInputField, - NumberInputFieldProps, - NumberInputProps, - NumberInputStepper, - NumberInputStepperProps, - Slider, - SliderFilledTrack, - SliderMark, - SliderMarkProps, - SliderThumb, - SliderThumbProps, - SliderTrack, - SliderTrackProps, - Tooltip, - TooltipProps, - forwardRef, -} from '@chakra-ui/react'; -import { useAppDispatch } from 'app/store/storeHooks'; -import { roundDownToMultiple } from 'common/util/roundDownToMultiple'; -import { shiftKeyPressed } from 'features/ui/store/hotkeysSlice'; -import { clamp } from 'lodash-es'; -import { - FocusEvent, - KeyboardEvent, - MouseEvent, - memo, - useCallback, - useEffect, - useMemo, - useState, -} from 'react'; -import { useTranslation } from 'react-i18next'; -import { BiReset } from 'react-icons/bi'; -import IAIIconButton, { IAIIconButtonProps } from './IAIIconButton'; - -export type IAIFullSliderProps = { - label?: string; - value: number; - min?: number; - max?: number; - step?: number; - onChange: (v: number) => void; - withSliderMarks?: boolean; - withInput?: boolean; - isInteger?: boolean; - inputWidth?: string | number; - withReset?: boolean; - handleReset?: () => void; - tooltipSuffix?: string; - hideTooltip?: boolean; - isCompact?: boolean; - isDisabled?: boolean; - sliderMarks?: number[]; - sliderFormControlProps?: FormControlProps; - sliderFormLabelProps?: FormLabelProps; - sliderMarkProps?: Omit; - sliderTrackProps?: SliderTrackProps; - sliderThumbProps?: SliderThumbProps; - sliderNumberInputProps?: NumberInputProps; - sliderNumberInputFieldProps?: NumberInputFieldProps; - sliderNumberInputStepperProps?: NumberInputStepperProps; - sliderTooltipProps?: Omit; - sliderIAIIconButtonProps?: IAIIconButtonProps; -}; - -const IAISlider = forwardRef((props: IAIFullSliderProps, ref) => { - const [showTooltip, setShowTooltip] = useState(false); - const { - label, - value, - min = 1, - max = 100, - step = 1, - onChange, - tooltipSuffix = '', - withSliderMarks = false, - withInput = false, - isInteger = false, - inputWidth = 16, - withReset = false, - hideTooltip = false, - isCompact = false, - isDisabled = false, - sliderMarks, - handleReset, - sliderFormControlProps, - sliderFormLabelProps, - sliderMarkProps, - sliderTrackProps, - sliderThumbProps, - sliderNumberInputProps, - sliderNumberInputFieldProps, - sliderNumberInputStepperProps, - sliderTooltipProps, - sliderIAIIconButtonProps, - ...rest - } = props; - const dispatch = useAppDispatch(); - const { t } = useTranslation(); - - const [localInputValue, setLocalInputValue] = useState< - string | number | undefined - >(String(value)); - - useEffect(() => { - setLocalInputValue(value); - }, [value]); - - const numberInputMin = useMemo( - () => (sliderNumberInputProps?.min ? sliderNumberInputProps.min : min), - [min, sliderNumberInputProps?.min] - ); - - const numberInputMax = useMemo( - () => (sliderNumberInputProps?.max ? sliderNumberInputProps.max : max), - [max, sliderNumberInputProps?.max] - ); - - const handleSliderChange = useCallback( - (v: number) => { - onChange(v); - }, - [onChange] - ); - - const handleInputBlur = useCallback( - (e: FocusEvent) => { - if (e.target.value === '') { - e.target.value = String(numberInputMin); - } - const clamped = clamp( - isInteger - ? Math.floor(Number(e.target.value)) - : Number(localInputValue), - numberInputMin, - numberInputMax - ); - const quantized = roundDownToMultiple(clamped, step); - onChange(quantized); - setLocalInputValue(quantized); - }, - [isInteger, localInputValue, numberInputMin, numberInputMax, onChange, step] - ); - - const handleInputChange = useCallback((v: number | string) => { - setLocalInputValue(v); - }, []); - - const handleResetDisable = useCallback(() => { - if (!handleReset) { - return; - } - handleReset(); - }, [handleReset]); - - const forceInputBlur = useCallback((e: MouseEvent) => { - if (e.target instanceof HTMLDivElement) { - e.target.focus(); - } - }, []); - - const handleKeyDown = useCallback( - (e: KeyboardEvent) => { - if (e.shiftKey) { - dispatch(shiftKeyPressed(true)); - } - }, - [dispatch] - ); - - const handleKeyUp = useCallback( - (e: KeyboardEvent) => { - if (!e.shiftKey) { - dispatch(shiftKeyPressed(false)); - } - }, - [dispatch] - ); - - const handleMouseEnter = useCallback(() => setShowTooltip(true), []); - const handleMouseLeave = useCallback(() => setShowTooltip(false), []); - const handleStepperClick = useCallback( - () => onChange(Number(localInputValue)), - [localInputValue, onChange] - ); - - return ( - - {label && ( - - {label} - - )} - - - - {withSliderMarks && !sliderMarks && ( - <> - - {min} - - - {max} - - - )} - {withSliderMarks && sliderMarks && ( - <> - {sliderMarks.map((m, i) => { - if (i === 0) { - return ( - - {m} - - ); - } else if (i === sliderMarks.length - 1) { - return ( - - {m} - - ); - } else { - return ( - - {m} - - ); - } - })} - - )} - - - - - - - - - {withInput && ( - - - - - - - - )} - - {withReset && ( - } - isDisabled={isDisabled} - onClick={handleResetDisable} - {...sliderIAIIconButtonProps} - /> - )} - - - ); -}); - -IAISlider.displayName = 'IAISlider'; - -export default memo(IAISlider); diff --git a/invokeai/frontend/web/src/common/components/IAISwitch.tsx b/invokeai/frontend/web/src/common/components/IAISwitch.tsx deleted file mode 100644 index 8773be49e5..0000000000 --- a/invokeai/frontend/web/src/common/components/IAISwitch.tsx +++ /dev/null @@ -1,77 +0,0 @@ -import { - Flex, - FormControl, - FormControlProps, - FormHelperText, - FormLabel, - FormLabelProps, - Switch, - SwitchProps, - Text, - Tooltip, -} from '@chakra-ui/react'; -import { memo } from 'react'; - -export interface IAISwitchProps extends SwitchProps { - label?: string; - width?: string | number; - formControlProps?: FormControlProps; - formLabelProps?: FormLabelProps; - tooltip?: string; - helperText?: string; -} - -/** - * Customized Chakra FormControl + Switch multi-part component. - */ -const IAISwitch = (props: IAISwitchProps) => { - const { - label, - isDisabled = false, - width = 'auto', - formControlProps, - formLabelProps, - tooltip, - helperText, - ...rest - } = props; - return ( - - - - - {label && ( - - {label} - - )} - - - {helperText && ( - - {helperText} - - )} - - - - ); -}; - -IAISwitch.displayName = 'IAISwitch'; - -export default memo(IAISwitch); diff --git a/invokeai/frontend/web/src/common/components/IAITextarea.tsx b/invokeai/frontend/web/src/common/components/IAITextarea.tsx deleted file mode 100644 index e29c6fe513..0000000000 --- a/invokeai/frontend/web/src/common/components/IAITextarea.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { Textarea, TextareaProps, forwardRef } from '@chakra-ui/react'; -import { useAppDispatch } from 'app/store/storeHooks'; -import { stopPastePropagation } from 'common/util/stopPastePropagation'; -import { shiftKeyPressed } from 'features/ui/store/hotkeysSlice'; -import { KeyboardEvent, memo, useCallback } from 'react'; - -const IAITextarea = forwardRef((props: TextareaProps, ref) => { - const dispatch = useAppDispatch(); - const handleKeyDown = useCallback( - (e: KeyboardEvent) => { - if (e.shiftKey) { - dispatch(shiftKeyPressed(true)); - } - }, - [dispatch] - ); - - const handleKeyUp = useCallback( - (e: KeyboardEvent) => { - if (!e.shiftKey) { - dispatch(shiftKeyPressed(false)); - } - }, - [dispatch] - ); - - return ( -